Docker-Container aktualisieren: Diun statt Watchtower
Watchtower ist eingestellt. Mit Diun und ntfy erfährst Du von neuen Docker-Images und aktualisierst Container kontrolliert statt blind.
Von Nathan Base
Jahrelang war Watchtower die Standardantwort auf die Frage, wie Docker-Container aktuell bleiben. Ein Container, der nachts nach neuen Images sucht, die anderen Container austauscht und neu startet. Unzählige Anleitungen empfehlen ihn bis heute. Das Problem: Das GitHub-Repository von Watchtower ist seit Dezember 2025 archiviert. Es gibt keine Weiterentwicklung und keine Sicherheitskorrekturen mehr, und mit neueren Docker-Versionen kommt es zunehmend zu Fehlern.
Das ist ein guter Anlass, das Prinzip zu überdenken. Automatische Updates klingen bequem, sind aber bei Diensten mit Datenbank riskant: Eine neue Hauptversion von Immich, Paperless oder Nextcloud verlangt oft eine Migration oder geänderte Einstellungen, und ein nächtliches Blind-Update bemerkst Du erst, wenn morgens nichts mehr geht. Diese Anleitung setzt deshalb auf einen anderen Ansatz: Diun meldet Dir neue Versionen, und Du aktualisierst bewusst. Stand ist Diun 4.33. Grundlage ist die Dokumentation von Diun.
Das Prinzip: benachrichtigen statt automatisch ersetzen
Diun steht für Docker Image Update Notifier. Es schaut in regelmäßigen Abständen nach, ob es für die Images Deiner laufenden Container neue Versionen gibt, und schickt Dir dann eine Nachricht. Es ändert selbst nichts. Das hat drei Vorteile:
- Du entscheidest, wann ein Update passiert, zum Beispiel nicht kurz vor dem Urlaub.
- Du kannst vorher die Release Notes lesen und weißt, ob eine Migration nötig ist.
- Du bemerkst ein fehlerhaftes Update sofort, weil Du direkt danach nachschaust.
Für die Benachrichtigung nutzt diese Anleitung ntfy, einen selbst gehosteten Push-Dienst. Wie Du ihn einrichtest, steht in Push-Benachrichtigungen selbst hosten mit ntfy. Diun kann aber auch Mails, Telegram, Discord und viele andere Ziele bedienen.
Diun einrichten
Lege auf dem Server einen Ordner an und darin eine compose.yml:
mkdir -p ~/diun
cd ~/diun
nano compose.ymlFüge diesen Inhalt ein:
services:
diun:
image: crazymax/diun:latest
container_name: diun
command: serve
restart: always
volumes:
- ./data:/data
- /var/run/docker.sock:/var/run/docker.sock:ro
environment:
TZ: Europe/Berlin
LOG_LEVEL: info
DIUN_WATCH_SCHEDULE: "0 8 * * *"
DIUN_WATCH_JITTER: 30s
DIUN_PROVIDERS_DOCKER: "true"
DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT: "true"
DIUN_NOTIF_NTFY_ENDPOINT: https://ntfy.example.com
DIUN_NOTIF_NTFY_TOPIC: updates
DIUN_NOTIF_NTFY_TOKEN: tk_DEIN_TOKENWas die Einstellungen bewirken:
DIUN_WATCH_SCHEDULEist ein Zeitplan im Cron-Format.0 8 * * *prüft jeden Morgen um 8 Uhr. Häufiger ist selten nötig.DIUN_PROVIDERS_DOCKERliest die laufenden Container über den Docker-Socket aus. Diun braucht dafür nur Lesezugriff, deshalb steht:rohinter dem Pfad.DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULTüberwacht automatisch alle Container. Willst Du nur ausgewählte überwachen, setzt Du den Wert auffalseund markierst die gewünschten Container mit einem Label, siehe unten.- Die drei
NTFY-Zeilen enthalten Adresse, Kanal und Zugangstoken Deines ntfy-Servers.
Starte Diun:
docker compose up -dBeim ersten Durchlauf merkt sich Diun den aktuellen Stand aller Images, ohne Dir für jedes eine Nachricht zu schicken. Ab dem nächsten Durchlauf meldet es nur noch Änderungen. Mit docker compose logs -f siehst Du, was Diun gerade prüft.
Auch Versionsnummern überwachen
Hier wird es spannend. Viele Container nutzen ein festes Tag wie postgres:17 oder immich-server:v3.3.6. Diun erkennt standardmäßig, wenn sich das Image hinter genau diesem Tag ändert, etwa bei einem Sicherheitsupdate für postgres:17. Eine neue Version mit anderer Nummer, etwa v3.4.0, bemerkt es dagegen nur, wenn Du es dazu aufforderst.
Dafür setzt Du in der compose.yml des jeweiligen Dienstes Labels:
services:
immich-server:
image: ghcr.io/immich-app/immich-server:v3.3.6
labels:
- diun.enable=true
- diun.watch_repo=true
- diun.include_tags=^v\d+\.\d+\.\d+$diun.watch_repo=true lässt Diun alle Tags des Repositorys ansehen, und diun.include_tags filtert sie mit einem regulären Ausdruck auf echte Versionsnummern. So bekommst Du keine Meldungen zu Testversionen. Nach dem Ändern der Labels musst Du den Dienst mit docker compose up -d neu erstellen.
Ein Update durchführen
Kommt eine Meldung, gehst Du so vor:
- Release Notes lesen. Auf der GitHub-Seite des Projekts steht, ob die Version Breaking Changes enthält. Bei großen Projekten wie Immich ist das Pflicht.
- Backup prüfen. Wann lief die letzte Sicherung? Wie Du Server verschlüsselt sicherst, zeigt Backups mit restic: verschlüsselt auf S3 und Spaces.
- Image aktualisieren. Wechsle in den Ordner des Dienstes. Hast Du ein festes Tag, änderst Du die Versionsnummer in der
compose.yml. Dann holst Du das neue Image und startest neu:
docker compose pull
docker compose up -d- Prüfen. Schau mit
docker compose logs -fin die Ausgabe, ob der Dienst ohne Fehler startet, und öffne ihn im Browser. - Aufräumen. Alte Images belegen Platz. Entferne nicht mehr genutzte Images mit
docker image prune.
Welche Dienste Du automatisch aktualisieren kannst
Für einfache Dienste ohne Datenbank, etwa Uptime Kuma, ntfy oder einen statischen Webserver, ist das Risiko eines automatischen Updates gering. Wer hier trotzdem Automatik will, kann sich ein kleines Skript schreiben, das docker compose pull und docker compose up -d per Cronjob ausführt. Für alles mit Datenbank oder persönlichen Daten bleibt das kontrollierte Update der bessere Weg.
Häufige Fragen
Kann ich Watchtower einfach weiterlaufen lassen? Technisch läuft es oft noch, aber ohne Pflege und mit Zugriff auf den Docker-Socket, also mit weitreichenden Rechten. Ein unbetreutes Programm mit solchen Rechten ist ein Sicherheitsrisiko. Ersetze es.
Diun meldet nichts. Prüfe in den Logs, ob Diun die Container findet. Steht dort, dass 0 Images überwacht werden, fehlt der Docker-Socket in den volumes.
Ich bekomme zu viele Meldungen. Setze DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT auf false und markiere nur die Container mit diun.enable=true, die Dir wichtig sind.
Fazit
Das Ende von Watchtower ist eine Chance, Updates bewusster zu machen. Mit Diun und ntfy erfährst Du jeden Morgen, was neu ist, und aktualisierst dann, wenn Du Zeit für einen kurzen Blick in die Release Notes hast. Das kostet ein paar Minuten pro Woche und erspart Dir den Morgen, an dem nach einem nächtlichen Blind-Update der Fotodienst nicht mehr startet.
Weiterlesen.
-
Web & CodePush-Benachrichtigungen selbst hosten mit ntfy
ntfy mit Docker und Caddy selbst hosten, absichern und Meldungen von Skripten, Uptime Kuma und Home Assistant aufs iPhone und Android-Handy schicken.
Nathan Base -
Raspberry Pi & LinuxProxmox: Docker im LXC-Container oder in einer VM?
Docker unter Proxmox VE 9.2: wann ein LXC-Container reicht, warum eine VM meist die bessere Wahl ist und wie Du die Docker-VM richtig einrichtest.
Nathan Base -
Web & CodeBackups mit restic: verschlüsselt auf S3 und Spaces
Server und Mac mit restic sichern: verschlüsselt, inkrementell und automatisch auf DigitalOcean Spaces oder anderen S3-Speicher, samt Restore.
Nathan Base -
Web & Codesops und age: .env-Dateien verschlüsselt in Git
Passwörter und API-Schlüssel aus .env-Dateien mit sops und age verschlüsselt ins Git-Repository legen und auf dem Server direkt mit Docker Compose nutzen.
Nathan Base -
Web & CodeStirling-PDF selbst hosten: PDF-Werkzeuge ohne Upload
PDFs zusammenführen, verkleinern, schwärzen und per OCR durchsuchbar machen, ohne Upload zu Online-Diensten: Stirling-PDF mit Docker einrichten.
Nathan Base -
Web & CodeForgejo: eigener Git-Server mit Docker statt GitHub
Forgejo mit Docker Compose installieren, per SSH nutzen und Repositories von GitHub übernehmen, für Code und Konfigurationen, die privat bleiben.
Nathan Base