Umami
Web analytics without cookies, stored in a Postgres database that you run.
- Replaces
-
Hosted web analytics, such as Google Analytics.
All open-source alternatives to Google Analytics
- Difficulty
-
Difficulty: Medium
Two services: the app and a Postgres database in a named volume that you back up. You must replace the placeholder secrets before the first start.
- Stack
Node.js (runtime), Next.js (framework), PostgreSQL (database)
- Deployment
docker_compose, docker, manual
- Requirements
Not stated.
- License
-
MIT(OSI-approved open source)Read from github.com/umami-software/umami/blob/e92fdab/LICENSE
- Business model
-
Unknown
The README says Umami runs self-hosted or in the cloud. We did not check what the cloud plan adds, so the business model stays unknown.
Source: github.com/umami-software/umami/blob/e92fdab/README.md, read on .
- Repository
GitHub stats
- Stars
- 39,494
- Forks
- 8,359
- Open issues and pull requests
- 121
- Last push
- 2026-10-20
- Latest release
- v3.4.0
- Released
- 2026-09-17
From the GitHub API on . These numbers are a snapshot, not live. GitHub detected the license as MIT.
Compose file
---
services:
umami:
image: ghcr.io/umami-software/umami:latest
ports:
- "3000:3000"
environment:
DATABASE_URL: postgresql://umami:umami@db:5432/umami
APP_SECRET: replace-me-with-a-random-string
# Required for two-factor authentication, generate with: openssl rand -hex 32
TWO_FACTOR_ENCRYPTION_KEY: replace-me-with-a-64-character-hex-string
depends_on:
db:
condition: service_healthy
init: true
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
db:
image: postgres:15-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: umami
volumes:
- umami-db-data:/var/lib/postgresql/data
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
volumes:
umami-db-data:
From the app's own repository: github.com/umami-software/umami/blob/e92fdab/docker-compose.yml.
docker compose config (Docker Compose v5.1.0) exited 0 on this exact file. That check covers YAML and the compose schema. It does not start the containers. Before the first start, replace APP_SECRET, TWO_FACTOR_ENCRYPTION_KEY and the default database password umami.
Install
- Docker with the Compose plugin (github.com/umami-software/umami/blob/e92fdab/README.md)
A host with Docker and the Docker Compose plugin. The compose file starts its own PostgreSQL container.
- Save the compose file as docker-compose.yml (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml)
Use the compose file shown above.
- Set the two secrets in the file (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml)
The compose file has two placeholder values: APP_SECRET (a random string) and TWO_FACTOR_ENCRYPTION_KEY (64 hex characters; the file says to generate it with: openssl rand -hex 32). Replace both before the first start.
- Start it (github.com/umami-software/umami/blob/e92fdab/README.md)
docker compose up -d - Check that it answers (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml)
Open http://localhost:3000. The compose file health check calls http://localhost:3000/api/heartbeat inside the container.
Compose file check: config_ok on 2026-10-21.
Gotchas and maintenance
Gotchas
- The compose file has placeholder secrets and a weak database password. APP_SECRET and TWO_FACTOR_ENCRYPTION_KEY are placeholders ("replace-me..."). The database user and password in the file are both "umami". (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml, checked 2026-10-21)
- The image tag is latest. The compose file uses ghcr.io/umami-software/umami:latest, so a pull can move to a new version without notice. (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml, checked 2026-10-21)
- Default login from the README. The README says the first build creates a login user named admin with the password umami. (github.com/umami-software/umami/blob/e92fdab/README.md, checked 2026-10-21)
Upgrades
- Upgrade the Docker install. The README gives these steps: docker compose pull, then docker compose up --force-recreate -d. (github.com/umami-software/umami/blob/e92fdab/README.md, checked 2026-10-21)
Requirements
- Versions for a non-Docker install. The README lists Node.js 18.18 or newer and PostgreSQL 12.14 or newer. (github.com/umami-software/umami/blob/e92fdab/README.md, checked 2026-10-21)
Signals
- Open issues and pull requests: 121
- Last push: 2026-10-20 (1 days before this page was built)
- Latest release: v3.4.0 on 2026-09-17 (34 days before this page was built)