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.localen local), validées parsrc/lib/env.ts(@t3-oss/env-core+ zod).
Variables d'environnement
Auth (Convex — convex/auth/config.ts)
| Variable | Rôle |
|---|---|
SITE_URL | URL canonique de l'app (liens emails, redirections, origins) |
BETTER_AUTH_SECRET | Signature des sessions Better Auth |
BETTER_AUTH_COOKIE_PREFIX | Préfixe des cookies (défaut : appId) |
BETTER_AUTH_TRUSTED_ORIGINS / TRUSTED_ORIGINS | Origins web additionnels (séparés par virgules) |
BETTER_AUTH_ALLOW_VERCEL_PREVIEWS | 1 pour faire confiance au wildcard *.vercel.app |
MOBILE_APP_SCHEME | Schémas de l'app mobile Expo (défaut : check-kit,checkkit,nowstack → origins check-kit://…) |
GITHUB_CLIENT_ID/SECRET, GOOGLE_CLIENT_ID/SECRET | Providers OAuth (activés seulement si présents) |
Stripe (Convex — convex/stripe/actions.ts, convex/billing/plans.ts)
| Variable | Rôle |
|---|---|
STRIPE_SECRET_KEY | Clé secrète API |
STRIPE_WEBHOOK_SECRET | Vérification des signatures du webhook POST /stripe/webhook |
STRIPE_LIGHT_PLAN_ID / STRIPE_LIGHT_YEARLY_PLAN_ID | Price IDs du plan Light |
STRIPE_PRO_PLAN_ID / STRIPE_PRO_YEARLY_PLAN_ID | Price IDs du plan Premium |
STRIPE_ULTRA_PLAN_ID / STRIPE_ULTRA_YEARLY_PLAN_ID | Price 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)
| Variable | Rôle |
|---|---|
RESEND_API_KEY | Clé API Resend |
EMAIL_FROM | Expéditeur (Check Kit <noreply@…>) — le domaine doit être vérifié dans Resend |
EMAIL_CONTACT / VITE_EMAIL_CONTACT | Destinataire 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
| Variable | Rôle |
|---|---|
VITE_CONVEX_URL | URL WebSocket du déploiement Convex (client) |
VITE_CONVEX_SITE_URL | URL HTTP du déploiement (*.convex.site) — proxy /api/v1, webhook capteurs affiché dans Paramètres |
VITE_STRIPE_PUBLISHABLE_KEY | Clé publique Stripe |
VITE_POSTHOG_KEY / VITE_POSTHOG_HOST | Analytics PostHog (optionnel) |
VERCEL_ENV, PORT, CONVEX_DEPLOY_KEY | Contexte de build/déploiement |
Plans de facturation (convex/billing/plans.ts)
| ID interne | Label public | Mensuel | Annuel | Limites (sites / stockage / membres) | Essai |
|---|---|---|---|---|---|
free | Light | 19,90 € | 199 € | 1 / 5 Go / 5 | 15 j |
pro | Premium (populaire) | 29,90 € | 299 € | 5 / 30 Go / 20 | 15 j |
ultra | Premium Pack | 149 € | 1 490 € | 20 / 200 Go / 100 | 15 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
| Script | Rôle |
|---|---|
pnpm start-all | Commande canonique de dev : Convex + web, logs dans .logs/web.txt et .logs/convex.txt |
pnpm ts | Typecheck (tsc --noEmit) |
pnpm test:ci / pnpm test:e2e:ci | Tests unitaires Vitest / E2E Playwright |
pnpm build | Build de production (3 passes + prérendu des pages publiques) |
pnpm convex:dev / pnpm convex:deploy | Pousser les fonctions Convex (dev / prod) |
pnpm convex:deploy:vercel | Commande de build Vercel (convex deploy --cmd "pnpm build") |
pnpm check-setup | Vérifications déterministes du setup du projet |
pnpm stripe-webhooks | Création du webhook Stripe pointant sur le déploiement Convex |
pnpm email | Pré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 daemonconvex devne pousse pas les nouveaux modules (EPERM), forcer avecpnpm 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 avecgit diff --ignore-cr-at-eol --stat. - Message de bannissement :
bannedUserMessage(dansconvex/auth/config.ts) doit contenir le mot « banni » — la détection clientisBannedAuthErrorcherche la sous-chaînebandans le message d'erreur. - Scripts Node NowStack sous Windows :
execFileSync("pnpm"/"npx")échoue (ENOENT) sans shell ; réécrire la logique avecexecSyncsi besoin.