Umami mit Docker installieren: Schritt-für-Schritt-Anleitung
Mit Umami betreiben Sie eine datenschutzorientierte Webanalyse auf Ihrem eigenen Server und behalten die Kontrolle über die erhobenen Analysedaten. Diese Anleitung zeigt Schritt für Schritt, wie Sie Umami mithilfe von Docker, PostgreSQL und einer verschlüsselten HTTPS-Verbindung auf einem VPS installieren.
Schritt 1: Passenden Server für Umami auswählen
Für die selbst gehostete Version von Umami benötigen Sie einen virtuellen privaten Server, kurz VPS. Dabei handelt es sich um einen dauerhaft mit dem Internet verbundenen Computer, den Sie über eine Kommandozeile verwalten. Für Umami selbst müssen Sie keine kostenpflichtige Softwarelizenz abschließen. Das Projekt steht unter der MIT-Lizenz. Kosten entstehen daher vor allem für den VPS, eine optionale Domain und gegebenenfalls zusätzliche Backups.
Die benötigte Serverleistung hängt davon ab, wie viele Websites Sie erfassen, wie stark diese besucht werden und wie lange Sie die Analysedaten speichern möchten. Die folgende Übersicht orientiert sich an aktuell verfügbaren VPS-Leistungsstufen. Die Angaben sind als leicht verständliche Ausgangspunkte und nicht als feste Kapazitätsgrenzen zu verstehen.
| Anwendungsfall | Geeignete Serverleistung | Einordnung |
|---|---|---|
| Kleine private Website, Portfolio oder einzelner Blog | 2 vCores, 2 GB RAM, 90 GB NVMe-Speicher | Ausreichend für eine einfache Umami-Installation mit überschaubarem Datenaufkommen |
| Kleine Unternehmenswebsite oder mehrere kleinere Projekte | 4 vCores, 4 GB RAM, 120 GB NVMe-Speicher | Empfehlenswerter Einstieg, wenn Umami dauerhaft produktiv eingesetzt werden soll |
| Gut besuchter Onlineshop, Nachrichtenportal oder mehrere Kundenwebsites | 6 vCores, 8 GB RAM, 240 GB NVMe-Speicher | Mehr Reserven für viele gleichzeitige Zugriffe, längere Datenspeicherung und umfangreichere Auswertungen |
| Agentur, umfangreiche Ereignisdaten und viele Websites | 8 vCores, 16 GB RAM, 480 GB NVMe-Speicher | Geeignet für größere Datenbestände und zusätzliche Analysefunktionen |
Für die meisten kleinen Unternehmen ist die Variante mit 4 vCores, 4 GB RAM und 120 GB NVMe-Speicher ein sinnvoller Ausgangspunkt. Ein Upgrade auf eine größere Serverstufe ist später möglich, falls Speicherverbrauch oder Auslastung deutlich ansteigen.
Zusätzlich benötigen Sie:
- ein 64-Bit-Linux-System,
- einen User mit Administratorrechten,
- eine öffentliche IPv4-Adresse,
- eine Domain oder Subdomain wie analytics.example.de,
- einen Computer mit Terminal beziehungsweise SSH-Programm,
- Zugriff auf die DNS-Einstellungen Ihrer Domain.
Lassen Sie sich von den Vorteilen überzeugen. Probieren Sie Ihren Virtual Server ganz in Ruhe 30 Tage lang aus!
Schritt 2: VPS mit Ubuntu bereitstellen und Netzwerkzugänge festlegen
Erstellen Sie im Verwaltungsbereich Ihres Hosting-Anbieters einen neuen VPS. Wählen Sie als Betriebssystem Ubuntu 24.04 LTS oder 26.04 LTS in der 64-Bit-Version. Diese Versionen werden offiziell von Docker unterstützt und sind für eine produktive Installation gut geeignet.
Wenn der Anbieter die Anmeldung mit einem SSH-Schlüssel ermöglicht, sollten Sie diese Variante einem reinen Passwortzugang vorziehen. Der öffentliche Teil des Schlüssels wird beim Server hinterlegt. Der private Schlüssel bleibt ausschließlich auf Ihrem Computer und darf nicht weitergegeben werden.
Öffnen Sie in der Firewall des Hosting-Anbieters nur die tatsächlich benötigten eingehenden Verbindungen:
| Port | Protokoll | Zweck |
|---|---|---|
| 22 | TCP | Anmeldung am Server über SSH |
| 80 | TCP | Unverschlüsselte HTTP-Verbindung und Ausstellung des TLS-Zertifikats |
| 443 | TCP | Verschlüsselte HTTPS-Verbindung |
| 443 | UDP | Optionales HTTP/3 über den eingesetzten Webserver |

