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
Hallo,
gestern ich habe den Uptime Kuma mal wieder eingerichtet, da ich gerne eine Übersicht über meine laufenden und fehlerhaften Container haben möchte. Update-Kuma läuft nur lokal ohne Traefik. Bei mir laufen unter Proxmox mehrere Docker-Instanzen in verschiedenen VMs und möchte nun Uptime Kuma auf einer Instanz installieren und sicher auf die Instanz eines anderen Servers via TLS zugreifen. Leider schaffe ich das nicht. Ich habe bisher folgendes gemacht:
# Verzeichnis für Zertifkate erstellt und hineingewechselt mkdir ~/docker-certs && cd ~/docker-certs # Gültigkeit für 10 Jahre export DAYS=3650 # IP Adresse dynamisch bestimmen export IPADDRESS="ip -4 addr show $(ip route show default | awk '/default/ {print $5}') | grep -oP '(?<=inet\s)\d+(\.\d+){3}')" openssl genrsa -out ca-key.pem 2048 openssl req -new -x509 -days "$DAYS" -key ca-key.pem -sha256 -out ca.pem # Server-Zertifikat erstellen openssl genrsa -out server-key.pem 2048 openssl req -subj "/CN=$IPADDRESS" -new -key server-key.pem -out server.csr openssl x509 -req -days "$DAYS" -sha256 -in server.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out server-cert.pem # Client-Zertifikat erstellen openssl genrsa -out key.pem 2048 openssl req -subj '/CN=client' -new -key key.pem -out client.csr echo extendedKeyUsage = clientAuth > extfile.cnf openssl x509 -req -days "$DAYS" -sha256 -in client.csr -CA ca.pem -CAkey ca-key.pem -CAcreateserial -out cert.pem -extfile extfile.cnfJetzt liegen die erstellten Zertifikate in meinem Ordner vor:
Danach habe ich meine /etc/docker/daemon.json angepasst und folgende Zeilen hinzugefügt:
{ ... "tls": true, "tlscert": "/home/bernd/docker-certs/server-cert.pem", "tlskey": "/home/bernd/docker-certs/server-key.pem", "tlsverify": true, "tlscacert": "/home/bernd/docker-certs/ca.pem", "hosts": ["tcp://0.0.0.0:2376", "unix:///var/run/docker.sock"], ... }Zusätzlich noch den Systemd-Service angepasst, da es sonst zu Duplikat-Meldungen kam:
wurde zu
Nun noch via folgenden Befehlen alles neu eingelesen und gestartet:
Alles scheint problemlos zu funktionieren. Keine Fehlermeldungen in den Logs zu sehen und der Rest läuft auch. Also bis hier hin sollte es ja passen.
Das war jetzt auf dem Host, auf den der andere zugreifen können soll, nennen wir ihn A. Auf dem anderen (B) ist also Update-Kuma installiert.
Unter Einstellungen kann man in Update-Kuma ja Docker-Hosts hinzufügen. Das habe ich mit dem lokalen Host auf B gemacht und jetzt möchte ich über TLS noch Host A hinzufügen.
Laut Anleitung, bindet man ja einen lokalen Ordner unter /app/data ein. In diesem Ordner wird ein Ordner docker-tls erstellt und in diesen sollen die Zertifikate jeweils in Unterordner mit der Hostnamen. Also zum Beispiel docker-tls/192.168.1.74 oder docker-tls/host-a.
Da ich vorher beim Erstellen der Zertifkate meine IP-Adresse benutzt habe, gehe ich davon aus, dass der Unterordner also meine IP-Adresse ist. Da ich nicht weiß welche Zertfikatsdateien benötigt werden, habe ich einfach alle Dateien aus dem Zertifkats-Ordner von Host A in den Unterordner auf Host B kopiert.
Und hier komme ich nicht weiter, ich habe keinen Plan, was noch zu tun ist. Ich füge unter Update-Kuma meinen Host A über TLS hinzu und gebe als Verbindungstyp tcp/http ein und dann als Docker-Daemon https://<meineip>:2376. Wenn ich auf testen klicke bekomme ich dann immer die Fehlermeldung: “Hostname/IP does not match certificate’s altnames: IP: <meineip> ist not in the certs list.
Ähnliche Meldungen habe ich per Suchmaschine gefunden, aber nie gab es Antworten. Wahrscheinlich hat es gar nichts mit Update-Kuma selber zu tun, sondern irgendwas übergeordnetes, allgemeines mit Verschlüsselungen. Ich weiß es einfach nicht.
Ich habe keinen Plan, was da fehlen könnte und hoffe, dass ihr mir da helfen könnt. Wo ist mein Fehler? Was übersehe oder missverstehe ich? 🤔
Vielen Dank schon mal im Voraus 🙂
Hat von Euch das schon jemand hinbekommen, dass beim Stoppen eines Containers, wenn Uptime Kuma das meldet, könnte er doch einfach den Container wieder anstarten. Kann Uptime Kuma das?
Hallo ihr, ich bin etwas verwirrt – ich bekomme auf
uptime.meinedomain.dekein Zertifikat. Ich bin alles durchgegangen, finde den Fehler aber leider nicht. Bei anderen Apps (Portainer/Nextcloud…) hatte ich das Problem nicht. Mein “traefik-crowdsec-stack” scheint also eigentlich zu funktionieren …Danke für die Anleitung.
Hat Supper funktioniert.
Nur für Seiten auf dem selben Server, musste ich das ipv6 netzwerk, wo auch immer das herkommt, joinen 🙂
Hallo Zusammen
Installation an sich hat wunderbar funktioniert. Ich errreiche nur keine Seite vom gleichen Server im Monitor. Es kommt timeout of 48000ms exceeded. Hat jemand eine Idee oder Tipp, an was es liegen könnte?
Hach wie schön, wollte gerade dazu auch eine schreiben! Jetzt kann ich einfach deine durcharbeiten👌
Hallo,
leider bekomme ich, wenn ich die Seite aufrufe nur einen 404 Error angezeigt.
Hat jemand eine Idee?
VG
Matthias
Funktioniert einwandfrei, vielen Dank….
Herzlichen Glückwunsch zu deiner ersten Anleitung
Brthld 🎉
Hat alles geklappt. Danke für die Anleitung 🙂