251 lines
6.8 KiB
Markdown
251 lines
6.8 KiB
Markdown
# Docker Compose Auto-Updater
|
|
|
|
Dieses Script überprüft mehrere Docker-Compose-Stacks auf Image-Updates und aktualisiert diese automatisch.
|
|
|
|
## 🚀 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
|
|
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
|
|
|
|
---
|
|
|
|
## 📂 Voraussetzungen
|
|
|
|
- Docker + Docker Compose (v2)
|
|
- Bash
|
|
- jq
|
|
- Optional: ntfy Server
|
|
|
|
---
|
|
|
|
## ⚙️ Konfiguration (`config.conf`)
|
|
|
|
```bash
|
|
# ==========================================================
|
|
# DOCKER COMPOSE UPDATER - CONFIG
|
|
# ==========================================================
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# PATH
|
|
# ----------------------------------------------------------
|
|
|
|
# Basisverzeichnis der Stacks [ String ]
|
|
PATH_COMPOSE_DIR="/pfad/zu/deinen/stacks"
|
|
|
|
# Compose-Dateiname [ String ]
|
|
PATH_COMPOSE_PATTERN="*compose*.yml"
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# LOG
|
|
# ----------------------------------------------------------
|
|
|
|
# Log-Datei [ String ]
|
|
LOG_FILE="/pfad/zum/log/update.log"
|
|
|
|
# Log-Level [ DEBUG | INFO | WARN | ERROR ]
|
|
LOG_LEVEL="INFO"
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# UPDATE
|
|
# ----------------------------------------------------------
|
|
|
|
# Nur Simulation, keine Änderungen [ true | false ]
|
|
UPDATE_DRY_RUN_ENABLED=false
|
|
|
|
# Gestoppte Container updaten [ true | false ]
|
|
UPDATE_INCLUDE_STOPPED=true
|
|
|
|
# Danach wieder starten [ true | false ]
|
|
UPDATE_START_STOPPED=false
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# REDEPLOY
|
|
# ----------------------------------------------------------
|
|
|
|
# Warten bis Container healthy [ true | false ]
|
|
REDEPLOY_WAIT_HEALTHY=true
|
|
|
|
# Timeout in Sekunden [ Number ]
|
|
REDEPLOY_TIMEOUT=60
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# EXCLUDES
|
|
# ----------------------------------------------------------
|
|
|
|
# Stacks vom Update ausschließen [ Array ]
|
|
EXCLUDE_STACKS=(
|
|
"example_stack_1"
|
|
"example_stack_2"
|
|
)
|
|
|
|
# Services vom Update ausschließen [ Array ]
|
|
EXCLUDE_SERVICES=(
|
|
"example_container_1"
|
|
"example_container_2"
|
|
)
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# NTFY SETTINGS
|
|
# ----------------------------------------------------------
|
|
|
|
# NTFY Zusammenfassung senden [ true | false ]
|
|
NTFY_ENABLED=true
|
|
|
|
# Server URL [ String ]
|
|
NTFY_URL="https://ntfy.example.com/topic"
|
|
|
|
# Token [ String ]
|
|
NTFY_TOKEN="DEIN_TOKEN"
|
|
|
|
# Titel mitsenden (optional) [ String ]
|
|
NTFY_TITLE="Docker Update ($(hostname))"
|
|
|
|
# Tags mitsenden (optional) [ String ]
|
|
NTFY_TAGS="docker,update"
|
|
|
|
# Icon mitsenden (optional) [ String ]
|
|
NTFY_IMAGE_URL="http://dein-server/host-icon.png"
|
|
|
|
# Nur senden wenn Updates vorhanden [ true | false ]
|
|
NTFY_ONLY_ON_CHANGES=false
|
|
|
|
# Versionsnummern anzeigen [ true | false ]
|
|
NTFY_SHOW_VERSIONS=true
|
|
|
|
|
|
# ----------------------------------------------------------
|
|
# DOCKER CLEANUP
|
|
# ----------------------------------------------------------
|
|
|
|
# Prune Befehle ausführen [ true | false ]
|
|
CLEANUP_ENABLED=true
|
|
|
|
# Nur nach erfolgten Updates ausführen [ true | false ]
|
|
CLEANUP_ONLY_ON_UPDATE=true
|
|
|
|
# Images löschen [ true | false ]
|
|
CLEANUP_IMAGES_ENABLED=true
|
|
|
|
# Image-Prune Modus [ dangling | unused ]
|
|
CLEANUP_IMAGES_MODE="unused"
|
|
|
|
# Container löschen [ true | false ]
|
|
CLEANUP_CONTAINERS_ENABLED=true
|
|
|
|
# Volumes löschen [ true | false ]
|
|
CLEANUP_VOLUMES_ENABLED=false
|
|
|
|
# Networks löschen [ true | false ]
|
|
CLEANUP_NETWORKS_ENABLED=true
|
|
```
|
|
|
|
---
|
|
|
|
## ▶️ Nutzung
|
|
|
|
```bash
|
|
chmod +x script.sh
|
|
./script.sh
|
|
```
|
|
|
|
---
|
|
|
|
## 🧠 Funktionsweise
|
|
|
|
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
|
|
|
|
---
|
|
|
|
## 🗑️ Prune / Cleanup
|
|
|
|
Nach Abschluss der Updates kann optional ein Docker Cleanup durchgeführt werden.
|
|
Dabei werden ungenutzte Ressourcen entfernt:
|
|
|
|
- `docker image prune`
|
|
→ entfernt ungenutzte („dangling“) Images
|
|
|
|
- `docker image prune -a`
|
|
→ entfernt alle Images, die von keinem Container verwendet werden
|
|
|
|
- `docker container prune`
|
|
→ entfernt gestoppte Container
|
|
|
|
- `docker volume prune`
|
|
→ entfernt ungenutzte Volumes
|
|
|
|
- `docker network prune`
|
|
→ entfernt ungenutzte Netzwerke
|
|
|
|
---
|
|
|
|
## 🔔 ntfy Prioritäten
|
|
|
|
| Zustand | Priorität |
|
|
|----------------------|----------|
|
|
| ✔️ Keine Updates | 1 |
|
|
| 🔄 Updates vorhanden | 3 |
|
|
| ❌ Fehler | 5 |
|
|
|
|
---
|
|
|
|
## 📄 Beispiel Ausgabe
|
|
|
|
```
|
|
→ Prüfe Stack: homepage
|
|
├─ dockerproxy (image)
|
|
└─ homepage (image)
|
|
|
|
→ Prüfe Stack: app
|
|
├─ db (image)
|
|
⬆️ UPDATE
|
|
alt: sha256:abc
|
|
neu: sha256:def
|
|
└─ web (image)
|
|
🔄 Stack wird neu deployt
|
|
```
|
|
|
|
---
|
|
|
|
## ⚠️ Hinweise
|
|
|
|
Wird in einem Stack ein Container aktualisiert, wird anschließend der gesamte Stack neu gestartet, sofern er mehr als einen Container enthält. Dadurch wird sichergestellt, dass alle Abhängigkeiten wieder gemäß der `docker-compose.yml` ausgeführt werden. |