# Self-Hosted Umami Analytics in Germany from €8/mo

> Umami analytics with its own PostgreSQL, deployed in one click. No cookies, no personal data, servers in Germany. About €8 a month, billed by the hour.

[Templates](/templates) Umami

# One-click Umami hostingSelf-hosted Umami analytics

Your own Umami, counting page views, referrers, countries, devices and events on your sites. It sets no cookies and keeps no IP addresses, and the data sits in your PostgreSQL in Germany. One click creates the service and the database and gives the admin account a random password, so nobody signs in with the default one before you do.

[ Deploy on Runsite](https://dashboard.runsite.app/templates)[ View on GitHub](https://github.com/runsite-platform/runsite-umami-template)

Runs on the €5 starting credit. No card needed to try it.

stats.yourcompany.com 

![Umami overview of a coffee shop website with visitor, view, bounce rate and visit duration counters above an hourly bar chart](/templates/umami/overview-light-2560.webp)![Umami overview of a coffee shop website with visitor, view, bounce rate and visit duration counters above an hourly bar chart](/templates/umami/overview-dark-2560.webp)

The template

€0

MIT, like Umami itself

Running it

€8/mo

Starter web service and Nano PostgreSQL

Where it runs

Germany

Unlimited websites and page views

## The rest of the dashboard

Every screenshot on this page comes from this template running on a laptop, filled with a month of made-up traffic for a coffee shop.

stats.yourcompany.com 

![Umami tables of top pages by visitors and top referrers led by google.com, duckduckgo.com and a newsletter](/templates/umami/pages-light-2560.webp)![Umami tables of top pages by visitors and top referrers led by google.com, duckduckgo.com and a newsletter](/templates/umami/pages-dark-2560.webp)

### Which pages people read and where they came from

Paths, entry and exit pages next to referrers. A newsletter link shows up under its own domain, and UTM campaigns get a report of their own.

stats.yourcompany.com 

![Umami breakdown of visitors by browser and by country, led by Chrome and Germany](/templates/umami/audience-light-2560.webp)![Umami breakdown of visitors by browser and by country, led by Chrome and Germany](/templates/umami/audience-dark-2560.webp)

### Devices and countries without a fingerprint

Browser, operating system, device type, country, region and city. All of it comes from the user agent and the IP address at the moment of the visit; neither is stored.

stats.yourcompany.com 

![Umami world map with most visitors in Europe and a weekday by hour heatmap with peaks around 11 am and 8 pm](/templates/umami/traffic-light-2560.webp)![Umami world map with most visitors in Europe and a weekday by hour heatmap with peaks around 11 am and 8 pm](/templates/umami/traffic-dark-2560.webp)

### When your visitors show up

A world map shaded by visitors and a grid of weekdays against hours. Here the shop peaks late in the morning and again after dinner.

stats.yourcompany.com 

![Umami events page with visitor and event counters above a stacked bar chart of three custom events by hour](/templates/umami/events-light-2560.webp)![Umami events page with visitor and event counters above a stacked bar chart of three custom events by hour](/templates/umami/events-dark-2560.webp)

### Clicks and sign-ups you choose to count

Add to cart, Start subscription and Newsletter signup, sent with a data-umami-event attribute. Each event can carry properties, such as the product or the plan.

Switch the site theme to see Umami in dark mode.

## What a visit leaves behind

The tracking script is under 2 KB and sends one small request per page view. Umami stores the page, the referrer and a few browser details. The IP address becomes a country and a city, and then it is thrown away.

One page view, as it reaches Umami

POST https://stats.yourcompany.com/api/send

Page

/pricing

Stored: as sent

Page title

Pricing · Your Company

Stored: as sent

Referrer

news.ycombinator.com

Stored: as sent

Screen

1440×900

Stored: as sent

Language

de-DE

Stored: as sent

User agent

Mozilla/5.0 (Macintosh…

Turned into: Firefox, macOS, laptop

IP address

203.0.113.42

Turned into: Germany, Berlin, then discarded

Cookies

none set

Never: Nothing written to the browser

To count unique visitors without a cookie, Umami hashes the website, the IP address, the user agent and a salt that changes every month. The hash can't be turned back into an IP, and the same person gets a new one next month.

## What one click sets up

A repository, a web service and a database, already connected. Umami keeps everything in PostgreSQL, so there is no disk to size or back up separately.

* Your own GitHub repository  
A copy of the template in your account. It pins the Umami version, so an update is a one-line commit.  
€0  
Stays yours if you leave Runsite
* [Web service](/services/web-services)  
Runs the official Umami image behind HTTPS and serves the tracking script. Needs no disk.  
Variables it fills in

  * `APP_SECRET`
  * `ADMIN_PASSWORD`  
€5/mo  
Starter plan: 512 MB, always on
* [PostgreSQL](/services/postgresql)  
Every page view, event, website and user. Umami keeps nothing anywhere else.  
Variables it fills in

  * `DATABASE_URL`  
€3/mo  
Nano plan with daily backups

Billed by the hour at the normal Runsite rates.

about €8 a month

Every plan is on the [pricing page](/pricing).

## No admin / umami on a public URL

A fresh Umami creates the user `admin` with the password `umami`. Everyone who has read the docs knows it, and a new instance is online before you get to the login page. The template swaps that password for a random one during the first start.

* ### Find it in the environment  
Web service, Environment, ADMIN\_PASSWORD. Change it in Umami under Settings, Profile whenever you like.
* ### It only ever replaces umami  
Once you set your own password, redeploys leave it alone and the variable can be deleted.

umami

Password

umami

••••••••••••••••••••••••

24 random characters from ADMIN\_PASSWORD, set before Umami answers its first request.

## Add the snippet to your site

In Umami open Settings, Websites, Add website. The Tracking code tab gives you one line for the head of every page. Visits show up on the dashboard within seconds.

<script defer
  src="https://stats.yourcompany.com/script.js"
  data-website-id="3f0b6c2e-8a41-4d9e-b7c5-1e2a9d6f40ab"></script>

### Events

Add `data-umami-event="Signup"` to a button, or call `umami.track()` from your own code.

### Campaigns

Umami reads UTM parameters from your links and shows them in a campaigns report.

### Your own domain

Attach stats.yourcompany.com to the web service and point the `src` at it.

## When ad blockers hide the script

Some blocklists match the default file name and path. Rename both in the web service environment; saving redeploys Umami, and then you update the src in the snippet.

TRACKER\_SCRIPT\_NAME

/script.js /stats.js

Serves the tracker under another file name

COLLECT\_API\_ENDPOINT

/api/send /api/collect

Sends page views to another path

## Pick Starter, because Nano sleeps

Umami uses about 200 MB doing nothing. The bigger problem with Nano is sleep: a service that is asleep can't answer the tracker, and those page views are gone.

* Nano  
256 MB, €3/mo  
Sleeps after 14 quiet days and loses the visits that wake it
* Starter  
512 MB, €5/mo  
Recommended. Plenty for a busy blog or a shop, with headroom
* Standard  
1 GB, €12/mo  
Many busy sites or large date ranges in reports

## What runs before Umami starts

A short entrypoint script runs on every start, in this order.

1. ### Waits for PostgreSQL  
On the first deploy the database may still be booting. The script retries for up to 180 seconds, then stops with a clear error.
2. ### Applies the migrations  
Umami creates or updates its tables. On the very first start this also creates the user admin with the password umami.
3. ### Replaces the default password  
If admin still has the password umami, it becomes the value of ADMIN\_PASSWORD. Once you change it yourself, this step does nothing.
4. ### Starts Umami  
With telemetry to Umami Software switched off and the tracker served under the name you chose.

`APP_SECRET` signs login sessions. The deploy generates it once; changing it later signs everyone out a single time. Any other [Umami environment variable](https://umami.is/docs/environment-variables) can be added in the web service environment.

## From click to first page view

You fill in nothing before the deploy. The session secret, the admin password and the database URL are generated for you.

1. ### Click Deploy  
The Starter web service and the Nano database both run on the €5 starting credit, so you can try Umami before you top up.
2. ### Name the project and the repository  
Runsite copies the template into your GitHub account, creates the web service and the database and starts the first build.
3. ### Copy ADMIN\_PASSWORD  
Web service, Environment. It is 24 random characters, generated once for this deploy.
4. ### Sign in as admin and add a website  
Settings, Websites, Add website. Umami gives you a one-line snippet for the head of your pages.

## Updating Umami

The version is pinned in the Dockerfile. Change the number, commit and push; Runsite rebuilds and Umami migrates the database on start.

# Dockerfile
ARG UMAMI_VERSION=3.4.1

Take a database backup first. Migrations are not undone if you go back to an older version.

## The same setup in Docker

The repository ships a docker-compose.yml with PostgreSQL, so you can try a change on your laptop before you push it.

$ docker compose up --build
# open http://localhost:3000, sign in as admin

The compose file uses a database password with @, :, / and # on purpose. If Umami connects, special characters in DATABASE\_URL are handled.

## What this template does not do

### One instance, PostgreSQL only

No Redis and no ClickHouse. Umami only needs them at a few million page views a month, which most sites never reach.

### Your old numbers stay behind

The database starts empty on the day you add the snippet. Keep your old analytics running for a while if you want history to compare against.

### Visits are lost while the service sleeps

Only the Nano plan sleeps. The tracker gets no answer until the service wakes up, and those page views are not retried.

### About the license

The template files are MIT. Umami itself is open source software by Umami Software, also under the [MIT License](https://github.com/umami-software/umami/blob/master/LICENSE), so running it for clients is fine too.

## Questions

How much does it cost to self-host Umami on Runsite? 

About €8 a month: €5 for a Starter web service with 512 MB of memory and €3 for a Nano PostgreSQL database. The template is free. Billing is hourly, and the €5 starting credit covers both plans while you try it.

Is Umami free? 

Yes. Umami is open source under the MIT license and the self-hosted version has no limit on websites, page views or users. You pay only for the server and the database it runs on.

Do I need a cookie banner with Umami? 

Umami sets no cookies and stores no IP addresses or other personal data, which is why many sites run it without a consent banner. The data stays in your PostgreSQL on servers in Germany. Whether your whole site needs a banner also depends on everything else you load, so check the rest of your scripts too.

How is this different from Umami Cloud? 

Umami Cloud is run by Umami Software and priced by events per month, with a free tier. Here you run the same open source code in your own account: no event limit, the database is yours, and you decide when to update.

Can I track several websites with one instance? 

Yes. Add as many websites as you like under Settings, Websites. Each gets its own website ID for the snippet and its own dashboard, and you can share a dashboard with a public link or invite teammates.

Can I put Umami on my own domain? 

Yes. Attach a domain such as stats.example.com to the web service, then change the src of the tracking snippet to it. A first-party domain is also less likely to be blocked than a third-party one.

I lost the admin password. What now? 

Set the password column of the admin row in the user table back to the hash of umami (it is in the template README), put a new ADMIN\_PASSWORD in the web service environment and redeploy. The start script sees the default password and replaces it again.

Can I run the same setup with Docker elsewhere? 

Yes. The repository is a thin layer over the official Umami image and ships a docker-compose.yml with PostgreSQL. docker compose up --build starts it on your laptop or any server.

## Your app deserves to be online

€5 of credit on signup. Deploy in under a minute. No credit card needed.

[Start deploying](https://dashboard.runsite.app/login)[View documentation](https://docs.runsite.app)

---

Source: https://runsite.app/templates/umami
