2026-03-31 15:23:20 +02:00
.
2026-03-31 14:13:11 +02:00
.
2026-03-30 20:08:41 +02:00
.
2026-03-31 15:19:15 +02:00
.
2026-03-31 15:23:20 +02:00
.
2026-03-31 15:19:15 +02:00

Docker Compose Auto-Updater

Logo


Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und aktualisiert diese automatisch.

🚀 Features

  • 🔄 Stack-basiertes Update Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert
  • 🧪 Dry-Run Modus Zeigt an, was passieren würde, ohne Änderungen durchzuführen
  • 📲 ntfy Benachrichtigungen Push-Notifications über ntfy bei Updates, Fehlern oder Status
  • ⏭️ Exclude-Liste Einzelne Container oder komplette Stacks gezielt vom Update ausschließen
  • 🗑️ Prune Funktion Entfernt nicht mehr benötigte Images/Container automatisch

📂 Voraussetzungen

  • Docker + Docker Compose (v2)
  • Bash
  • jq
  • Optional: ntfy Server

🧠 Funktionsweise

  1. Alle *compose*.yml Dateien werden rekursiv gefunden
  2. Verarbeitung erfolgt alphabetisch (deterministische Reihenfolge)
  3. Für jeden Stack:
  • Compose-Konfiguration wird ausgewertet (docker compose config)
  • Services und deren Images werden ermittelt
  • Für jedes Image:
    • Image wird (einmal pro Stack) gepullt (docker pull, nutzt Cache)
    • Lokale Image-ID wird ermittelt
    • Image-ID des vorhandenen Containers wird ermittelt (auch für gestoppte Container)
  1. Entscheidungslogik:
  • Container existiert nicht → kein Update (nur Definition vorhanden)
  • Image-ID unverändert → kein Update
  • Image-ID hat sich geändert → Update erkannt
  1. Wenn mindestens ein Service ein Update hat:
  • Einzelcontainer:
    • gezieltes Update nur dieses Services (docker compose up -d <service>)
  • Mehrere Services:
    • kompletter Stack wird neu deployed (docker compose up -d)
  • Optional
    • feste Wartezeit nach dem Deploy (REDEPLOY_WAIT)
    • anschließendes Warten auf erfolgreiche Healthchecks (REDEPLOY_WAIT_HEALTHY)
  1. Sonderverhalten:
  • Gestoppte Container werden ebenfalls geprüft und bei Updates berücksichtigt
  • Gestoppte Container werden nach dem Update optional wieder gestoppt
  • Excluded Services werden gepullt, aber nicht neu gestartet. Verfügbare Updates werden erkannt und per NTFY gemeldet.
  • Healthchecks können optional abgewartet werden

🗑️ Prune / Cleanup

Nach Abschluss der Updates kann optional ein Docker Cleanup durchgeführt werden. Dabei werden ungenutzte Ressourcen entfernt:

  • docker image prune
    → entfernt ungenutzte („dangling“) Images

  • docker image prune -a
    → entfernt alle Images, die von keinem Container verwendet werden

  • docker container prune
    → entfernt gestoppte Container

  • docker volume prune
    → entfernt ungenutzte Volumes

  • docker network prune
    → entfernt ungenutzte Netzwerke


🔔 ntfy

Zustand Priorität
✔️ Keine Updates 1
🔄 Updates vorhanden 3
Fehler 5

Anzeigebeispiel

Logo


⚙️ Konfiguration (config.conf)

# ==========================================================
# DOCKER COMPOSE UPDATER - CONFIG
# ==========================================================


# ----------------------------------------------------------
# PATH
# ----------------------------------------------------------

# Basisverzeichnis der Stacks                     [ String ]
PATH_COMPOSE_DIR="/pfad/zu/deinen/stacks"

# Compose-Dateiname                               [ String ]
PATH_COMPOSE_PATTERN="*compose*.yml"


# ----------------------------------------------------------
# LOG
# ----------------------------------------------------------

# Log-Datei                                       [ String ]
LOG_FILE="/pfad/zum/log/update.log"

# Log-Level                  [ DEBUG | INFO | WARN | ERROR ]
LOG_LEVEL="INFO"


# ----------------------------------------------------------
# UPDATE
# ----------------------------------------------------------

# Nur Simulation, keine Änderungen          [ true | false ]
UPDATE_DRY_RUN_ENABLED=false

