Wer eine Webseite betreibt, will wissen, welche Seiten gelesen werden und woher die Besucher kommen. Google Analytics beantwortet das, schickt dafür aber Daten an einen Dritten und braucht in der Regel eine Einwilligung. Umami ist eine schlanke, selbst gehostete Alternative: Sie zählt Aufrufe, Quellen, Geräte und Länder, setzt keine Cookies und speichert die Daten auf deinem Server.
Aufsetzen mit Compose#
# /srv/umami/compose.yaml
services:
umami:
image: ghcr.io/umami-software/umami:postgresql-latest
restart: unless-stopped
environment:
DATABASE_URL: postgresql://umami:${DB_PASSWORT}@db:5432/umami
APP_SECRET: ${APP_SECRET}
ports:
- "127.0.0.1:3000:3000"
depends_on:
db:
condition: service_healthy
db:
image: postgres:17
restart: unless-stopped
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${DB_PASSWORT}
volumes:
- ./postgres:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U umami"]
interval: 10s
retries: 5
cd /srv/umami
printf "DB_PASSWORT=%s\nAPP_SECRET=%s\n" "$(openssl rand -hex 24)" "$(openssl rand -hex 32)" > .env
chmod 600 .env
docker compose up -d
latest ist hier der Tag, den das Projekt für die PostgreSQL-Variante dokumentiert. Wer Updates bewusst steuern will, nimmt einen Versions-Tag aus den Releases. Nach außen bringt die Oberfläche ein Reverse-Proxy mit TLS, am besten unter einer eigenen Subdomain wie statistik.example.com.
Umami legt beim ersten Start einen Administrator mit bekanntem Standardpasswort an (Benutzer admin, Passwort umami). Anmelden, Passwort unter Einstellungen → Profil ändern, bevor die Seite von außen erreichbar ist. Eine Statistik-Oberfläche mit Standardpasswort ist offen für jeden, der die Adresse errät.
Eine Webseite einbinden#
In Umami unter Einstellungen → Websites eine Seite anlegen. Umami zeigt dann ein Skript zum Einbinden:
<script defer src="https://statistik.example.com/script.js"
data-website-id="<id aus umami>"></script>
Das kommt in den <head> jeder Seite. Bei einem Werkzeug wie WordPress gibt es dafür ein Feld in den Einstellungen des Themes oder ein kleines Plugin. defer sorgt dafür, dass das Skript das Laden der Seite nicht aufhält.
Werbeblocker sperren viele Statistik-Skripte, auch selbst gehostete, oft anhand des Dateinamens. Umami erlaubt, den Namen des Skripts zu ändern (Umgebungsvariable TRACKER_SCRIPT_NAME). Ob du das tust, ist eine Abwägung: Wer einen Blocker nutzt, hat damit auch ausgedrückt, dass er nicht gezählt werden will.
Was „ohne Cookies“ rechtlich heißt#
Umami speichert nichts auf dem Gerät des Besuchers und bildet Besuche aus IP-Adresse und Browserdaten, ohne die IP-Adresse selbst abzulegen. Das senkt den Eingriff deutlich. Es heißt aber nicht, dass nichts zu beachten ist: Die Verarbeitung von IP-Adressen braucht eine Rechtsgrundlage, und die Datenschutzerklärung muss die Statistik nennen. Ob du ohne Einwilligung auskommst, hängt vom Einzelfall ab. Im Zweifel fragst du jemanden, der dafür zugelassen ist.
Praktisch: Nenne Umami in der Datenschutzerklärung, mit Zweck, Speicherort (dein Server) und Speicherdauer. Und kläre die Speicherdauer: Ohne eigenes Zutun bleiben die Daten in der Datenbank liegen.
Was du daraus lernst und was nicht#
Umami beantwortet: Welche Seiten werden aufgerufen, von wo kommen Besucher (Suchmaschine, Verweis, direkt), mit welchen Geräten, aus welchen Ländern. Es beantwortet nicht, ob jemand eine Seite zu Ende gelesen hat, und keine Fragen über einzelne Personen. Für eine Content-Seite reicht das: Du siehst, welche Themen tragen.
Eigene Ereignisse, etwa Klicks auf einen Knopf, lassen sich mit einem Attribut zählen:
<a href="/kontakt" data-umami-event="kontakt-klick">Kontakt</a>
Die Alternative ganz ohne JavaScript#
Jeder Aufruf deiner Seite steht ohnehin im Zugriffsprotokoll des Webservers. GoAccess wertet diese Protokolle aus und erzeugt daraus einen Bericht, ohne dass der Besucher ein Skript lädt:
apt install goaccess
goaccess /var/log/nginx/access.log --log-format=COMBINED -o /var/www/statistik/index.html
Vorteil: nichts im Browser, Werbeblocker spielen keine Rolle. Nachteil: Bots werden mitgezählt (GoAccess filtert die bekannten), und Informationen wie Bildschirmgröße fehlen. Die Protokolle enthalten IP-Adressen; wie lange du sie aufbewahren darfst, ist dieselbe Frage wie oben. Wie viel davon heute schon auf KI-Crawler entfällt, steht in KI-Crawler auf dem eigenen Server.
Sichern#
Alle Daten liegen in der PostgreSQL-Datenbank:
docker compose exec db pg_dump -U umami -Fc umami > umami-$(date +%F).dump
Das gehört in die normale Sicherung. Siehe Datenbank sichern und wirklich zurückspielen.
Häufige Fragen#
Kann ich mehrere Webseiten in einer Umami-Installation zählen?#
Ja, beliebig viele. Jede bekommt ihre eigene data-website-id. Für jede Seite kannst du einen öffentlichen Freigabe-Link erzeugen.
Wie viel Last erzeugt das?#
Für kleine und mittlere Seiten wenig. Jeder Seitenaufruf ist ein kleiner Eintrag in der Datenbank. Bei sehr großen Seiten wächst vor allem die Datenbank; dann lohnt eine Aufbewahrungsgrenze.
Umami oder Plausible?#
Beide verfolgen denselben Ansatz. Plausible gibt es als Bezahldienst und als selbst gehostete Community-Ausgabe, die mehr Container mitbringt. Umami ist im Selbstbetrieb schlanker. Für eine einzelne Seite ist beides mehr als genug.
Zählt Umami auch Bots?#
Bekannte Bots werden herausgefiltert. Da das Skript im Browser läuft, zählen Crawler, die kein JavaScript ausführen, ohnehin nicht mit.
Kurz gesagt#
- Umami zählt Aufrufe ohne Cookies und ohne Dritte, auf deinem Server.
- Standardpasswort
admin/umamisofort ändern. - Cookielos heißt nicht pflichtenlos: Datenschutzerklärung anpassen, Speicherdauer festlegen.
- Ohne JavaScript: GoAccess wertet die Protokolle des Webservers aus.
- Die Datenbank gehört in die Sicherung.
Geschrieben aus dem laufenden Betrieb: MRMedia betreibt eigene Proxmox- Hosts, einen Backup-Server und Kundendienste in der EU. Fehler in einer Anleitung sind Fehler im eigenen Betrieb. Korrekturen bitte über Discord.