Mettre en ligne · 3 min
Variables d'environnement
Chaque variable, ce qui casse sans elle, et les deux erreurs qui produisent un 500 sans le moindre message utile.
| Variable | Nécessaire | Sans elle |
|---|---|---|
NEXT_PUBLIC_SITE_URL | Toujours | Métadonnées, sitemap et redirections Stripe cassés |
NEXT_PUBLIC_SUPABASE_URL | Toujours | Pas d'auth, pas de données |
NEXT_PUBLIC_SUPABASE_KEY | Toujours | Idem |
SUPABASE_SECRET_KEY | Toujours | Le webhook ne peut pas écrire |
RESEND_API_KEY | Pour l'e-mail | Les envois sont ignorés, journalisés, pas levés |
EMAIL_FROM | Pour l'e-mail | Resend refuse l'envoi |
STRIPE_SECRET_KEY | Pour encaisser | /api/checkout renvoie 503, le reste va bien |
STRIPE_WEBHOOK_SECRET | Pour encaisser | Le webhook renvoie 503 |
ADMIN_EMAILS | Pour /admin | Personne ne peut l'ouvrir |
SUPABASE_ACCESS_TOKEN | Pour db:push seulement | Jamais nécessaire au runtime |
NEXT_PUBLIC veut dire public
Tout ce qui est préfixé NEXT_PUBLIC_ est inséré dans le bundle JavaScript
à la compilation. C'est dans le navigateur de votre client, lisible dans les
devtools. C'est correct pour la clé publiable Supabase, qui est conçue pour cela
et ne sert à rien sans session puisque Row Level Security fait le travail.
C'est catastrophique pour SUPABASE_SECRET_KEY, qui contourne entièrement RLS.
Ne préfixez jamais un secret.
Vide est pire qu'absent
C'est celle qui produit un 500 sur chaque route sans rien dans les logs :
const base = process.env.NEXT_PUBLIC_SITE_URL ?? "http://localhost:3000";
new URL("/pricing", base);?? ne retombe que sur null et undefined. Une variable réglée sur une
chaîne vide passe tout droit, et new URL("/pricing", "") lève. Si c'est dans
le layout racine, toutes les pages meurent.
Supprimez la variable plutôt que de la vider, ou testez la valeur vraie :
const base = process.env.NEXT_PUBLIC_SITE_URL || "http://localhost:3000";Plain, pas sensitive
Sur Vercel, une variable marquée Sensitive est en écriture seule : vous ne
pouvez pas la relire, et elle n'est pas insérée dans le bundle. Pour une
variable NEXT_PUBLIC_, cela signifie que le navigateur reçoit undefined, et
que l'application casse en production comme elle ne l'a jamais fait en local.
Utilisez Encrypted, qui est le réglage par défaut. Sensitive est pour les valeurs que vous n'aurez jamais besoin de vérifier, et vous aurez toujours besoin de les vérifier.
La rotation
Tout ce qui a été collé dans une conversation, un ticket ou une capture d'écran est brûlé. Faites-en la rotation. Cela prend une minute dans chacun de ces tableaux de bord, et c'est le travail de sécurité le moins cher que vous ferez.
Une erreur ou un manque sur cette page ? Dites-le-nous.