stats.deinedomain.de anlegen kannst. 1 GB freier Arbeitsspeicher reicht völlig.So funktioniert Umami#
Umami besteht aus zwei Teilen: der Weboberfläche mit dem Tracking-Skript und einer PostgreSQL-Datenbank. Besucht jemand deine Webseite, läuft im Hintergrund Folgendes ab:
- Deine Seite lädt ein kleines Skript von
stats.deinedomain.de/script.js. - Das Skript meldet bei jedem Seitenaufruf an Umami, welche Seite aufgerufen wurde, woher der Besucher kam, welchen Browser und welches Land er hat.
- Umami speichert das in der Datenbank und zeigt es dir als übersichtliches Dashboard an.
Weil das Skript im Browser deiner Besucher läuft, muss Umami öffentlich und per HTTPS erreichbar sein. Ein reiner Zugriff im lokalen Netz oder über einen SSH-Tunnel reicht hier nicht.
DNS-Eintrag anlegen#
Leg bei deinem DNS-Anbieter einen A-Record für die Subdomain an, zum Beispiel stats, der auf die IP-Adresse deines Servers zeigt. Ohne diesen Eintrag kann Traefik kein Zertifikat holen, und Umami ist nicht erreichbar.
Prüfen kannst du den Eintrag so:
nslookup stats.deinedomain.deDocker installieren#
System aktualisieren#
apt update && apt upgrade -y && apt install ca-certificates curl -yDocker-Paketquelle einrichten#
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/debian/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/debian $(. /etc/os-release && echo "$VERSION_CODENAME") stable" > /etc/apt/sources.list.d/docker.listDocker und Docker Compose installieren#
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -yDockge installieren#
Dockge einrichten#
Dockge ist eine Weboberfläche, mit der du Docker-Compose-Stacks bequem im Browser verwaltest. Dieser Befehl legt die Verzeichnisse an und startet Dockge:
mkdir -p /opt/stacks /opt/dockge && cd /opt/dockge && curl -fsSL https://raw.githubusercontent.com/louislam/dockge/master/compose.yaml -o compose.yaml && docker compose up -dDockge öffnen#
Öffne Dockge im Browser und lege direkt dein Admin-Konto an:
http://IP-deines-Servers:5001Umami einrichten#
Stack anlegen#
Klicke in Dockge auf + Compose und gib unter Allgemein den Stack-Namen umami ein. Arbeitest du ohne Dockge, legst du den Ordner selbst an:
mkdir -p /opt/stacks/umami && cd /opt/stacks/umamicompose.yaml einfügen#
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
container_name: umami
restart: unless-stopped
environment:
DATABASE_URL: postgresql://umami:${DB_PASSWORD}@db:5432/umami
APP_SECRET: ${APP_SECRET}
depends_on:
db:
condition: service_healthy
labels:
- traefik.enable=true
- traefik.http.routers.umami.rule=Host(`${DOMAIN}`)
- traefik.http.routers.umami.entrypoints=websecure
- traefik.http.routers.umami.tls.certresolver=${CERTRESOLVER}
- traefik.http.services.umami.loadbalancer.server.port=3000
networks:
- proxy
- default
db:
image: postgres:16-alpine
container_name: umami-db
restart: unless-stopped
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${DB_PASSWORD}
volumes:
- ./data:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami -d umami"]
interval: 5s
timeout: 5s
retries: 5
networks:
- default
networks:
proxy:
external: trueEin paar Details zum Aufbau:
- Kein offener Port: Umami lauscht intern auf Port 3000. Traefik leitet die Anfragen im Docker-Netzwerk weiter, deshalb gibt es keinen
ports-Eintrag. Port 3000 kommt so auch anderen Diensten wie Grafana nicht in die Quere. - Datenbank nur intern: PostgreSQL hängt nur im internen Netzwerk
defaultund ist von außen nicht erreichbar. - Daten im Stack-Ordner: Die Datenbank liegt im Ordner
./datadirekt neben dercompose.yaml. Zum Umziehen auf einen anderen Server kopierst du einfach den ganzen Stack-Ordner.
Umgebungsvariablen in der .env festlegen#
Trag unten rechts im Feld für die .env diese Werte ein:
DOMAIN=stats.deinedomain.de
CERTRESOLVER=letsencrypt
DB_PASSWORD=hier-ein-zufallswert
APP_SECRET=hier-ein-zweiter-zufallswertSichere Zufallswerte für die beiden Passwörter erzeugst du so:
openssl rand -hex 24
openssl rand -hex 32proxy) und des Certresolvers stehen in deiner Traefik-Konfiguration. Stimmt der Certresolver nicht, bekommt Umami kein Zertifikat, und im Traefik-Log steht Router uses a nonexistent certificate resolver. Den richtigen Namen findest du bei einem anderen Container, bei dem HTTPS schon funktioniert, hinter tls.certresolver=.Stack starten#
Klicke auf Speichern und dann auf Deploy. Ohne Dockge startest du den Stack so:
docker compose up -dBeim ersten Start legt Umami die Datenbanktabellen an. Im Log siehst du dann All migrations have been successfully applied und kurz darauf Ready:
docker logs umami --tail 20Nutzt Traefik bei dir die DNS-Prüfung für Zertifikate, steht im Traefik-Log eine Weile Waiting for record. Das ist normal, nach ein bis zwei Minuten ist das Zertifikat da.
Erste Anmeldung#
Öffne https://stats.deinedomain.de und melde dich mit den Standardzugangsdaten an:
- Benutzername:
admin - Passwort:
umami
Ändere das Passwort sofort unter Profil. Bis dahin kann sich jeder mit diesen Daten anmelden.
Unauthorized, ist deine Anmeldung nicht mehr gültig, etwa nach einer Passwortänderung oder einem Neustart des Containers. Melde dich einmal ab und wieder an oder öffne die Seite in einem privaten Fenster.Webseite hinzufügen#
- Gehe zu Einstellungen → Websites → Website hinzufügen.
- Name: zum Beispiel den Namen deiner Seite
- Domain: deine Webseite ohne
https://, also etwawww.deinedomain.de - Speichere und klicke anschließend bei der Webseite auf Bearbeiten.
Dort findest du die Website-ID, eine lange Zeichenkette wie a1b2c3d4-.... Die brauchst du gleich für die Einbindung.
Umami in die Webseite einbinden#
Mit Hugo und Blowfish#
Blowfish hat Umami bereits eingebaut. Du trägst nur die Website-ID und die Adresse deines Umami-Servers in config/_default/params.toml ein:
[umamiAnalytics]
websiteid = "DEINE-WEBSITE-ID"
domain = "stats.deinedomain.de"
scriptName = "script.js"
enableTrackEvent = true- domain: die Adresse deines Umami-Servers, ohne
https:// - scriptName: der Name des Tracking-Skripts, normalerweise
script.js - enableTrackEvent: zählt zusätzlich Klicks, die du später unter Ereignisse siehst
Baue die Seite danach neu und lade sie hoch.
Bei jeder anderen Webseite#
Bei WordPress, eigenen HTML-Seiten oder anderen Systemen fügst du diese Zeile in den <head>-Bereich ein. Den fertigen Code zeigt dir Umami auch unter Bearbeiten → Tracking-Code an:
<script defer src="https://stats.deinedomain.de/script.js" data-website-id="DEINE-WEBSITE-ID"></script>Testen#
Ruf deine Webseite auf und öffne in Umami die Ansicht Echtzeit. Dein Besuch sollte nach wenigen Sekunden erscheinen. Taucht nichts auf, prüfe:
- Blockiert ein Werbeblocker im Browser das Skript? Teste in einem anderen Browser oder privaten Fenster.
- Lädt das Skript? Öffne
https://stats.deinedomain.de/script.jsdirekt im Browser. - Stimmt die Website-ID genau?
Datenschutz#
Umami setzt keine Cookies, speichert keine vollständigen IP-Adressen und erstellt keine Profile über mehrere Webseiten hinweg. Deshalb brauchst du für Umami in der Regel kein Cookie-Banner. Weil du trotzdem Besucherdaten auswertest, gehört ein Abschnitt zu Umami in deine Datenschutzerklärung. Generatoren wie die von eRecht24 oder Dr. Schwenke haben dafür fertige Textbausteine.
Speicherbedarf#
Umami ist sehr sparsam. Ein Seitenaufruf belegt in der Datenbank grob ein halbes bis ein Kilobyte. Ein Blog mit 100 Aufrufen am Tag kommt im Jahr auf etwa 20 bis 50 MB, selbst bei 10.000 Aufrufen täglich sind es nur wenige Gigabyte. Wie groß der Datenordner gerade ist, siehst du so:
du -sh /opt/stacks/umami/dataPorts und Firewall#
Von außen müssen nur die Ports deines Reverse Proxys offen sein:
| Port | Zweck |
|---|---|
| 443 | HTTPS, darüber läuft Umami |
| 80 | HTTP, für die Weiterleitung auf HTTPS und Let’s Encrypt |
| 22 | SSH für deine Verwaltung |
Port 3000 von Umami und 5432 von PostgreSQL gibst du nicht frei.
Backup#
Sichere die Datenbank regelmäßig mit einem Dump. Das ist zuverlässiger, als den laufenden Datenordner zu kopieren:
docker exec umami-db pg_dump -U umami umami | gzip > umami-backup-$(date +%F).sql.gzWiederherstellen kannst du den Dump so:
gunzip -c umami-backup-DATUM.sql.gz | docker exec -i umami-db psql -U umami umamiUmami aktualisieren#
In Dockge klickst du im Stack auf Aktualisieren. Per Kommandozeile:
cd /opt/stacks/umami
docker compose pull && docker compose up -dMach vorher ein Backup. Neue Versionen passen beim Start automatisch die Datenbank an.
Häufige Probleme#
Seite nicht erreichbar: Prüfe mit nslookup, ob der DNS-Eintrag auf deinen Server zeigt, und mit docker ps, ob beide Container laufen.
Zertifikatsfehler im Browser: Schau ins Log von Traefik:
docker logs traefik --tail 30 | grep -i -E "acme|certificate|error"Meist ist der Name des Certresolvers falsch oder der DNS-Eintrag noch nicht aktiv.
Umami startet ständig neu: Prüfe mit docker logs umami und free -h, ob ein Fehler auftritt oder der Arbeitsspeicher knapp ist. Hilft das nicht, entferne den Container und starte den Stack neu. Die Daten bleiben dabei im Ordner ./data erhalten.

