4.7 KiB
#223 — Dev/prod sans noms publics en dur : URLs de l'écosystème par configuration
Ouvert le 2026-10-25 (chantier dev/prod de Bruno). Contexte : l'installation actuelle (
deepin.lab.home) devient l'environnement dev (noms en-dev), la future installation (jump.point.mint.home) sera la prod (noms officiels sans suffixe), identique sauf noms et clés. Règle : aucun nom public de l'écosystème codé en dur dans le code vivant ; défauts = noms officiels ; le dev déclare ses-devdans son seul.env.
Configuration (nouveau module backend/draco_config.py)
Lecture à l'appel, jamais à l'import. Défauts officiels :
| Variable | Défaut officiel | Rôle |
|---|---|---|
DRACO_AGENT_URL |
https://agent.dracodev.net |
Base du service d'agents. À défaut : origine dérivée d'AGENT_EVENEMENTS_URL, puis défaut. |
DRACO_OBSIGATE_URL |
https://og.dracodev.net |
Liens profonds ObsiGate |
DRACO_FLOWDECK_URL |
https://flowdeck.dracodev.net |
Liens profonds Flowdeck |
DRACO_TIKTAK_URL |
https://tiktak.dracodev.net |
Liens profonds TikTak |
DRACO_KANBANTE_URL |
https://kanbante.dracodev.net |
Onglet Kanbante de la barre |
DRACO_GITEA_URL |
https://git.dracodev.net |
Cartes Kanbante (= issues Gitea). Distincte d'OBSIGATE_GITEA_URL (source connectée de l'assistant). |
AGENT_EVENEMENTS_URL (existant, #220) reste la configuration première du
journal d'événements ; agent_journal._url() retombe sur
DRACO_AGENT_URL + /api/v1/evenements quand elle est absente.
Backend
- CSP (
backend/main.py,SecurityHeadersMiddleware) :connect-srcetframe-srcutilisentdraco_config.agent_origine()— dérivée de la config à chaque réponse, plus aucun littéral. Tests danstests/test_security_headers.pyvia la config (défaut officiel neutralisé, dérivation depuisAGENT_EVENEMENTS_URL, prioritéDRACO_AGENT_URL). - Références croisées (
backend/external_refs.py) :parse_deep_linkreconnaît les hôtes officiels et configurés (draco_config.hotes_reconnus()) — un lien collé depuis le dev comme depuis la prod est reconnu.build_deep_link(app, type, id)construit l'URL d'affichage depuis la config ;list_refs/get_ref/delete_refservent des copies donttarget_urlest reconstruite à la lecture. ⚠️ Les références stockées (data/external_refs/*.json) gardent l'URL absolue collée par l'utilisateur : aucune migration, la valeur stockée n'est simplement plus jamais servie telle quelle.
- WebAuthn — confirmé, aucun changement :
resolve_relying_party()(backend/auth/webauthn_mfa.py, BUG-070) dériverp_id/origines de la requête (hôte exact,X-Forwarded-Host/X-Forwarded-Protohonorés siOBSIGATE_TRUST_PROXY=true), etOBSIGATE_WEBAUTHN_RP_ID/OBSIGATE_WEBAUTHN_ORIGINSpriment quand ils sont posés. Aucun nom figé.
Frontend (contrat d'injection de dracodev-commons)
L'hôte fournit les URL : backend/main.py::_index_html() injecte
window.DRACO_URLS = {…} (JSON issu de draco_config.urls_publiques(),
nonce CSP par le mécanisme existant) dans index.html au service.
frontend/draco-panneau.js:API = window.DRACO_URLS.agent || défaut officiel;appHote()retire un suffixe-devéventuel du premier label d'hôte (og-dev→obsigatepour le lien profond?app=).frontend/draco-liens.js: « Ouvrir dans TikTak » =window.DRACO_URLS.tiktak || défaut officiel.frontend/index.html: leshrefdes onglets portent les défauts officiels ; le script de configuration de la barre les réécrit depuisDRACO_URLS. Le menu des apps (draco-barre.js) est construit depuis ces onglets : il suit donc sans changement.- Chemin réellement servi :
/static/draco-*.jsvia le montageStaticFiles,Cache-Control: no-cacheposé parSecurityHeadersMiddlewaresur/static/*, et service worker network-first pour le code — aucun cache-busting par empreinte n'existe (revalidation systématique).
Restes assumés
- Suffixe SSO
dracodev.net(draco_session.validate_return_to,frontend/js/auth.js) : ce n'est pas un nom d'hôte mais le domaine parent commun aux deux environnements (les noms-devrestent des sous-domaines) ; le domaine du cookie est déjà configurable (DRACO_SESSION_COOKIE_DOMAIN). - Mentions textuelles (titres/messages du panneau, contact OpenAPI et lien « À propos » vers le dépôt Git) : infra Git hors périmètre, ou libellés.
OBSIGATE_SEARXNG_URL: déjà configurable, défaut officiel conservé.- Le panneau reste un asset partagé : la même ligne d'injection doit être recopiée dans les 3 autres apps par leurs chantiers respectifs pour retrouver l'octet-identique.