Die später intern verwendeten Ports 3000 für Umami und 5432 für PostgreSQL dürfen nicht öffentlich freigegeben werden. Beide Dienste kommunizieren ausschließlich innerhalb des Docker-Netzwerks. Notieren Sie nach der Bereitstellung die öffentliche IP-Adresse und den Namen des administrativen Users.
Schritt 3: Über SSH mit dem Server verbinden
Öffnen Sie auf Ihrem Computer ein Terminal. Unter macOS und Linux ist bereits ein SSH-Programm vorhanden. Unter aktuellen Windows-Versionen können Sie SSH in der PowerShell oder im Windows Terminal verwenden.
Geben Sie folgenden Befehl ein und ersetzen Sie die beiden Platzhalter:
ssh SERVERBENUTZER@SERVER_IPbashBei der ersten Verbindung erscheint eine Rückfrage zum Fingerabdruck des Servers. Kontrollieren Sie nach Möglichkeit, ob der angezeigte Fingerabdruck mit der Angabe Ihres Hosting-Anbieters übereinstimmt. Bestätigen Sie die Verbindung anschließend mit yes.
Aktualisieren Sie nach der Anmeldung zunächst die Paketlisten und die bereits installierte Software:
sudo apt update
sudo apt upgrade -ybashDer erste Befehl lädt Informationen zu verfügbaren Paketen. Der zweite Befehl installiert die Aktualisierungen. Falls während der Aktualisierung ein neuer Systemkern installiert wurde, starten Sie den Server neu:
sudo rebootbashDie SSH-Verbindung wird dadurch getrennt. Warten Sie kurz, bis der Server wieder erreichbar ist, und melden Sie sich danach erneut mit dem SSH-Befehl an.
Schritt 4: Docker und Docker Compose installieren
Docker führt Anwendungen in voneinander getrennten Containern aus. Für diese Installation werden drei Container verwendet:
- Umami stellt die Weboberfläche und die Analysefunktionen bereit.
- PostgreSQL speichert die erfassten Daten.
- Caddy nimmt Webanfragen entgegen und stellt die verschlüsselte HTTPS-Verbindung her.
Docker Compose beschreibt alle drei Container in einer gemeinsamen Konfigurationsdatei. Dadurch lässt sich die vollständige Installation später mit wenigen Befehlen starten, stoppen und aktualisieren.
Installieren Sie zunächst die benötigten Hilfsprogramme:
sudo apt update
sudo apt install -y ca-certificates curlbashLegen Sie anschließend den Speicherort für den offiziellen Docker-Schlüssel an:
sudo install -m 0755 -d /etc/apt/keyringsbashLaden Sie den Signaturschlüssel des offiziellen Docker-Paketarchivs herunter:
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg \
-o /etc/apt/keyrings/docker.ascbashErlauben Sie dem Paketmanager, den Schlüssel zu lesen:
sudo chmod a+r /etc/apt/keyrings/docker.ascbashFügen Sie danach das offizielle Docker-Paketarchiv hinzu:
sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOFbashAktualisieren Sie die Paketlisten erneut:
sudo apt updatebashInstallieren Sie nun Docker Engine, die Kommandozeilenwerkzeuge und das Docker-Compose-Plug-in:
sudo apt install -y \
docker-ce \
docker-ce-cli \
containerd.io \
docker-buildx-plugin \
docker-compose-pluginbashAktivieren und starten Sie Docker:
sudo systemctl enable --now dockerbashÜberprüfen Sie die Installation mit einem Testcontainer:
sudo docker run hello-worldbashErscheint eine Erfolgsmeldung, funktioniert Docker.

