Analytics, checked 2026-10-17

Umami: Docker configuration reference

Self-hosted web analytics on Next.js with a PostgreSQL backend and optional ClickHouse for analytics queries.

At a glance

Ports

Ports
PortWhat listensSource
3000HTTP listener for the dashboard, the tracker script and the collect API. Point the reverse proxy here.source for port 3000
5432 (db)PostgreSQL, reached over the internal network only. It does not need publishing to the host.source for port 5432

Environment variables

Environment variables
VariableRequiredWhat it doesExampleSource
DATABASE_URLYesConnection string for the database. The docs call it the only required variable, but the upstream compose also sets APP_SECRET.postgresql://umami:umami@db:5432/umamisource for DATABASE_URL
APP_SECRETYesRandom string that secures authentication tokens. Each installation needs its own value.openssl rand -hex 32source for APP_SECRET
TWO_FACTOR_ENCRYPTION_KEYNo64 character hex key required before two-factor authentication will work. Since v3.3.0.openssl rand -hex 32source for TWO_FACTOR_ENCRYPTION_KEY
CLIENT_IP_HEADERNoHTTP header to read the visitor IP from when a proxy in front uses a non-standard header. Since v1.24.0.CF-Connecting-IPsource for CLIENT_IP_HEADER
COLLECT_API_ENDPOINTNoMoves the collect endpoint off the default /api/send, which is what ad blockers match on. Since v1.34.0./api/collect-heresource for COLLECT_API_ENDPOINT
DISABLE_TELEMETRYNoTurns off the anonymous usage telemetry the application sends upstream. Since v2.0.0.1source for DISABLE_TELEMETRY
DISABLE_LOGINNoDisables the login page entirely. Since v1.26.0. Only sane behind an identity gate you already trust.1source for DISABLE_LOGIN
CORS_MAX_AGENoSeconds a CORS preflight is cached for. Default is 24 hours. Since v2.0.0.86400source for CORS_MAX_AGE

Volumes that must persist

Volumes
PathWhat is in itSource
/var/lib/postgresql/data (db)The whole dataset. The application container itself is stateless, so this is the only thing to back up.source for /var/lib/postgresql/data

Behind a reverse proxy

What it needs alongside it

Dependencies
DependencyWhySource
PostgreSQL (ClickHouse optional)The upstream compose file pairs the application with postgres:15-alpine. From v3 there is one image; MySQL is no longer supported.source for PostgreSQL (ClickHouse optional)

Release timeline

Releases
VersionDateBreakingWhat changedSource
v3.4.02026-09-17NoAdds annotations, API keys, a read-only MCP endpoint (off unless MCP_ENABLED=1) and new analytics APIs; legacy report APIs kept. Runs schema migrations.source for release v3.4.0
v3.3.12026-08-20NoMaintenance release. Hardens two-factor auth when TWO_FACTOR_ENCRYPTION_KEY is missing or invalid.source for release v3.3.1
v3.3.02026-08-12YesAdds two-factor authentication, which needs the new TWO_FACTOR_ENCRYPTION_KEY variable set before it will work.source for release v3.3.0
v3.2.02026-06-24NoAdds heatmaps, property reporting changes and session replay controls.source for release v3.2.0
v3.1.02026-04-16NoAdds boards, session replay, web vitals performance tracking and a redesigned share page.source for release v3.1.0
v3.0.32025-12-12NoPatch for the Next.js security advisory published 2025-12-11.source for release v3.0.3

If it is not coming up

Read from the upstream documentation, repository and container registry by Keita Emsden on 2026-10-17. Every row links the page it came from. Upstream changes without telling anyone, so check the source link before you rely on a value.

Other app references

All app references