Technique/Configuration & environnements

Configuration & environnements

Variables d'environnement, plans de facturation, scripts pnpm, Stripe, R2, Resend et déploiement de Check Kit

Cette page recense tout le paramétrage technique de Check Kit : où vivent les variables d'environnement, comment sont définis les plans de facturation, et quels scripts utiliser au quotidien.

Où vivent les variables

Il y a deux environnements distincts :

  • Convex (backend) : variables posées avec pnpm exec convex env set KEY VALUE (dev et prod séparément). C'est là que vivent les secrets d'auth, Stripe, Resend et R2.
  • Web / Vercel (frontend + SSR) : variables du projet Vercel (ou .env.local en local), validées par src/lib/env.ts (@t3-oss/env-core + zod).

Variables d'environnement

Auth (Convex — convex/auth/config.ts)

VariableRôle
SITE_URLURL canonique de l'app (liens emails, redirections, origins)
BETTER_AUTH_SECRETSignature des sessions Better Auth
BETTER_AUTH_COOKIE_PREFIXPréfixe des cookies (défaut : appId)
BETTER_AUTH_TRUSTED_ORIGINS / TRUSTED_ORIGINSOrigins web additionnels (séparés par virgules)
BETTER_AUTH_ALLOW_VERCEL_PREVIEWS1 pour faire confiance au wildcard *.vercel.app
MOBILE_APP_SCHEMESchémas de l'app mobile Expo (défaut : check-kit,checkkit,nowstack → origins check-kit://…)
GITHUB_CLIENT_ID/SECRET, GOOGLE_CLIENT_ID/SECRETProviders OAuth (activés seulement si présents)

Stripe (Convex — convex/stripe/actions.ts, convex/billing/plans.ts)

VariableRôle
STRIPE_SECRET_KEYClé secrète API
STRIPE_WEBHOOK_SECRETVérification des signatures du webhook POST /stripe/webhook
STRIPE_LIGHT_PLAN_ID / STRIPE_LIGHT_YEARLY_PLAN_IDPrice IDs du plan Light
STRIPE_PRO_PLAN_ID / STRIPE_PRO_YEARLY_PLAN_IDPrice IDs du plan Premium
STRIPE_ULTRA_PLAN_ID / STRIPE_ULTRA_YEARLY_PLAN_IDPrice IDs du plan Premium Pack

Attention : .env-template ne liste pas les IDs STRIPE_LIGHT_* alors que plans.ts les référence — pensez-y lors d'un nouveau setup.

Emails (Convex — Resend)

VariableRôle
RESEND_API_KEYClé API Resend
EMAIL_FROMExpéditeur (Check Kit <noreply@…>) — le domaine doit être vérifié dans Resend
EMAIL_CONTACT / VITE_EMAIL_CONTACTDestinataire des formulaires de contact/support

Fichiers R2 (Convex — convex/files/actions.ts, photos de traçabilité)

R2_S3_URL (endpoint S3 du compte), R2_S3_ACCESS_KEY_ID, R2_S3_SECRET_ACCESS_KEY, R2_S3_BUCKET_NAME, R2_URL (URL publique de lecture). Les clés d'objet sont générées côté serveur (UUID + extension déduite des magic bytes).

Web / Vite

VariableRôle
VITE_CONVEX_URLURL WebSocket du déploiement Convex (client)
VITE_CONVEX_SITE_URLURL HTTP du déploiement (*.convex.site) — proxy /api/v1, webhook capteurs affiché dans Paramètres
VITE_STRIPE_PUBLISHABLE_KEYClé publique Stripe
VITE_POSTHOG_KEY / VITE_POSTHOG_HOSTAnalytics PostHog (optionnel)
VERCEL_ENV, PORT, CONVEX_DEPLOY_KEYContexte de build/déploiement

Plans de facturation (convex/billing/plans.ts)

ID interneLabel publicMensuelAnnuelLimites (sites / stockage / membres)Essai
freeLight19,90 €199 €1 / 5 Go / 515 j
proPremium (populaire)29,90 €299 €5 / 30 Go / 2015 j
ultraPremium Pack149 €1 490 €20 / 200 Go / 10015 j

L'annuel vaut 10× le mensuel (2 mois offerts). Les statuts d'abonnement actifs sont active, trialing, past_due ; les comptes offerts par l'admin (discount.mode = "admin_free") sont gérés localement et expirent à periodEnd. Un admin peut surcharger les limites d'une organisation via overrideLimits.

Scripts pnpm

ScriptRôle
pnpm start-allCommande canonique de dev : Convex + web, logs dans .logs/web.txt et .logs/convex.txt
pnpm tsTypecheck (tsc --noEmit)
pnpm test:ci / pnpm test:e2e:ciTests unitaires Vitest / E2E Playwright
pnpm buildBuild de production (3 passes + prérendu des pages publiques)
pnpm convex:dev / pnpm convex:deployPousser les fonctions Convex (dev / prod)
pnpm convex:deploy:vercelCommande de build Vercel (convex deploy --cmd "pnpm build")
pnpm check-setupVérifications déterministes du setup du projet
pnpm stripe-webhooksCréation du webhook Stripe pointant sur le déploiement Convex
pnpm emailPrévisualisation des templates react-email

Identité du site

src/site-config.ts : titre « Check Kit », domaine check-kit.fr, appId check-kit, locale fr_FR, marque #007291 (accent #21b6cf), contact contact@check-kit.fr. Le miroir convex/utils/siteConfig.ts doit rester synchronisé à la main (Convex ne peut pas importer depuis src/) — il porte notamment prodUrl et email.logoUrl utilisés par les templates d'email.

Déploiement

  • Convex : déploiement dédié par environnement ; les fonctions se poussent avec pnpm convex:deploy (prod). Sur Windows, si le daemon convex dev ne pousse pas les nouveaux modules (EPERM), forcer avec pnpm exec convex dev --once.
  • Vercel : build command = pnpm convex:deploy:vercel. Les previews sont isolées : aucune donnée de production n'y est importée.
  • vite est figé en 8.0.12 (exact, sans caret) : rolldown 1.1.5 embarqué par vite 8.1.x panique au build SSR sur @shikijs/engine-javascript (« Symbol should belong to a chunk »). Ne remonter la version qu'après correction du bug rolldown.

Pièges connus

  • Fins de ligne : si tout le repo semble modifié après un outil qui réécrit les EOL, exécuter git add --renormalize . ; voir les vrais changements avec git diff --ignore-cr-at-eol --stat.
  • Message de bannissement : bannedUserMessage (dans convex/auth/config.ts) doit contenir le mot « banni » — la détection client isBannedAuthError cherche la sous-chaîne ban dans le message d'erreur.
  • Scripts Node NowStack sous Windows : execFileSync("pnpm"/"npx") échoue (ENOENT) sans shell ; réécrire la logique avec execSync si besoin.