Architecture

Architecture Docker

Services, profils et volumes Docker du projet.

Architecture Docker

Le projet utilise deux profils Docker Compose : dev pour le développement avec hot-reload, prod pour la production avec images optimisées.

make up        # profil dev
make prod      # profil prod

Services

front (dev) / front-prod (prod)

Propriétédevprod
Build targetdevprod
Port exposéaucun (proxy Caddy)3000:3000
Dépend debackback-prod
Volume sources./front:/app

En développement, le port 3000 n'est pas exposé directement — le frontend est servi via le reverse proxy Caddy du backend. En production, le conteneur expose directement le port 3000.


back (dev) / back-prod (prod)

Propriétédevprod
Build targetdevprod
Ports exposés80, 443/tcp, 443/udp80, 443/tcp, 443/udp
Dépend dedatabasedatabase-prod
Volumes sources./back:/app + Caddyfile + php.inicaddy_data + caddy_config uniquement

FrankenPHP intègre Caddy comme serveur web. Le Caddyfile est monté en lecture seule en développement. En production, le code est copié dans l'image au build — aucun volume source n'est monté.


back-cron (dev) / back-cron-prod (prod)

Propriétédevprod
Build targetdevprod
Commandecron -fcron -f
Dépend dedatabasedatabase-prod
RôleScheduler des défisScheduler des défis

Ce service exécute automatiquement les commandes Symfony de défis hebdomadaires et mensuels définies dans back/cron/challenges.cron.


database (dev) / database-prod (prod)

Propriétédevprod
Imagemysql:8.4mysql:8.4
Port exposé3306:3306aucun
Volumemysql_datamysql_data

Le port MySQL est délibérément absent en production pour limiter la surface d'attaque.


Volumes

VolumeRôle
mysql_dataPersistance des données MySQL
caddy_dataCertificats TLS gérés par Caddy
caddy_configConfiguration runtime de Caddy
front_node_modulesnode_modules isolés du système hôte (dev uniquement)