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é | dev | prod |
|---|---|---|
| Build target | dev | prod |
| Port exposé | aucun (proxy Caddy) | 3000:3000 |
| Dépend de | back | back-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é | dev | prod |
|---|---|---|
| Build target | dev | prod |
| Ports exposés | 80, 443/tcp, 443/udp | 80, 443/tcp, 443/udp |
| Dépend de | database | database-prod |
| Volumes sources | ./back:/app + Caddyfile + php.ini | caddy_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é | dev | prod |
|---|---|---|
| Build target | dev | prod |
| Commande | cron -f | cron -f |
| Dépend de | database | database-prod |
| Rôle | Scheduler des défis | Scheduler 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é | dev | prod |
|---|---|---|
| Image | mysql:8.4 | mysql:8.4 |
| Port exposé | 3306:3306 | aucun |
| Volume | mysql_data | mysql_data |
Le port MySQL est délibérément absent en production pour limiter la surface d'attaque.
Volumes
| Volume | Rôle |
|---|---|
mysql_data | Persistance des données MySQL |
caddy_data | Certificats TLS gérés par Caddy |
caddy_config | Configuration runtime de Caddy |
front_node_modules | node_modules isolés du système hôte (dev uniquement) |