# DEPLOYMENT.md — Expria V2 > Version 1.0 — Rédigé avant lancement > Procédure officielle de bascule V1 → V2 sur expria.app > À lire intégralement avant toute action de déploiement. --- ## 1. Architecture cible | Composant | V1 (actuel) | V2 (cible) | |---|---|---| | Frontend | Next.js sur Render | React/Vite sur Cloudflare Pages | | Backend | Next.js API routes sur Render | Hono.js sur Render (déjà live) | | DNS | Vercel | Vercel (inchangé) | | Domaine | expria.app | expria.app (inchangé) | | Auth | Supabase | Supabase (inchangé) | | Paiement | Stripe | Stripe (inchangé) | --- ## 2. Prérequis — ne pas lancer la bascule sans cocher tout ### Code - [ ] Tous les tests Vitest backend passent (0 échec) - [ ] Tous les tests Vitest frontend passent (0 échec) - [ ] npm run typecheck frontend → 0 erreur - [ ] Smoke test complet (Groupe Z du GOLDEN_DATASET.md) validé en local ### Infrastructure - [ ] Backend V2 stable sur api.expria.app depuis au moins 48h sans erreur critique Sentry - [ ] Sentry configuré et actif sur le frontend V2 - [ ] Variables d'environnement Cloudflare Pages configurées : - VITE_API_URL=https://api.expria.app - VITE_SUPABASE_URL=... - VITE_SUPABASE_ANON_KEY=... - VITE_ENABLE_T2_LIVE=false - [ ] CNAME Cloudflare Pages créé et testé sur une URL de preview ### Stripe - [ ] Webhooks Stripe pointent vers api.expria.app (backend V2) - [ ] Test de paiement réel effectué sur l'URL de preview Cloudflare Pages ### Rollback DNS — valeurs de référence (ne pas supprimer) - @ → A → 216.24.57.1 (frontend V1 Render) - www → CNAME → expria.onrender.com (frontend V1 Render) - api → CNAME → expria-backend.onrender.com (backend V2 — inchangé) --- ## 3. Procédure de bascule — dans l'ordre exact ### Étape 1 — Mettre V1 en mode maintenance (2 min) Dans Render, sur le service frontend V1 : - Modifier la variable d'environnement `MAINTENANCE_MODE=true` - Redéployer le service V1 - Vérifier que expria.app affiche la page de maintenance > ⚠️ À partir de ce moment, expria.app est inaccessible pour les utilisateurs. > Faire cette étape à une heure creuse (nuit, week-end). ### Étape 2 — Configurer le CNAME dans Vercel (5 min) Dans le dashboard Vercel → Domains → expria.app : - Supprimer ou modifier l'enregistrement A/CNAME actuel qui pointe vers Render - Ajouter un CNAME : `expria.app` → `.pages.dev` (URL Cloudflare Pages) - Sauvegarder ### Étape 3 — Configurer le domaine dans Cloudflare Pages (5 min) Dans Cloudflare Pages → projet expria-frontend → Custom domains : - Ajouter `expria.app` - Cloudflare Pages vérifie le CNAME automatiquement - Attendre la validation (peut prendre 1-5 min) ### Étape 4 — Vérifier la propagation DNS (5-15 min) Vérifier sur https://dnschecker.org que `expria.app` pointe vers Cloudflare Pages. Ne pas continuer avant que la propagation soit visible depuis au moins 3 régions. ### Étape 5 — Smoke test en production (15 min) Rejouer le Groupe Z du GOLDEN_DATASET.md sur expria.app : - [ ] Z1 — Inscription + première simulation Free - [ ] Z2 — Blocage quota Free - [ ] Z3 — Simulation Standard complète - [ ] Z4 — Mode examen bloqué en Standard - [ ] Z5 — T2 live Premium - [ ] Z6 — Mode examen EE complet - [ ] Z7 — Paiement Free → Standard - [ ] Z8 — Prorata Standard → Premium - [ ] Z9 — Déconnexion + accès protégé - [ ] Z10 — Responsive mobile Home + Login ### Étape 6 — Vérifier Sentry (5 min) - Ouvrir le dashboard Sentry projet expria-frontend - Vérifier qu'aucune erreur critique n'apparaît dans les 5 premières minutes - Si erreur critique → déclencher le rollback immédiatement ### Étape 7 — Déclarer la bascule réussie - Noter la date et l'heure dans ce fichier (section 6) - Désactiver MAINTENANCE_MODE sur V1 (optionnel — V1 reste sur Render comme fallback 30 jours) --- ## 4. Rollback — si quelque chose casse **Objectif : revenir sur V1 en moins de 10 minutes.** ### Étape 1 — Désactiver V2 (2 min) Dans Cloudflare Pages → projet expria-frontend : - Désactiver le domaine personnalisé expria.app ### Étape 2 — Remettre V1 en ligne (3 min) Dans Vercel → Domains → expria.app : - Remettre le CNAME/A record vers Render (valeur originale) Dans Render → service frontend V1 : - Modifier `MAINTENANCE_MODE=false` - Redéployer ### Étape 3 — Vérifier (5 min) - Vérifier que expria.app affiche à nouveau V1 - Vérifier que la connexion et une simulation fonctionnent ### Étape 4 — Diagnostiquer - Ouvrir Sentry V2 — identifier l'erreur critique - Ne pas retenter la bascule avant d'avoir corrigé et rejoué le Groupe Z complet --- ## 5. Post-bascule — checks 24h après - [ ] Sentry : aucune erreur critique nouvelle - [ ] Stripe : webhooks reçus et traités correctement - [ ] Supabase : aucune erreur d'auth dans les logs - [ ] Au moins 1 simulation complète effectuée par un vrai utilisateur - [ ] V1 sur Render toujours en ligne comme fallback (désactiver après 30 jours) --- ## 6. Historique des déploiements | Date | Version | Résultat | Notes | |---|---|---|---| | — | — | — | — | --- ## 7. Historique du document | Version | Date | Changements | |---|---|---| | 1.0 | 2026-04-19 | Création initiale |