Files
PleinR/.env.example
T
Claude 39eb8cfc13 Documente le fil d'informations et la messagerie
CLAUDE.md gagne les deux sections et, surtout, les pièges qui coûteraient
une soirée à retrouver : `db.execute` qui rend les colonnes brutes, les
deux interrupteurs de boucle qu'il ne faut pas confondre, la rotation du
jeton Microsoft, l'adresse d'expédition lue chez le fournisseur, et la
raison pour laquelle les mots de passe temporaires ne passent jamais par
la file.

README et .env.example décrivent les trois transports, le piège des sept
jours côté Google, et le repli SMTP par variables d'environnement qui
permet un premier déploiement sans démarche préalable.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
Claude-Session: https://claude.ai/code/session_014QsLjRAnuLwivqxCbM4WeP
2026-09-14 16:23:32 +00:00

101 lines
4.3 KiB
Bash
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ---- Database (external Postgres) ----
# With docker-compose the app reaches Postgres via the UNIQUE container name
# "pleinr-postgres" on the internal port 5432 (avoids collisions with other
# "postgres" containers on a shared proxy network; NOT the published host port).
# For local dev outside Docker against the dockerised Postgres, use
# localhost on the published host port: postgres://pleinr:pleinr@localhost:54329/pleinr
DATABASE_URL=postgres://pleinr:pleinr@pleinr-postgres:5432/pleinr
# Individual vars consumed by the postgres container in docker-compose.yml
POSTGRES_USER=pleinr
POSTGRES_PASSWORD=pleinr
POSTGRES_DB=pleinr
# ---- Auth.js (NextAuth v5) ----
# Optional with docker-compose: if left unset, the container generates and
# persists one automatically. To set it yourself: openssl rand -base64 32
AUTH_SECRET=
# Public URL of the app (used by Auth.js for callbacks).
# Leave EMPTY behind a reverse proxy (Nginx Proxy Manager, Traefik…): Auth.js
# auto-detects it from the Host / X-Forwarded-Proto headers (trustHost).
# Set it only to force a value, e.g. https://pleinr.ffnancy.fr
AUTH_URL=
# ---- First admin user (created by the seed script) ----
SEED_ADMIN_EMAIL=admin@plein-r.fr
# Laissez vide : un mot de passe aléatoire est généré au premier démarrage,
# affiché UNE FOIS dans les journaux, et doit être changé à la première connexion.
SEED_ADMIN_PASSWORD=
SEED_ADMIN_NAME=Administrateur Plein R
# Données de démonstration (adhérents, promotions, demandes, journal et
# comptes au mot de passe connu de tous) : uniquement sur un poste de
# développement, jamais en production. Par défaut la base reste vide, avec le
# référentiel des catégories et le compte administrateur seulement.
# Pour retirer des données de démo déjà en base : npm run db:purge-demo
# (ou, dans le conteneur : node dist/purge-demo.cjs).
SEED_DEMO=false
# ---- App ----
NODE_ENV=production
PORT=3000
# ---- VPS sans reverse proxy existant (voir README) ----
# Caddy devant l'application : ports 80 et 443, certificat Let's Encrypt
# automatique pour SITE_DOMAIN, et réponse immédiate sur http://IP_DU_SERVEUR
# tant que le DNS n'est pas configuré. Renseignez SITE_DOMAIN même si le
# domaine ne pointe pas encore : la bascule en HTTPS se fera toute seule.
#COMPOSE_FILE=docker-compose.yml:docker-compose.caddy.yml
#SITE_DOMAIN=pleinr.example.fr
#CADDY_EMAIL=vous@example.fr
# ---- Publication des promotions sur les réseaux sociaux ----
# La configuration se fait désormais dans Backend › Réseaux sociaux : on y colle
# les identifiants de l'application, on clique Connecter, et les jetons sont
# récupérés et stockés chiffrés automatiquement. Rien à mettre ici dans le cas
# normal.
#
# Clé de chiffrement des jetons en base. Si elle est vide, AUTH_SECRET est
# utilisé. La définir explicitement permet de faire tourner AUTH_SECRET sans
# perdre les connexions réseaux.
# openssl rand -base64 32
SOCIAL_TOKEN_KEY=
# Versions d'API (facultatif)
FACEBOOK_GRAPH_VERSION=v21.0
LINKEDIN_API_VERSION=202506
# --- Repli historique ---
# Ces variables restent lues si aucun compte n'est connecté depuis le
# backoffice. Utile pour un jeton posé à la main ; sinon, laissez vide.
FACEBOOK_PAGE_ID=
FACEBOOK_PAGE_ACCESS_TOKEN=
LINKEDIN_ORGANIZATION_URN=
LINKEDIN_ORGANIZATION_ID=
LINKEDIN_ACCESS_TOKEN=
# ---- Boîte mail de l'association ----
# La configuration se fait dans Backend › Boîte mail : on y branche Google
# (API Gmail), Microsoft (API Graph) ou un serveur SMTP, et les secrets sont
# stockés chiffrés. Rien à mettre ici dans le cas normal.
#
# Les jetons et mots de passe utilisent la même clé que les réseaux sociaux
# (SOCIAL_TOKEN_KEY, avec repli sur AUTH_SECRET).
#
# `off` arrête la file d'envoi sans toucher au reste (le libérateur de
# publications programmées a son propre interrupteur, PROMO_SCHEDULER).
#MAIL_WORKER=off
# Débit de la file, en messages par passage (défaut : 20). Gmail plafonne
# autour de 500 destinataires par jour sur un compte gratuit.
#MAIL_RATE_PER_MINUTE=20
# --- Repli avant toute configuration depuis le backoffice ---
# Permet un premier déploiement sans passer par l'écran. Dès qu'un compte est
# enregistré dans Backend › Boîte mail, il prime sur ces variables.
SMTP_HOST=
SMTP_PORT=465
SMTP_SECURE=true
SMTP_USER=
SMTP_PASSWORD=
SMTP_FROM=
SMTP_FROM_NAME=