Variables d'environnement

Catalogue des variables lues par @lrvo/core, valeur par défaut, module qui les lit, effet quand elles sont absentes.

Toutes les variables lues par @lrvo/core. La source de vérité est le catalogue src/core/doctor/env.js, où le core déclare ce qu'il sait lire, comme un module le fait dans son manifest.envVars. Une variable lue par le code sans y figurer fait échouer npm run build, et l'inverse aussi.

Le fichier .env.example est autre chose : le modèle de démarrage copié par @lrvo/start dans un nouveau projet, réduit à ce qu'il faut remplir pour que le site tourne. Une variable peut donc exister ici sans figurer au modèle, et c'est le cas de tout ce qui a une valeur par défaut satisfaisante. Cette page les liste toutes.

Variables requises

Trois seulement. Leur absence fait sortir lrvo-doctor en erreur, parce qu'aucune configuration légitime ne s'en passe :

VariableSans elle
LRVO_DATABASE_URLAucun chemin de démarrage n'échappe à la base.
LRVO_ENCRYPTION_KEYLe chiffrement applicatif lève à la première écriture. Remplie par npx @lrvo/start.
NEXT_PUBLIC_URLLa vérification CSRF refuse toute requête mutante, en silence.

Le stockage, le courriel et les paiements restent optionnels : un projet sans téléversement, sans courriel transactionnel ou sans paiement est une configuration valide, et le diagnostic ne doit pas contredire la tuile de santé de l'admin, qui les affiche en avertissement et jamais en erreur.

Les variables LRVO_* sont serveur uniquement. Seules les NEXT_PUBLIC_* existent dans le bundle navigateur. Un composant client qui lit une variable LRVO_* reçoit undefined sans erreur, et le flag se comporte comme désactivé en silence. Voir Configuration de l'app.

Général

VariableDéfautLu parEffet
NEXT_PUBLIC_URL—appConfig, core/apiRequise. Origine publique du site. Base des liens de courriel, du canonical SEO, des assets de PDF, et de la vérification CSRF.
NEXT_PUBLIC_URL_DEV—appConfig, core/apiRemplace la précédente quand NODE_ENV=development.
LRVO_NAMELRVOappConfig, core/email, SEONom de l'application. Sert de %sitename% et de repli dans BaseLayout.
LRVO_LOGO_URL—appConfigLogo affiché sur les pages publiques des modules et dans la barre de l'admin, en thème clair. URL absolue ou chemin servi depuis public/. Sans lui, l'admin affiche LRVO_NAME.
LRVO_LOGO_URL_DARKLRVO_LOGO_URLappConfigVariante du logo en thème sombre, et sur la barre de l'admin quand le thème la garde foncée (chrome: 'dark'). Obligatoire pour un logo noir, qui disparaîtrait sinon.
LRVO_SITE_URL—appConfigDestination du lien posé autour du logo. Sans elle, le logo n'est pas cliquable.

Sans URL publique configurée, la vérification CSRF refuse les requêtes mutantes.

Les trois variables de marque sont lues par getPublicBrand() et servent de repli à tous les modules qui servent une page publique : un site qui signe partout sous la même enseigne les déclare une fois ici, un site qui partage ou facture sous une autre enseigne surcharge le module concerné. LRVO_LOGO_URL est l'image du logo, à ne pas confondre avec LRVO_EMAIL_LOGO_URL, qui est la destination du lien posé autour du logo des courriels. Sur une page publique, getPublicBrand().name ne retombe pas sur le défaut LRVO : sans LRVO_NAME, la ligne de marque du pied de page ne s'affiche pas plutôt que de signer le site d'un nom inventé.

Régional

VariableDéfautLu parEffet
LRVO_TIMEZONEAmerica/TorontoappConfig, core/cronFuseau par défaut des jobs cron.
LRVO_DATE_FORMATYYYY-MM-DDappConfigFormat de date de l'application.
LRVO_CURRENCYCADappConfig, core/paymentsDevise par défaut, y compris pour les PaymentIntents.
LRVO_CURRENCY_SYMBOL$appConfigSymbole affiché.
LRVO_SUPPORT_EMAIL—core/emailAdresse affichée dans le pied de BaseLayout quand supportSection est actif.

Proxy

VariableDéfautLu parEffet
LRVO_TRUST_PROXYfalseshared/rate-limitNombre de reverse proxys de confiance devant l'application. Autorise la lecture des en-têtes de proxy pour déterminer l'IP du client. true vaut 1.

