HORIZON · Dépôt, stack et déploiement
HHORIZON 04 · Documentation

Mise à jour session 2 · 22/07/2026 · directive commanditaire : hébergement front Cloudflare

Dépôt GitLab, stack technique et déploiement

Cette page rend le démarrage de l'implémentation immédiat : organisation GitLab (groupe, sous-groupes, dépôts décrits), arborescence du monorepo, stack complète et explicite, chaîne CI/CD GitLab → Cloudflare Pages + Supabase, secrets, environnements, et bascule du prototype vers Figma. Ce pack lui-même est déployable en 2 minutes (voir README.md et .gitlab-ci.yml à la racine).

1 · Organisation GitLab : groupe, sous-groupes, dépôts

horizon/                                [GROUPE GitLab]
│   Accès par rôle, variables CI protégées communes (jetons Cloudflare, Supabase),
│   modèles de tickets et de demandes de fusion, registre des décisions.
│
├── produit/                            [SOUS-GROUPE : ce qui est livré aux utilisateurs]
│   └── horizon-app                     [DÉPÔT · monorepo applicatif]
│       SPA Vue 3 + paquets partagés + schéma Supabase + fonctions + tests.
│       C'est ici que vivent les 38 lots L-01 à L-38 (HZ-PLN-004 annexe A).
│
├── plateforme/                         [SOUS-GROUPE : ce qui fait tourner le produit]
│   ├── horizon-infra                   [DÉPÔT · infrastructure déclarative]
│   │   Configuration Cloudflare (Pages, DNS, règles, en-têtes de sécurité _headers),
│   │   provisionnement des projets Supabase UE (recette, production),
│   │   gestion et rotation documentée des secrets.
│   └── horizon-ops                     [DÉPÔT · exploitation]
│       Runbooks RB-01 à RB-04 exécutables, sondes de disponibilité,
│       tableaux de bord SLI, scripts d'exercice PITR et de réversibilité.
│
└── horizon-conception                  [DÉPÔT · CE PACK]
    Site statique (wireframes, design system, prototype, documentation,
    présentation), déployé sur Cloudflare Pages par sa propre CI.

Pourquoi un monorepo applicatif unique ? Décision du plan (HZ-PLN-004 §5) : types partagés front/fonctions, une seule CI, atomicité des changements transverses. L'éclatement par dossier reste possible si un composant doit vivre séparément. Les dépôts horizon-infra et horizon-ops sont séparés car leurs cycles de vie, droits d'accès et secrets diffèrent [Proposition P-09].

2 · Arborescence du monorepo horizon-app

