# 09-lubelogger.md

kstack:
  book: Centerpoint Home Lab
  chapter: Documents & Organization
  page: LubeLogger
  tags: [lubelogger, vehicles, maintenance, postgres]
---

## Overview

LubeLogger is a vehicle maintenance and fuel log tracker. It stores service
records, oil changes, tyre rotations, fuel fill-ups, and other vehicle events.
External-only route with GeoBlock and CrowdSec — no internal `home.local` route.
Authentication is LubeLogger's own built-in user system. Backend is PostgreSQL 16.

## Access

| Type     | URL                                       | Auth                        |
|----------|-------------------------------------------|-----------------------------|
| External | `https://logger.jeeves5454.ddns.net`      | GeoBlock + CrowdSec (own auth) |

No internal route configured.

## Containers

| Container       | Image                          | Role                |
|-----------------|--------------------------------|---------------------|
| `lubelogger`    | `ghcr.io/hargata/lubelogger:latest` | Web application  |
| `lubelogger-db` | `postgres:16`                  | PostgreSQL database |

### lubelogger (application)

**Image:** `ghcr.io/hargata/lubelogger:latest`  
**Runtime:** .NET 10.0.8 (ASP.NET Core)

**Key environment variables:**

| Variable               | Value / Notes                         |
|------------------------|---------------------------------------|
| `POSTGRES_CONNECTION`  | **REDACTED** (includes password)      |
| `ASPNETCORE_HTTP_PORTS`| `8080`                                |
| `LC_ALL` / `LANG`      | `en_US.UTF-8`                         |

**Bind mounts:**

| Host Path                               | Container Path                    | Purpose                       |
|-----------------------------------------|-----------------------------------|-------------------------------|
| `/home/jeeves/docker/lubelogger/data`   | `/App/data`                       | App data and uploads          |
| `/home/jeeves/docker/lubelogger/keys`   | `/root/.aspnet/DataProtection-Keys` | ASP.NET data protection keys |

### lubelogger-db (PostgreSQL 16)

**Image:** `postgres:16`

| Variable         | Value        |
|------------------|--------------|
| `POSTGRES_USER`  | `lubelogger` |
| `POSTGRES_DB`    | `lubelogger` |
| `POSTGRES_PASSWORD` | **REDACTED** |

**Bind mounts:**

| Host Path                              | Container Path             |
|----------------------------------------|----------------------------|
| `/home/jeeves/docker/lubelogger/db`    | `/var/lib/postgresql/data` |

## Traefik Labels

```yaml
traefik.http.routers.lubelogger.rule: Host(`logger.jeeves5454.ddns.net`)
traefik.http.routers.lubelogger.entrypoints: websecure
traefik.http.routers.lubelogger.tls.certresolver: letsencrypt
traefik.http.routers.lubelogger.middlewares: plex-geoblock@file,crowdsec-bouncer@file,lubelogger-headers
traefik.http.middlewares.lubelogger-headers.headers.customrequestheaders.X-Forwarded-Proto: https
traefik.docker.network: traefik-net
traefik.http.services.lubelogger.loadbalancer.server.port: 8080
```

## Notes / Gotchas

- `POSTGRES_CONNECTION` in the container environment contains the database
  password in plaintext — treat this as sensitive and avoid logging the
  environment of this container.
- The `DataProtection-Keys` bind mount (`/lubelogger/keys`) must persist across
  container restarts. If it is lost, all active user sessions will be
  invalidated and users will need to log in again.
- The `X-Forwarded-Proto: https` middleware is required for ASP.NET Core to
  correctly identify requests as HTTPS when behind a reverse proxy.

---
*Last Updated: 2026-06-17*