Skip to main content
Arct Cloud provides an unmanaged Linux VPS. Umami is not preinstalled or managed by Arct Cloud; you are responsible for installation, privacy configuration, database operations, security, backups, and updates. This guide installs the current Umami release on Ubuntu 24.04 using Umami’s official Docker Compose architecture: the Umami application plus PostgreSQL.

Requirements

Analytics volume, retention, and concurrent dashboard queries determine real resource use. Monitor PostgreSQL growth rather than treating the starting plan as a fixed production limit.

Install Umami

1

Deploy Ubuntu 24.04

Deploy a server, select a plan that meets your traffic and retention needs, and choose Ubuntu 24.04.
2

Connect over SSH

Find the server IP address in the Arct Cloud console, then connect:
See Connect via SSH for help with keys or usernames.
3

Point a domain to the server

Create an A record such as analytics.example.com pointing to the VPS’s public IPv4 address. Add an AAAA record only if IPv6 is configured. Confirm the record resolves before requesting a certificate:
4

Install Docker Engine

Install Docker Engine and the Compose plugin from Docker’s official Ubuntu repository:
5

Generate the application secrets

Create the project directory and generate a unique database password and APP_SECRET. Hexadecimal values avoid connection-string escaping problems.
Do not commit .env, paste it into support tickets, or regenerate it during routine updates. Preserve it with your encrypted backups.
6

Create the official-style Compose stack

The configuration follows Umami’s current upstream Compose file, with secrets moved to .env and application port 3000 restricted to loopback. PostgreSQL has no published host port.
7

Start Umami and secure the default account privately

Start Umami while port 3000 is still reachable only on server loopback:
From a second terminal on your local computer, open an SSH tunnel and leave it running:
Open http://localhost:3000 and sign in with Umami’s initial credentials:Change the default password immediately, then create a separate account for routine use if your team needs shared access. Never embed an administrator credential in a website’s tracking code. Close the tunnel with Ctrl+C only after the default password has been changed.
8

Configure the public reverse proxy and HTTPS

Replace analytics.example.com with your domain:
If UFW is enabled, allow SSH and the reverse proxy:
9

Verify the deployment

Confirm both containers are healthy and the local and public endpoints respond:
Add a website in Umami, copy its tracking snippet into that site’s <head>, visit the site, and confirm that a pageview appears in the realtime view.

Persistent Data, Secrets, and Ports

The umami-db-data Docker volume contains all analytics and account data. /opt/umami/.env contains the PostgreSQL password and APP_SECRET; changing APP_SECRET invalidates existing authentication tokens. Keep both the database backup and .env encrypted and stored outside the VPS. Only ports 80 and 443 need inbound public access. Port 3000 is loopback-only, and PostgreSQL port 5432 is not published at all. Do not add a public 5432 mapping. Website tracking requests arrive through the same HTTPS endpoint as the dashboard.
Self-hosting gives you control of the analytics database, but you remain responsible for your privacy notice, retention policy, access controls, and any laws that apply to your visitors.

Back Up and Restore

Create a consistent logical PostgreSQL backup and preserve the matching secrets:
Copy the dump, .env, application digest, and PostgreSQL version record to encrypted storage outside the VPS. Test restoration before relying on the backup.
Never test a restore over the live database. Use a replacement VPS or an isolated Compose project with a new, empty PostgreSQL volume.
On the replacement stack, restore the saved .env, set the Umami image to the recorded immutable digest, and use the same PostgreSQL major version. Start only the empty database, then restore the dump into it:
Verify login, historical reports, and new realtime events through an SSH tunnel to the replacement VPS. Switch DNS or the reverse-proxy upstream only after those checks pass. Keep the original stack intact until the replacement is serving traffic correctly; update it only after the restore has been proven.

Update Safely

Umami’s official Compose file follows its current latest application channel. Treat each pull as a deployment:
  1. Read the Umami releases and migration notes.
  2. Create a PostgreSQL dump and copy .env off the server.
  3. Record the current application image digest:
  4. Pull and recreate the containers:
  5. After a major Umami upgrade, refresh PostgreSQL planner statistics as recommended upstream:
  6. Verify login, realtime collection, and historical reports before pruning old images.
Application startup can migrate the database. Do not run an older Umami image against a database already migrated by a newer release. For rollback, build a replacement stack with the previous image digest, the same PostgreSQL major version, the saved .env, and a new empty volume. Restore the pre-update dump, verify it through an SSH tunnel, then switch traffic; keep the migrated stack available until rollback is confirmed.

Troubleshooting

Run sudo docker compose -f /opt/umami/compose.yaml ps and inspect sudo docker compose -f /opt/umami/compose.yaml logs --tail 100 umami db. The database must become healthy before Umami starts; also check disk space with df -h.
Confirm POSTGRES_PASSWORD exists in /opt/umami/.env and that sudo docker compose config resolves the same value for the app and database. Changing the Compose environment does not change the password inside an already initialized PostgreSQL volume; update the database role deliberately or restore the original .env.
Confirm the snippet uses this Umami domain and the correct website ID. In the browser network panel, look for blocked script or collection requests; content blockers commonly block analytics. Test without a blocker and verify the public URL uses a valid HTTPS certificate.
Confirm curl -fsS http://127.0.0.1:3000/api/heartbeat works, then run sudo nginx -t. If the app is still starting migrations, follow its logs instead of repeatedly restarting it.

Official Resources

Umami Documentation

Official installation, configuration, and update guidance.

Umami on GitHub

Source code, Compose file, security policy, and issue tracker.

Umami Releases

Current releases, changes, and upgrade context.
Umami is developed by Umami Software and its contributors. Arct Cloud is an independent infrastructure provider and is not affiliated with, sponsored by, or endorsed by Umami Software.