fokan/docker-compose.yml
Gautier Stefanini 84c971b05b Audit de sécurité et fonctionnel : correctifs appliqués, quiz rejouable (D-018)
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>
2026-07-28 13:05:55 +00:00

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