Build Umami Cloud
YESreplaces $20/mosaves $240/yrback to the verdict
Build a user-operated Umami installation with verified collection and restoration.
Before step 1
Everything below is assumed from the first step. Tick each one when you actually have it, not when you plan to.
- installDocker Engine has no hosting fee; Desktop licensing depends on your use, and a rented host is billed separately.
Why The upstream application runs in containers.
Get it Install Docker Engine and the Compose plugin on Linux using the official instructions. On Windows use Docker Desktop with WSL2, then work inside a Linux project folder. open ↗
Verify
docker compose version prints a v2 version and docker info reaches the daemon. - decideSoftware/edition terms and optional paid features are defined by the upstream project.
Why The guide must match the software you actually deploy.
Get it Open https://docs.umami.is/docs/install, choose a stable release compatible with its database requirements, record its tag and resolved digest in versions.txt, and use those values in compose.yaml. Avoid unattended latest-tag updates. open ↗
Verify
versions.txt names both application and database versions or states that the pilot uses embedded SQLite. - have readyNo paid service required for this local step.
Why This fixture makes the first end-to-end check reproducible.
Get it Create synthetic sample data before implementation: A user-owned test site with two page loads and one signup-click custom event. Save it under fixtures/ with the expected results in fixtures/README.md; use no real credentials or customer records.
Verify
The fixture files and expected outcomes exist and can be inspected without a vendor account. - decideNo paid service required for this local step.
Why The full commercial product is larger than this guide.
Get it The deliverable is a user-operated Umami installation with verified collection and restoration. Read every exclusion below. Indie mode runs locally; any public or shared use requires the product access and deployment gates first.
Verify
You can name the primary workflow and the vendor features this version deliberately leaves out.
Data model
Create these before the first phase that stores anything. Changing a table later is the expensive kind of change.
- Use the upstream Umami PostgreSQL schema without custom tables. Persist the database, Compose configuration, selected image digest and encrypted deployment secrets. Track a test website id and a named proof event in OPERATIONS.md. - Use stable ids and explicit relationships; add auxiliary tables named by the phases before those phases use them. - Acceptance fixture: A user-owned test site with two page loads and one signup-click custom event.
Environment variables
These go in a .env file the app reads at startup. The pack's .env.example is this table as a file · copy it, never commit the filled-in version.
| Variable | Needed | Example | Where the value comes from |
|---|---|---|---|
APP_IMAGE | required | replace-with-tested-image-and-digest | Copy the exact application image reference selected from upstream into compose.yaml via this variable. |
SITE_URL | required | http://localhost:3000 | The loopback URL selected in compose.yaml; replace with your HTTPS origin only after completing product deployment. |
POSTGRES_PASSWORDsecret | required | replace-with-random-db-password | Generate a random password, map it into the database service and URL; keep it outside version control. |
DATABASE_URLsecret | required | postgresql://umami:replace-password@db:5432/umami | Compose internal PostgreSQL connection URL; URL-encode special password characters. |
The build, in order
Deployment inventory and safe pilot
Prepare the pinned upstream deployment for a user-operated Umami installation with verified collection and restoration.
Read the linked upstream installation guide and create compose.yaml, .env.example, versions.txt and OPERATIONS.md. Map APP_IMAGE and only each service's required environment variables explicitly. Keep database ports internal and map the pilot application port to 127.0.0.1.
Files
compose.yaml.env.exampleversions.txtUse the upstream Umami PostgreSQL schema without custom tables. Persist the database, Compose configuration, selected image digest and encrypted deployment secrets. Track a test website id and a named proof event in OPERATIONS.md. Name each volume and its mount path in OPERATIONS.md; never use ephemeral container storage for the only copy. Create .env manually from .env.example and replace placeholders before starting.
Files
OPERATIONS.md.gitignoreterminaldocker compose config --quiet
Create a private fixtures/ folder containing: A user-owned test site with two page loads and one signup-click custom event. Create a separate backup destination and an isolated restore-project name; do not reuse live volumes in restore exercises.
Files
fixtures/README.mdOPERATIONS.md
done when · tick each as it passeswatch out- A valid Compose file proves configuration syntax only, not application health.
Isolated upstream deployment
Isolated upstream deployment for Umami Cloud: Deploy the official Umami container with PostgreSQL on an internal Compose network and a loopback-only app port; pin tested image digests.
Deploy the official Umami container with PostgreSQL on an internal Compose network and a loopback-only app port; pin tested image digests.
Files
compose.yamlOPERATIONS.mdSet DATABASE_URL using the internal database service name and change the initial administrator password immediately.
Files
OPERATIONS.mdUse A user-owned test site with two page loads and one signup-click custom event. Check: The dashboard opens locally and the original default password no longer works. Then check: Restarting both containers preserves the administrator and registered website. Record commands, observed results and the date in OPERATIONS.md.
Files
OPERATIONS.md
done when · tick each as it passeswatch out- Do not implement a second analytics engine or edit upstream database tables.
Prove collection
Prove collection for Umami Cloud: Register the owned test website and use the exact tracking snippet generated by this installed version.
Register the owned test website and use the exact tracking snippet generated by this installed version.
Files
compose.yamlOPERATIONS.mdGenerate the fixture pageviews and named event; inspect the network response and dashboard before declaring collection healthy.
Files
OPERATIONS.mdUse A user-owned test site with two page loads and one signup-click custom event. Check: The named signup-click event appears for the correct website. Then check: No event is attributed to a second website id in the fixture. Record commands, observed results and the date in OPERATIONS.md.
Files
OPERATIONS.md
done when · tick each as it passeswatch out- Collection blocked by consent settings or a browser extension is not evidence that the server is down.
Restore and upgrade drill
Restore and upgrade drill for Umami Cloud: Create a consistent PostgreSQL logical backup and record the matching app/database versions and secret recovery location.
Create a consistent PostgreSQL logical backup and record the matching app/database versions and secret recovery location.
Files
compose.yamlOPERATIONS.mdRestore into a separate Compose project with a new volume, compare websites/events and rehearse an upgrade there before production.
Files
OPERATIONS.mdUse A user-owned test site with two page loads and one signup-click custom event. Check: The restored dashboard contains the test website and proof event. Then check: The restore exercise touches no live database volume and records its date. Record commands, observed results and the date in OPERATIONS.md.
Files
OPERATIONS.md
done when · tick each as it passeswatch out- Changing a database major version is a migration, not a routine image pull.
Portable delivery and clean-start proof
Finish the Umami Cloud replacement with a documented first-run path and a recoverable export.
Document prerequisites, every configuration variable, data locations and the three domain workflows: Isolated upstream deployment; Prove collection; Restore and upgrade drill. Include the exclusions, actual costs and source check date 2026-09-05. Commands shown earlier that reference project files are files the builder must implement before running them.
Files
README.md.env.exampleUse a PostgreSQL logical dump plus the Compose file, image manifest and securely stored deployment secrets. Restore into a separate empty directory or isolated deployment, with all outbound actions and schedules disabled. Recreate this proof: A user-owned test site with two page loads and one signup-click custom event. Compare ids/counts and open the result before recording the restore date. Never test a restore over the only live copy.
Files
OPERATIONS.mdbackup/README.mdUse a new folder and only README instructions to reach the fixture outcome. Verify upstream login, persistence, proof output and restore. Record exactly what passed; do not mark unrun checks complete.
Files
README.mdverification.mdterminaldocker compose ps
done when · tick each as it passeswatch out- Export without an import or restore rehearsal is not verified portability.
Operate and share with access controlsproduct builder
Product-builder only: make a user-operated Umami installation with verified collection and restoration operable for its stated audience before allowing remote access.
Use upstream authentication, replace default credentials, restrict the editor/admin surface and inventory public ingestion/webhook paths. Review upstream edition and license boundaries before offering this as a service.
Files
ARCHITECTURE.mdOPERATIONS.mdPut Caddy HTTPS in front of the upstream app, keep database and management ports private and configure public URLs from the chosen domain. For n8n, rehearse upstream PostgreSQL migration/import and recovery before claiming production readiness; disable any unused AI sandbox services.
Files
CaddyfileOPERATIONS.mdAdd a scheduled encrypted off-host backup using this procedure: Use a PostgreSQL logical dump plus the Compose file, image manifest and securely stored deployment secrets. Monitor health, disk space, failed jobs and backup age. Stop the service to test an alert; rehearse recovery with outbound effects disabled and record recovery time. Rotate any exposed credentials and require reconciliation before resuming queues.
Files
OPERATIONS.mdrelease-checklist.md
done when · tick each as it passeswatch out- Product mode is additional engineering, not a switch that makes a local prototype production-ready.
That is the whole plan for Umami Cloud. What it deliberately does not cover is below · check the gaps before you call it a replacement.
- Changing a database major version is a migration, not a routine image pull.
- This is a user-operated Umami installation with verified collection and restoration; full Umami Cloud feature parity, vendor hosting and support are not included.
- managed hosting
- upgrades
- reliability
- team/billing convenience
- support
- Extend restore and upgrade drill only after the fixture and recovery checks pass.
- Before adding another integration, document its credentials, limits, cost and failure behavior with primary-source links.
Need the files? The project pack on the verdict page hands your agent the whole brief · more analytics.