5.2 KiB
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→<projet>.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 |