# # Wakdo - template de configuration # # Usage : # cp .env.example .env # Editer .env (gitignore) avec les valeurs reelles. # # Audience : # Destine a l'auteur, au jury et aux contributeurs futurs. # # Modele de deploiement : # Ce projet tourne sur serveur derriere un reverse proxy Traefik. Il n'y a # pas de binding de ports hote : l'acces se fait uniquement via les FQDN # configures ci-dessous et routes par Traefik (reseau admin_proxy). # Les distinctions dev / staging / prod se font par FQDN distincts # (ex : .dev.acadenice.fr vs .acadenice.fr) et par .env dedie. # # =================================================================== # Environnement applicatif # =================================================================== APP_ENV=dev # dev | staging | prod APP_DEBUG=true # true en dev, false en prod APP_TIMEZONE=Europe/Paris # URL publique de la borne (Bloc 1), doit pointer vers le FQDN Traefik. # Placeholder example.com (RFC 2606) - a remplacer par le FQDN reel. APP_URL_KIOSK=https://kiosk.example.com # URL publique du back-office + API (Bloc 2). # Placeholder example.com (RFC 2606) - a remplacer par le FQDN reel. APP_URL_ADMIN=https://admin.example.com # =================================================================== # Base de donnees (MariaDB) # =================================================================== # Valeurs ci-dessous = PLACEHOLDERS. Remplacer par des mots de passe forts. # Pas accessible depuis l'exterieur : le service wakdo-db est sur le reseau # interne uniquement, aucun port exposé a l'hote. DB_HOST=wakdo-db # nom du service docker-compose DB_PORT=3306 DB_NAME=wakdo DB_USER=wakdo DB_PASSWORD=change_me_strong_password DB_ROOT_PASSWORD=change_me_root_password # =================================================================== # Sessions # =================================================================== SESSION_LIFETIME_IDLE=14400 # 4h en secondes - idle timeout SESSION_LIFETIME_ABSOLUTE=36000 # 10h en secondes - absolute timeout SESSION_NAME=WAKDO_SID # nom du cookie (evite PHPSESSID) # =================================================================== # Securite # =================================================================== # Origine autorisee pour les requetes CORS de l'API. # Doit correspondre exactement a APP_URL_KIOSK (pas de wildcard). CORS_ALLOWED_ORIGIN=https://kiosk.example.com # Algorithme de hashage mot de passe (password_hash PHP). # argon2id recommande depuis PHP 7.3 pour les nouveaux projets. PASSWORD_ALGO=argon2id # Parametres de cout argon2id (password_hash options). # Defauts alignes sur les recommandations OWASP Password Storage Cheat Sheet # (memoire >= 19 MiB, >= 2 iterations). 65536 KiB = 64 MiB, marge confortable. # Ces valeurs servent aussi au hash du PIN equipier (pin_hash, actions sensibles). ARGON2_MEMORY_COST=65536 # KiB (64 MiB) ARGON2_TIME_COST=4 # nombre d'iterations ARGON2_THREADS=1 # parallelisme (1 = portable, deterministe) # =================================================================== # Anti brute-force - throttling de connexion (security-by-design) # =================================================================== # Deux gardes complementaires (cf. docs/merise/mld.md 4.21 + PROJECT_CONTEXT 19) : # 1. par compte : colonnes user.failed_login_attempts / user.lockout_until # 2. par IP source : table login_throttle (entite 21) # Backoff degressif (pas de lock definitif) : evite le DoS sur compte legitime. # Compteur par compte : nombre d'echecs avant declenchement du backoff. ACCOUNT_LOCKOUT_THRESHOLD=5 # Duree de base du backoff (secondes). Croit de facon degressive a chaque # palier d'echecs supplementaires (ex : 60 -> 300 -> 900). ACCOUNT_LOCKOUT_BASE_SECONDS=60 ACCOUNT_LOCKOUT_MAX_SECONDS=900 # plafond du backoff (15 min) # Gate par IP : fenetre glissante et plafond de tentatives sur cette fenetre. IP_THROTTLE_WINDOW_SECONDS=900 # 15 min IP_THROTTLE_MAX_ATTEMPTS=20 # par IP sur la fenetre # PIN equipier pour actions sensibles (annulation, override). Chiffres uniquement, # bornes min ET max (RG-T18 : validation serveur + longueur bornee). STAFF_PIN_MIN_LENGTH=4 STAFF_PIN_MAX_LENGTH=12 # Expiration du token de reinitialisation de mot de passe (secondes). PASSWORD_RESET_TTL=3600 # 1h # =================================================================== # Retention des donnees (RGPD - minimisation et limitation de conservation) # =================================================================== # Purges executees par le service cron (docker/cron/crontab). # Justification documentee : interet legitime / obligations probatoires. AUDIT_LOG_RETENTION_DAYS=365 # journal d'audit ~12 mois THROTTLE_PURGE_AFTER_HOURS=24 # login_throttle : lignes sans lockout actif > 24h ORDER_RETENTION_DAYS=1095 # commandes (historique/stats) ~3 ans # Purge des sessions expirees : deja geree par le cron */15 (voir crontab). # =================================================================== # Upload images produits # =================================================================== UPLOAD_MAX_SIZE_MB=5 UPLOAD_ALLOWED_MIME=image/jpeg,image/png,image/webp # =================================================================== # Cron (fenetre de maintenance 01h30 - 09h30) # =================================================================== # Les jobs sont definis dans docker/cron/crontab. Ici uniquement le TZ. CRON_TIMEZONE=Europe/Paris # =================================================================== # Exposition via Traefik # =================================================================== # FQDN consommes par les labels docker-compose.yml pour generer les routes # Traefik et les certificats TLS (Traefik gere le resolver par defaut). # Le Traefik de l'hote prend en charge Let's Encrypt automatiquement. TRAEFIK_DOMAIN_KIOSK=kiosk.example.com TRAEFIK_DOMAIN_ADMIN=admin.example.com # =================================================================== # Reseau Docker externe du reverse proxy # =================================================================== # Nom du reseau Docker externe auquel le service web doit se connecter # pour etre expose par le reverse proxy de l'hote. # # Adapter selon votre infrastructure. Valeurs courantes : # traefik_proxy - convention neutre (placeholder) # traefik_public - convention doc Traefik # traefik - setups simples # proxy - autre convention frequente # # Le reseau doit exister AVANT 'make init' (cree par votre stack de # reverse proxy, ou manuellement : docker network create ). # La cible 'make init' echoue proprement avec un message d'aide si le # reseau est introuvable. REVERSE_PROXY_NETWORK=traefik_proxy