Le projet utilise Docker et Docker Compose pour la conteneurisation de tous les services. Cette approche garantit une cohérence entre les environnements de développement, de review et de production, et simplifie le déploiement.
L'architecture conteneurisée comprend plusieurs services :
flowchart TD
A[Utilisateur] --> B[Caddy:80/443]
B --> C[Front:3000]
B --> D[API]
B --> E[Adminer:8080]
B --> F[Mails:8025]
D --> G[DB:5432]
D --> H[Gotenberg:3000]
C --> D
style B fill:#4CAF50
style C fill:#42B883
style D fill:#000000
style G fill:#336791
Reverse proxy principal qui gère le routage et le SSL automatique.
Configuration :
80, 443, 24678 (WebSocket pour HMR)caddy:2-alpine./Caddyfile, caddy_data, caddy_configHOSTRoutage :
{$HOST} → Frontend (port 3000)api.{$HOST} → API Symfonymails.{$HOST} → Mailpitadminer.{$HOST} → AdminerApplication Nuxt.js avec deux modes : développement et production.
Développement (Dockerfile.dev) :
FROM node:22-alpine
WORKDIR /app
COPY ./sources .
RUN npm install
EXPOSE 3000
CMD ["npm", "run", "dev"]
Production (Dockerfile) :
nuxtjs:nodejs)Variables d'environnement :
NUXT_HOST : Adresse d'écoute (0.0.0.0)NUXT_BASE_API : URL de l'API backendNUXT_PUBLIC_MATOMO_HOST : Host MatomoNUXT_PUBLIC_MATOMO_SITE_ID : ID du site MatomoFRONT_PASS : Mot de passe pour l'accès frontendApplication Symfony avec FrankenPHP pour de meilleures performances.
Base (Dockerfile - target: base) :
FROM dunglas/frankenphp:1.4.4-php8.4.4 AS base
# Installation des extensions PHP
# Configuration Blackfire
# Configuration xDebug
Production (Dockerfile - target: prod) :
Extensions PHP :
pdo, pdo_pgsql, pgsql : Support PostgreSQLapcu, opcache : Cache et optimisationintl, zip : Fonctionnalités supplémentairesxdebug : Débogage (développement)blackfire : ProfilingVariables d'environnement :
APP_ENV : Environnement (dev/prod)APP_SECRET : Secret SymfonyWWW_DATA_UID : UID pour www-data (synchronisation avec l'hôte)SYMFONY_TRUSTED_PROXIES : Configuration proxySERVER_NAME : Nom du serveurCADDY_GLOBAL_OPTIONS : Options CaddyBase de données PostgreSQL 17.2 Alpine.
Configuration :
5432postgres:17.2-alpinedatabase (persistance des données)Variables d'environnement :
POSTGRES_USER : appPOSTGRES_PASSWORD : appPOSTGRES_DB : appPGDATA : /var/lib/postgresql/data/pgdataAdminer :
8080netteMailpit :
8025Gotenberg :
3000compose.yml)Configuration complète avec tous les services et outils de développement.
Caractéristiques :
Démarrage :
make up
# ou
docker compose up -d
Certificat SSL local :
make ssl
# Copie le certificat root CA depuis Caddy
compose.prod.yml)Configuration optimisée pour la production.
Caractéristiques :
Services :
compose.review.yml)Configuration pour les environnements de review (branches GitLab).
Caractéristiques :
Labels Roadie :
roadie.front.host=FRONTroadie.api.host=APIroadie.mails.host=MAILSroadie.adminer.host=ADMINERLe fichier Caddyfile configure le reverse proxy :
{$HOST} {
tls internal
reverse_proxy front:3000
}
{$HOST}:24678 {
tls internal
@websockets {
header Connection Upgrade
header Upgrade websocket
}
reverse_proxy @websockets front:24678
}
api.{$HOST} {
tls internal
reverse_proxy api
}
mails.{$HOST} {
tls internal
reverse_proxy mails:8025
}
adminer.{$HOST} {
tls internal
reverse_proxy adminer:8080
}
Fonctionnalités :
Volumes nommés :
caddy_data : Données Caddy (certificats, cache)caddy_config : Configuration Caddydatabase : Données PostgreSQLVolumes montés (développement) :
./front/sources:/app : Code source frontend./api/sources:/app : Code source API./Caddyfile:/etc/caddy/Caddyfile : Configuration Caddymake setup # Configuration initiale (copie .env, configure UID/GID)
make up # Démarre les conteneurs
make down # Arrête les conteneurs
make ssl # Copie le certificat SSL depuis Caddy
make api # Shell dans le conteneur API (utilisateur www-data)
make front # Shell dans le conteneur frontend (utilisateur node)
make api-logs # Logs du conteneur API
make front-logs # Logs du conteneur frontend
make api:lint # Lint du code PHP (phpcs, rector, phpstan)
make front:lint # Lint du code frontend (npm run check)
make tests # Exécute les tests PHPUnit
make reset # Rebuild complet des conteneurs (destructif)
make fixtures # Charge les fixtures dans la base de données
make prepare-test # Prépare l'environnement de test
make xdebug-enable # Active xDebug dans le conteneur API
.envLe fichier .env (copié depuis .env.example lors de make setup) contient :
Configuration générale :
HOST : Domaine principal (ex: save-france.local)HTTP_PORT : Port HTTP (défaut: 80)HTTPS_PORT : Port HTTPS (défaut: 443)MAILHOG_PORT : Port Mailpit (défaut: 8025)Frontend :
FRONT_PASS : Mot de passe pour l'accès frontendNUXT_NITRO_PRESET : Preset Nitro (défaut: node-server)NUXT_PUBLIC_MATOMO_HOST : Host MatomoNUXT_PUBLIC_MATOMO_SITE_ID : ID du site MatomoAPI :
APP_ENV : Environnement Symfony (dev/prod/test)WWW_DATA_UID : UID pour www-data (synchronisé automatiquement)XDEBUG_CLIENT_HOST : Host pour xDebug (détecté automatiquement)BLACKFIRE_CLIENT_ID : ID client Blackfire (optionnel)BLACKFIRE_CLIENT_TOKEN : Token Blackfire (optionnel)Stripe :
NUXT_PUBLIC_STRIPE_PUBLISHABLE_KEY : Clé publique StripeNUXT_STRIPE_SECRET_KEY : Clé secrète StripeSTRIPE_API_KEY : Clé API Stripe (backend)Autres services :
GOTENBERG_DSN : DSN GotenbergYOUSIGN_API_KEY : Clé API YousignBREVO_API_KEY : Clé API BrevoLes services critiques ont des healthchecks configurés :
API :
healthcheck:
test: curl -f http://localhost:2019/metrics || exit 1
start_period: 3s
interval: 30s
retries: 10
Frontend (production) :
healthcheck:
test: ["CMD", "wget", "--no-verbose", "--tries=1", "--spider", "http://localhost:3000/"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
Base de données :
healthcheck:
test: [ "CMD-SHELL", "pg_isready -U app -d app" ]
interval: 10s
retries: 5
start_period: 30s
timeout: 10s
make setup lors de la première installationmake xdebug-enable)make api-logs, make front-logs).envSi vous avez des problèmes de permissions avec les fichiers générés :
# Vérifier l'UID dans .env
grep WWW_DATA_UID .env
# Ajuster si nécessaire
sed -i "s/WWW_DATA_UID=.*/WWW_DATA_UID=$(id -u)/g" .env
# Régénérer le certificat
make ssl
# Vérifier dans le navigateur
# macOS : Ajouter rootCA.crt dans Keychain Access
# Linux : Ajouter dans les certificats système
# Vérifier les logs
docker compose logs [service]
# Vérifier les healthchecks
docker compose ps
# Rebuild si nécessaire
docker compose build --no-cache [service]
# Vérifier les réseaux Docker
docker network ls
# Inspecter un réseau
docker network inspect [network_name]
# Nettoyer les réseaux orphelins
docker network prune