Aller au contenu

Docker Auto-Updates

Le workflow Docker Auto-Updates automatise la mise à jour des images Docker du VPS. DIUN détecte les nouvelles versions disponibles, le hub N8N classifie chaque image (critical / base / applicatif), et un sous-workflow exécute le cycle complet : backup, pull/build, health check, rollback si nécessaire, notification.

WorkflowIDNodesRôle
Docker DIUN (parent)WdSepRkceMzI0QQ536Triggers, routage par catégorie, classification
DIUN Update Executor (SW-1)VSFJv2DbdkvQ2cl125Lifecycle partagé : backup, update, health check, rollback, notify
DIUN Queue Processor (SW-2)Eb3QIk8DnEQIXeSl6Boucle de traitement de la queue 03h-05h
DIUN Approval Handler (SW-3)JLsR7JSMAQDwzqEX20Classification, approbation, rejet, report Telegram

Avant le refactoring #275, ce workflow comptait 101 nodes monolithiques. La séparation en hub + 3 sous-workflows permet de tester chaque cycle isolément et de réutiliser le DIUN Update Executor depuis d’autres déclencheurs (rebuild manuel, file provider).

SW-2 Queue Processor · 6 nodes

SW-1 Update Executor · 25 nodes

SW-3 Approval Handler · 20 nodes

Docker DIUN · 36 nodes

Déclencheurs

base

03h-05h

critical

applicatif

approved

rejected/later

DIUN webhook · 6h scan

File Provider · base images

Cron 03h · queue processor

Manual rebuild

Webhook

Lookup image_policies

Classify · critical / base / applicatif

Notification Hub · approval

Wait for callback · approve/reject/later

Switch decision

Backup if needed

Pull or Build

compose up -d

Health check 2 min

Rollback if KO

Notification Hub · success/failure

Loop pending_updates

Call Update Executor

Insert pending_updates

CatégorieComportementExemples
criticalUpdate immédiat + health checkcaddy, crowdsec, security-stack
baseQueue pour fenêtre 03h-05hpostgres, redis, prometheus
applicatifApprobation admin requise via Telegramn8n, odoo, grafana, ai-stack

ProblèmeSans ce workflowAvec ce workflow
Images obsolètesVulnérabilités non patchéesUpdates automatiques selon politique
Downtime utilisateurUpdates en pleine journéeFenêtre de maintenance nocturne
Updates risquésPas de validation préalableApprobation pour les apps critiques
Rollback manuelIntervention tardiveHealth check + rollback automatique
Pas de visibilité versions”Quelque chose a changé”Version tracking before/after dans la notif
CatégorieJustification
criticalSécurité prioritaire, update immédiat (Caddy = point d’entrée)
baseInfra stable, update nocturne pour minimiser l’impact
applicatifBusiness-critical, validation humaine requise

Pourquoi un sub-workflow Update Executor partagé ?

Section intitulée « Pourquoi un sub-workflow Update Executor partagé ? »

Le cycle d’update (backup → pull/build → up → health check → rollback / notify) est identique quelle que soit la cause du déclenchement. L’extraction en SW-1 permet :

BénéficeDétail
RéutilisationMêmes garanties pour DIUN, file provider, rebuild manuel
Tests isolésMockable indépendamment du trigger
MaintenanceUn seul endroit où changer la stratégie de health check

ColonneTypeDescription
image_keyTextClé unique : project/service
categoryTextcritical / base / applicatif
backupBooleanBackup requis avant update
custom_buildBooleanImage custom (build vs pull)
github_repoTextowner/repo pour changelog
compose_dirTextChemin absolu du docker-compose
ColonneTypeDescription
image_keyTextClé unique
imageTextNom complet de l’image
projectTextNom du projet
serviceTextNom du service
custom_buildBooleanBuild au lieu de pull
created_atTextTimestamp ISO

pending_updates_approvals — Approbations en attente

Section intitulée « pending_updates_approvals — Approbations en attente »

Approbations applicatives en attente de réponse Telegram. TTL 7j ; au-delà, l’approbation est automatiquement requestée à nouveau au prochain scan.

Fenêtre de terminal
# Image standard
docker compose -f /path/to/stack/docker-compose.yaml pull
docker compose -f /path/to/stack/docker-compose.yaml up -d
# Image custom (custom_build = true)
docker compose -f /path/to/stack/docker-compose.yaml pull --ignore-buildable
docker compose -f /path/to/stack/docker-compose.yaml build --no-cache
docker compose -f /path/to/stack/docker-compose.yaml up -d