À activer uniquement derrière un reverse proxy vérifié. Sans cette précaution, un client pourrait forger un X-Forwarded-For et contourner la limitation de débit. Quand l'IP reste inconnue, la limitation est suspendue et un avertissement est émis une fois.

La valeur doit correspondre au nombre exact de proxys traversés : true ou 1 derrière un seul proxy, 2 derrière Cloudflare puis nginx. Le core lit dans X-Forwarded-For l'entrée située à ce rang en partant de la droite, la seule que le client ne peut pas écrire. Toute autre valeur qu'un entier positif ou true laisse les en-têtes ignorés. Voir Rate limit.

Base de données

VariableDéfautLu parEffet
LRVO_DATABASE_URL—core/databaseRequise. URL de connexion PostgreSQL.
LRVO_DATABASE_URL_DEV—core/databaseRemplace la précédente quand NODE_ENV=development.
LRVO_DB_SSL_DISABLEDfalsecore/databasetrue désactive TLS entièrement.
LRVO_DB_SSL_NO_VERIFYfalsecore/databasetrue garde TLS mais ne vérifie pas le certificat.
LRVO_DB_SSL_CA—core/databaseAutorité de certification à épingler : PEM inline, ou chemin vers un fichier.

L'ordre de résolution TLS est détaillé dans Base de données.

Les paramètres TLS portés par l'URL de connexion, ?sslmode=… en tête, sont retirés avant la connexion : ces trois variables restent la source de vérité. Le sslmode sert de valeur par défaut quand aucune n'est posée. Voir Paramètres TLS dans l'URL.

Chiffrement

VariableDéfautLu parEffet
LRVO_ENCRYPTION_KEY—core/cryptoRequise. Clé maîtresse AES-256-GCM, 64 caractères hexadécimaux. Remplie par npx @lrvo/start.

Sur un projet monté à la main, générer la clé :

node -e "console.log(require('crypto').randomBytes(32).toString('hex'))"

Changer cette clé rend illisible tout ce qui a été chiffré avec l'ancienne. Voir Chiffrement.

Stockage

VariableDéfautLu parEffet
LRVO_STORAGE_PROVIDERbackblazecore/storagebackblaze ou r2.
LRVO_STORAGE_ENDPOINT—core/storageBackblaze : s3.<region>.backblazeb2.com. R2 : <accountId>.r2.cloudflarestorage.com.
LRVO_STORAGE_REGIONauto pour R2core/storageObligatoire pour Backblaze, optionnelle pour R2.
LRVO_STORAGE_BUCKET—core/storageNom du bucket.
LRVO_STORAGE_ACCESS_KEY—core/storageClé d'accès.
LRVO_STORAGE_SECRET_KEY—core/storageClé secrète.

Un seul jeu de variables sert les deux providers.

Courriel

VariableDéfautLu parEffet
LRVO_EMAIL_PROVIDERresendcore/emailresend ou smtp. Toute autre valeur fait échouer l'envoi.
LRVO_EMAIL_FROM_ADDRESS—core/emailAdresse expéditeur par défaut. Obligatoire.
LRVO_EMAIL_FROM_NAME—core/emailNom affiché de l'expéditeur.
LRVO_EMAIL_LOGO—core/emailURL du logo dans BaseLayout.
LRVO_EMAIL_LOGO_URL—core/emailDestination du lien autour du logo.
LRVO_EMAIL_RESEND_APIKEY—core/emailClé API Resend. Obligatoire quand le fournisseur est resend.
LRVO_EMAIL_SMTP_HOST—core/emailHôte du relais. Obligatoire quand le fournisseur est smtp.
LRVO_EMAIL_SMTP_PORT587core/emailPort du relais.
LRVO_EMAIL_SMTP_USER—core/emailIdentifiant. Vide pour un relais sans authentification.
LRVO_EMAIL_SMTP_PASSWORD—core/emailMot de passe. Vide pour un relais sans authentification.
LRVO_EMAIL_SMTP_SECUREdéduit du portcore/emailtrue : TLS implicite dès la connexion. Sans valeur : true sur le port 465, false ailleurs.
LRVO_EMAIL_SMTP_TLS_NO_VERIFYfalsecore/emailtrue : TLS actif, certificat non vérifié.

Les variables LRVO_EMAIL_FROM_* et LRVO_EMAIL_LOGO* servent les deux fournisseurs. Le fournisseur actif est choisi par LRVO_EMAIL_PROVIDER, et seules les variables de ce fournisseur sont lues.

Paiements

