Start here

Arrows to move, enter to open, escape to close.

Ship/Now

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.

VariableNécessaireSans elle
NEXT_PUBLIC_SITE_URLToujoursMétadonnées, sitemap et redirections Stripe cassés
NEXT_PUBLIC_SUPABASE_URLToujoursPas d'auth, pas de données
NEXT_PUBLIC_SUPABASE_KEYToujoursIdem
SUPABASE_SECRET_KEYToujoursLe webhook ne peut pas écrire
RESEND_API_KEYPour l'e-mailLes envois sont ignorés, journalisés, pas levés
EMAIL_FROMPour l'e-mailResend refuse l'envoi
STRIPE_SECRET_KEYPour encaisser/api/checkout renvoie 503, le reste va bien
STRIPE_WEBHOOK_SECRETPour encaisserLe webhook renvoie 503
ADMIN_EMAILSPour /adminPersonne ne peut l'ouvrir
SUPABASE_ACCESS_TOKENPour db:push seulementJamais 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.