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