VariableDéfautLu parEffet
STRIPE_SECRET_KEY—core/paymentsClé secrète. Requise pour toute opération.
STRIPE_PUBLISHABLE_KEY—core/paymentsClé publique, transmise au client.
STRIPE_WEBHOOK_SECRET—core/paymentsSecret de signature des webhooks.

isEnabled() retourne false tant que les deux premières ne sont pas définies, ce qui permet de masquer l'UI de paiement plutôt que de laisser un appel échouer.

Authentification

VariableDéfautLu parEffet
LRVO_AUTH_SESSION_COOKIE_NAMElrvo_sessionappConfigNom du cookie de session.
LRVO_AUTH_REDIRECT_AFTER_LOGIN/features/authDestination après connexion. Le .env.example la fixe à /admin, qui est donc la valeur d'un projet généré ; sans la variable, le code retombe sur la racine du site.
LRVO_AUTH_REGISTRATIONtrueappConfig, features/authfalse ferme les inscriptions publiques. Contrairement aux autres drapeaux, celui-ci est en opt-out : toute autre valeur, y compris l'absence de variable, laisse les inscriptions ouvertes. Voir Fermer les inscriptions.

SEO

VariableDéfautLu parEffet
LRVO_SEOfalseappConfig, @lrvo/core/seotrue active la zone SEO des éditeurs et la génération des balises <head>. Absente du modèle de démarrage : un projet généré n'a donc pas de SEO tant que la variable n'est pas posée.
LRVO_SEO_SEPARATOR-SEOValeur du token %sep%.
LRVO_SEO_TITLE_TEMPLATE%title% %sep% %sitename%SEOGabarit appliqué quand un contenu n'a pas de titre SEO explicite.

Admin

VariableDéfautLu parEffet
LRVO_ADMIN_SITE_LINKautoappConfig, AdminLayouttrue affiche toujours le bouton « Voir le site » de l'en-tête de l'admin, false le masque. Absente : affiché dès qu'un module de contenu public (Pages, Posts) est actif.

C'est la seule variable du core à trois états. Sa lecture teste === 'true' puis === 'false', et toute autre valeur laisse la détection automatique décider : sans @lrvo/module-pages ni @lrvo/module-posts, le projet n'a pas de site public et le bouton reste masqué. Voir features/admin.

Développement

VariableDéfautLu parEffet
LRVO_DEVKITfalseappConfigtrue expose /admin/devkit/components et /admin/devkit/icons, et affiche la tuile Liens rapides du tableau de bord.
NEXT_TELEMETRY_DISABLED—Next.js1 désactive la télémétrie.

Le devkit n'est jamais rendu quand le flag est absent ou différent de true.

Mises à jour et compatibilité

VariableDéfautLu parEffet
LRVO_UPDATE_CHECKtruelrvo-modules sync, tuile update de l'adminfalse éteint le rappel de mise à jour affiché au démarrage, et l'appel au registre de la tuile du tableau de bord.
LRVO_COMPAT_STRICTfalseinitializeLrvotrue fait échouer le boot sur toute incompatibilité de version core / module, et pas seulement quand le core est sous le plancher exigé.

Le rappel de mise à jour est déjà muet hors terminal interactif et quand CI est définie : la variable ne sert qu'à l'éteindre sur un poste de développement. Voir lrvo-update.

La tuile update du tableau de bord lit la même variable, mais elle n'a aucune de ces gardes : elle tourne précisément là où il n'y a pas de terminal. C'est donc le seul moyen d'empêcher le serveur de contacter le registre. Voir features/admin.

LRVO_UPDATE_CHECK est la seule variable du core dont le défaut est actif. Sa lecture teste donc !== 'false', à l'inverse de LRVO_DEVKIT ou LRVO_SEO qui testent === 'true' : un projet dont le .env ne porte pas encore la variable garde le comportement par défaut.

LRVO_COMPAT_STRICT ne change rien au comportement par défaut, qui reste d'avertir. Un core sous le plancher exigé par un module fait échouer le boot dans les deux cas : cette combinaison est réellement inexécutable.

Variables d'un module

Chaque module @lrvo/module-* déclare ses propres variables dans manifest.envVars. Leur effet est documenté module par module : Pages, Posts, Médias, Formulaires, Facturation, Fichiers. Une variable required: true absente produit un avertissement au boot, sans faire tomber le serveur : le module gère son propre repli. lrvo-doctor, lui, la signale comme bloquante ; il reste muet sur les optionnelles absentes, dont la valeur par défaut suffit.

Un module porte en plus une variable d'activation de la forme LRVO_MODULE_<NOM>. Installé mais non activé, il n'enregistre rien.

LRVO_MODULE_MEDIAS=true

Sur cette page