Repository navigation
fix(comfyui-qwen,#14382): credential API par fichier bind-mounte, plus d'interpolation compose - #14426
Conversation
…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>
Bash Syntax Advisory — shebang / executable-bit warningsSee the |
jsboige
left a comment
There was a problem hiding this comment.
[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.shlit bien celui du service principal,comfyui_idle_monitor.pycelui du sidecar via_read_token_file()fallback. Cohérent. install_comfyui.sh:cpdu fichier +exit 1si absent — fail-loud, remplace leechosilencieusement tronqué. Bon.- Suppressions nettes :
COMFYUI_BEARER_TOKENetCOMFYUI_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.pyne é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.
Grain: MED/genai -- lane myia-po-2023:CoursIA -- prev: MED/genai #14415
Resume
Cable le credential ComfyUI-Login de
comfyui-qwenen 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)
$2b$12$Iv...(60c) compare litteralement au fichier bind-mounte.secrets/qwen-api-user.token. Docker compose interprete les$des valeurs interpolees :docker compose configemetThe "Iv" variable is not set, et le conteneur vivant portait unCOMFYUI_BEARER_TOKENde 57c (le$Ivavale, 60-3=57). Toute voie env-compose du credential est donc corrompue par construction.COMFYUI_BEARER_TOKEN/COMFYUI_RAW_TOKEN, querender_envs.pyne gere pas : sur un.envrendu 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 ouauth_manager.pyles 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 outreCOMFYUI_RAW_TOKEN(le mot de passe formulaire, pas le bearer) -> ses polls d'activite prenaient 401.Controle d'honnetete : le token notebook
GenAI/.envn'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 envCOMFYUI_BEARER_TOKEN(service) etCOMFYUI_AUTH_TOKEN=${COMFYUI_RAW_TOKEN}(idle-monitor) ; le monitor bind-mounte.secrets/qwen-api-user.tokenen lecture seule.shared/comfyui_idle_monitor.py:--tokenpar defaut = env OU fichier/secrets/qwen-api-user.token(fallback, sans interpolation).workspace/install_comfyui.sh: lePASSWORDde ComfyUI-Login est copie depuis le fichier monte (l'echode l'env ecrivait un token tronque), avec erreur explicite si le fichier manque.scripts/secrets/render_envs.py:COMFYUI_AUTH_TOKENentre dansSECRET_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 chaineor.scripts/genai-stack/core/auth_manager.py: n'ecrit plusCOMFYUI_BEARER_TOKEN/COMFYUI_RAW_TOKENdans 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.envgeres).Verification (po-2023, stack live)
docker compose config --quietsur le nouveau compose : plus AUCUN warning d'interpolation de bcrypt (avant :Iv is not setx4).render_envs.py --check:All 18 target .env in sync (27 secret keys)avec AUTH dans master ; import module ->SECRET_KEYS/ALIASEScoherents (28 cles).up -d --build idle-monitor), service recre (healthy), matrice auth live : credential fichier HTTP 200 / sans auth HTTP 401 sur/system_stats./secrets/qwen-api-user.tokenmonte (60 octets verifies en conteneur),Successfully logged in as admin, polling actif (Idle: 0s / 1200s) — zero 401.grep -c qwen-api-user.tokensur le script extrait de l'image = 2.py_compile/ast.parsesur les 3 scripts Python,bash -nsur install_comfyui.sh.Note d'ops : l'image service a ete rebuild une fois par erreur pendant la verification (
--buildnon cible) — le redemarrage initial a bute surlibGL.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)
.claude/rules/genai-config.md, skills) qui documentent encoreCOMFYUI_BEARER_TOKEN— sujet doc a part.QWEN_API_TOKENvsCOMFYUI_API_TOKEN(deux "bearer" logiques cote notebooks 00-5) — non tranche ici.Closes #14382
🤖 Generated with Claude Code