Overview
Umami is a privacy-first, cookieless web and product analytics platform — a self-hosted, MIT-licensed alternative to Google Analytics. This template deploys the stateless Umami v3 app tier backed by PostgreSQL, serving both the analytics dashboard and the public tracking endpoint over HTTPS. You embed a small tracking script on your site; visitor events POST back to the same workload and are stored in PostgreSQL, with no cookies and no personal data collected.Architecture
- Umami — A stateless
standardworkload serving the dashboard, API, and tracking/collect endpoint on port3000. Runs a single replica by default; setreplicasto2or more for an always-on tier with zero-downtime rolling restarts. All state lives in PostgreSQL, so replicas are independent — no clustering. - PostgreSQL (single-instance, default) — The postgres template as a subchart: the backing store for all users, websites, sessions, and events.
- PostgreSQL (HA, optional) — The postgres-highly-available template instead: 3× Patroni PostgreSQL with automatic failover and an HAProxy leader endpoint, for a durable production store.
What Gets Created
- Standard Umami Workload — One or more stateless replicas serving the UI, API, and tracking endpoint on port
3000. - Database Workloads — Single mode: one stateful PostgreSQL workload. HA mode: a stateful Patroni PostgreSQL workload, a stateful etcd workload, and a standard HAProxy leader-routing workload.
- Volume Sets — The database subchart’s persistent volumes (10 GiB by default; per replica in HA mode). Umami itself has none.
- Secret, Identity & Policy — A template-managed
appSecret(dictionary secret) and a least-privilege policy granting the Umami identityrevealon exactly the app config secret and the active database credential secret. - Cron Backup Workload (optional) — When database backups are enabled.
This template does not create a GVC. You must deploy it into an existing GVC.
Prerequisites
None for a default install. For optional database backups you need a bucket and access setup for one of the supported providers — see Backing Up. Install the template using your preferred method:UI
Browse, install, and manage templates visually
CLI
Manage templates from your terminal
Terraform
Declare templates in your Terraform configurations
Pulumi
Declare templates in your Pulumi programs
Choosing a Database Mode
Exactly one of the two backing stores must be enabled — the chart enforces this at render. Umami is wired to the active database automatically.
To switch to HA mode, set
postgres.enabled: false and postgresHA.enabled: true.
Configuration
Key configuration values (see the template’svalues.yaml for the complete set):
Application
image— The Umami open-source container image.replicas— Number of stateless app-tier replicas.1is the proven single-instance shape;2or more gives an always-on tier where rolling restarts cycle one replica at a time with no downtime. Replicas are independent and share only the database andapp.appSecret.resources— CPU and memory per replica.app.appSecret— Signs auth tokens and secures sessions. It must be unique per installation, identical across replicas, and stable across restarts — changing it logs every user out. Generate one withopenssl rand -base64 32and set it before installing.app.disableTelemetry— Whentrue(default), opts out of Umami’s anonymous usage telemetry.
Tracker
tracker.scriptName— Serve the tracking script under a custom path (e.g.s.js→/s.js) instead of the default/script.js. Useful for reducing ad-blocker interception.tracker.collectEndpoint— Have the tracker POST events to a custom path (e.g./api/track) instead of the default/api/send.
"" (standard paths). Custom paths take effect once a replica has fully booted with the new setting; a mid-rollout replica still serves the old path until it cycles.
Access
publicAccess.enabled— Serve the dashboard and tracking endpoint on the canonical*.cpln.appHTTPS endpoint (default). Keep this enabled for tracking to work — browsers must reach/script.jsand/api/send. Set tofalsefor an internal-only instance (external requests are blocked at the edge; in-GVC callers still reach it perinternalAccess), which stops all public data collection.internalAccess.type— Internal firewall scope of the Umami workload:
Backing Store
Enable exactly one ofpostgres (single-instance, default) or postgresHA (HA) — see Choosing a Database Mode. In both modes, change the database password before installing (postgres.config.password / postgresHA.postgres.password).
Connecting
To start collecting data, log in, add a website in the dashboard, then paste the generated
<script> tag — which loads the tracking script and POSTs to the collect endpoint — into your site’s HTML.
Backing Up
Database backups are optional and disabled by default. They cover the analytics database — the users, websites, sessions, and events that make up your Umami instance. Enable them withpostgres.backup.enabled or postgresHA.backup.enabled (matching your database mode), and complete the storage setup for your provider before installing. The backup runs as a scheduled job in the backing PostgreSQL store, so this is the same setup as that template.
- AWS S3
- Google Cloud Storage
- S3-compatible (MinIO)
1
Create a bucket
Create an S3 bucket. Set
backup.aws.bucket and backup.aws.region to match.2
Set up a Cloud Account
If you do not have one, create a Cloud Account for your AWS account. Set
backup.aws.cloudAccountName to its name.3
Create a bucket-scoped IAM policy
Create an AWS IAM policy that grants list/get/put/delete on your bucket (
arn:aws:s3:::YOUR_BUCKET and arn:aws:s3:::YOUR_BUCKET/*), then set backup.aws.policyName to the policy’s name. The backing template’s README has the full JSON.postgresHA.backup.mode selects logical (scheduled pg_dump) or wal-g (continuous WAL archiving). The full per-provider walkthrough, including the exact IAM JSON, lives in the backing postgres / postgres-highly-available template README.
Important Notes
- Change the default admin password immediately after first login. The bootstrap admin is a hardcoded
admin/umami, seeded by the first database migration — there is no way to override it at install time. Change it in Settings → Profile right after installing. - Set your own
app.appSecretbefore installing. It signs auth tokens; changing it later logs every user out. Generate one withopenssl rand -base64 32. - Keep
publicAccessenabled for tracking to work — browsers must reach the tracking script and collect endpoint. Disabling it silently stops all public data collection. - Ad blockers block the default
/script.jsand/api/send— settracker.scriptName/tracker.collectEndpointto custom paths to reduce blocking. replicas≥ 2 is recommended for production — replicas are independent and share the database andappSecret; rolling restarts cycle one at a time with no downtime.- Database volumes survive reinstalls under the same release name; uninstalling deletes them — all analytics data is lost. Use
postgresHAand/or enable backups for durable production data.
External References
Umami Documentation
Official Umami documentation
Tracker Configuration
Configure the tracking script and its options
Collect API
How events are sent to the collect endpoint
Environment Variables
Umami environment variables reference
Umami Template
View the source files, default values, and chart definition