This commit is contained in:
2026-04-01 12:19:58 +02:00
parent b4006cdeec
commit f93fb53638
2 changed files with 26 additions and 20 deletions

View File

@@ -6,19 +6,19 @@
--- ---
Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und aktualisiert diese automatisch. > 🔧 Automatisches Update von Docker-Compose-Stacks mit feingranularer Steuerung per Labels
## 🚀 Features ## 🚀 Features
- 🔄 Stack-basiertes Update - 🔄 **Stack-basiertes Update**
Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert
- 🧪 Dry-Run Modus - 🧪 **Dry-Run Modus**
Zeigt an, was passieren würde, ohne Änderungen durchzuführen Zeigt an, was passieren würde, ohne Änderungen durchzuführen
- 📲 ntfy Benachrichtigungen - 📲 **ntfy Benachrichtigungen**
Push-Notifications über ntfy bei Updates, Fehlern oder Status Push-Notifications über ntfy bei Updates, Fehlern oder Status
- ⚙️ Service-Modi (per Label steuerbar) - ⚙️ **Service-Modi** (per Label steuerbar)
Einzelne Container oder komplette Stacks gezielt vom Update ausschließen Einzelne Container oder komplette Stacks gezielt vom Update ausschließen
- 🗑️ Prune Funktion - 🗑️ **Prune Funktion**
Entfernt nicht mehr benötigte Images/Container automatisch Entfernt nicht mehr benötigte Images/Container automatisch
@@ -41,7 +41,7 @@ Entfernt nicht mehr benötigte Images/Container automatisch
- Compose-Konfiguration wird ausgewertet (`docker compose config`) - Compose-Konfiguration wird ausgewertet (`docker compose config`)
- Services und deren Images werden ermittelt - Services und deren Images werden ermittelt
- Für jedes Image: - Für jedes Image:
- Image wird (einmal pro Stack) gepullt (`docker pull`, nutzt Cache) - Image wird bei Bedarf gepullt (maximal einmal pro Image und Stack, Cache-basiert)
- Lokale Image-ID wird ermittelt - Lokale Image-ID wird ermittelt
- Image-ID des vorhandenen Containers wird ermittelt (auch für gestoppte Container) - Image-ID des vorhandenen Containers wird ermittelt (auch für gestoppte Container)
4. Entscheidungslogik: 4. Entscheidungslogik:
@@ -59,9 +59,12 @@ Entfernt nicht mehr benötigte Images/Container automatisch
6. Sonderverhalten: 6. Sonderverhalten:
- Gestoppte Container werden ebenfalls geprüft und bei Updates berücksichtigt - Gestoppte Container werden ebenfalls geprüft und bei Updates berücksichtigt
- Gestoppte Container werden nach dem Update optional wieder gestoppt - Gestoppte Container werden nach dem Update optional wieder gestoppt
- Excluded Services werden gepullt, aber **nicht** neu gestartet. - Service-Verhalten wird vollständig über Labels gesteuert (`composeupdater.mode`)
Verfügbare Updates werden erkannt und per NTFY gemeldet. - Je nach Modus werden Services:
- Healthchecks können optional abgewartet werden - komplett ignoriert (`ignore`)
- nur überwacht (`notify-only`)
- oder automatisch aktualisiert (`update`)
--- ---
@@ -139,7 +142,7 @@ services:
- composeupdater.mode=update - composeupdater.mode=update
``` ```
#### 📦 Stack-Level Label (optional) #### 📦 Stack-Level Label
Du kannst das Verhalten auch für den gesamten Stack setzen: Du kannst das Verhalten auch für den gesamten Stack setzen:
@@ -147,6 +150,9 @@ Du kannst das Verhalten auch für den gesamten Stack setzen:
labels: labels:
- composeupdater.mode=ignore - composeupdater.mode=ignore
``` ```
Das Stack-Level Label definiert den Standard für alle Services im Stack
Service-Labels können diesen Standard überschreiben
--- ---

View File

@@ -298,12 +298,6 @@ while IFS= read -r -d '' file; do
stack_mode=$(get_stack_mode) stack_mode=$(get_stack_mode)
if [ "$stack_mode" = "ignore" ]; then
log INFO "→ Stack $stack übersprungen (label=ignore)"
cd "$PATH_COMPOSE_DIR"
continue
fi
mapfile -t services < <(docker compose config --services) mapfile -t services < <(docker compose config --services)
total_services=${#services[@]} total_services=${#services[@]}
current_index=0 current_index=0
@@ -336,8 +330,16 @@ while IFS= read -r -d '' file; do
continue continue
fi fi
# =============================
# Mode bestimmen (Service > Stack)
# =============================
mode=$(get_service_mode "$svc") mode=$(get_service_mode "$svc")
if [ -z "$mode" ]; then
mode="$stack_mode"
fi
case "$mode" in case "$mode" in
ignore) ignore)
@@ -355,6 +357,7 @@ while IFS= read -r -d '' file; do
continue continue
fi fi
# 👉 Pull nur einmal pro Image
if [ -z "${pulled_images[$image]:-}" ]; then if [ -z "${pulled_images[$image]:-}" ]; then
pull_with_retry "$image" || true pull_with_retry "$image" || true
pulled_images[$image]=1 pulled_images[$image]=1
@@ -392,8 +395,6 @@ while IFS= read -r -d '' file; do
# Pull + Vergleich # Pull + Vergleich
# ============================= # =============================
# 👉 Pull (nutzt Cache → schnell wenn nichts neu)
if [ -z "${pulled_images[$image]:-}" ]; then if [ -z "${pulled_images[$image]:-}" ]; then
if ! pull_with_retry "$image"; then if ! pull_with_retry "$image"; then
log ERROR " ❌ Pull fehlgeschlagen" log ERROR " ❌ Pull fehlgeschlagen"
@@ -408,7 +409,6 @@ while IFS= read -r -d '' file; do
after_id=$(get_local_image_id "$image") after_id=$(get_local_image_id "$image")
if ! container_exists "$svc"; then if ! container_exists "$svc"; then
# 👉 Container existiert nicht → KEIN Update
update_needed=false update_needed=false
elif [ "$before_id" != "$after_id" ]; then elif [ "$before_id" != "$after_id" ]; then