Image applicative détectée

Notification Hub · approval_request

Boutons inline · Approve / Reject / Later

NH Callback Handler

SW-3 Approval Handler

Switch decision

approved

rejected

later → pending_updates

SW-1 Update Executor

Notify · Skipped

Queue 03h-05h

Après chaque update, SW-1 vérifie pendant 2 minutes que les conteneurs sont healthy :

Fenêtre de terminal
docker compose -f /path/to/stack/docker-compose.yaml ps --format json

Si un conteneur reste unhealthy après 120 s, un rollback est déclenché : docker compose pull <previous_digest> puis up -d. Une notification critical est envoyée au Hub avec le détail du diagnostic.

Updater N8N lui-même est délicat : le workflow d’update tourne dans le container qu’il met à jour. Le pattern self-restart utilisé :

ÉtapeAction
1Insert flag de maintenance dans error_handling_config (suppress notifications)
2Déclencher un script externe via nohup qui attend 10s puis docker compose up -d --force-recreate
3Le workflow N8N s’arrête (le container redémarre)
4Au redémarrage, un workflow de cleanup retire le flag de maintenance et notifie le succès

Chaque update capture les versions avant/après pour traçabilité. Le format utilise des marqueurs SSH pour extraire les versions du Dockerfile ou du image:tag :

n8n-custom:latest 2.4.8 → 2.5.0
caddy-crowdsec:latest 2.8.4 → 2.8.5

Les notifications Telegram affichent la transition de version, ce qui permet de voir d’un coup d’œil la nature du changement (patch, minor, major).

Quand une image de base change (node:20-slim, caddy:builder…), les images custom qui en dépendent doivent être reconstruites. DIUN surveille ces images via son provider file (lecture du base-images.yml), et le workflow détecte la dépendance.

Image de baseService customCatégorie
caddy:builder, caddy:latestsecurity-stack/caddycritical (rebuild immédiat)
n8nio/n8n:latestn8n-stack/n8napplicatif (approbation requise)
node:20-slim, ghcr.io/astral-sh/uvai-stack/cli-ollamaapplicatif (approbation requise)

Quand Prometheus Alertmanager signale un problème (conteneur down, CPU spike, disk full), un workflow Incident Response déclenche un diagnostic Claude :

SévéritéComportement
TRIVIALAuto-remediation (restart) + health check + notification
MODERATEClaude propose + exécute le fix, monitoring 5 min
COMPLEXClaude génère un plan, attente d’approbation humaine (timeout 30 min)

Pour les cas COMPLEX, Claude produit un plan détaillé envoyé sur Telegram avec boutons [Exécuter] [Modifier] [Ignorer]. C’est le même pattern Plan Engine que le Système Conversationnel.

Fenêtre de terminal
# Forcer un check DIUN
docker exec diun diun --test
# Logs DIUN
docker logs diun --tail 50
# Voir les politiques configurées
# N8N → Data → Tables → image_policies (26 entries actuelles)
# Voir les updates en attente
# N8N → Data → Tables → pending_updates

LimiteImpactMitigation
Pas de tests automatiquesRisque de régression non détectéeHealth check basique uniquement
Rollback manuel possibleSi rollback échoue, intervention requiseNotification immédiate avec contexte
Dépendance DIUNPas de détection si DIUN downMonitoring du conteneur via Health Check
Pas de canaryUpdate direct, pas de progressive rolloutAcceptable sur un VPS solo

Si un update cause une régression :

  • Health check détecte le problème
  • Rollback automatique vers l’image précédente
  • Notification avec détails pour investigation

Si les updates sont trop fréquents :

  • Ajuster le polling DIUN (actuellement 6h)
  • Créer une catégorie “stable” avec updates mensuels
  • Filtrer par semantic versioning (major uniquement)

Si besoin de tests plus poussés :

  • Smoke tests post-update via la stack monitoring-stack
  • Délai d’observation avant notification success
  • Environnement staging dédié pour tests préalables (coût VPS supplémentaire)

Si couplage CVE plus fort souhaité :

  • Refuser un update qui introduirait une nouvelle CRITICAL non corrigée
  • Utiliser la veille Security CVE Watch comme gating

  • Glossaire — DIUN, Health Check, Self-restart, File Provider