Déploiement
Vercel (recommandé), variables d'environnement, 26 crons, configuration domaine.
Vercel (recommandé)
Étapes de déploiement
-
Créer un projet Vercel et connecter le repository Git
-
Configurer le Framework Preset : Next.js (auto-détecté)
-
Build Command (automatique) :
pnpm build -
Node.js Version : 20.x
-
Configurer les variables d'environnement (voir section suivante)
-
Déployer — Vercel lance automatiquement le build à chaque push
Build settings
Le build nécessite 7 GB de RAM (configuré dans package.json) :
{
"build": "NODE_OPTIONS=--max-old-space-size=7168 next build"
}Prisma sur Vercel
Le binary target rhel-openssl-3.0.x est nécessaire pour l'environnement Vercel :
generator client {
provider = "prisma-client-js"
output = "../generated/prisma"
binaryTargets = ["native", "rhel-openssl-3.0.x"]
}
npx prisma generateest automatiquement exécuté lors dupostinstall.
Variables d'environnement (production)
Obligatoires
| Variable | Description | Exemple |
|---|---|---|
DATABASE_URL | PostgreSQL (pgBouncer) | postgresql://...?pgbouncer=true |
DIRECT_URL | PostgreSQL (direct, migrations) | postgresql://... |
AUTH_SECRET | Secret NextAuth (≥32 chars) | openssl rand -base64 32 |
NEXTAUTH_URL | URL de l'app | https://app.votre-domaine.fr |
NEXT_PUBLIC_APP_URL | URL publique | https://app.votre-domaine.fr |
STRIPE_SECRET_KEY | Clé secrète Stripe | sk_live_xxxx |
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY | Clé publique Stripe | pk_live_xxxx |
STRIPE_WEBHOOK_SECRET | Secret webhook Stripe | whsec_xxxx |
RESEND_API_KEY | Clé API Resend | re_xxxx |
UPSTASH_REDIS_REST_URL | URL Redis (rate limiting) | https://xxxx.upstash.io |
UPSTASH_REDIS_REST_TOKEN | Token Redis | AXxxxx |
TOKEN_ENCRYPTION_KEY | AES-256-GCM (64 hex chars) | openssl rand -hex 32 |
CRON_SECRET | Secret des crons (≥32 chars) | openssl rand -base64 32 |
Stripe Price IDs
Chaque plan/module nécessite ses Price IDs Stripe (monthly + annual) :
# Plans
STRIPE_PRICE_STARTER="price_xxxx"
STRIPE_PRICE_STARTER_ANNUAL="price_xxxx"
STRIPE_PRICE_CORE="price_xxxx"
STRIPE_PRICE_CORE_ANNUAL="price_xxxx"
STRIPE_PRICE_BUSINESS="price_xxxx"
STRIPE_PRICE_BUSINESS_ANNUAL="price_xxxx"
STRIPE_PRICE_ENTERPRISE="price_xxxx"
STRIPE_PRICE_ENTERPRISE_ANNUAL="price_xxxx"
# Utilisateur supplémentaire
STRIPE_PRICE_EXTRA_USER="price_xxxx"
STRIPE_PRICE_EXTRA_USER_ANNUAL="price_xxxx"
# Modules (16 × 2 = 32 variables)
STRIPE_PRICE_MODULE_DEVIS="price_xxxx"
STRIPE_PRICE_MODULE_DEVIS_ANNUAL="price_xxxx"
# ... (voir .env.example pour la liste complète)Optionnelles (mais recommandées)
| Variable | Description |
|---|---|
MISTRAL_API_KEY | Copilote IA (Mistral) |
PUSHER_APP_ID / PUSHER_SECRET / NEXT_PUBLIC_PUSHER_KEY | Temps réel |
GOOGLE_CLIENT_ID / GOOGLE_CLIENT_SECRET | OAuth Google |
MICROSOFT_CLIENT_ID / MICROSOFT_CLIENT_SECRET | OAuth Microsoft |
SUPABASE_URL / SUPABASE_SERVICE_KEY | Storage Supabase |
WEBHOOK_SECRET | HMAC webhooks sortants |
ADMIN_CHALLENGE_SECRET | 2FA panel admin |
Crons (tâches planifiées)
HeartCo utilise 26 crons Vercel configurés dans vercel.json :
Quotidiens
| Cron | Schedule | Description |
|---|---|---|
/api/cron/demo-reset | 03:00 | Reset données de démo |
/api/relances/cron | 08:00 | Envoi des relances automatiques |
/api/cron/bill-usage | 02:00 | Facturation de l'usage |
/api/cron/calendar-reminders | 08:00 | Rappels événements calendrier |
/api/cron/check-trial | 09:00 | Vérification état des trials |
/api/cron/publish-articles | 07:00 | Publication articles programmés |
/api/cron/expire-quotes | 00:00 | Expiration des devis |
/api/cron/recurring-transactions | 06:00 | Transactions récurrentes |
/api/cron/appointment-reminders | 07:00 | Rappels rendez-vous |
/api/cron/recurring-invoices | 07:00 | Génération factures récurrentes |
/api/cron/trial-expiry | 06:00 | Downgrade des trials expirés |
/api/cron/trial-reminder | 08:00 | Rappels J-7 et J-2 |
/api/cron/email-processor | 06:00 | Traitement file d'emails |
/api/cron/inactivity-checker | 07:00 | Détection utilisateurs inactifs |
/api/cron/sequence-processor | 10:00 | Exécution séquences email |
/api/cron/renew-watches | 06:00 | Renouvellement watches Gmail |
/api/cron/iopole-sync | 01:00 | Synchronisation e-facturation |
/api/cron/iopole-fetch | 02:00 | Récupération factures entrantes |
/api/dunning/enroll | 03:00 | Inscription relance auto |
/api/dunning/execute | 03:30 | Exécution étapes relance |
/api/dunning/winback | 09:00 | Campagnes win-back |
Mensuels
| Cron | Schedule | Description |
|---|---|---|
/api/cron/reset-usage | 1er du mois, 00:00 | Reset quotas freemium |
/api/cron/generate-payslips | 1er du mois, 05:00 | Génération fiches de paie |
/api/cron/leave-accrual | 1er du mois, 01:00 | Accumulation congés |
/api/cron/e-reporting-reminder | 5 du mois, 09:00 | Rappel e-reporting |
Hebdomadaires
| Cron | Schedule | Description |
|---|---|---|
/api/cron/privilege-audit | Lundi 09:00 | Audit des permissions |
Timeouts
| Durée | Routes |
|---|---|
| 30s (défaut) | invoice send, reset-usage, webhooks Stripe/Resend |
| 60s | relances, demo-reset, bill-usage, dunning, recurring-invoices, iopole-sync, privilege-audit |
Configuration domaine
Architecture recommandée
votre-domaine.fr → Landing page / marketing
app.votre-domaine.fr → Dashboard (application SaaS)
Redirections automatiques
HeartCo gère automatiquement dans le middleware :
| Domaine source | Destination |
|---|---|
heartco.ch / www.heartco.ch | 301 → heartco.fr |
heartco.com | 301 → app.heartco.fr |
app.heartco.fr/dashboard/* | Autorisé (application) |
heartco.fr/dashboard | 301 → app.heartco.fr/dashboard |
CORS (app mobile)
Les origines autorisées pour l'app mobile Expo :
// Production
"heartco.fr", "heartco.com", "app.heartco.fr"
// Développement
"localhost", "192.168.*", "10.*", "172.*"Méthodes : GET, POST, DELETE, OPTIONS Headers : Content-Type, Authorization, x-trpc-source
Checklist déploiement
- Toutes les variables obligatoires sont configurées
- Les Price IDs Stripe correspondent à l'environnement (live, pas test)
-
NEXTAUTH_URLpointe vers l'URL de production -
NEXT_PUBLIC_APP_URLest identique - Le webhook Stripe est configuré pour l'URL de production
- Le DNS pointe vers Vercel
- SSL est activé (automatique avec Vercel)
- Les crons fonctionnent (vérifier les logs Vercel)
- Le seed de production est exécuté (si nécessaire)
- Le domaine email (Resend) est vérifié