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
- 🔄 Stack-basiertes Update
- 🔄 **Stack-basiertes Update**
Aktualisiert komplette Docker-Compose Stacks strukturiert und kontrolliert
- 🧪 Dry-Run Modus
- 🧪 **Dry-Run Modus**
Zeigt an, was passieren würde, ohne Änderungen durchzuführen
- 📲 ntfy Benachrichtigungen
- 📲 **ntfy Benachrichtigungen**
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
- 🗑️ Prune Funktion
- 🗑️ **Prune Funktion**
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`)
- Services und deren Images werden ermittelt
- 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
- Image-ID des vorhandenen Containers wird ermittelt (auch für gestoppte Container)
4. Entscheidungslogik:
@@ -59,9 +59,12 @@ Entfernt nicht mehr benötigte Images/Container automatisch
6. 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
- Service-Verhalten wird vollständig über Labels gesteuert (`composeupdater.mode`)
- Je nach Modus werden Services:
- komplett ignoriert (`ignore`)
- nur überwacht (`notify-only`)
- oder automatisch aktualisiert (`update`)
---
@@ -139,7 +142,7 @@ services:
- composeupdater.mode=update
```
#### 📦 Stack-Level Label (optional)
#### 📦 Stack-Level Label
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:
- 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)
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)
total_services=${#services[@]}
current_index=0
@@ -336,8 +330,16 @@ while IFS= read -r -d '' file; do
continue
fi
# =============================
# Mode bestimmen (Service > Stack)
# =============================
mode=$(get_service_mode "$svc")
if [ -z "$mode" ]; then
mode="$stack_mode"
fi
case "$mode" in
ignore)
@@ -355,6 +357,7 @@ while IFS= read -r -d '' file; do
continue
fi
# 👉 Pull nur einmal pro Image
if [ -z "${pulled_images[$image]:-}" ]; then
pull_with_retry "$image" || true
pulled_images[$image]=1
@@ -392,8 +395,6 @@ while IFS= read -r -d '' file; do
# Pull + Vergleich
# =============================
# 👉 Pull (nutzt Cache → schnell wenn nichts neu)
if [ -z "${pulled_images[$image]:-}" ]; then
if ! pull_with_retry "$image"; then
log ERROR " ❌ Pull fehlgeschlagen"
@@ -408,7 +409,6 @@ while IFS= read -r -d '' file; do
after_id=$(get_local_image_id "$image")
if ! container_exists "$svc"; then
# 👉 Container existiert nicht → KEIN Update
update_needed=false
elif [ "$before_id" != "$after_id" ]; then