.
This commit is contained in:
28
README.md
28
README.md
@@ -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
|
||||||
|
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user