Umami — simple, privacy-friendly, open-source web analytics (a cookie-free Google Analytics alternative). Deployed all-in-one with its PostgreSQL database in a single host-networked Nomad job; runs schema migrations on start.
Save as values.hcl, edit, then run:
# The name of the Nomad job.
job_name = "umami"
# The Nomad namespace to deploy into.
namespace = "default"
# The datacenters to deploy to.
datacenters = ["*"]
# The Umami container image (PostgreSQL build). Pin a tag in production.
image = "ghcr.io/umami-software/umami:postgresql-latest"
# Host port for the Umami web UI / tracking endpoint. Default 3005 to avoid the panel (:3000), grafana (:3001), gitea (:3002), metabase (:3003).
port = 3005
# Secret used to sign auth tokens. Set a random string in production (keep it stable). Empty = Umami derives one.
app_secret = ""
# PostgreSQL image backing Umami.
postgres_image = "postgres:16-alpine"
# Host port PostgreSQL listens on. Umami connects on 127.0.0.1.
db_port = 5432
# Password for the Umami database user. CHANGE THIS. (DB name and user are both "umami".)
db_password = "umami"
# Docker named volume for the Postgres data dir — all analytics data. Back it up. A fresh volume inherits the image's data-dir ownership.
db_data_volume = "umami_db_data"
# Placement constraints — pin the job to one node so the Postgres local volume stays put. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true".
constraints = []
# Resources for the Umami task.
umami_resources = {
cpu = 500
memory = 512
}
# Resources for the PostgreSQL task.
postgres_resources = {
cpu = 500
memory = 512
}
| Name | Type | Default | Description |
|---|---|---|---|
| job_name | string | "umami" | The name of the Nomad job. |
| namespace | string | "default" | The Nomad namespace to deploy into. |
| datacenters | list | ["*"] | The datacenters to deploy to. |
| image | string | "ghcr.io/umami-software/umami:postgresql-latest" | The Umami container image (PostgreSQL build). Pin a tag in production. |
| port | number | 3005 | Host port for the Umami web UI / tracking endpoint. Default 3005 to avoid the panel (:3000), grafana (:3001), gitea (:3002), metabase (:3003). |
| app_secret key | string | "" | Secret used to sign auth tokens. Set a random string in production (keep it stable). Empty = Umami derives one. |
| postgres_image | string | "postgres:16-alpine" | PostgreSQL image backing Umami. |
| db_port | number | 5432 | Host port PostgreSQL listens on. Umami connects on 127.0.0.1. |
| db_password key | string | "umami" | Password for the Umami database user. CHANGE THIS. (DB name and user are both "umami".) |
| db_data_volume | string | "umami_db_data" | Docker named volume for the Postgres data dir — all analytics data. Back it up. A fresh volume inherits the image's data-dir ownership. |
| constraints | list | [] | Placement constraints — pin the job to one node so the Postgres local volume stays put. On a nomploy cluster: attribute = "$${meta.nomploy_control_plane}", operator = "=", value = "true". |
| umami_resources | object | {
cpu = 500
memory = 512
} | Resources for the Umami task. |
| postgres_resources | object | {
cpu = 500
memory = 512
} | Resources for the PostgreSQL task. |
No variables match.
Umami — simple, privacy-friendly, open-source web analytics: a cookie-free, GDPR-friendly alternative to Google Analytics. All-in-one: Umami plus its PostgreSQL database in a single host-networked Nomad job (Postgres as a prestart sidecar). Umami runs its schema migrations on start.
nomad-pack registry add nomploy github.com/Nomploy/nomad-packs
nomad-pack run umami --registry nomploy
In nomploy: create a Compose service, type Nomad Pack, pack umami, custom registry
github.com/Nomploy/nomad-packs, then Deploy.
Open http://<node-ip>:3005 and log in with admin / umami — change the password
immediately. Add your website to get the tracking <script>.
| Variable | Default | Notes |
|---|---|---|
image |
ghcr.io/umami-software/umami:postgresql-latest |
Pin a tag in production. |
port |
3005 |
Web UI / tracking endpoint (off 3000–3003 to dodge other packs). |
app_secret |
"" |
Random string to sign tokens; keep it stable. |
db_password |
umami |
App Postgres password. Change this. |
db_data_volume |
umami_db_data |
Analytics data. Back it up. |
db_port |
5432 |
Bundled Postgres host port. |
constraints |
[] |
Pin to a node so the DB volume stays put. |
Per-task resources: umami_resources, postgres_resources.
count is fixed to 1 (local Postgres volume). Pin with constraints.db_data_volume (or pg_dump the umami database).