In dieser Anleitung zeige ich euch, wie ihr innerhalb weniger Minuten Uptime Kuma mittels Docker und Traefik bereitstellen könnt.
Bei Uptime Kuma handelt es sich um ein Monitoring Tool, das eure Webseiten oder Dienste überwachen und euch bei einem Ausfall informieren kann (z.B. per Mail).
Updates
| Datum | Änderungen |
|---|---|
| 07.09.2022 | Docker-Socket für Docker-Monitoring (ab Version 1.18) hinzugefügt |
| 01.06.2023 | Anpassungen an neue Traefik Labels @christian |
| 02.09.2026 | Update auf Uptime Kuma 2. Danke an @wuldorf |
| 06.09.2026 | CrowdSec Whitelist hinzugefügt |
1. Vorraussetzung
- Docker mit Docker Compose installiert (Anleitung für Ubuntu / Debian)
- Traefik ab v3.6 mit CrowdSec installieren und konfigurieren
2. Verzeichnis anlegen
Als ersten Schritt legen wir uns ein Verzeichnis für Uptime Kuma an:
mkdir -p /opt/containers/uptime
3. Anlegen der docker-compose.yml
nano /opt/containers/uptime/docker-compose.yml
Inhalt der docker-compose.yml
services:
uptime-kuma:
image: louislam/uptime-kuma:2
container_name: uptime-kuma
restart: unless-stopped
volumes:
- ./data:/app/data
labels:
- "traefik.enable=true"
- "traefik.http.routers.uptime.entrypoints=websecure"
- "traefik.http.routers.uptime.rule=Host(`uptime.euredomain.de`)"
- "traefik.http.routers.uptime.tls=true"
- "traefik.http.routers.uptime.tls.certresolver=http_resolver"
- "traefik.http.routers.uptime.service=uptime"
- "traefik.http.services.uptime.loadbalancer.server.port=3001"
- "traefik.docker.network=proxy"
- "traefik.http.routers.uptime.middlewares=default@file"
networks:
- proxy
networks:
proxy:
external: trueCode-Sprache: JavaScript (javascript)
Notwendige Anpassungen:
- Eure Domain bei Traefik anpassen (“uptime.euredomain.de”)
4. CrowdSec AppSec Whitelist (optional)
Wenn ihr AppSec verwendet, dann müsst ihr noch eine Whitelist erstellen, da ihr sonst innerhalb weniger Sekunden gebannt seid.
Erstellt dazu folgende Datei:
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/appsec-rules/uptime-kuma-whitelist.yaml
Inhalt:
name: custom/uptime-kuma-whitelist
description: "Whitelist fuer Uptime Kuma - Socket.IO, Push-API, Badges, Status-Pages"
seclang_rules:
- "SecRule REQUEST_URI \"@beginsWith /socket.io/\" \"id:19001,phase:1,pass,nolog,noauditlog,ctl:ruleRemoveById=920420,msg:'Uptime Kuma: Content-Type-Whitelist socket.io'\""
- "SecRule REQUEST_URI \"@beginsWith /socket.io/\" \"id:19002,phase:2,pass,nolog,noauditlog,ctl:ruleRemoveById=949110,ctl:ruleRemoveById=980170,msg:'Uptime Kuma: Anomaly-Whitelist socket.io'\""
- "SecRule REQUEST_URI \"@beginsWith /api/push/\" \"id:19003,phase:2,pass,nolog,noauditlog,ctl:ruleRemoveById=949110,ctl:ruleRemoveById=980170,msg:'Uptime Kuma: Anomaly-Whitelist Push-API'\""
- "SecRule REQUEST_URI \"@beginsWith /api/badge/\" \"id:19004,phase:2,pass,nolog,noauditlog,ctl:ruleRemoveById=949110,ctl:ruleRemoveById=980170,msg:'Uptime Kuma: Anomaly-Whitelist Badge-API'\""
- "SecRule REQUEST_URI \"@beginsWith /api/status-page/\" \"id:19005,phase:2,pass,nolog,noauditlog,ctl:ruleRemoveById=949110,ctl:ruleRemoveById=980170,msg:'Uptime Kuma: Anomaly-Whitelist Status-Page-API'\""Code-Sprache: JavaScript (javascript)
Anschließend fügt ihr diese noch der Konfiguration hinzu:
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/appsec-configs/mrks-config.yaml
Inhalt:
name: custom/mrks-config
default_remediation: ban
inband_rules:
- custom/uptime-kuma-whitelist # <--- neu hinzugefuegt
- custom/freescout-whitelist
- crowdsecurity/base-config
.
.
.Code-Sprache: HTTP (http)
Jetzt müsst ihr noch die IP des Servers selbst freigeben, da sonst Uptime sich selbst bannt.
nano /opt/containers/traefik-crowdsec-stack/data/crowdsec/config/parsers/s02-enrich/uptime-kuma-selfcheck.yaml
Inhalt:
name: custom/uptime-kuma-selfcheck
description: "Eigene Server-IP nicht sperren - Uptime Kuma prueft eigene Dienste per Hairpin"
whitelist:
reason: "Uptime Kuma Self-Monitoring ueber die oeffentliche IP"
ip:
- "PLACEHOLDER_IPV4"
- "PLACEHOLDER_IPV6"Code-Sprache: JavaScript (javascript)
Jetzt führen wir nachfolgenden Code aus, damit die Platzhalter durch die echte IP des Servers ersetzt werden:
FILE=/opt/containers/traefik-crowdsec-stack/data/crowdsec/config/parsers/s02-enrich/uptime-kuma-selfcheck.yaml
IPV4=$(curl -4 -s --max-time 5 https://ipv4.icanhazip.com | tr -d '[:space:]')
IPV6=$(curl -6 -s --max-time 5 https://ipv6.icanhazip.com | tr -d '[:space:]')
if [ -z "$IPV4" ] && [ -z "$IPV6" ]; then
echo "FEHLER: Keine oeffentliche IP ermittelbar. Datei bleibt unveraendert."
else
if [ -n "$IPV4" ]; then
sed -i "s|PLACEHOLDER_IPV4|$IPV4|" "$FILE"
echo "IPv4 eingetragen: $IPV4"
else
sed -i '/PLACEHOLDER_IPV4/d' "$FILE"
echo "Keine IPv4 ermittelt - Zeile entfernt"
fi
if [ -n "$IPV6" ]; then
sed -i "s|PLACEHOLDER_IPV6|$IPV6|" "$FILE"
echo "IPv6 eingetragen: $IPV6"
else
sed -i '/PLACEHOLDER_IPV6/d' "$FILE"
echo "Keine IPv6 ermittelt - Zeile entfernt"
fi
echo "---"
cat "$FILE"
fiCode-Sprache: PHP (php)
Jetzt noch CrowdSec neu starten, damit alles korrekt übernommen wird:
docker restart crowdsec
5. Uptime Kuma starten
docker compose -f /opt/containers/uptime/docker-compose.yml up -d
Nach einer kurzen Wartezeit könnt ihr nun die gewählte Domain “uptime.euredomain.de” aufrufen. Hier wählt ihr nun “Embedded MariaDB” aus:

Wählt nun euren Benutzernamen und euer Passwort aus.

Danach könnt ihr euch mit dem gewählten User einloggen und die ersten Checks einrichten.
6. Migration von Version 1 auf Version 2
Hier gibts noch eine Anleitung, wie ihr von eurer bisherigen Version 1 auf die Version 2 updaten könnt und was sich im Detail geändert hat.

Als kleines Update:
das aktuelle image ist ‘louislam/uptime-kuma:2’
Die Migration hatte bei mir problemlos ohne weitere Anpassungen funktioniert, hat aber eine kleine Ewigkeit gedauert.
Empfehlung aus dem Migration guide: unbedingt ‘data’ vorher sichern (hab ich nicht gemacht, aber hab auch regelmäßige snapshots über Proxmox)
Quellen:
https://github.com/louislam/uptime-kuma/blob/master/compose.yaml
https://github.com/louislam/uptime-kuma/releases/tag/2.0.0
https://github.com/louislam/uptime-kuma/wiki/Migration-From-v1-To-v2