Zum Inhalt springen
SONOYA.com
Web & Code

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

Docker-Symbol auf dunkelgrünem Verlauf für kontrollierte Container-Updates mit Diun als Ersatz für das eingestellte Watchtower

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:

Code
mkdir -p ~/diun
cd ~/diun
nano compose.yml

Füge diesen Inhalt ein:

Code
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_TOKEN

Was die Einstellungen bewirken:

  • DIUN_WATCH_SCHEDULE ist ein Zeitplan im Cron-Format. 0 8 * * * prüft jeden Morgen um 8 Uhr. Häufiger ist selten nötig.
  • DIUN_PROVIDERS_DOCKER liest die laufenden Container über den Docker-Socket aus. Diun braucht dafür nur Lesezugriff, deshalb steht :ro hinter dem Pfad.
  • DIUN_PROVIDERS_DOCKER_WATCHBYDEFAULT überwacht automatisch alle Container. Willst Du nur ausgewählte überwachen, setzt Du den Wert auf false und markierst die gewünschten Container mit einem Label, siehe unten.
  • Die drei NTFY-Zeilen enthalten Adresse, Kanal und Zugangstoken Deines ntfy-Servers.

Starte Diun:

Code
docker compose up -d

Beim 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:

Code
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:

  1. 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.
  2. Backup prüfen. Wann lief die letzte Sicherung? Wie Du Server verschlüsselt sicherst, zeigt Backups mit restic: verschlüsselt auf S3 und Spaces.
  3. 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:
Code
docker compose pull
docker compose up -d
  1. Prüfen. Schau mit docker compose logs -f in die Ausgabe, ob der Dienst ohne Fehler startet, und öffne ihn im Browser.
  2. 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.