OpenLogs

All tools

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

umami-software/umami

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

Config check passed docker compose config exited 0 on this exact file on 2026-10-21.
docker-compose.yml Version 1
---
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

  1. 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.

  2. Save the compose file as docker-compose.yml (github.com/umami-software/umami/blob/e92fdab/docker-compose.yml)

    Use the compose file shown above.

  3. 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.

  4. Start it (github.com/umami-software/umami/blob/e92fdab/README.md)
    docker compose up -d
  5. 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

Upgrades

Requirements

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)