Kontrollieren Sie zusätzlich Docker Compose:
sudo docker compose versionbash
Schritt 5: Domain oder Subdomain mit dem Server verbinden
Um Umami später über eine leicht merkbare und verschlüsselte Adresse aufzurufen, sollten Sie eine Subdomain verwenden. Öffnen Sie die DNS-Verwaltung der betreffenden Domain. Erstellen Sie dort einen A-Record mit folgenden Angaben:
| Einstellung | Beispiel |
|---|---|
| Typ | A |
| Hostname | analytics |
| Ziel beziehungsweise Wert | Öffentliche IPv4-Adresse des VPS |
| TTL | Standardwert oder beispielsweise 3600 Sekunden |
Verfügt Ihr Server zusätzlich über eine korrekt konfigurierte öffentliche IPv6-Adresse, können Sie ergänzend einen AAAA-Record anlegen. Die Änderung kann abhängig vom bisherigen TTL-Wert einige Zeit benötigen. Prüfen Sie auf dem Server, ob die Domain bereits auf die richtige IP-Adresse verweist:
getent hosts analytics.example.debashErsetzen Sie analytics.example.de durch Ihre tatsächliche Subdomain. Die Ausgabe sollte die IP-Adresse Ihres Servers enthalten.
Caddy kann ein öffentlich anerkanntes TLS-Zertifikat automatisch ausstellen, wenn der DNS-Eintrag auf den Server zeigt und die Ports 80 sowie 443 von außen erreichbar sind. Caddy erneuert das Zertifikat später ebenfalls automatisch und leitet unverschlüsselte HTTP-Aufrufe auf HTTPS um.
Schritt 6: Verzeichnis und sichere Zugangsdaten für Umami erstellen
Legen Sie ein eigenes Verzeichnis für die Installation an:
sudo mkdir -p /opt/umami
sudo chown "$USER":"$USER" /opt/umami
cd /opt/umamibashIn diesem Verzeichnis werden die Docker-Konfiguration, die HTTPS-Konfiguration und die geheimen Zugangsdaten gespeichert. Installieren Sie das Werkzeug OpenSSL, falls es noch nicht vorhanden ist:
sudo apt install -y opensslbashErzeugen Sie anschließend ein zufälliges sicheres Datenbankpasswort, einen geheimen Anwendungsschlüssel sowie einen separaten Schlüssel für die optionale Zwei-Faktor-Authentifizierung:
DB_PASSWORD=$(openssl rand -hex 24)
UMAMI_SECRET=$(openssl rand -hex 32)
TWO_FACTOR_KEY=$(openssl rand -hex 32)bashSpeichern Sie diese drei Werte in einer Datei namens .env:
printf "POSTGRES_PASSWORD=%s\nAPP_SECRET=%s\nTWO_FACTOR_ENCRYPTION_KEY=%s\n" \
"$DB_PASSWORD" "$UMAMI_SECRET" "$TWO_FACTOR_KEY" > .envbashEntfernen Sie die temporären Variablen danach aus der aktuellen Terminalsitzung:
unset DB_PASSWORD UMAMI_SECRET TWO_FACTOR_KEYbashBeschränken Sie den Zugriff auf die Datei:
chmod 600 .envbashVeröffentlichen Sie die .env-Datei niemals. Das APP_SECRET schützt unter anderem die von Umami verwendeten Anmeldetoken.
Schritt 7: Docker-Compose-Datei für Umami erstellen
Erstellen Sie im Verzeichnis /opt/umami eine neue Datei:
nano compose.ymlbashFügen Sie den folgenden Inhalt ein:
services:
db:
image: postgres:15-alpine
restart: unless-stopped
environment:
POSTGRES_DB: umami
POSTGRES_USER: umami
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
volumes:
- umami_db_data:/var/lib/postgresql/data
healthcheck:
test:
- CMD-SHELL
- pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}
interval: 5s
timeout: 5s
retries: 10
umami:
image: ghcr.io/umami-software/umami:latest
restart: unless-stopped
init: true
environment:
DATABASE_URL: postgresql://umami:${POSTGRES_PASSWORD}@db:5432/umami
APP_SECRET: ${APP_SECRET}
TWO_FACTOR_ENCRYPTION_KEY: ${TWO_FACTOR_ENCRYPTION_KEY}
depends_on:
db:
condition: service_healthy
expose:
- "3000"
healthcheck:
test:
- CMD-SHELL
- curl -f http://localhost:3000/api/heartbeat || exit 1
interval: 10s
timeout: 5s
retries: 10
caddy:
image: caddy:2-alpine
restart: unless-stopped
ports:
- "80:80"
- "443:443"
- "443:443/udp"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
depends_on:
umami:
condition: service_healthy
volumes:
umami_db_data:
caddy_data:
caddy_config:yaml
Der Abschnitt volumes sorgt dafür, dass die Datenbank nicht zusammen mit dem Container gelöscht wird. Ein Container kann dadurch aktualisiert oder neu erstellt werden, ohne dass die gespeicherten Analysedaten verloren gehen.
Die Einträge unter expose machen Port 3000 nur innerhalb des Docker-Netzes erreichbar. Die Datenbank besitzt überhaupt keine öffentliche Portfreigabe. Entscheidend ist, dass der Umami-Dienst keinen Eintrag unter ports besitzt. Port 3000 kann daher nicht direkt über die öffentliche IP-Adresse des VPS aufgerufen werden. Von außen sind lediglich die für Caddy vorgesehenen Ports 80 und 443 erreichbar.
Schritt 8: HTTPS-Proxy mit Caddy konfigurieren
Erstellen Sie die Caddy-Konfiguration:
nano CaddyfilebashFügen Sie folgenden Inhalt ein und ersetzen Sie die Beispieldomain:
analytics.example.de {
encode zstd gzip
reverse_proxy umami:3000
}txt
Speichern und schließen Sie die Datei wieder. Der Eintrag reverse_proxy umami:3000 bedeutet, dass Caddy eingehende Anfragen an den Umami-Container weiterleitet. Die Bezeichnung umami entspricht dem Servicenamen aus der Compose-Datei. Docker löst diesen Namen automatisch innerhalb des gemeinsamen Netzwerks auf.
Sobald Caddy mit einer öffentlichen Domain gestartet wird, versucht es automatisch, ein gültiges TLS-Zertifikat auszustellen. Dafür müssen der DNS-Eintrag stimmen und die Ports 80 sowie 443 erreichbar sein.
Kontrollieren Sie, ob alle benötigten Dateien vorhanden sind:
ls -labashDie Ausgabe sollte mindestens folgende Dateien enthalten:
.envCaddyfilecompose.yml