# Gestoppte Container updaten               [ true | false ]
UPDATE_INCLUDE_STOPPED=true

# Danach wieder starten                     [ true | false ]
UPDATE_START_STOPPED=false


# ----------------------------------------------------------
# REDEPLOY
# ----------------------------------------------------------

# Feste Wartezeit nach Redeploy                   [ Number ]
REDEPLOY_WAIT=120

# Warten bis Container healthy sind         [ true | false ]
REDEPLOY_WAIT_HEALTHY=true

# Timeout in Sekunden für healthy Check           [ Number ]
REDEPLOY_WAIT_HEALTHY_TIMEOUT=60


# ----------------------------------------------------------
# EXCLUDES
# ----------------------------------------------------------

# Stacks vom Update ausschließen                   [ Array ]
EXCLUDE_STACKS=(
  "example_stack_1"
  "example_stack_2"
)

# Services vom Update ausschließen                 [ Array ]
EXCLUDE_SERVICES=(
  "example_container_1"
  "example_container_2"
)


# ----------------------------------------------------------
# NTFY SETTINGS
# ----------------------------------------------------------

# NTFY Zusammenfassung senden               [ true | false ]
NTFY_ENABLED=true       

# Server URL                                      [ String ]
NTFY_URL="https://ntfy.example.com/topic"     

# Token                                           [ String ]
NTFY_TOKEN="DEIN_TOKEN"

# Titel mitsenden (optional)                      [ String ]
NTFY_TITLE="Autoupdate Report ($(hostname))"

# Tags mitsenden (optional)                       [ String ]
NTFY_TAGS="docker,update"

# Icon mitsenden (optional)                       [ String ]
NTFY_IMAGE_URL="http://dein-server/host-icon.png"

# Nur senden wenn Updates vorhanden         [ true | false ]
NTFY_ONLY_ON_CHANGES=false

# Versionsnummern anzeigen                  [ true | false ]
NTFY_SHOW_VERSIONS=true


# ----------------------------------------------------------
# DOCKER CLEANUP
# ----------------------------------------------------------

# Prune Befehle ausführen                   [ true | false ]
CLEANUP_ENABLED=true

# Nur nach erfolgten Updates ausführen      [ true | false ]
CLEANUP_ONLY_ON_UPDATE=true

# Images löschen                            [ true | false ]
CLEANUP_IMAGES_ENABLED=true

# Image-Prune Modus                    [ dangling | unused ]
CLEANUP_IMAGES_MODE="unused"    

# Container löschen                         [ true | false ]
CLEANUP_CONTAINERS_ENABLED=true

# Volumes löschen                           [ true | false ]
CLEANUP_VOLUMES_ENABLED=false

# Networks löschen                          [ true | false ]
CLEANUP_NETWORKS_ENABLED=true

▶️ Nutzung

chmod +x script.sh
./script.sh

📄 Beispiel Ausgabe

→ Prüfe Stack: rss
   ├─ read (phpdockerio/readability-js-server)
   ├─ merc (wangqiru/mercury-parser-api)
   ├─ full-text-rss (heussd/fivefilters-full-text-rss:latest)
   ├─ rss-bridge (rssbridge/rss-bridge:latest)
      ⬆ UPDATE
         alt: rssbridge/rss-bridge:latest@sha256:55215923cf81b2fa6fbb7ecc1bd2555405f4fc06029ae9876e91164a735c7b9d
         neu: rssbridge/rss-bridge:latest@sha256:f3f0218c8b075cbc7c559c8e6852888e95fa6d68258436da6195efc5ab98b025
   └─ freshrss (freshrss/freshrss:latest)
   🔄 Stack wird neu deployt (Trigger: rss-bridge)
   ⏳ Deploy läuft...
   ✔ Stack erfolgreich aktualisiert
    Keine Healthchecks definiert → überspringe warten
   ⏱ Dauer: 18s


→ Prüfe Stack: sonarr
   └─ sonarr (lscr.io/linuxserver/sonarr:latest)
   ⏱ Dauer: 3s

⚠️ Hinweise

Wird in einem Stack ein Container aktualisiert, wird anschließend der gesamte Stack neu gestartet, sofern er mehr als einen Container enthält. Dadurch wird sichergestellt, dass alle Abhängigkeiten wieder gemäß der docker-compose.yml ausgeführt werden.

Description
No description provided
Readme 746 KiB
Languages
Shell 100%