Déploiement
Le guide complet pour déployer ScaleRocket en production — Vercel, Supabase, Stripe, Auth, Email, DNS et une checklist complète.
Déploiement
ScaleRocket fonctionne avec trois applications frontend sur Vercel et un backend qui gère toute la logique côté serveur.
Vue d'ensemble de l'architecture :
| Application | Local | Production | Stack |
|---|---|---|---|
apps/web | localhost:3000 | yourdomain.com | Next.js (site marketing) |
apps/app | localhost:5173 | app.yourdomain.com | Vite + React (tableau de bord utilisateur) |
apps/ops | localhost:5174 | admin.yourdomain.com | Vite + React (panneau d'administration) |
Backend : Les Supabase Edge Functions gèrent les webhooks Stripe, le checkout, le portail, l'utilisation des crédits et la suppression de compte. Les webhooks Stripe pointent vers Supabase, pas vers une application hébergée sur Vercel.
Backend : Les fonctions Convex gèrent les webhooks Stripe, le checkout, le portail, l'utilisation des crédits et la suppression de compte. Les webhooks Stripe pointent vers les endpoints HTTP Convex, pas vers une application hébergée sur Vercel.
1. Déployer sur Vercel (3 projets)
Vous avez besoin de trois projets Vercel séparés, tous connectés au même dépôt Git. Chaque projet a son propre répertoire racine et ses propres variables d'environnement.
1a. Site marketing (apps/web)
- Allez sur vercel.com/new
- Importez votre dépôt Git
- Définissez le Root Directory sur
apps/web - Définissez le Framework Preset sur Next.js
- Définissez la Build Command sur
cd ../.. && pnpm turbo build --filter=web - Définissez la Install Command sur
cd ../.. && pnpm install - Ajoutez les variables d'environnement (voir le tableau ci-dessous)
- Cliquez sur Deploy
Variables d'environnement pour apps/web :
| Variable | Valeur | Requis |
|---|---|---|
NEXT_PUBLIC_WEB_URL | https://yourdomain.com | Oui |
NEXT_PUBLIC_APP_URL | https://app.yourdomain.com | Oui |
NEXT_PUBLIC_PLAUSIBLE_DOMAIN | yourdomain.com | Optionnel |
NEXT_PUBLIC_GA_ID | G-XXXXXXXXXX | Optionnel |
NEXT_PUBLIC_POSTHOG_KEY | phc_... | Optionnel |
Note : Le site marketing n'a PAS besoin de clés Supabase ou Stripe. Il a seulement besoin de connaître les URLs pour pouvoir créer des liens vers le tableau de bord.
1b. Tableau de bord (apps/app)
- Créez un autre projet Vercel depuis le même dépôt
- Définissez le Root Directory sur
apps/app - Définissez le Framework Preset sur Vite
- Définissez la Build Command sur
cd ../.. && pnpm turbo build --filter=app - Définissez la Install Command sur
cd ../.. && pnpm install - Ajoutez les variables d'environnement (voir le tableau ci-dessous)
- Cliquez sur Deploy
Variables d'environnement pour apps/app :
| Variable | Valeur | Requis |
|---|---|---|
VITE_WEB_URL | https://yourdomain.com | Oui |
VITE_APP_URL | https://app.yourdomain.com | Oui |
VITE_SUPABASE_URL | https://YOUR_PROJECT_REF.supabase.co | Oui |
VITE_SUPABASE_ANON_KEY | eyJ... (depuis le tableau de bord Supabase > Settings > API) | Oui |
VITE_STRIPE_PUBLISHABLE_KEY | pk_live_... (depuis le Stripe Dashboard, LIVE mode) | Oui |
| Variable | Valeur | Requis |
|---|---|---|
VITE_WEB_URL | https://yourdomain.com | Oui |
VITE_APP_URL | https://app.yourdomain.com | Oui |
VITE_CONVEX_URL | https://YOUR_DEPLOYMENT.convex.cloud | Oui |
VITE_STRIPE_PUBLISHABLE_KEY | pk_live_... (depuis le Stripe Dashboard, LIVE mode) | Oui |
1c. Panneau d'administration (apps/ops)
- Créez un troisième projet Vercel depuis le même dépôt
- Définissez le Root Directory sur
apps/ops - Définissez le Framework Preset sur Vite
- Définissez la Build Command sur
cd ../.. && pnpm turbo build --filter=ops - Définissez la Install Command sur
cd ../.. && pnpm install - Ajoutez les variables d'environnement (voir le tableau ci-dessous)
- Cliquez sur Deploy
Variables d'environnement pour apps/ops :
| Variable | Valeur | Requis |
|---|---|---|
VITE_SUPABASE_URL | https://YOUR_PROJECT_REF.supabase.co | Oui |
VITE_SUPABASE_ANON_KEY | eyJ... (même clé anon que apps/app) | Oui |
| Variable | Valeur | Requis |
|---|---|---|
VITE_CONVEX_URL | https://YOUR_DEPLOYMENT.convex.cloud | Oui |
Astuce : Les trois projets partagent le même dépôt Git. Vercel détecte les changements par répertoire racine et ne reconstruit que l'application concernée.
2. Déployer le backend
Pousser les migrations de base de données
Exécutez ceci depuis la racine de votre projet pour appliquer toutes les migrations à votre base de données Supabase de production :
npx supabase db pushSi vous n'avez pas encore lié votre projet :
npx supabase link --project-ref YOUR_PROJECT_REFDéployer les Edge Functions
Déployez toutes les Edge Functions en production :
npx supabase functions deployCela déploie chaque fonction dans supabase/functions/ (stripe-webhook, stripe-checkout, stripe-portal, use-credits, delete-account, et toutes les autres).
Pour déployer une seule fonction :
npx supabase functions deploy stripe-webhookDéfinir les secrets de production
Les Edge Functions ont besoin de ces secrets pour fonctionner. Définissez-les tous :
npx supabase secrets set STRIPE_SECRET_KEY=sk_live_...
npx supabase secrets set STRIPE_WEBHOOK_SECRET=whsec_...
npx supabase secrets set RESEND_API_KEY=re_...
npx supabase secrets set RESEND_FROM_EMAIL=hello@yourdomain.com
npx supabase secrets set APP_URL=https://app.yourdomain.com
npx supabase secrets set ADMIN_EMAILS=admin@yourdomain.comVérifiez que vos secrets sont définis :
npx supabase secrets listImportant :
APP_URLest utilisé par les Edge Functions pour la logique CORS et de redirection. Il doit correspondre exactement à votre URL de tableau de bord de production —https://app.yourdomain.comsans barre oblique finale.
Déployer Convex
Déployez votre backend Convex en production :
npx convex deployCela déploie le schéma, toutes les fonctions et les endpoints HTTP en une seule commande.
Définir les variables d'environnement de production
Les fonctions Convex ont besoin de ces variables d'environnement pour fonctionner. Définissez-les toutes :
npx convex env set STRIPE_SECRET_KEY sk_live_...
npx convex env set STRIPE_WEBHOOK_SECRET whsec_...
npx convex env set RESEND_API_KEY re_...
npx convex env set RESEND_FROM_EMAIL hello@yourdomain.com
npx convex env set APP_URL https://app.yourdomain.com
npx convex env set ADMIN_EMAILS admin@yourdomain.comVérifiez que vos variables d'environnement sont définies :
npx convex env listImportant :
APP_URLest utilisé pour la logique de redirection. Il doit correspondre exactement à votre URL de tableau de bord de production —https://app.yourdomain.comsans barre oblique finale.
3. Configurer Stripe pour la production
Le Stripe test mode et le live mode sont complètement séparés. Les produits, prix et webhooks du test mode ne sont pas transférés au live mode.
Étape par étape :
-
Passez en LIVE mode dans le Stripe Dashboard (bouton bascule en haut à gauche)
-
Créez vos produits et prix en live mode. Ils doivent être créés de zéro — ils ne peuvent pas être copiés depuis le test mode.
-
Copiez les Price IDs live (ex.
price_1Abc...) et mettez-les à jour dans :packages/config/src/pricing.tsRemplacez chaque Price ID de test (
price_1Test...) par le Price ID live correspondant. -
Créez un endpoint webhook de production :
- Allez dans Developers > Webhooks dans le Stripe Dashboard (assurez-vous d'être en LIVE mode)
- Cliquez sur Add endpoint
- Définissez l'Endpoint URL sur :
https://YOUR_PROJECT_REF.supabase.co/functions/v1/stripe-webhookhttps://YOUR_DEPLOYMENT.convex.site/stripe-webhook- Sélectionnez ces événements :
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deletedinvoice.payment_succeededinvoice.payment_failed
- Cliquez sur Add endpoint
- Copiez le Signing secret (commence par
whsec_) et définissez-le :
npx supabase secrets set STRIPE_WEBHOOK_SECRET=whsec_...npx convex env set STRIPE_WEBHOOK_SECRET whsec_...- Copiez la Live Publishable Key (
pk_live_...) et assurez-vous qu'elle est définie commeVITE_STRIPE_PUBLISHABLE_KEYdans le projet Vercel apps/app.
Critique : L'URL du webhook pointe vers votre fonction backend, pas vers une route API Vercel/Next.js. C'est l'erreur la plus courante.
4. Configurer l'authentification pour la production
Cette étape est critique et fréquemment oubliée. Sans elle, la connexion et le OAuth ne fonctionneront pas en production.
Mettre à jour la configuration des URLs
-
Allez dans votre tableau de bord Supabase > Authentication > URL Configuration
-
Définissez le Site URL sur :
https://app.yourdomain.com -
Ajoutez ces Redirect URLs :
https://app.yourdomain.com/** https://admin.yourdomain.com/**Le wildcard
/**garantit que tous les sous-chemins sont autorisés (ex./auth/callback,/dashboard, etc.).
-
Définissez la variable d'environnement
SITE_URLdans Convex :npx convex env set SITE_URL https://app.yourdomain.com -
Mettez à jour
convex/auth.config.tsavec vos URLs de redirection de production.
Mettre à jour les callbacks des fournisseurs OAuth
Les fournisseurs OAuth (Google, GitHub, etc.) redirigent vers votre backend d'authentification d'abord, puis vers votre application.
Google OAuth :
- Allez sur Google Cloud Console > APIs & Services > Credentials
- Modifiez votre OAuth 2.0 Client
- Sous Authorized redirect URIs, ajoutez :
https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback - Supprimez les URIs de redirection
localhost(ou gardez-les pour le développement local)
GitHub OAuth :
- Allez dans les GitHub Developer Settings > OAuth Apps
- Modifiez votre OAuth App
- Définissez l'Authorization callback URL sur :
https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback
Comment ça fonctionne : L'utilisateur clique sur "Sign in with Google" -> redirigé vers Google -> Google redirige vers
https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback-> Supabase crée la session -> Supabase redirige vers votre Site URL (https://app.yourdomain.com).
Google OAuth :
- Allez sur Google Cloud Console > APIs & Services > Credentials
- Modifiez votre OAuth 2.0 Client
- Sous Authorized redirect URIs, ajoutez :
https://YOUR_DEPLOYMENT.convex.site/api/auth/callback/google
GitHub OAuth :
- Allez dans les GitHub Developer Settings > OAuth Apps
- Modifiez votre OAuth App
- Définissez l'Authorization callback URL sur :
https://YOUR_DEPLOYMENT.convex.site/api/auth/callback/github
Comment ça fonctionne : L'utilisateur clique sur "Sign in with Google" -> redirigé vers Google -> Google redirige vers votre endpoint HTTP Convex -> Convex crée la session -> redirige vers votre application.
5. Configurer l'email (Resend)
Les fonctions côté serveur utilisent Resend pour envoyer des emails transactionnels.
-
Vérifiez votre domaine dans le tableau de bord Resend :
- Ajoutez
yourdomain.com - Ajoutez les enregistrements DNS fournis par Resend (SPF, DKIM, DMARC)
- Attendez que la vérification soit terminée
- Ajoutez
-
Mettez à jour l'email d'envoi dans vos secrets backend :
npx supabase secrets set RESEND_FROM_EMAIL=hello@yourdomain.comnpx convex env set RESEND_FROM_EMAIL hello@yourdomain.comL'adresse d'envoi doit utiliser votre domaine vérifié. Les emails provenant de domaines non vérifiés seront rejetés.
- Testez l'envoi en déclenchant un flux en production (ex. inscrivez un utilisateur test, faites un achat test) et confirmez que l'email arrive.
6. Configurer le CORS
Les Edge Functions utilisent le secret APP_URL pour restreindre le CORS (Cross-Origin Resource Sharing). Seules les requêtes depuis votre tableau de bord de production seront acceptées.
Assurez-vous d'avoir défini :
npx supabase secrets set APP_URL=https://app.yourdomain.comSi des erreurs CORS apparaissent dans la console du navigateur après le déploiement, vérifiez :
- Le secret
APP_URLest correctement défini (sans barre oblique finale) - Les Edge Functions ont été redéployées après avoir défini le secret
- La requête provient de
https://app.yourdomain.com, pas d'une URL de prévisualisation Vercel
Convex gère le CORS automatiquement pour tous les appels de fonctions via le client Convex. Aucune configuration CORS manuelle n'est nécessaire.
Pour les endpoints HTTP (webhooks), le CORS est géré dans convex/http.ts.
7. Domaines personnalisés
Domaines Vercel
Pour chacun des trois projets Vercel :
- Allez dans Settings > Domains dans le tableau de bord Vercel
- Ajoutez votre domaine :
| Projet Vercel | Domaine(s) |
|---|---|
| apps/web | yourdomain.com et www.yourdomain.com |
| apps/app | app.yourdomain.com |
| apps/ops | admin.yourdomain.com |
- Vercel fournira les enregistrements DNS à ajouter. Les enregistrements exacts dépendent de votre fournisseur DNS.
Configuration DNS
Ajoutez ces enregistrements chez votre registraire de domaine ou fournisseur DNS :
| Type | Nom | Valeur | Projet |
|---|---|---|---|
| A | @ | 76.76.21.21 | apps/web |
| CNAME | www | cname.vercel-dns.com | apps/web |
| CNAME | app | cname.vercel-dns.com | apps/app |
| CNAME | admin | cname.vercel-dns.com | apps/ops |
Note : L'adresse IP exacte de l'enregistrement A peut varier. Utilisez toujours les valeurs que Vercel vous affiche dans le tableau de bord. Les certificats SSL sont provisionnés automatiquement par Vercel une fois le DNS propagé.
8. Checklist de production
Passez en revue chaque élément avant d'annoncer votre lancement.
Variables d'environnement
- apps/web sur Vercel a
NEXT_PUBLIC_WEB_URLetNEXT_PUBLIC_APP_URLdéfinis - apps/app sur Vercel a
VITE_WEB_URL,VITE_APP_URL,VITE_SUPABASE_URL,VITE_SUPABASE_ANON_KEYetVITE_STRIPE_PUBLISHABLE_KEYdéfinis - apps/ops sur Vercel a
VITE_SUPABASE_URLetVITE_SUPABASE_ANON_KEYdéfinis - Les secrets Supabase sont définis :
STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,RESEND_API_KEY,RESEND_FROM_EMAIL,APP_URL,ADMIN_EMAILS
- apps/web sur Vercel a
NEXT_PUBLIC_WEB_URLetNEXT_PUBLIC_APP_URLdéfinis - apps/app sur Vercel a
VITE_WEB_URL,VITE_APP_URL,VITE_CONVEX_URLetVITE_STRIPE_PUBLISHABLE_KEYdéfinis - apps/ops sur Vercel a
VITE_CONVEX_URLdéfini - Les variables d'environnement Convex sont définies :
STRIPE_SECRET_KEY,STRIPE_WEBHOOK_SECRET,RESEND_API_KEY,RESEND_FROM_EMAIL,APP_URL,ADMIN_EMAILS
Stripe
- Produits et prix créés en LIVE mode (pas en test mode)
- Les Price IDs dans
packages/config/src/pricing.tssont mis à jour avec les Price IDs live - L'URL de l'endpoint webhook est
https://YOUR_PROJECT_REF.supabase.co/functions/v1/stripe-webhook - Le webhook signing secret (
whsec_...) est défini commeSTRIPE_WEBHOOK_SECRETdans les secrets Supabase - La publishable key Stripe dans apps/app est la clé LIVE (
pk_live_..., paspk_test_...)
- Produits et prix créés en LIVE mode (pas en test mode)
- Les Price IDs dans
packages/config/src/pricing.tssont mis à jour avec les Price IDs live - L'URL de l'endpoint webhook est
https://YOUR_DEPLOYMENT.convex.site/stripe-webhook - Le webhook signing secret (
whsec_...) est défini commeSTRIPE_WEBHOOK_SECRETdans les variables d'environnement Convex - La publishable key Stripe dans apps/app est la clé LIVE (
pk_live_..., paspk_test_...)
Authentification
- Le Site URL est défini sur
https://app.yourdomain.com - Les Redirect URLs incluent
https://app.yourdomain.com/**ethttps://admin.yourdomain.com/** - L'URI de redirection autorisée Google OAuth est
https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback - L'URL de callback d'autorisation GitHub OAuth est
https://YOUR_PROJECT_REF.supabase.co/auth/v1/callback
- La variable d'environnement
SITE_URLest définie surhttps://app.yourdomain.com - L'URI de redirection autorisée Google OAuth est
https://YOUR_DEPLOYMENT.convex.site/api/auth/callback/google - L'URL de callback d'autorisation GitHub OAuth est
https://YOUR_DEPLOYMENT.convex.site/api/auth/callback/github
- Domaine vérifié dans Resend (enregistrements SPF, DKIM, DMARC ajoutés)
-
RESEND_FROM_EMAILutilise votre domaine vérifié (ex.hello@yourdomain.com) - Email de test envoyé et reçu avec succès en production
Base de données
- Migrations poussées en production (
npx supabase db push) - RLS (Row Level Security) activé sur toutes les tables
- Edge Functions déployées (
npx supabase functions deploy)
- Convex déployé en production (
npx convex deploy) - Schéma et fonctions à jour
Sécurité
- Le secret
ADMIN_EMAILScontient les bonnes adresses email d'administration - Le CORS est restreint à l'
APP_URLde production uniquement -
apps/ops(panneau d'administration) n'est pas accessible publiquement, ou dispose d'une vérification d'email admin appropriée
DNS
-
yourdomain.compointe vers apps/web sur Vercel -
app.yourdomain.compointe vers apps/app sur Vercel -
admin.yourdomain.compointe vers apps/ops sur Vercel - Les certificats SSL sont actifs sur tous les domaines (automatique avec Vercel une fois le DNS propagé)
Dépannage
"Invalid redirect" après la connexion OAuth
Votre Site URL ou vos Redirect URLs d'authentification sont incorrects. Vérifiez qu'ils correspondent exactement à vos domaines de production.
Le webhook Stripe retourne 401 ou 400
- Vérifiez que l'URL du webhook pointe vers Supabase (
https://YOUR_PROJECT_REF.supabase.co/functions/v1/stripe-webhook), pas vers une URL Vercel. - Vérifiez que le secret Supabase
STRIPE_WEBHOOK_SECRETcorrespond au signing secret affiché dans le Stripe Dashboard pour votre endpoint webhook de production. - Assurez-vous d'avoir créé le webhook en LIVE mode, pas en test mode.
- Vérifiez que l'URL du webhook pointe vers Convex (
https://YOUR_DEPLOYMENT.convex.site/stripe-webhook), pas vers une URL Vercel. - Vérifiez que la variable d'environnement Convex
STRIPE_WEBHOOK_SECRETcorrespond au signing secret affiché dans le Stripe Dashboard pour votre endpoint webhook de production. - Assurez-vous d'avoir créé le webhook en LIVE mode, pas en test mode.
Erreurs CORS dans la console du navigateur
- Vérifiez que le secret Supabase
APP_URLcorrespond exactement à votre URL de tableau de bord de production (https://app.yourdomain.com, sans barre oblique finale). - Redéployez les Edge Functions après avoir modifié les secrets :
npx supabase functions deploy.
- Convex gère le CORS automatiquement pour les appels de fonctions client. Si vous voyez des erreurs CORS sur les endpoints HTTP, vérifiez votre configuration
convex/http.ts.
Les emails ne s'envoient pas
- Confirmez que votre domaine est vérifié dans Resend.
- Confirmez que
RESEND_FROM_EMAILutilise le domaine vérifié. - Vérifiez le tableau de bord Resend pour les logs de livraison et les erreurs.
Les paiements réussissent mais l'abonnement n'est pas créé
- Le webhook Stripe n'atteint pas votre fonction backend. Vérifiez les logs du webhook dans le Stripe Dashboard sous Developers > Webhooks > [votre endpoint] > Attempts.
- Assurez-vous que les six événements requis sont sélectionnés sur l'endpoint webhook.
Fini ? Marquez cette page comme terminée.