Sécurité : réclamation de foyer et consentement de rétractation déplacés dans le webhook Stripe uniquement (jamais plus au rendu de page) ; mot de passe Postgres régénéré et réseau dédié (fokan-net, base retirée de ai-net) ; limitation de débit sur les routes publiques ; plafonds sur les invitations ; jeton .ics dédié et révocable ; en-têtes de sécurité. Fonctionnel : le mail « garder le lien » part réellement ; verrou en mémoire sur l'enrichissement d'un foyer (course quiz/pg-boss) ; rattrapage Crit'Air étendu au passage hebdomadaire ; webhook Stripe robustifié (past_due/trialing ne coupent plus l'accès) ; champ P.2 proposé aussi sur la voie déclarative du quiz (marque/modèle), pas seulement via le champ K. Nouveau : un abonné peut rejouer son quiz pour mettre à jour son foyer (garde-fou d'un rejeu par mois) — voir D-018 dans docs/decisions.md pour le compromis retenu sur l'état des échéances. Exploitation : CI GitHub Actions, ESLint, migrations Drizzle versionnées (base existante baselinée, nouvelle migration jouée), healthcheck /api/health. Code mort retiré. Voir docs/audit-2026-07-28.md § 0 pour le détail complet, correctif par correctif, et ce qui reste délibérément différé (sauvegardes, sourcing des intervalles de courroie). Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
51 lines
1.7 KiB
YAML
51 lines
1.7 KiB
YAML
services:
|
|
db:
|
|
image: postgres:16-alpine
|
|
container_name: fokan-db
|
|
environment:
|
|
POSTGRES_USER: fokan
|
|
# Injecté depuis .env, jamais en clair ici (audit S7). docker compose lit .env du
|
|
# répertoire du projet pour la substitution ${...}, indépendamment de env_file: ci-dessous.
|
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
|
POSTGRES_DB: fokan
|
|
volumes:
|
|
- /srv/user-data/fokan:/var/lib/postgresql/data
|
|
healthcheck:
|
|
test: ["CMD-SHELL", "pg_isready -U fokan"]
|
|
interval: 5s
|
|
retries: 5
|
|
restart: unless-stopped
|
|
networks:
|
|
# Réseau dédié uniquement : la base n'a plus besoin d'être joignable par les ~25 autres
|
|
# conteneurs de ai-net (audit S7). Seul `app` la joint, sur fokan-net.
|
|
- fokan-net
|
|
|
|
app:
|
|
build: .
|
|
container_name: fokan-app
|
|
depends_on:
|
|
db:
|
|
condition: service_healthy
|
|
env_file: .env
|
|
environment:
|
|
# Sans lui, le serveur standalone Next.js ne bind que sur l'IP du conteneur — jamais sur
|
|
# 127.0.0.1, ce qui fait échouer le healthcheck ci-dessous (constaté au déploiement du
|
|
# 28/07/2026, audit E4). 0.0.0.0 couvre les deux.
|
|
HOSTNAME: "0.0.0.0"
|
|
ports:
|
|
- "127.0.0.1:3100:3000"
|
|
restart: unless-stopped
|
|
networks:
|
|
- fokan-net # pour joindre fokan-db
|
|
- ai-net # pour rester joignable par Caddy (reverse proxy), qui vit sur ai-net
|
|
healthcheck:
|
|
test: ["CMD", "node", "-e", "require('http').get('http://127.0.0.1:3000/api/health',r=>process.exit(r.statusCode===200?0:1)).on('error',()=>process.exit(1))"]
|
|
interval: 30s
|
|
timeout: 5s
|
|
retries: 3
|
|
start_period: 15s
|
|
|
|
networks:
|
|
fokan-net:
|
|
ai-net:
|
|
external: true
|