Schritt 9: Umami-Container starten und Installation prüfen
Lassen Sie Docker Compose zunächst überprüfen, ob die Konfiguration gültig ist:
sudo docker compose config -qbashDer Befehl prüft die Compose-Konfiguration auf Fehler, ohne die aufgelösten Konfigurationswerte im Terminal auszugeben. Laden Sie anschließend die benötigten Container-Images herunter:
sudo docker compose pullbashStarten Sie die vollständige Installation im Hintergrund:
sudo docker compose up -dbashDocker erstellt nun das gemeinsame Netzwerk, das PostgreSQL-Volume und die drei Container. Prüfen Sie anschließend den Status:
sudo docker compose psbashNach der Startphase sollten der Datenbank- und der Umami-Container als healthy angezeigt werden. Der Caddy-Container sollte den Status Up besitzen.
Öffnen Sie danach Ihre Umami-Adresse im Browser:
https://analytics.example.debashBeim ersten Start kann die Ausstellung des Zertifikats einen kurzen Moment dauern. Danach sollte die Umami-Anmeldeseite über eine verschlüsselte HTTPS-Verbindung erscheinen.

Schritt 10: Zum ersten Mal bei Umami anmelden
Die offizielle Docker-Installation erstellt standardmäßig folgendes Administratorkonto:
- Benutzername: admin
- Passwort: umami

Diese Standardzugangsdaten sind öffentlich bekannt und müssen daher unmittelbar geändert werden. Melden Sie sich an und öffnen Sie anschließend über das Benutzermenü die Einstellungen beziehungsweise das Profil. Ändern Sie dort das Kennwort des Administratorkontos und verwenden Sie dazu ein langes, sicheres Passwort, das Sie nicht für andere Dienste einsetzen.

