TL;DR
Après le go-live de https://zevent.vfg.lol (dashboard ZDASH live à la racine), la session a figé en ligne les livraisons Kimi et un snapshot de l’UI ZDASH, accessibles via un index :
| URL | Contenu |
|---|---|
| https://zevent.vfg.lol/archives/ | Index des versions figées |
/kimi-hub/ | Build Kimi_Agent_Hub ZEvent temps réel |
/kimi-fusion/ | Build Kimi_Agent_Fusion Projet Sécurité |
/kimi-3d/ | Build Kimi_Agent_Projet VJ 3D POC |
/zevent-dash/ | Snapshot UI ZDASH (APIs live du même serveur) |
Le dashboard live reste à /. Les archives appellent encore les APIs externes (zevent.fr, relais CORS, decapi, Twitch IRC, etc.) → CSP dédiée ARCHIVE_CSP avec connect-src 'self' ws: wss: https:.
Contexte ops du même jour (incident Caddy Lucien) déjà documenté :
→ Incident Caddy — lucien.best offline (vhosts perdus) + prep zevent.vfg.lol
Pourquoi des archives sous le même host
Trois builds Kimi + un snapshot ZDASH existent dans le monorepo Zevent2026. Les servir sous le même zevent.vfg.lol évite :
- de multiplier les vhosts Caddy / ACME pour des artefacts de comparaison ;
- de perdre la trace « ce qui tournait » une fois la fusion produit avancée ;
- de devoir rouvrir un tunnel ou un static serveur ad hoc pour montrer Hub vs Fusion vs 3D vs ZDASH.
Le live (public/index.html + JS à la racine) continue d’utiliser la CSP stricte ZDASH (connect-src 'self' ws: wss: uniquement). Les builds archives, eux, parlent au monde extérieur → deux CSP, basculées par préfixe de chemin.
Ce qui a changé dans le code
Fichiers publics
zevent-dash/public/
archives/index.html # hub de liens
kimi-hub/ # dist figé
kimi-fusion/
kimi-3d/
zevent-dash/ # copie UI snapshot (hors racine live)
L’index /archives/ clarifie que le dashboard live reste à la racine et que les archives restent branchées sur les APIs temps réel externes.
Serveur (zevent-dash/server/server.js)
- Index dossiers — un
GET /kimi-hub/(trailing slash) résout…/kimi-hub/index.htmlviastat+isDirectory(), sinon 404. ARCHIVE_PREFIXES—/kimi-hub,/kimi-fusion,/kimi-3d,/zevent-dash,/archives.ARCHIVE_CSP— notamment :connect-src 'self' ws: wss: https:(poll zevent.fr, allorigins/jina, decapi, tmi, evenmorestats…) ;script-srcavec'unsafe-inline'(builds Vite inlinés) ;worker-src/media-srcpour le POC 3D.
La CSP live de la racine n’est pas assouplie : seuls les préfixes archives passent par ARCHIVE_CSP.
Procédure de deploy (rejouable)
Ops : debian@51.77.244.222 (sudo NOPASSWD). Identity locale : ~/.ssh/id_ed25519.
Prérequis : stack ZDASH déjà up (fg-zevent, :5200, vhost zevent.caddy) — voir article incident § B.
1. Sync code + builds archives
Depuis le poste FG (D:\Zevent2026\zevent-dash) :
rsync -az --exclude node_modules --exclude data --exclude .env \
./ debian@51.77.244.222:/opt/vfg-fleet/repo/zevent-dash/
S’assurer que public/{archives,kimi-hub,kimi-fusion,kimi-3d,zevent-dash}/ sont bien dans le tarball / rsync.
2. Rebuild image + recreate container
ssh debian@51.77.244.222 \
"sudo docker build -t fg-zevent:latest /opt/vfg-fleet/repo/zevent-dash"
# Recreate UNIQUEMENT le service zevent — jamais compose --remove-orphans
# sur un seul fichier YAML (risque fleet).
ssh debian@51.77.244.222 \
"cd /opt/vfg-fleet && sudo docker compose -f compose/t3-zevent.yml up -d --force-recreate"
Caddy n’a pas besoin d’être touché si zevent.vfg.lol reverse déjà vers :5200 : les nouveaux chemins sont du static Node.
3. Smoke
for u in \
https://zevent.vfg.lol/ \
https://zevent.vfg.lol/archives/ \
https://zevent.vfg.lol/kimi-hub/ \
https://zevent.vfg.lol/kimi-fusion/ \
https://zevent.vfg.lol/kimi-3d/ \
https://zevent.vfg.lol/zevent-dash/ \
https://zevent.vfg.lol/healthz
do
curl -sS -o /dev/null -w "%{http_code} $u\n" "$u"
done
Attendu : 200 partout. Contrôle navigateur optionnel : Network → pas de blocage CSP sur connect vers https://zevent.fr / relais depuis une page archive.
4. Ne pas casser
| Anti-pattern | Pourquoi |
|---|---|
| Assouplir la CSP de la racine live | Surface d’attaque inutile pour ZDASH |
docker compose … --remove-orphans avec seulement t3-zevent.yml | Peut cueillir le reste de la fleet |
systemctl reload caddy (admin off) | Échec trompeur — voir article Lucien |
Committer .env / ADMIN_TOKEN | Secrets hors git |
Cartographie rapide repo ↔ URL
| Source locale (indicatif) | URL prod |
|---|---|
Kimi_Agent_Hub…/dist (ou copie sync) | /kimi-hub/ |
Kimi_Agent_Fusion…/app/dist | /kimi-fusion/ |
Kimi_Agent_Projet VJ 3D POC/dist | /kimi-3d/ |
Copie figée zevent-dash/public/{js,index…} | /zevent-dash/ |
| Live courant | / |
Canon serveur : D:\Zevent2026\zevent-dash → VPS /opt/vfg-fleet/repo/zevent-dash.
État attendu post-session
| Check | Attendu |
|---|---|
https://zevent.vfg.lol/ | 200 — live ZDASH |
https://zevent.vfg.lol/archives/ | 200 — index |
| Quatre sous-chemins archives | 200 |
https://lucien.best/ | 200 — non régressé (fix Caddy du matin) |
| CSP HTML archive | header Content-Security-Policy avec connect-src … https: |
| CSP HTML racine | connect-src 'self' ws: wss: (strict) |
Liens utiles
- Article lié (même jour) : incident Caddy lucien.best + prep zevent
- Live : zevent.vfg.lol
- Archives : zevent.vfg.lol/archives/
- Runbook :
Zevent2026/zevent-dash/README.md - Code CSP :
zevent-dash/server/server.js(ARCHIVE_CSP,ARCHIVE_PREFIXES)