fokan/.env.example
Gautier Stefanini a1116e05c5
Some checks are pending
CI / verify (push) Waiting to run
Aligner les valeurs de repli de NEXT_PUBLIC_SITE_URL sur fokan.fr
Le domaine réel est fokan.fr depuis un moment (.env, legal.ts, contact@fokan.fr,
BIMI), mais sitemap.ts, robots.ts, layout.tsx et checkout/route.ts gardaient
encore l'ancien fokan.g0tch.myds.me comme valeur par défaut si la variable
d'env est absente.
2026-08-09 09:18:34 +00:00

147 lines
8.6 KiB
Text

# Base de données (docker-compose fournit fokan-db sur ai-net)
DATABASE_URL=postgres://fokan:fokan@fokan-db:5432/fokan
# Référentiel véhicules — RDW Open Data, gratuit. Le jeton n'est pas requis mais relève
# le quota Socrata de 100 à 1 000 requêtes/h : recommandé avant le premier cron complet.
# RDW_APP_TOKEN=
# Adapter adresse — open data, pas de clé requise
# ADEME_DPE_DATASET_URL=https://data.ademe.fr/data-fair/api/v1/datasets/dpe03existant/lines
# Référentiel véhicules (RDW Open Data, domaine public) — jeton gratuit et FACULTATIF.
# Sans jeton, le quota est partagé par IP et les refus (429) sont plus fréquents ; avec, on
# passe à 1 000 requêtes/heure glissante (un passage complet en consomme ~560, étalées sur ~2 h).
# Le rejeu automatique absorbe les refus dans les deux cas ; le jeton ne fait que les raréfier.
# S'obtenir sur https://opendata.rdw.nl (profil développeur → App Tokens).
# RDW_APP_TOKEN=
# Lecture de carte grise (D-053) — docling-serve, sur le réseau ai-net de la machine.
# `fokan-app` et `docling` y sont tous deux attachés, donc le nom de conteneur résout seul :
# c'est le défaut du code, cette ligne n'est utile qu'en dev hors Docker (mettre l'IP du
# conteneur, comme pour DATABASE_URL) ou si le service déménage.
#
# ⚠️ Trois réglages du service lui-même conditionnent la promesse « rien n'est conservé »
# affichée au foyer, et ils vivent dans le compose de docling, pas ici :
# DOCLING_SERVE_RESULT_REMOVAL_DELAY=0 (sinon le résultat OCR — nom, adresse, VIN, plaque —
# reste 300 s en mémoire APRÈS la réponse)
# DOCLING_SERVE_SYNC_POLL_INTERVAL=1 (le défaut, 2, arrondit toute réponse à 2 s près)
# DOCLING_DEVICE=cuda (18-22 s sur CPU contre 1-4 s sur GPU)
# DOCLING_URL=http://docling:5001
# Comptes (better-auth, § 25) — secret long et aléatoire, JAMAIS commité.
# Générer avec : openssl rand -hex 32
BETTER_AUTH_SECRET=
NEXT_PUBLIC_SITE_URL=https://fokan.fr
# Sel du compteur de lectures libres des guides (D-042) — les deux guides entiers par visiteur.
# Générer avec : openssl rand -hex 32
#
# Il sale un HMAC de l'adresse IP : c'est ce qui fait que la table `lectures_guides` ne contient
# aucune IP, seulement une empreinte irréversible (§ « RGPD by design, minimisation »). Facultatif
# — à défaut, BETTER_AUTH_SECRET est réutilisé. Le renseigner reste préférable : le faire tourner
# remet tous les compteurs à zéro, ce qu'on ne veut pas avoir à arbitrer en même temps qu'une
# rotation de secret d'authentification.
# GUIDE_METER_SECRET=
# Mail sortant (§ 26) — sans SMTP_USER/PASSWORD, les emails sont journalisés, pas envoyés
# (dégradation gracieuse de src/adapters/mail.ts, cf. le lien magique en dev).
#
# En attente du domaine fokan (à créer) : ces cinq valeurs seront à remplacer d'un bloc,
# sur le même schéma que kankwa-api (mail.infomaniak.com) — SMTP via un relais externe,
# donc aucun souci de réputation d'IP résidentielle ni de port 25 bloqué (§ 26.2.1, ce
# risque ne concerne que l'envoi direct vers le serveur du destinataire, pas la
# soumission authentifiée en 587/465 vers le relais du fournisseur). Vérifié le
# 26/07/2026 — voir D-014 dans docs/decisions.md.
#
# SMTP_USER est la boîte qui s'authentifie (ex. contact@fokan.fr) ; FROM_EMAIL peut être
# un alias différent sur le même domaine (ex. no-reply@fokan.fr) tant que l'alias existe
# côté fournisseur — c'est exactement le montage de kankwa (SMTP_USER=contact@kankwa.fr,
# FROM_EMAIL=no-reply@kankwa.fr).
SMTP_HOST=
SMTP_PORT=587
SMTP_USER=
SMTP_PASSWORD=
FROM_EMAIL=noreply@fokan.fr
FROM_NAME=fokan
# Boîte où atterrissent les réponses. Facultatif : à défaut, `sendMail` retombe sur SMTP_USER,
# qui est par construction une vraie boîte — contrairement à l'alias `noreply@` de FROM_EMAIL.
# REPLY_TO_EMAIL=contact@fokan.fr
# ── Mode d'accès (D-065) ───────────────────────────────────────────────────────
# « payant » (défaut) : mur Stripe, 19,99 €/an, tout le vocabulaire d'abonnement.
# « gratuit » : mur d'inscription (une adresse, pas de carte), pages CGU au lieu de
# CGV, et /api/checkout fermé côté serveur — pas seulement à l'écran.
#
# Le défaut est « payant » : une variable absente ou mal orthographiée doit laisser le produit
# dans l'état qu'on lui connaît, jamais ouvrir l'accès complet à tout le monde sur une faute de
# frappe. Seul le mot exact « gratuit » bascule.
#
# La bascule est réversible et n'efface rien : les accès déjà ouverts portent `acces_mode`, qui
# distingue ce qui a été acheté de ce qui a été offert. `/api/stripe/portal` reste ouvert en
# mode gratuit, pour que les abonnements en cours restent résiliables en ligne (art. L215-1-1).
FOKAN_MODE=payant
# Plafond de comptes gratuits. IGNORÉ en mode payant (sans quoi un plafond oublié limiterait un
# jour le nombre de clients). Vide = pas de plafond.
#
# Au-delà, l'inscription crée le compte et le range en liste d'attente : le foyer est calculé,
# son détail reste masqué, et le passage quotidien de 4 h admet les plus anciens dès qu'il reste
# de la place. RELEVER CE NOMBRE SUFFIT — rien à déclencher, rien à écrire : la variable est
# relue à chaque exécution du cron, et les admissions partent le lendemain matin avec leur mail.
#
# `0` est un plafond légitime, pas un synonyme de « vide » : il ferme les inscriptions et met
# tout le monde en attente, ce qui est le geste d'un lancement qu'on prépare.
# FOKAN_PLACES_GRATUITES=100
# Paiement (Stripe, § 10.1) — 19,99 €/an. Sans STRIPE_SECRET_KEY, /api/checkout répond 501.
# Utiliser les clés de TEST (sk_test_/whsec_test) tant que la case de rétractation (§ 10.7)
# n'a pas été validée par un professionnel du droit — ne jamais passer en clés live avant.
STRIPE_SECRET_KEY=
STRIPE_WEBHOOK_SECRET=
STRIPE_PRICE_ANNUAL=
# ── Mentions légales (§ 28) ────────────────────────────────────────────────────
# Ces valeurs alimentent /mentions-legales, /cgv et /confidentialite. Elles ne sont PAS
# écrites dans le code : le nom, le domicile et le téléphone d'un éditeur personne physique
# sont des données personnelles, et les commiter les mettrait dans l'historique git,
# c'est-à-dire nulle part d'où on puisse les retirer.
#
# Tant qu'un champ obligatoire manque, les trois pages affichent « à compléter » et un encart
# rouge dit lesquels. Elles rendent à la requête (`force-dynamic`) précisément parce que le
# build Docker n'a pas accès à ce fichier : prérendues, elles figeraient un « à compléter »
# que remplir le .env n'effacerait jamais.
#
# ⚠️ Sans LEGAL_SIREN, le service ne peut pas être vendu légalement : encaisser sans
# immatriculation rend les CGV inopposables et relève de l'art. L8221-3 du Code du travail.
# L'immatriculation micro-entreprise est gratuite (guichet unique INPI, 1 à 2 semaines).
#
# En FOKAN_MODE=gratuit, quatre champs cessent d'être réclamés parce qu'ils ne tiennent qu'au
# commerce : LEGAL_SIREN (art. 6 III-1 LCEN, éditeur professionnel), LEGAL_TELEPHONE (art.
# L221-5, vente à distance), LEGAL_MEDIATEUR_* (art. L616-1, litiges de consommation) et
# LEGAL_REGIME_TVA (il n'y a pas de prix à qualifier). Les cinq autres restent dus dans les deux
# modes — identité, siège, responsable de publication, contact, hébergeur.
LEGAL_IDENTITE=
LEGAL_SIEGE=
LEGAL_SIREN=
LEGAL_TELEPHONE=
LEGAL_EMAIL=
LEGAL_RESPONSABLE_PUBLICATION=
# Sociétés uniquement — laisser vide pour une entreprise individuelle ou une micro-entreprise.
LEGAL_FORME_JURIDIQUE=
LEGAL_CAPITAL=
LEGAL_RCS=
# `franchise` (micro-entreprise sous les seuils) ou `assujetti`. Toute autre valeur est ignorée.
# En franchise, les CGV portent « TVA non applicable, art. 293 B du CGI » et le prix cesse d'être
# annoncé « toutes taxes comprises » ; assujetti, LEGAL_TVA devient obligatoire.
LEGAL_REGIME_TVA=
LEGAL_TVA=
# Hébergeur — l'art. 6 III-1 LCEN veut nom, adresse ET téléphone, pour qu'un lecteur puisse le
# joindre sans passer par l'éditeur. Auto-hébergé, ce sont les coordonnées de l'éditeur.
LEGAL_HEBERGEUR_NOM=
LEGAL_HEBERGEUR_ADRESSE=
LEGAL_HEBERGEUR_TELEPHONE=
# Médiateur de la consommation (art. L616-1 Code conso) — adhésion payante à souscrire avant
# le premier encaissement, pas une simple déclaration. Les deux clés vont ensemble : sans l'une,
# les CGV affichent « à compléter ».
LEGAL_MEDIATEUR_NOM=
LEGAL_MEDIATEUR_URL=