Skip to content

Génère le jeton de l'updater au lieu de le faire saisir - #28

Merged
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu
Aug 1, 2026
Merged

Génère le jeton de l'updater au lieu de le faire saisir#28
flocom merged 1 commit into
mainfrom
claude/remove-apel-sensitive-data-73l5iu

Conversation

@flocom

@flocom flocom commented Aug 1, 2026

Copy link
Copy Markdown
Owner

Le bouton Appliquer maintenant demandait de choisir une valeur au hasard, de la coller dans le .env du serveur et de relancer la pile. C'est une contrainte pour rien : ce jeton n'autorise qu'une demande de redémarrage entre deux conteneurs de la même machine.

Ce qui change

L'entrypoint génère le jeton au premier démarrage et le conserve dans le volume de configuration, comme les autres secrets. Watchtower remplace la valeur de WATCHTOWER_HTTP_API_TOKEN par le contenu du fichier quand elle désigne un fichier existant : les deux conteneurs partagent donc le même jeton sans que personne n'ait de valeur à saisir. Renseigner la variable dans le .env continue d'imposer une valeur.

Le conteneur updater-token, lancé par le même profil autoupdate, exécute l'entrypoint puis s'arrête. Il garantit que le fichier existe avant que l'updater ne le lise, sans faire dépendre l'updater de la santé de l'application — dont il est justement le moyen de rétablissement.

Deux correctifs découverts en vérifiant sur une pile réelle

  • Aucune mise à jour automatique n'avait lieu sur un Docker récent. Watchtower 1.7.1 s'adresse au démon en API 1.25, que les moteurs récents refusent (client version 1.25 is too old. Minimum supported API version is 1.40). DOCKER_API_VERSION corrige ce point ; 1.41 est acceptée par tous les démons depuis Docker 20.10.
  • Les fichiers temporaires des secrets étaient nommés d'après le PID, or tous les conteneurs démarrent leur entrypoint en PID 1. Deux conteneurs lancés en même temps sur un volume vierge écrivaient dans le même fichier temporaire et pouvaient retenir des secrets différents. mktemp et une création par lien dur (ln, qui échoue si la cible existe) les font converger.

Vérifications

Menées avec un démon Docker réel, l'image publiée et le vrai compose.yaml :

Test Résultat
Six conteneurs simultanés sur un volume vierge une seule valeur retenue pour chaque secret (avant : deux, dont un jeton vide)
docker compose up -d, sans .env ni jeton saisi updater-token sort en 0 avant le démarrage de l'updater
POST /v1/update depuis le conteneur applicatif HTTP 200, Updates triggered by HTTP API request. côté updater
Même appel avec un autre jeton HTTP 401
WATCHTOWER_HTTP_API_TOKEN imposé dans l'environnement valeur reprise par l'application et par l'updater, fichier réaligné
Fichier avec et sans saut de ligne final lu correctement dans les deux cas
DOCKER_API_VERSION absente l'updater ne joint pas le démon, aucune mise à jour

tsc --noEmit, npm run lint et next build passent.

Côté serveur

Une seule commande, une seule fois :

git pull && docker compose pull && docker compose up -d

compose.yaml vit sur le serveur et n'est pas mis à jour par l'updater.


Generated by Claude Code

Le bouton « Appliquer maintenant » demandait de choisir une valeur au hasard,
de la coller dans le .env du serveur et de relancer la pile. C'est une
contrainte pour rien : ce jeton n'autorise qu'une demande de redémarrage entre
deux conteneurs de la même machine.

L'entrypoint le génère désormais au premier démarrage et le conserve dans le
volume de configuration, comme les autres secrets. Watchtower remplace la
valeur de WATCHTOWER_HTTP_API_TOKEN par le contenu du fichier quand elle
désigne un fichier existant : les deux conteneurs partagent donc le même jeton
sans que personne n'ait de valeur à saisir. Renseigner la variable dans le .env
continue d'imposer une valeur.

Le conteneur `updater-token`, lancé par le même profil, exécute l'entrypoint
puis s'arrête : il garantit que le fichier existe avant que l'updater ne le
lise, sans faire dépendre l'updater de la santé de l'application, dont il est
justement le moyen de rétablissement.

Deux correctifs découverts en vérifiant le tout sur une pile réelle :

- Watchtower 1.7.1 s'adresse au démon Docker en API 1.25, que les moteurs
  récents refusent (« client version 1.25 is too old », minimum 1.40) : aucune
  mise à jour n'avait lieu. DOCKER_API_VERSION corrige ce point.
- Les fichiers temporaires des secrets étaient nommés d'après le PID, or tous
  les conteneurs démarrent leur entrypoint en PID 1 : deux conteneurs lancés en
  même temps sur un volume vierge s'écrasaient mutuellement et pouvaient
  retenir des secrets différents. mktemp et une création par lien dur les font
  converger — vérifié avec six conteneurs simultanés.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014SfQYBU4xXTeSEHKhHQXdD
@flocom
flocom merged commit df7d4fd into main Aug 1, 2026
1 check passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants