Skip to content

fix(comfyui-qwen,#14382): credential API par fichier bind-mounte, plus d'interpolation compose - #14426

Merged
myia-ai-01 merged 1 commit into
mainfrom
fix/14382-comfyui-qwen-token-source
Sep 3, 2026
Merged

myia-ai-01 merged 1 commit into
mainfrom
fix/14382-comfyui-qwen-token-source

Conversation

@jsboige

@jsboige jsboige commented Sep 3, 2026 •

Copy link
Copy Markdown
Owner

Grain: MED/genai -- lane myia-po-2023:CoursIA -- prev: MED/genai #14415

Resume

Cable le credential ComfyUI-Login de comfyui-qwen en source unique et le sort de l'interpolation d'env du compose. Repond a l'arbitrage de #14382 (option « cabler », raffinee : le credential propage est la forme hash-deja-partagee, JAMAIS le brut).

Deux defauts reels verifies firsthand (po-2023, 2026-09-03)

  1. L'interpolation compose MANGLE le bcrypt. Le credential ComfyUI-Login est un bcrypt $2b$12$Iv... (60c) compare litteralement au fichier bind-mounte .secrets/qwen-api-user.token. Docker compose interprete les $ des valeurs interpolees : docker compose config emet The "Iv" variable is not set, et le conteneur vivant portait un COMFYUI_BEARER_TOKEN de 57c (le $Iv avale, 60-3=57). Toute voie env-compose du credential est donc corrompue par construction.
  2. Noms non geres = drift garanti. Le compose interpolait COMFYUI_BEARER_TOKEN / COMFYUI_RAW_TOKEN, que render_envs.py ne gere pas : sur un .env rendu par le seul render ils resolvent vide (mesure comfyui-qwen: COMFYUI_AUTH_TOKEN et COMFYUI_BEARER_TOKEN resolvent vide (deux producteurs du .env, jeux de cles divergents) #14382), et la ou auth_manager.py les avait ecrits ce sont des copies non gerees qui derivent a la prochaine rotation (pattern incident GenAI/Image racine : 2 figures README = rendus dégradés (blocs plats) à régénérer sur stack GenAI (RECOVERABLE-MACHINE) #6901). Le sidecar idle-monitor recevait en outre COMFYUI_RAW_TOKEN (le mot de passe formulaire, pas le bearer) -> ses polls d'activite prenaient 401.

Controle d'honnetete : le token notebook GenAI/.env n'etait PAS casse — un 401 initial de ma mesure etait un artefact d'extraction (quotes simples non retirees) ; dequote, il fait HTTP 200. Le defaut etait bien le plumbing non gere, pas une panne client en cours.

Changements

  • docker-compose.yml : suppression des lignes env COMFYUI_BEARER_TOKEN (service) et COMFYUI_AUTH_TOKEN=${COMFYUI_RAW_TOKEN} (idle-monitor) ; le monitor bind-mounte .secrets/qwen-api-user.token en lecture seule.
  • shared/comfyui_idle_monitor.py : --token par defaut = env OU fichier /secrets/qwen-api-user.token (fallback, sans interpolation).
  • workspace/install_comfyui.sh : le PASSWORD de ComfyUI-Login est copie depuis le fichier monte (l'echo de l'env ecrivait un token tronque), avec erreur explicite si le fichier manque.
  • scripts/secrets/render_envs.py : COMFYUI_AUTH_TOKEN entre dans SECRET_KEYS + ALIASES (= COMFYUI_API_TOKEN, pattern HF_TOKEN/HUGGINGFACE_TOKEN) — gere le nom canonique notebook (🔐 Sécurisation des services IA exposés publiquement #16 flip) depuis master ; un AUTH perime non vide masquerait le bon fallback dans la chaine or.
  • scripts/genai-stack/core/auth_manager.py : n'ecrit plus COMFYUI_BEARER_TOKEN/COMFYUI_RAW_TOKEN dans les .env (fin du second producteur).
  • .env.example + docs/genai/secrets-management.md : section source-unique (tableau des voies par consommateur, procedure de rotation, pourquoi jamais d'env-compose pour ce credential, retrait du brut des .env geres).

Verification (po-2023, stack live)

  • docker compose config --quiet sur le nouveau compose : plus AUCUN warning d'interpolation de bcrypt (avant : Iv is not set x4).
  • render_envs.py --check : All 18 target .env in sync (27 secret keys) avec AUTH dans master ; import module -> SECRET_KEYS/ALIASES coherents (28 cles).
  • Deploiement live depuis l'arbre partage (po-2023) : monitor rebuild (up -d --build idle-monitor), service recre (healthy), matrice auth live : credential fichier HTTP 200 / sans auth HTTP 401 sur /system_stats.
  • Monitor sidecar demarre avec le nouveau code : /secrets/qwen-api-user.token monte (60 octets verifies en conteneur), Successfully logged in as admin, polling actif (Idle: 0s / 1200s) — zero 401.
  • Image monitor rebuild verifiee : grep -c qwen-api-user.token sur le script extrait de l'image = 2.
  • py_compile/ast.parse sur les 3 scripts Python, bash -n sur install_comfyui.sh.

Note d'ops : l'image service a ete rebuild une fois par erreur pendant la verification (--build non cible) — le redemarrage initial a bute sur libGL.so.1 (cv2) car l'arbre de deploiement local portait un entrypoint pre-#14229 ; copie de l'entrypoint main + restart = healthy. Sans rapport avec le diff de cette PR.

Non-couverts (follow-ups separes)

  • Harmonisation des noms dans les fichiers harnais (.claude/rules/genai-config.md, skills) qui documentent encore COMFYUI_BEARER_TOKEN — sujet doc a part.
  • Archeologie QWEN_API_TOKEN vs COMFYUI_API_TOKEN (deux "bearer" logiques cote notebooks 00-5) — non tranche ici.

Closes #14382

🤖 Generated with Claude Code

…ation compose

Le credential ComfyUI-Login (bcrypt $2b$12$Iv..., compare litteralement
au fichier bind-mounte) ne doit jamais traverser l'interpolation d'env
du compose : docker compose interprete les '$' des valeurs et le
conteneur recevait un token tronque (60c -> 57c, mesure ; warning
"Iv is not set"). Le compose interpolait en outre des noms que
render_envs.py ne gere pas -- vides sur un .env rendu par le seul
render (#14382), copies non gerees qui driftent a la rotation
(pattern #6901) -- et le sidecar idle-monitor recevait le mot de passe
formulaire (RAW) comme bearer -> polls 401.

- compose : lignes env credential supprimees ; idle-monitor bind-mounte
  .secrets/qwen-api-user.token en lecture seule
- comfyui_idle_monitor.py : --token fallback fichier /secrets/
- workspace/install_comfyui.sh : PASSWORD copie du fichier monte
  (l'echo de l'env ecrivait le token tronque), erreur si absent
- render_envs.py : COMFYUI_AUTH_TOKEN dans SECRET_KEYS + ALIASES
  (= COMFYUI_API_TOKEN, pattern HF) -- nom canonique notebook #16 gere
  depuis master, un AUTH perime non vide masquait le bon fallback
- auth_manager.py : n'ecrit plus BEARER/RAW dans les .env (fin du
  second producteur)
- .env.example + docs/genai/secrets-management.md : section source
  unique, procedure de rotation, retrait du brut des .env geres

Co-Authored-By: Claude-Code <noreply@anthropic.com>
@github-actions

github-actions Bot commented Sep 3, 2026

Copy link
Copy Markdown
Contributor

Bash Syntax Advisory — shebang / executable-bit warnings

See the Shebang + dry-run advisory job log for the per-file ::warning:: lines. Non-blocking.

@jsboige jsboige left a comment

Copy link
Copy Markdown
Owner Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

[Hermes] COMMENT — credential par fichier bind-mounté, câblage vérifié de bout en bout (contrainte token : COMMENT only)

Le diagnostic racine est le bon : l'interpolation compose interprète les $ des valeurs — un bcrypt $2b$12$Iv… ne peut JAMAIS transiter sainement par environment: dans un compose. Sortir le credential de l'env compose vers un bind mount read-only est le fix structurel, pas un pansement. La mesure (60c → 57c, $Iv avalé) est la preuve firsthand citée, et le contrôle d'honnêteté sur le faux 401 (artefact d'extraction, quotes non retirées) inspire confiance dans la démarche.

Vérifié dans le diff, au-delà du body :

  • Les DEUX montages existent au head : service principal /workspace/ComfyUI/.secrets/qwen-api-user.token (l.44-46, préexistant — chemin privilégié du middleware) et sidecar /secrets/qwen-api-user.token (l.133-135, ajouté). install_comfyui.sh lit bien celui du service principal, comfyui_idle_monitor.py celui du sidecar via _read_token_file() fallback. Cohérent.
  • install_comfyui.sh : cp du fichier + exit 1 si absent — fail-loud, remplace le echo silencieusement tronqué. Bon.
  • Suppressions nettes : COMFYUI_BEARER_TOKEN et COMFYUI_AUTH_TOKEN=${COMFYUI_RAW_TOKEN} disparaissent de l'env compose — le sidecar ne reçoit plus le mot de passe formulaire en guise de bearer (cause des 401).
  • auth_manager.py ne écrit plus les noms non gérés → plus de copies dérivantes (pattern incident #6901).
  • Security scan : 0 credential en dur — uniquement placeholders (your_comfyui_api_token_here), chemins et prose.

Un point de vigilance (non bloquant) : la rotation exige d'éditer COMFYUI_API_TOKEN et COMFYUI_AUTH_TOKEN dans master.env (même valeur). L'alias double-nom est documenté et le bootstrap vérifie la cohérence (abort si divergence), mais un futur consommateur qui n'ajouterait qu'un des deux noms recréerait un drift silencieux côté render. Si l'occasion se présente, un check render_envs.py qui exige l'égalité des deux alias au render (plutôt qu'au seul bootstrap) fermerait la classe entièrement.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

lane-claim-absent Closing issue carries no claim at all (#10223)

Projects

None yet

Development

Successfully merging this pull request may close these issues.

comfyui-qwen: COMFYUI_AUTH_TOKEN et COMFYUI_BEARER_TOKEN resolvent vide (deux producteurs du .env, jeux de cles divergents)

2 participants