Code source wiki de Watchtower
Modifié par john le 2026/09/20 18:43
Afficher les derniers auteurs
| author | version | line-number | content |
|---|---|---|---|
| 1 | = Watchtower = | ||
| 2 | |||
| 3 | Mise à jour automatique des images Docker des conteneurs de la machine. | ||
| 4 | |||
| 5 | == Rôle == | ||
| 6 | |||
| 7 | Watchtower surveille les registres des images utilisées par les conteneurs en cours d'exécution, télécharge les nouvelles versions et recrée les conteneurs avec la configuration présente dans Docker au moment de la mise à jour (variables, volumes, réseaux, labels). Il ne lit pas les fichiers Compose et ne connaît pas les stacks Portainer : une image épinglée sur un tag fixe n'est jamais mise à jour, seuls les tags mouvants (##latest##, ##stable##) le sont. | ||
| 8 | |||
| 9 | == Fork utilisé == | ||
| 10 | |||
| 11 | Le projet d'origine ##containrrr/watchtower## est archivé depuis décembre 2025. L'image utilisée est le fork maintenu ##nickfedor/watchtower##, qui conserve les variables ##WATCHTOWER_*## et l'espace de noms de labels ##com.centurylinklabs.watchtower.*##. | ||
| 12 | |||
| 13 | Documentation : [[watchtower.nickfedor.com>>https://watchtower.nickfedor.com/]] | ||
| 14 | |||
| 15 | == Stack == | ||
| 16 | |||
| 17 | {{code language="yaml"}} | ||
| 18 | services: | ||
| 19 | watchtower: | ||
| 20 | image: nickfedor/watchtower:latest | ||
| 21 | container_name: watchtower | ||
| 22 | restart: unless-stopped | ||
| 23 | environment: | ||
| 24 | - TZ=<FUSEAU_HORAIRE> | ||
| 25 | - WATCHTOWER_SCHEDULE=0 0 5 * * * | ||
| 26 | - WATCHTOWER_CLEANUP=true | ||
| 27 | volumes: | ||
| 28 | - /var/run/docker.sock:/var/run/docker.sock | ||
| 29 | {{/code}} | ||
| 30 | |||
| 31 | * ##WATCHTOWER_SCHEDULE## utilise un cron à six champs : le premier est celui des secondes. La valeur ci-dessus déclenche un passage à 5 h 00. | ||
| 32 | * ##WATCHTOWER_CLEANUP## supprime l'image précédente après recréation du conteneur, sinon les anciennes couches s'accumulent. | ||
| 33 | * Aucune API HTTP n'est activée et aucune notification n'est configurée côté Watchtower : le suivi des mises à jour est assuré par un workflow n8n qui interroge docker-socket-proxy en lecture seule toutes les dix minutes et notifie sur Telegram. | ||
| 34 | |||
| 35 | {{warning}} | ||
| 36 | Le montage de ##/var/run/docker.sock## donne à ce conteneur un contrôle total de l'hôte. Il ne doit être ni publié, ni proxifié, ni placé sur un réseau partagé avec des services exposés. | ||
| 37 | {{/warning}} | ||
| 38 | |||
| 39 | == Options disponibles, non utilisées ici == | ||
| 40 | |||
| 41 | |=Variable|=Effet|=Statut | ||
| 42 | |WATCHTOWER_POLL_INTERVAL|Intervalle de scrutation en secondes (300 par défaut)|Remplacé par un cron | ||
| 43 | |WATCHTOWER_ROLLING_RESTART|Met à jour les conteneurs un par un|Incompatible avec les dépendances, voir ci-dessous | ||
| 44 | |WATCHTOWER_MONITOR_ONLY|Détecte et signale sans mettre à jour|Rôle tenu par n8n | ||
| 45 | |WATCHTOWER_NO_PULL|Ne consulte que le cache d'images local|Utile pour des images construites localement | ||
| 46 | |WATCHTOWER_NO_RESTART|Recrée les conteneurs sans les démarrer|Pour un cycle de vie géré par systemd | ||
| 47 | |WATCHTOWER_LABEL_ENABLE|Inverse la logique : seuls les conteneurs marqués enable=true sont suivis|La liste d'exclusions est plus courte que la liste d'inclusions | ||
| 48 | |WATCHTOWER_DISABLE_CONTAINERS|Exclusion par nom de conteneur, expressions régulières acceptées|Exclusions faites par label | ||
| 49 | |WATCHTOWER_ENABLE_CONTAINERS_BY_LABEL|Restreint le suivi à des paires label=valeur| | ||
| 50 | |WATCHTOWER_SKIP_IMAGE_NAMES|Exclusion par nom d'image, tag inclus| | ||
| 51 | |WATCHTOWER_SCOPE|Cloisonne plusieurs instances de Watchtower par label de portée|Une seule instance par machine | ||
| 52 | |WATCHTOWER_INCLUDE_STOPPED|Inclut les conteneurs créés ou sortis| | ||
| 53 | |WATCHTOWER_REVIVE_STOPPED|Redémarre les conteneurs arrêtés après mise à jour, exige include-stopped|Laisserait repartir les conteneurs volontairement arrêtés | ||
| 54 | |WATCHTOWER_INCLUDE_RESTARTING|Inclut les conteneurs en état restarting| | ||
| 55 | |WATCHTOWER_REMOVE_VOLUMES|Supprime les volumes anonymes lors de la recréation, les volumes nommés ne sont pas touchés| | ||
| 56 | |WATCHTOWER_TIMEOUT|Délai avant arrêt forcé d'un conteneur, 30s par défaut| | ||
| 57 | |WATCHTOWER_DISK_SPACE_MAX|Bloque la session de mise à jour au-delà d'un volume d'images donné| | ||
| 58 | |WATCHTOWER_DISK_SPACE_WARN|Seuil d'avertissement, en taille ou en pourcentage du maximum| | ||
| 59 | |WATCHTOWER_USE_COMPOSE_DEPENDS_ON|Respecte l'ordre imposé par depends_on, actif par défaut|Laissé à sa valeur par défaut | ||
| 60 | |WATCHTOWER_LABEL_TAKE_PRECEDENCE|Donne la priorité aux labels sur les options globales| | ||
| 61 | |WATCHTOWER_HTTP_API_UPDATE|Expose un point d'entrée de mise à jour à la demande|API non activée | ||
| 62 | |WATCHTOWER_HTTP_API_TOKEN|Jeton d'authentification de l'API|API non activée | ||
| 63 | |WATCHTOWER_HTTP_API_METRICS|Expose des métriques Prometheus|API non activée | ||
| 64 | |WATCHTOWER_NOTIFICATION_URL|Notifications Shoutrrr (Telegram, courriel, Gotify…)|Notifications assurées par n8n | ||
| 65 | |WATCHTOWER_EPHEMERAL_SELF_UPDATE|Auto-mise à jour par conteneur orchestrateur éphémère|Expérimental | ||
| 66 | |||
| 67 | {{warning}} | ||
| 68 | ##--rolling-restart## ne fonctionne pas dès qu'un conteneur suivi possède une dépendance : ##depends_on## Compose, label ##depends-on##, lien Docker ou ##network_mode## pointant vers un autre conteneur. Le fork refuse alors de démarrer. L'option a été retirée de la stack pour cette raison. | ||
| 69 | {{/warning}} | ||
| 70 | |||
| 71 | == Exclusions == | ||
| 72 | |||
| 73 | Les conteneurs portant le label ##com.centurylinklabs.watchtower.enable=false## sont ignorés, sans autre configuration côté Watchtower. | ||
| 74 | |||
| 75 | |=Conteneur|=Raison de l'exclusion | ||
| 76 | |Reverse proxy|Toute la chaîne d'accès aux services en dépend, une régression coupe l'accès distant à la machine | ||
| 77 | |Authentification unique|Un changement de schéma de configuration bloque l'authentification de tous les services protégés | ||
| 78 | |Détection et bannissement|Configuration sensible (acquisition, profils, bouncers) susceptible d'évoluer d'une version à l'autre | ||
| 79 | |Base de données applicative|Un changement de version majeure du moteur peut déclencher une migration de schéma irréversible | ||
| 80 | |||
| 81 | Déclaration dans la stack du service concerné : | ||
| 82 | |||
| 83 | {{code language="yaml"}} | ||
| 84 | labels: | ||
| 85 | - com.centurylinklabs.watchtower.enable=false | ||
| 86 | {{/code}} | ||
| 87 | |||
| 88 | Ces quatre conteneurs se mettent à jour manuellement, après lecture des notes de version, en dehors des fenêtres de sauvegarde. | ||
| 89 | |||
| 90 | === Autres labels reconnus === | ||
| 91 | |||
| 92 | |=Label|=Effet | ||
| 93 | |com.centurylinklabs.watchtower.enable|true ou false, inclut ou exclut le conteneur | ||
| 94 | |com.centurylinklabs.watchtower.monitor-only|Détecte la nouvelle image sans recréer le conteneur | ||
| 95 | |com.centurylinklabs.watchtower.no-pull|N'interroge pas le registre pour ce conteneur | ||
| 96 | |com.centurylinklabs.watchtower.scope|Rattache le conteneur à une instance de Watchtower donnée | ||
| 97 | |com.centurylinklabs.watchtower.depends-on|Ordre de mise à jour explicite, indépendant de Compose | ||
| 98 | |com.centurylinklabs.watchtower.lifecycle.pre-update-command|Commande exécutée dans le conteneur avant l'arrêt | ||
| 99 | |com.centurylinklabs.watchtower.lifecycle.post-update-command|Commande exécutée après le démarrage de la nouvelle instance | ||
| 100 | |||
| 101 | == Commandes utiles == | ||
| 102 | |||
| 103 | {{code language="bash"}} | ||
| 104 | # Journaux du dernier passage | ||
| 105 | docker logs --tail 100 watchtower | ||
| 106 | |||
| 107 | # Vérifier la planification prise en compte au démarrage | ||
| 108 | docker logs watchtower | grep -i -e schedule -e "next run" | ||
| 109 | |||
| 110 | # Conteneurs actuellement exclus | ||
| 111 | docker ps --filter "label=com.centurylinklabs.watchtower.enable=false" | ||
| 112 | |||
| 113 | # Vérifier les labels Watchtower d'un conteneur | ||
| 114 | docker inspect <NOM_CONTENEUR> | grep -i watchtower | ||
| 115 | |||
| 116 | # Passage immédiat, sans toucher au conteneur planifié | ||
| 117 | docker run --rm \ | ||
| 118 | -v /var/run/docker.sock:/var/run/docker.sock \ | ||
| 119 | nickfedor/watchtower --run-once --cleanup <NOM_CONTENEUR> | ||
| 120 | |||
| 121 | # Contrôle à blanc : signale les images obsolètes sans rien recréer | ||
| 122 | docker run --rm \ | ||
| 123 | -v /var/run/docker.sock:/var/run/docker.sock \ | ||
| 124 | nickfedor/watchtower --run-once --monitor-only | ||
| 125 | |||
| 126 | # Prise en compte d'un changement de variable : redéployer la stack | ||
| 127 | {{/code}} | ||
| 128 | |||
| 129 | {{info}} | ||
| 130 | La sauvegarde nocturne est déclenchée à 3 h 30, Watchtower à 5 h. Une mise à jour défaillante est donc toujours précédée d'un point de restauration de la nuit même. | ||
| 131 | {{/info}} |