Google Analytics staat in een paar minuten op je site. Ermee leven is lastiger. Op een kleine site laad je al snel een zwaar script van een derde partij en stuur je bezoekersdata van je server af, alleen om af en toe een verkeersgrafiek te bekijken.
Umami is een kleinere, schonere optie. Het is een open-source, privacygerichte analyticstool voor pageviews, verwijzers, apparaten, landen, events en campagnegegevens. Je kunt Umami op je eigen server draaien met PostgreSQL, en de officiële Docker-opzet is kort genoeg om te begrijpen voordat je hem plakt.
Hieronder staat een volledige VPS-opzet: Docker Compose voor Umami en PostgreSQL, Nginx als publieke reverse proxy, Let's Encrypt-certificaten via Certbot en de twee onderhoudsklussen die mensen vaak vergeten: back-ups en updates.
Waarom analyticsdata lokaal houden
Website-analytics kan onschuldig lijken omdat het dashboard netjes oogt. De data erachter blijft gedragsdata: bezochte URL's, timestamps, verwijzers, apparaatinformatie, locatie op landniveau en eventnamen die je zelf definieert. Gebruik je een externe analytics-dienst, dan verlaat die stroom bewust je eigen infrastructuur.
Door Umami zelf te hosten houd je die data aan jouw kant. Je verkeersgegevens komen terecht in jouw PostgreSQL-database, op jouw server, onder jouw back-upbeleid. Je hebt nog steeds een privacybeleid nodig en je moet nog steeds begrijpen welke toestemmingsregels voor jouw site gelden. Het verschil is dat je analytics niet naar een groot advertentie-ecosysteem stuurt alleen om te zien welke blogpost verkeer krijgt.
De serververeisten zijn bescheiden. Een kleine KVM VPS is genoeg voor een persoonlijke site of een paar projecten met weinig verkeer. Een grotere VPS geeft PostgreSQL meer ruimte als je meerdere websites meet of data lang bewaart. Snelle opslag helpt meer dan veel mensen verwachten, omdat analytics vooral leest uit en schrijft naar de database.
Wat je nodig hebt voordat je Umami installeert
Je hebt nodig:
- Een Linux-server met root- of sudo-toegang
- Een domein of subdomein voor Umami, zoals
stat.example.com - DNS dat die hostname al naar het IPv4-adres van je server verwijst
- Poorten 80 en 443 open op de serverfirewall
- Een shellsessie als
rootof als gebruiker met sudo-rechten
Het Compose-bestand hieronder bindt Umami aan 127.0.0.1:3000, zodat de app-poort niet direct publiek bereikbaar is. Nginx accepteert publiek HTTP/HTTPS-verkeer en proxyt dat naar de lokale container.
Docker en Docker Compose installeren
Op Debian is extrepo een korte route als jouw release de Docker CE repository-entry bevat:
sudo apt update
sudo apt install extrepo
sudo extrepo enable docker-ce
sudo apt update
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Voor andere Linux-systemen is het convenience script van Docker de snelle route:
curl -fsSL https://get.docker.com -o get-docker.sh
sudo bash get-docker.sh
De documentatie van Docker beschrijft dat script als nuttig voor test- en ontwikkelomgevingen, dus bekijk het eerst als dit een productieserver is. Zorg op Debian of Ubuntu dat de Compose-plugin aanwezig is:
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Op CentOS Stream, Rocky Linux of AlmaLinux installeer je dezelfde pakketten via dnf nadat de Docker-repository is geconfigureerd:
sudo dnf install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
Draai je niet als root, voeg dan je huidige gebruiker toe aan de docker-groep:
sudo usermod -aG docker youruser
Log uit en weer in, of voer newgrp docker uit voordat je test. De Linux post-installation guide van Docker waarschuwt dat lidmaatschap van de docker-groep rootniveau-rechten geeft, dus voeg alleen gebruikers toe die dat toegangsniveau mogen hebben.
Schakel Docker in en controleer of Docker en de Compose-plugin werken:
sudo systemctl enable --now docker
docker version
docker compose version
Het Umami Compose-bestand maken
Maak een aparte map voor Umami:
mkdir -p ~/services/umami
cd ~/services/umami
Genereer twee willekeurige waarden voordat je het bestand schrijft: een voor Umami-authenticatietokens en een voor PostgreSQL:
openssl rand -hex 32
openssl rand -hex 32
Maak compose.yaml:
name: umami
services:
umami:
container_name: umami
image: docker.umami.is/umami-software/umami:latest
ports:
- "127.0.0.1:3000:3000"
environment:
DATABASE_URL: postgresql://umami:CHANGE_ME_DB_PASSWORD@umami-db:5432/umami
DATABASE_TYPE: postgresql
APP_SECRET: CHANGE_ME_APP_SECRET
depends_on:
umami-db:
condition: service_healthy
init: true
restart: always
healthcheck:
test: ["CMD-SHELL", "curl http://localhost:3000/api/heartbeat"]
interval: 5s
timeout: 5s
retries: 5
umami-db:
container_name: umami-db
image: postgres:18-alpine
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: CHANGE_ME_DB_PASSWORD
volumes:
- ./data:/var/lib/postgresql
restart: always
healthcheck:
test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"]
interval: 5s
timeout: 5s
retries: 5
Vervang beide CHANGE_ME_DB_PASSWORD-waarden door hetzelfde PostgreSQL-wachtwoord. Vervang CHANGE_ME_APP_SECRET door een andere willekeurige string. De Umami environment variable docs beschrijven APP_SECRET als de waarde waarmee authenticatietokens worden beveiligd, dus hergebruik die niet ergens anders.
Gecontroleerd op 2 juli 2026 vermeldt Docker Hub postgres:18-alpine als actieve officiële Postgres-imagetag. Voor een verse Umami-installatie is dat een redelijke keuze. Behandel database-majorversies bij een bestaande installatie voorzichtig: maak een pg_dump, test een restore en verander daarna pas de imagetag.
Umami starten
Haal de images op en start de stack:
docker compose pull
docker compose up -d
Controleer de containers:
docker compose ps
docker compose logs -f umami
Umami luistert op http://127.0.0.1:3000 vanaf de host. Omdat de container aan localhost is gebonden, open je hem nog niet direct vanuit je browser. Nginx wordt het publieke ingangspunt.
Het standaard administratoraccount is:
- Gebruikersnaam:
admin - Wachtwoord:
umami
Volgens de login guide van Umami moet je dat wachtwoord direct na de eerste login wijzigen. Doe dat voordat je websites toevoegt of de URL deelt.
Nginx als reverse proxy configureren
Installeer Nginx:
# Debian or Ubuntu
sudo apt update
sudo apt install nginx
# CentOS Stream, Rocky Linux, or AlmaLinux
sudo dnf update
sudo dnf install nginx
In dit voorbeeld is de analytics-hostname stat.example.com. Vervang die door je echte hostname.
Maak op Debian of Ubuntu /etc/nginx/sites-available/stat.example.com.conf aan:
upstream umami_backend {
server 127.0.0.1:3000;
}
server {
listen 80;
listen [::]:80;
server_name stat.example.com;
location / {
proxy_pass http://umami_backend;
proxy_http_version 1.1;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
}
}
Schakel de site in:
sudo ln -s /etc/nginx/sites-available/stat.example.com.conf /etc/nginx/sites-enabled/
sudo nginx -t
sudo systemctl reload nginx
Op CentOS Stream, Rocky Linux of AlmaLinux zet je hetzelfde server block in:
/etc/nginx/conf.d/stat.example.com.conf
Test daarna Nginx en start of herlaad de service:
sudo nginx -t
sudo systemctl enable --now nginx
sudo systemctl reload nginx
Nginx-configuratiebestanden onder /etc/nginx/ vereisen rootrechten. Als nginx -t faalt, los dat eerst op voordat je Certbot gebruikt.
HTTPS toevoegen met Certbot
Installeer Certbot en de Nginx-plugin:
# Debian or Ubuntu
sudo apt install certbot python3-certbot-nginx
# CentOS Stream, Rocky Linux, or AlmaLinux
sudo dnf install epel-release
sudo dnf install certbot python3-certbot-nginx
Vraag het certificaat aan:
sudo certbot --nginx -d stat.example.com
Nadat Certbot de Nginx-configuratie heeft aangepast, controleer je de site:
sudo nginx -t
sudo systemctl reload nginx
Open nu:
https://stat.example.com/
Log in met admin en umami, en wijzig daarna het wachtwoord via Settings voordat je iets anders doet. Een publiek analytics-dashboard met standaardgegevens blijft niet lang van jou.
Certbot-pakketten installeren vaak een systemd timer voor vernieuwingen. Controleer die:
systemctl list-timers | grep certbot
sudo certbot renew --dry-run
Als je installatie geen timer aanmaakt en je de pip/virtualenv-methode van Certbot volgt, gebruiken de Certbot-instructies van EFF een cronjob zoals deze:
echo "0 0,12 * * * root /opt/certbot/bin/python -c 'import random; import time; time.sleep(random.random() * 3600)' && sudo certbot renew -q" | sudo tee -a /etc/crontab > /dev/null
Gebruik bij distro-pakketten liever de pakket-timer als die bestaat. Voer hoe dan ook sudo certbot renew --dry-run uit, zodat je weet of vernieuwing werkt voordat het certificaat bijna verloopt.
Een website toevoegen en het trackingscript installeren
Zodra je bent ingelogd, ga je naar Websites en klik je op Add website. De add-a-website guide van Umami behandelt de twee velden die ertoe doen: de naam mag alles zijn, en het domein moet het echte websitedomein zijn zodat Umami je eigen site correct uit verwijzers kan filteren.
Open na het opslaan het bewerkscherm van de website en kopieer de trackingcode. De collect data guide van Umami zegt dat je die code in de <head> van de website plaatst die je wilt meten.
De snippet ziet er ongeveer zo uit:
<script defer src="https://stat.example.com/script.js" data-website-id="YOUR-WEBSITE-ID"></script>
Bezoek je site en ga daarna terug naar het Umami-dashboard. Verschijnt er geen data, open dan de ontwikkelaarstools van je browser en controleer of script.js en /api/send-verzoeken stat.example.com bereiken. Browserextensies en agressieve contentblockers kunnen analytics-scripts blokkeren, ook als je ze zelf host.
Back-ups maken van Umami
De belangrijke gegevens van Umami staan in PostgreSQL. Maak een back-upmap en dump de database:
mkdir -p ~/services/umami/backups
cd ~/services/umami
docker exec umami-db pg_dump -U umami -d umami | gzip > backups/umami_$(date +%F).sql.gz
Kopieer dat .sql.gz-bestand naar een plek buiten de VPS. Bewaar ook een kopie van compose.yaml, want daarin staan de image, poorten en omgevingsvariabelen die je nodig hebt voor een nette restore.
Host je Umami op QDE, dan zijn dagelijkse back-ups op platformniveau een nuttige tweede laag, maar ze vervangen geen database-dump op applicatieniveau. Een dump is draagbaar. Een serversnapshot is handig. Bewaar beide.
Umami updaten
Maak eerst een back-up en update daarna vanuit de Umami-map:
cd ~/services/umami
docker compose pull
docker compose up -d
Bekijk na de update de logs:
docker compose logs -f umami
De Umami README raadt voor Docker-updates aan om de nieuwe image te pullen en de container opnieuw te maken. Lees bij major releases eerst de release notes. Analyticsdata is klein vergeleken met een fotobibliotheek, maar het blijft irritant als je die kwijtraakt omdat je de database te nonchalant behandelde.
Houd analytics dicht bij de app
Umami zelf hosten geeft je nuttige verkeerscijfers zonder bezoekersdata via Google Analytics te sturen. De onderdelen zijn gewoon: Docker voor de app en PostgreSQL, Nginx voor de publieke hostname, Certbot voor HTTPS en een kleine back-uproutine die je vanuit cron kunt draaien.
Het privacyvoordeel is het sterkst als de rest van de stack erbij past. Draai Umami op infrastructuur die je zelf beheert, houd de database in een jurisdictie die je begrijpt en voeg niet meer scripts van derden toe dan je net hebt verwijderd.
QDE biedt privacygerichte VPS-hosting in Nederland met KVM-virtualisatie, NVMe-opslag, 10 Gbps-uplinks, volledige root-toegang en dagelijkse externe back-ups. Dat is een praktische plek om Umami te draaien terwijl je analyticsdata onder je eigen beheer blijft.
Veelgestelde vragen over Umami zelf hosten
Is Umami gratis om zelf te hosten?
Ja. Umami is open source en je kunt het op je eigen server draaien. Je kosten zitten in de VPS, het domein en de tijd die je besteedt aan onderhoud.
Vervangt Umami Google Analytics?
Voor de meeste kleine en middelgrote websites wel. Umami geeft je pageviews, verwijzers, landen, apparaten, events en campagne-tracking. Het vervangt niet elke geavanceerde Google Analytics-workflow, maar het dekt de cijfers die veel site-eigenaren echt gebruiken.
Heb ik een grote VPS nodig voor Umami?
Nee. Een kleine VPS is genoeg voor een persoonlijke site of een paar websites met weinig verkeer. Meet je veel domeinen, bewaar je data lang of draai je andere services op dezelfde machine, geef PostgreSQL dan meer RAM en schijfruimte.
Waarom Umami aan 127.0.0.1 binden?
Door de container aan 127.0.0.1:3000 te binden blijft de app-poort privé. Alleen Nginx is publiek bereikbaar op poorten 80 en 443, zodat je een enkel publiek ingangspunt hebt voor TLS, headers en toegangscontrole.
Waar slaat Umami data op?
In het Compose-bestand hierboven slaat Umami analyticsdata op in PostgreSQL, en PostgreSQL schrijft zijn bestanden onder ~/services/umami/data op de host. De draagbare back-up is de pg_dump-output in plaats van de ruwe databasemap.
Wat moet ik direct na de eerste login doen?
Wijzig het standaardwachtwoord van admin. De officiële Umami-documentatie vermeldt dat het standaardaccount admin is met wachtwoord umami, en dat je dat wachtwoord direct na de eerste login moet aanpassen.

