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)
| Couche | Technologie retenue | Ré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 front | Cloudflare Pages (CDN mondial, TLS, aperçus par branche) ; en-têtes de sécurité via _headers ; routage SPA via _redirects | D-11 précisée · directive commanditaire (session 2) |
| Base de données | Supabase : 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 |
| Authentification | Supabase Auth (GoTrue) : e-mail + mot de passe, TOTP, sessions 30 min | EF-001 à 004 |
| API de lecture/écriture | PostgREST généré, toujours sous RLS, jeton de session ; pas de BFF en v1 | D-06 · SFD §8 |
| Logique métier serveur | Edge Functions Deno / TypeScript : simuler, echeance-transition, export-pdf, generer-occurrences ; moteur coeur-calcul TypeScript pur partagé | D-05, D-07 |
| Stockage de fichiers | Supabase Storage, compatible S3 (API et outillage S3 utilisables) : bucket privé « rapports », URL signées 10 minutes, journal des téléchargements | EF-071 · DAT annexe D.3 |
| CI/CD | GitLab CI (groupe horizon/), déploiements Cloudflare via wrangler, migrations et fonctions via CLI Supabase | C-04, D-08 |
| Observabilité | Sentry (front + fonctions), journaux plateforme centralisés, corrélation request_id, alertes SLO | D-09 · DAT §10 |
| Python | Absent 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_ID | Déploiement Pages (recette, production, aperçus par branche). |
SUPABASE_ACCESS_TOKEN | CLI Supabase (fonctions, configuration). |
SUPABASE_DB_URL_RECETTE / _PROD | Application des migrations (jamais exposées au front). |
SUPABASE_REF_RECETTE / _PROD | Référence des deux projets Supabase UE distincts. |
SENTRY_AUTH_TOKEN | Publication 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
- Direct upload (2 minutes) : Cloudflare → Workers & Pages → Create → Pages → Upload assets → glisser le contenu du zip du projet. URL publique immédiate. Aucun build : site statique à liens relatifs.
- Ligne de commande :
wrangler pages deploy . --project-name horizon-conception - CI fournie : le fichier
.gitlab-ci.ymlà la racine du pack déploie automatiquement la branchemainet publie un aperçu par branche. - En local : servir le dossier (
npx serve .oupython3 -m http.server 8080). L'ouverture en double-clic (file://) fonctionne pour l'essentiel mais certains navigateurs restreignent ce mode : le serveur local ou Cloudflare Pages est la voie garantie.
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 :
| Où | 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
| Environnement | Front | Back | Données |
|---|---|---|---|
| Développement | Vite local | Supabase local (conteneurs) par développeur | Seed de démonstration |
| Recette | Cloudflare Pages horizon-recette + aperçus par branche | Projet Supabase UE dédié | Seed + scénarios de recette, zéro donnée réelle |
| Production | Cloudflare Pages horizon-prod (domaine du commanditaire) | Projet Supabase UE dédié, PITR, alertes | Donné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ôle | Responsable |
|---|---|---|
| ☐ | 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 |