horizon-app/
  apps/web/                      SPA Vue 3 (modules d'écran, stores Pinia, routes)
    src/modules/                 tableau-bord | clients | simulateur | portefeuilles |
                                 documents | conformite | parametres | auth
    src/stores/                  session, clientCourant, simulation, echeancier, notifications
    public/_headers              en-têtes de sécurité servis par Cloudflare Pages (CSP, HSTS...)
    public/_redirects            /* -> /index.html 200 (routage SPA côté Cloudflare)
    functions/_middleware.ts     passerelle d'accès (clé HORIZON_ACCESS_KEY) — cf. §5 bis
  packages/ui/                   composants Hz* + documentation vivante (états)
  packages/coeur-calcul/         formules RG (pur, déterministe, couverture 90 %+)
  packages/types/                schémas zod partagés front / fonctions
  packages/api-client/           accès REST (PostgREST sous RLS) + fonctions
  supabase/
    migrations/                  0001_schema · 0002_rls · 0003_audit · 0004_seed_demo
    functions/                   simuler | echeance-transition | export-pdf | generer-occurrences
    config.toml                  auth (sessions 30 min, TOTP), storage (bucket privé « rapports »)
  tests/e2e/                     Playwright : parcours CU, non-régression visuelle CA-08, axe
  tests/rls/                     suite de cloisonnement (bloquante en CI)
  agents/                        fiches de mission de la fabrication augmentée par IA
  docs/                          corpus HORIZON + registre des décisions D-xx
  .gitlab-ci.yml                 pipeline complet (§4)
  wrangler.toml                  projet Cloudflare Pages (nom, dossier de build dist/)

3 · Stack technique explicite (aucune zone d'ombre)

CoucheTechnologie retenueRéférence de décision
Front (SPA)Vue 3 + TypeScript strict + Vite · Pinia (état) · Vue Router · Tailwind CSS contraint par les tokens --hz-* · Apache ECharts (courbe, sparklines, anneau)D-02, D-03, D-04
Hébergement frontCloudflare Pages (CDN mondial, TLS, aperçus par branche) ; en-têtes de sécurité via _headers ; routage SPA via _redirectsD-11 précisée · directive commanditaire (session 2)
Base de donnéesSupabase : PostgreSQL 15 managé, région UE · RLS sur 100 % des tables · contraintes et déclencheurs d'audit · PITR (RPO 15 min)C-01, D-01 · SFD §7
AuthentificationSupabase Auth (GoTrue) : e-mail + mot de passe, TOTP, sessions 30 minEF-001 à 004
API de lecture/écriturePostgREST généré, toujours sous RLS, jeton de session ; pas de BFF en v1D-06 · SFD §8
Logique métier serveurEdge Functions Deno / TypeScript : simuler, echeance-transition, export-pdf, generer-occurrences ; moteur coeur-calcul TypeScript pur partagéD-05, D-07
Stockage de fichiersSupabase Storage, compatible S3 (API et outillage S3 utilisables) : bucket privé « rapports », URL signées 10 minutes, journal des téléchargementsEF-071 · DAT annexe D.3
CI/CDGitLab CI (groupe horizon/), déploiements Cloudflare via wrangler, migrations et fonctions via CLI SupabaseC-04, D-08
ObservabilitéSentry (front + fonctions), journaux plateforme centralisés, corrélation request_id, alertes SLOD-09 · DAT §10
PythonAbsent de la stack v1, par décision documentée : le microservice de calcul Python a été examiné et écarté (surcoût d'exploitation sans besoin de calcul scientifique lourd) ; la stack est 100 % TypeScript / SQL. Réversible si le commanditaire l'impose : le contrat de la fonction simuler est indépendant du langage.DAT §14.4 (comparatif)

4 · Pipeline CI/CD de l'application (GitLab → Cloudflare + Supabase)

# .gitlab-ci.yml du dépôt horizon-app (extrait de référence)
stages: [verifier, tester, construire, valider, deployer_recette, fumee, deployer_production]

verifier:      lint + typage strict + détection secrets/termes proscrits + audit dépendances
tester:        unitaires coeur-calcul (90 %+, cas B-01..B-06 gelés) + composants Hz*
               + suite RLS sur base éphémère (BLOQUANTE)
construire:    build SPA (Vite -> dist/) + fonctions ; budgets taille/performance
valider:       Playwright e2e (CU-01..08) + non-régression visuelle 1440/1280 (CA-08)
               + accessibilité axe-core
deployer_recette:   (auto sur main)
  - supabase db push --db-url $SUPABASE_DB_URL_RECETTE          # migrations d'abord
  - supabase functions deploy --project-ref $SUPABASE_REF_RECETTE
  - wrangler pages deploy dist --project-name horizon-recette
fumee:         sonde de santé + parcours critique automatique sur recette
deployer_production: (manuel, sur étiquette vX.Y.Z, double approbation)
  - mêmes étapes vers $SUPABASE_REF_PROD + projet Pages horizon-prod
  - surveillance renforcée 48 h post-déploiement
Variable CI (protégée, masquée)Rôle
CLOUDFLARE_API_TOKEN / CLOUDFLARE_ACCOUNT_IDDéploiement Pages (recette, production, aperçus par branche).
SUPABASE_ACCESS_TOKENCLI Supabase (fonctions, configuration).
SUPABASE_DB_URL_RECETTE / _PRODApplication des migrations (jamais exposées au front).
SUPABASE_REF_RECETTE / _PRODRéférence des deux projets Supabase UE distincts.
SENTRY_AUTH_TOKENPublication des sourcemaps.

Règles héritées du plan : migrations toujours appliquées avant le code qui les utilise, répétition à blanc sur recette avant production, retour arrière par redéploiement de l'étiquette précédente, clé de service uniquement côté fonctions et CI.

5 · Déployer CE pack (horizon-conception) sur Cloudflare Pages

5 bis · Protéger l'accès par une clé d'authentification

Le pack est confidentiel. Une passerelle Cloudflare Pages Functions (functions/_middleware.js, fournie à la racine) protège l'intégralité du site par une clé, sans jamais écrire de secret dans le dépôt. La clé vit à deux endroits, en miroir :

Quoi
Variable d'environnement Cloudflare
Pages → Settings → Environment variables
HORIZON_ACCESS_KEY (Production et Preview). Lue au runtime par la passerelle : écran de connexion, ou accès direct une fois via ?k=…. Cookie de session 12 h, HttpOnly · Secure · SameSite=Lax.
Variable GitLab CI
Settings → CI/CD → Variables (protégée + masquée)
HORIZON_ACCESS_KEY. La CI la pousse vers Cloudflare au déploiement via wrangler pages secret put : une seule source de vérité, jamais en clair dans Git.
# .gitlab-ci.yml — injection de la cle avant chaque deploiement (extrait)
before_script:
  - npm install -g wrangler
  - if [ -n "$HORIZON_ACCESS_KEY" ]; then \
      printf "%s" "$HORIZON_ACCESS_KEY" | \
      wrangler pages secret put HORIZON_ACCESS_KEY --project-name "$CF_PAGES_PROJECT"; \
    fi
script:
  - wrangler pages deploy . --project-name "$CF_PAGES_PROJECT" --branch "$CI_COMMIT_BRANCH"

Si HORIZON_ACCESS_KEY n'est pas définie, le site reste ouvert : pratique en local et sur les aperçus, verrouillé dès que la clé est posée en production. La même mécanique (variable GitLab miroir d'un secret Cloudflare / Supabase) s'applique à tous les secrets de l'application : jetons, clé de service Supabase, DSN Sentry.

6 · Environnements

EnvironnementFrontBackDonnées
DéveloppementVite localSupabase local (conteneurs) par développeurSeed de démonstration
RecetteCloudflare Pages horizon-recette + aperçus par brancheProjet Supabase UE dédiéSeed + scénarios de recette, zéro donnée réelle
ProductionCloudflare Pages horizon-prod (domaine du commanditaire)Projet Supabase UE dédié, PITR, alertesDonnées réelles

7 · Bascule du prototype vers Figma

Le prototype est du HTML/CSS propre alimenté par les tokens : il s'importe fidèlement dans Figma via un plugin d'import HTML (par exemple « html.to.design ») pointé sur l'URL Cloudflare Pages du prototype (.../03-prototype/index.dc.html), écran par écran (accueil, simulateur, clients, conformité...). Les calques arrivent éditables ; les couleurs correspondent aux tokens du design system à recréer en styles Figma. Sens inverse déjà couvert : la maquette Figma source reste la loi (V-04).

8 · Liste de contrôle « prêt à implémenter » (J0)

ContrôleResponsable
Groupe GitLab horizon/ créé, sous-groupes et 4 dépôts initialisés avec leurs descriptions (§1).Responsable technique
Compte Cloudflare : projets Pages horizon-recette, horizon-prod, horizon-conception ; jeton API en variable CI.Plateforme
Deux projets Supabase région UE (recette, production) ; PITR activée ; bucket privé « rapports ».Plateforme
Variables CI protégées et masquées posées au niveau du groupe (§4).Responsable technique
Accès Figma source obtenu (V-04) ; référent métier désigné (arbitrages sous 5 jours).Commanditaire
Clé HORIZON_ACCESS_KEY posée en variable Cloudflare (Prod + Preview) et en variable GitLab CI protégée (§5 bis).Plateforme
Ce pack déployé sur Cloudflare Pages (accès protégé par clé) et partagé aux parties prenantes.Équipe projet