This commit is contained in:
2026-03-30 19:17:36 +02:00
parent 6635d8a0be
commit f1c2abb411
3 changed files with 437 additions and 305 deletions

168
README.md
View File

@@ -5,10 +5,20 @@ Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und ak
## 🚀 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
- ⏭️ Exclude-Liste für ganze Stacks oder einzelne Container
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
- ⚡ Digest-basierter Update-Check (kein Blind-Pull)
Images werden nicht pauschal gepullt. Stattdessen:
Vergleich des lokalen Image-Digests mit dem Remote-Digest
Pull nur bei tatsächlicher Änderung
Spart Bandbreite, Zeit und unnötige Layer-Downloads
---
@@ -16,6 +26,7 @@ Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und ak
- Docker + Docker Compose (v2)
- Bash
- jq
- Optional: ntfy Server
---
@@ -23,93 +34,85 @@ Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und ak
## ⚙️ Konfiguration (`config.conf`)
```bash
# =============================
# =============================
# Pfade
# =============================
# =========================================================
# DOCKER COMPOSE UPDATER - CONFIG
# =========================================================
# Pfad zu deinen Compose-Files
COMPOSE_DIR="/pfad/zu/deinen/stacks"
# Logging
LOG_FILE="/pfad/zum/log/update.log"
LOG_LEVEL="INFO" # DEBUG=sehr detailliert, INFO=Standard, WARN=nur wichtige Hinweise/Updates, ERROR=nur Fehler
# Dateimuster
COMPOSE_PATTERN="docker-compose.yml"
# ---------------------------------------------------------
# PATH
# ---------------------------------------------------------
# =============================
# =============================
# Allgemein Einstellungen
# =============================
PATH_COMPOSE_DIR="/pfad/zu/deinen/stacks" # Basisverzeichnis der Stacks
PATH_COMPOSE_PATTERN="*compose*.yml" # Compose-Dateiname
# Verhalten bei gestoppten Containern
UPDATE_STOPPED=true # Image aktualisieren
START_STOPPED=false # danach NICHT starten
# Dry Run (true/false)
DRY_RUN=false
# ---------------------------------------------------------
# LOG
# ---------------------------------------------------------
# =============================
# =============================
# Exclude
# =============================
LOG_FILE="/pfad/zum/log/update.log" # Log-Datei
LOG_LEVEL="INFO" # DEBUG [ INFO | WARN | ERROR ]
# Exclude Container
EXCLUDE_SERVICES=(
"example_container_1"
"example_container_2"
)
# Exclude Stack
EXCLUDE_STACKS=(
# ---------------------------------------------------------
# UPDATE
# ---------------------------------------------------------
UPDATE_DRY_RUN=false # Nur Simulation, keine Änderungen [ true | false ]
UPDATE_INCLUDE_STOPPED=true # Gestoppte Container updaten [ true | false ]
UPDATE_START_STOPPED=false # Danach wieder starten [ true | false ]
# ---------------------------------------------------------
# REDEPLOY
# ---------------------------------------------------------
REDEPLOY_WAIT_HEALTHY=true # Warten bis Container healthy [ true | false ]
REDEPLOY_TIMEOUT=60 # Timeout in Sekunden [ Sekunden ]
# ---------------------------------------------------------
# EXCLUDES
# ---------------------------------------------------------
EXCLUDE_STACKS=( # Liste mit ganzen Stacks die nicht geupdated werden
"example_stack_1"
"example_stack_2"
)
# =============================
# =============================
# NTFY
# =============================
EXCLUDE_SERVICES=( # Liste mit einzelnen Containern die nicht geupdated werden
"example_container_1"
"example_container_2"
)
# ---------------------------------------------------------
# NTFY SETTINGS
# ---------------------------------------------------------
NTFY_ENABLED=true
NTFY_TITLE="Docker Update ($(hostname))"
NTFY_TOKEN="DEIN_TOKEN"
NTFY_URL="https://ntfy.example.com/topic"
NTFY_IMAGE_URL="http://dein-server/host-icon.png"
NTFY_TOKEN="DEIN_TOKEN"
NTFY_TITLE="Docker Update ($(hostname))"
NTFY_TAGS="docker,update"
NTFY_ONLY_ON_CHANGES=false
# Versions Nr. anzeigen (true/false)
SHOW_VERSIONS=true
NTFY_IMAGE_URL="http://dein-server/host-icon.png"
NTFY_ONLY_ON_CHANGES=false # Nur senden wenn Updates vorhanden
NTFY_SHOW_VERSIONS=true # Versionsnummern anzeigen
# =============================
# =============================
# Docker Cleanup
# =============================
ENABLE_CLEANUP=true
CLEANUP_ONLY_ON_UPDATE=true
# ---------------------------------------------------------
# DOCKER CLEANUP
# ---------------------------------------------------------
# Images:
# 🟢 dangling → docker image prune (nur <none> Images)
# 🟡 unused → docker image prune -a (alle ungenutzten Images)
CLEANUP_IMAGES=true
CLEANUP_IMAGES_MODE="unused" # dangling | unused
CLEANUP_ENABLED=true # Aktivieren [ true | false ]
CLEANUP_ONLY_ON_UPDATE=true # Nur nach Updates ausführen [ true | false ]
# Container:
# entfernt gestoppte Container
# 🟢 docker container prune
CLEANUP_CONTAINERS=true
CLEANUP_IMAGES_ENABLED=true # Images löschen [ true | false ]
CLEANUP_IMAGES_MODE="unused" # Methode [ dangling | unused ]
# Volume:
# entfernt ungenutzte Volumes
# ⚠️ kann Daten löschen
CLEANUP_VOLUMES=false
# Networks:
# entfernt ungenutzte Netzwerke
# 🟢 meist unkritisch
CLEANUP_NETWORKS=true
# =============================
CLEANUP_CONTAINERS_ENABLED=true # Container löschen [ true | false ]
CLEANUP_VOLUMES_ENABLED=false # Volumes löschen [ true | false ]
CLEANUP_NETWORKS_ENABLED=true # Networks löschen [ true | false ]
```
---
@@ -125,13 +128,28 @@ chmod +x script.sh
## 🧠 Funktionsweise
1. Alle `docker-compose.yml` Dateien werden gefunden
2. Alphabetisch sortiert
3. Jeder Stack wird geprüft:
- Image wird gepullt
- Vergleich: Container Image-ID vs. aktuelles Image
4. Wenn ein Service ein Update hat:
- kompletter Stack wird neu deployed
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)
- Verwendete Images werden extrahiert
- Für jedes Image:
- Remote-Digest wird aus der Registry abgefragt
-Lokaler Digest wird ermittelt
-Vergleich lokal vs. remote
4. Entscheidungslogik:
- ❌ Kein Unterschied → kein Pull, kein Restart
- ✅ Digest unterschiedlich → Image wird gepullt
5. Wenn mindestens ein Service ein Update hat:
- kompletter Stack wird neu deployed (docker compose up -d)
---
## ⚡ Verhalten im Detail
- Kein unnötiger Netzwerk-Traffic (kein blindes docker pull)
- Updates erfolgen nur bei tatsächlichen Änderungen
- Mehrere Services im Stack → einheitlicher Redeploy, kein Teilzustand
- Optional: Dry-Run zeigt exakt diese Entscheidungen ohne Ausführung
---