- geolite2: quote the real commented compose mount (./geolite2 to /opt/geolite2, the GEOLITE2_DIR default, so no env var is needed for the default path) - getting-started: healthcheck probes /api/health, not /api/version; the environment module reaches archive-api and geocoding-api .open-meteo.com, relevant for egress allowlists - mcp: the module is opt-in and off by default, but no longer the only such module - reverse-proxy: the Coach stream is SSE over plain HTTP, not WebSockets; note that TRUST_PROXY_HOPS is not on the bundled compose whitelist and must be added by hand - scaling: /api/health healthcheck; worker liveness is in-memory and invisible across a web/worker split; pool sizing now goes through getConnectionBudget with DB_CONNECTION_LIMIT as the compose knob and a 2-connection pg-boss share - sso: the native SSO handoff shipped, OIDC_ONLY works with app builds that carry it - unraid: geo databases are baked in only when the build had a licence key, or mounted; replaceable either way
5.9 KiB
HealthLog on Unraid
HealthLog runs on Unraid in two ways. The Compose Manager path is the clean, self-contained install (app + database as one unit) and is recommended. The Community Applications (CA) template gives you the familiar one-app-at-a-time Unraid UI, but because CA templates describe a single container you install PostgreSQL separately and wire the two together.
HealthLog stores all persistent state in PostgreSQL — the app container itself is stateless (the offline geo-IP databases are either baked in at build time or mounted read-only; replaceable either way, not state). A backup of the database is a backup of everything.
What you need
- Unraid 6.12 or newer.
- The image:
ghcr.io/mbombeck/healthlog:latest(multi-arch, amd64 + arm64). - Three secrets, each generated with
openssl rand -hex 32(a 64-character hex string). On Unraid open the terminal (the>_icon, top-right) and run the command three times:POSTGRES_PASSWORD— the database passwordENCRYPTION_KEY— AES-256-GCM key for data at restAPI_TOKEN_HMAC_KEY— API token hashing key
Keep ENCRYPTION_KEY safe and backed up. If you lose it, the encrypted columns
become unrecoverable.
Recommended: Compose Manager
This installs the app and its database together, exactly as the project's
docker-compose.yml describes.
-
Install Compose Manager from Community Applications (search "Compose Manager", by dcflachs).
-
Settings → Docker → Compose Manager → Add New Stack, name it
healthlog. -
Paste the project
docker-compose.ymlinto the stack's compose file. -
Edit the stack's
.env(the "Edit Stack → env" field) and set:POSTGRES_PASSWORD=<your openssl rand -hex 32> ENCRYPTION_KEY=<your openssl rand -hex 32> API_TOKEN_HMAC_KEY=<your openssl rand -hex 32> SESSION_COOKIE_SECURE=false NEXT_PUBLIC_APP_URL=http://tower:3000 APP_URL=http://tower:3000Replace
towerwith your server's hostname or IP.SESSION_COOKIE_SECURE=falseis required for plain-HTTP LAN access — see the note below. -
Compose Up. The app waits for PostgreSQL, runs database migrations on first boot, then starts serving.
-
Open
http://tower:3000. The first account you register becomes the admin.
Verify the running version:
curl -s http://tower:3000/api/version
Alternative: Community Applications template
Use this if you prefer the per-app Unraid UI. You install PostgreSQL yourself, then add HealthLog pointed at it.
Step 1 — install PostgreSQL 16
- In Apps (Community Applications), search for a PostgreSQL container
(for example jj9987's
postgresql). Install version 16. - Set:
POSTGRES_USER=healthlogPOSTGRES_PASSWORD= your generated passwordPOSTGRES_DB=healthlog
- Map the Postgres data path to a share on the array (e.g.
/mnt/user/appdata/healthlog-db) so the database survives container updates. - Note the container's IP (or container name if both run on the same custom Docker network).
Step 2 — add the HealthLog template
The template lives at
docs/self-hosting/unraid/healthlog.xml. Add it via
Docker → Add Container → Template and paste the raw URL, or copy it into
/boot/config/plugins/dockerMan/templates-user/ and pick it from the template
dropdown.
Fill in the fields:
| Field | Value |
|---|---|
| WebUI Port | 3000 |
DATABASE_URL |
postgresql://healthlog:<password>@<postgres-host>:5432/healthlog?schema=public |
ENCRYPTION_KEY |
your generated key |
API_TOKEN_HMAC_KEY |
your generated key |
SESSION_COOKIE_SECURE |
false for plain-HTTP LAN access |
NEXT_PUBLIC_APP_URL |
http://tower:3000 (or your domain) |
APP_URL |
same as NEXT_PUBLIC_APP_URL |
Replace <password> and <postgres-host> with the values from Step 1. Apply,
then open http://tower:3000 — the first registered user becomes the admin.
The HealthLog container has no persistent volume of its own; all state is in the PostgreSQL container you installed in Step 1. Back that one up.
The one setting that trips people up
SESSION_COOKIE_SECURE=false is required for plain-HTTP LAN installs
(http://tower:3000). Left at its default, the session cookie carries the
Secure flag, the browser refuses to send it over HTTP, and login appears to
"do nothing" — the page reloads to the login screen with no error.
Set SESSION_COOKIE_SECURE=true (or leave it unset) only when a TLS reverse
proxy serves HealthLog over HTTPS. In that case also point NEXT_PUBLIC_APP_URL
and APP_URL at the public https:// URL.
Updates
Pin a release tag (ghcr.io/mbombeck/healthlog:vX.Y.Z) and bump deliberately,
or track :latest and let Unraid's update check re-pull. Skim the
CHANGELOG before
upgrading, and back up the database first. Migrations are forward-only and run
automatically on container start.
Health check
Both /api/health and /api/version respond without authentication.
/api/health returns 200 when the database and background worker are up
(503 otherwise) and is the container health probe baked into the image.
/api/version returns the version, build SHA, and build timestamp for deploy
verification.