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.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 From a second terminal on your local computer, open an SSH tunnel and leave it running:Open
3000 is still reachable only on server loopback: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 If UFW is enabled, allow SSH and the reverse proxy:
analytics.example.com with your domain: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
Theumami-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:.env, application digest, and PostgreSQL version record to encrypted storage outside the VPS. Test restoration before relying on the backup.
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:
Update Safely
Umami’s official Compose file follows its currentlatest application channel. Treat each pull as a deployment:
- Read the Umami releases and migration notes.
-
Create a PostgreSQL dump and copy
.envoff the server. -
Record the current application image digest:
-
Pull and recreate the containers:
-
After a major Umami upgrade, refresh PostgreSQL planner statistics as recommended upstream:
- Verify login, realtime collection, and historical reports before pruning old images.
.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
The Umami container is unhealthy
The Umami container is unhealthy
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.Umami cannot authenticate to PostgreSQL
Umami cannot authenticate to PostgreSQL
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.The dashboard loads but no pageviews appear
The dashboard loads but no pageviews appear
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.
Nginx returns 502 Bad Gateway
Nginx returns 502 Bad Gateway
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.