Files
annu-kute-ced/docs/DEPLOIEMENT-SVELTEKIT.md
T
sucupira d6efb6736f Réécriture SvelteKit statique (Svelte 5 runes + TS, adapter-static)
- Données PeerTube (GADE), Castopod (KUTE) et Mastodon (BOKANTE) bakées au
  build via +page.server.ts (throttle + retry 429 + déduplication)
- Charte OKI complète : tokens, thème sombre par défaut (clair opt-in,
  anti-FOUC), Archivo/Inter self-hébergées, flag-bar, sprite SVG (zéro emoji
  en interface, zéro Font Awesome/CDN)
- i18n FR/EN par routage [[locale]], bundles JSON, hreflang, %lang% serveur
- Pages : accueil, /video/[uuid] (embed, téléchargements, partage,
  commentaires, JSON-LD VideoObject), /categories/[id], /recherche (index
  JSON baké, recherche client), /direct (live + annonce multi-fuseaux),
  /dons, /mentions-legales, /offline + 404 kréyòl
- Motion gwoka : KineticText (scrub view()), ScrollProgressBar, FlagChip,
  reveal syncopé, View Transitions, gate prefers-reduced-motion unique
- PWA : manifest + Workbox generateSW (fallback /offline/), registerSW
  statique
- Sécurité : CSP par page en <meta> (SHA-256 des inline via
  scripts/postbuild-csp.mjs) + headers globaux (_headers Cloudflare et
  .htaccess o2switch), redirections des anciennes URLs PHP
- Doc : docs/DEPLOIEMENT-SVELTEKIT.md
2026-07-23 00:49:02 -04:00

3.1 KiB

Déploiement — ANNU KUTE CED (SvelteKit)

Branche svelte : le hub est un site 100 % statique (SvelteKit + adapter-static, prerender intégral). Les données PeerTube / Castopod / Mastodon sont récupérées au build : pour rafraîchir le contenu, on rebuild (cron, webhook ou CI).

Build

npm ci
npm run build        # génère build/ + injecte la CSP par page (scripts/postbuild-csp.mjs)
npm run preview      # vérification locale

Le dossier build/ est le site complet, déposable tel quel sur n'importe quel hébergement statique.

o2switch (Apache, mutualisé)

  1. Déposer le contenu de build/ à la racine web du domaine (public_html/ ou équivalent).
  2. Le .htaccess fourni dans build/ gère : redirection HTTPS, redirections des anciennes URLs PHP (index.php, video.php?uuid=…, categories.php?id=…, recherche.php?q=…, direct.php, dons.php, mentions-legales.php), ErrorDocument 404 /404.html, headers de sécurité, cache immutable pour /_app/ et /fonts/.
  3. Rafraîchissement du contenu : rebuild en local ou en CI puis rsync -av --delete build/ user@host:public_html/.

Exemple de cron quotidien (sur une machine de build) :

0 5 * * * cd /chemin/annu-kute-ced && git pull && npm ci --prefer-offline && npm run build && rsync -az --delete build/ user@o2switch:public_html/

Cloudflare Pages

  • Build command : npm run build
  • Build output directory : build
  • Le fichier _headers (dans build/) applique CSP, HSTS, X-Frame-Options, nosniff, Referrer-Policy, Permissions-Policy et le cache immutable.
  • Les anciennes URLs PHP peuvent être redirigées via _redirects si besoin (le .htaccess ne s'applique pas chez Cloudflare).

Sécurité — modèle CSP

  • En-tête global (_headers / .htaccess) : style-src, img-src, font-src, connect-src 'self', media-src, frame-src https://gade.o-k-i.net, frame-ancestors 'none', base-uri, form-action, object-src 'none'.
  • script-src est délivré par page via une balise <meta http-equiv="Content-Security-Policy"> injectée par scripts/postbuild-csp.mjs : chaque page ne déclare que les empreintes SHA-256 de ses scripts inline (script de démarrage SvelteKit + JSON-LD). Aucun 'unsafe-inline' pour les scripts.
  • Seules exceptions sortantes (chargement de ressources) : les instances de l'écosystème first-party gade.o-k-i.net (vignettes, embeds, flux), kute.o-k-i.net (audio, pochettes), bokante.o-k-i.net (médias Mastodon). Aucun autre domaine tiers.

PWA

  • manifest.webmanifest + service worker Workbox (vite-plugin-pwa, generateSW) : précache du shell, navigateFallback: /offline/index.html.
  • Enregistrement par static/registerSW.js (chemins absolus), jamais par injection du plugin.

Vérifications avant mise en production

npm run check   # 0 erreur, 0 warning
npm run build   # fetch des données + prerender + CSP

Puis, sur le build : zéro requête tierce au chargement hors instances de l'écosystème (onglet réseau), toutes les routes historiques redirigées, sitemap.xml et robots.txt servis.