blog.vfg.lol

Archives Kimi Hub / Fusion / 3D + snapshot ZDASH sous zevent.vfg.lol

Handoff 2026-09-05 : versions figées servies sous /archives/, CSP assouplie pour les APIs externes temps réel, procédure de redeploy sans casser la fleet.

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 :

URLContenu
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)

  1. Index dossiers — un GET /kimi-hub/ (trailing slash) résout …/kimi-hub/index.html via stat + isDirectory(), sinon 404.
  2. ARCHIVE_PREFIXES — /kimi-hub, /kimi-fusion, /kimi-3d, /zevent-dash, /archives.
  3. ARCHIVE_CSP — notamment :
    • connect-src 'self' ws: wss: https: (poll zevent.fr, allorigins/jina, decapi, tmi, evenmorestats…) ;
    • script-src avec 'unsafe-inline' (builds Vite inlinés) ;
    • worker-src / media-src pour 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-patternPourquoi
Assouplir la CSP de la racine liveSurface d’attaque inutile pour ZDASH
docker compose … --remove-orphans avec seulement t3-zevent.ymlPeut cueillir le reste de la fleet
systemctl reload caddy (admin off)Échec trompeur — voir article Lucien
Committer .env / ADMIN_TOKENSecrets 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

CheckAttendu
https://zevent.vfg.lol/200 — live ZDASH
https://zevent.vfg.lol/archives/200 — index
Quatre sous-chemins archives200
https://lucien.best/200 — non régressé (fix Caddy du matin)
CSP HTML archiveheader Content-Security-Policy avec connect-src … https:
CSP HTML racineconnect-src 'self' ws: wss: (strict)

Liens utiles

source markdown

Concepts de cet article

CaddyZEventVPS

Partage le plus de concepts avec