Optional können Sie zusätzlich die Zwei-Faktor-Authentifizierung aktivieren. Öffnen Sie dazu die Einstellungen und wechseln Sie zu „Security“. Dort lässt sich 2FA mit einer Authenticator-App einrichten. Bewahren Sie die anschließend erzeugten Backup-Codes sicher auf.
Kontrollieren Sie außerdem, ob die in Umami angezeigte Zeitzone zu Ihrem Standort passt. Eine korrekte Zeitzone ist wichtig, damit Tageswerte und zeitliche Auswertungen richtig dargestellt werden.
- NEU: Flexibel skalieren mit VM-Cloning, Load Balancing, neuen Storage-Optionen und mehr
- Unbegrenzt Traffic, > 99,99% Verfügbarkeit
- 24/7 Experten-Support mit persönlichem Berater
Schritt 11: Erste Website in Umami hinzufügen
Öffnen Sie in Umami den Bereich Websites und wählen Sie die Funktion zum Hinzufügen einer neuen Website. Tragen Sie einen verständlichen Namen und die Domain der zu analysierenden Website ein. Geben Sie die Domain ohne Pfad ein. Nutzen Sie die Schreibweise, unter der die Website tatsächlich erreichbar ist.

Speichern Sie die Website. Öffnen Sie danach die Bearbeitungsansicht und suchen Sie den Abschnitt Tracking code. Umami erzeugt dort automatisch einen individuellen Code mit einer Website-ID, den Sie einfach kopieren können.

Seit Umami 3.1 lassen sich zusätzlich Core Web Vitals erfassen. Dafür ergänzen Sie im Code data-performance="true":
<script
defer
src="https://analytics.example.de/script.js"
data-website-id="IHRE-WEBSITE-ID"
data-domains="example.de,www.example.de"
data-performance="true"
></script>htmlDamit kann Umami unter anderem LCP, INP, CLS, FCP und TTFB auswerten.
Bei WordPress können Sie den Code über ein geeignetes Header-Plug-in oder über die Theme-Konfiguration einfügen. Bei statischen Websites gehört er direkt in den <head>-Abschnitt der HTML-Datei. In Frameworks mit clientseitigem Routing wie React, Vue oder Angular kann der Tracking-Code direkt eingebunden werden. Bei Next.js empfiehlt sich die Einbindung über die integrierte next/script-Komponente, damit das Script korrekt in die Anwendung integriert wird.
Damit ist die Umami-Installation vollständig eingerichtet. Die Anwendung läuft in getrennten Docker-Containern, die PostgreSQL-Datenbank ist nicht öffentlich erreichbar und Caddy stellt automatisch eine verschlüsselte HTTPS-Verbindung bereit.
Schritt 12: Backup und Wiederherstellung
Ein Docker-Volume ersetzt kein Backup. Sichern Sie die PostgreSQL-Datenbank daher regelmäßig und bewahren Sie die Sicherung außerhalb des VPS auf:
sudo docker compose exec -T db \
pg_dump -U umami -d umami -Fc > umami-backup.dumpbashDieser Befehl sichert nur die Datenbank. Bewahren Sie zusätzlich compose.yml, Caddyfile und die geheimen Werte aus .env sicher auf. Diese Dateien werden für eine vollständige Wiederherstellung der Installation benötigt.
Prüfen Sie die Wiederherstellung zunächst in einer Testinstallation. Wenn Sie eine bestehende Installation wiederherstellen, halten Sie Umami vorher an:
sudo docker compose stop umamibashDer folgende Befehl löscht die im Backup enthaltenen Datenbankobjekte in der Zieldatenbank und stellt sie aus der Sicherung wieder her. Daten, die seit dem Backup hinzugekommen sind, gehen dabei verloren:
sudo docker compose exec -T db \
pg_restore -U umami -d umami --clean --if-exists --no-owner \
< umami-backup.dumpbashStarten Sie Umami anschließend erneut:
sudo docker compose start umamibashDie Sicherungsdatei umami-backup.dump liegt bei diesen Befehlen im aktuellen Verzeichnis. Denken Sie daher daran, die genannten Befehle im Installationsverzeichnis /opt/umami auszuführen.