Some checks are pending
CI / verify (push) Waiting to run
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.
147 lines
8.6 KiB
Text
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=
|