services: # --- Service PHP --- # Conteneur pour exécuter l'application Symfony (requêtes web) php: build: context: . dockerfile: ./docker/php/Dockerfile args: # Utilise l'UID/GID de l'hôte pour éviter les problèmes de permissions UID: ${UID:-1000} GID: ${GID:-1000} container_name: e-cosplay_php environment: - XDEBUG_MODE=coverage volumes: # Monte le code source de l'application dans le conteneur - ./:/srv/app # Monte le socket Docker pour permettre l'exécution de commandes docker depuis le conteneur - /var/run/docker.sock:/var/run/docker.sock - ./coverage:/opt/phpstorm-coverage - ./.coverage:/opt/phpstorm-coverage depends_on: # S'assure que la base de données et Redis sont démarrés avant PHP - db - redis networks: - e-cosplay_network # Assignation au réseau commun # --- Service Worker pour Symfony Messenger --- # Conteneur dédié à l'exécution des messages en arrière-plan messenger-worker: build: context: . dockerfile: ./docker/php/Dockerfile args: UID: ${UID:-1000} GID: ${GID:-1000} container_name: e-cosplay_messenger_worker # Commande pour lancer le worker. 'async' est le nom du transport par défaut. command: php bin/console messenger:consume async --memory-limit=128M --time-limit=3600 volumes: - ./:/srv/app # Monte aussi le socket Docker ici pour la cohérence - /var/run/docker.sock:/var/run/docker.sock depends_on: - db - redis networks: - e-cosplay_network # Assignation au réseau commun # --- Service Frontend (Bun + Vite) --- # Conteneur pour compiler les assets JS/CSS en développement bun: image: oven/bun:1-slim container_name: e-cosplay_bun # Exécute les commandes avec l'utilisateur de l'hôte pour éviter les problèmes de permissions sur node_modules user: "${UID:-1000}:${GID:-1000}" working_dir: /usr/src/app volumes: - ./:/usr/src/app ports: # Port par défaut du serveur de développement Vite - "5173:5173" # Lance le serveur de développement Vite défini dans package.json command: bun run dev networks: - e-cosplay_network # Assignation au réseau commun # --- Service Serveur Web (Caddy) --- # Serveur web moderne qui sert l'application et gère le PHP-FPM caddy: image: caddy:2-alpine container_name: e-cosplay_caddy ports: # Mappe le port 8000 de l'hôte au port 80 du conteneur - "8000:80" volumes: # Monte le fichier de configuration de Caddy - ./docker/caddy/Caddyfile:/etc/caddy/Caddyfile # Monte le code source pour servir les fichiers statiques - ./:/srv/app depends_on: - php networks: - e-cosplay_network # Assignation au réseau commun # --- Service Base de Données principale (PostgreSQL) --- db: image: postgres:16-alpine container_name: e-cosplay_db ports: - "5432:5432" environment: POSTGRES_DB: app_db POSTGRES_USER: symfony_user POSTGRES_PASSWORD: ChangeMeInProd! volumes: # Volume nommé pour la persistance des données - db_data:/var/lib/postgresql/data networks: - e-cosplay_network # Assignation au réseau commun # --- Service Cache/Messenger (Redis) --- redis: image: redis:7-alpine container_name: e-cosplay_redis networks: - e-cosplay_network # Assignation au réseau commun # --- Service de Test d'Emails (MailHog) --- # Intercepte tous les emails envoyés en développement mailhog: image: mailhog/mailhog:latest container_name: e-cosplay_mailhog ports: # Port 1025 pour le serveur SMTP factice - "1025:1025" # Port 8025 pour l'interface web de MailHog - "8025:8025" networks: - e-cosplay_network # Assignation au réseau commun # --- Service de Stockage Fichiers (MinIO) --- # Fournit une API compatible S3 pour le stockage de fichiers minio: image: minio/minio:RELEASE.2025-02-03T21-03-04Z container_name: e-cosplay_minio ports: # Port 9000 pour l'API S3 - "9000:9000" # Port 9001 pour la console web de MinIO - "9001:9001" environment: MINIO_ROOT_USER: minio_user MINIO_ROOT_PASSWORD: ChangeMeInProd! volumes: # Volume nommé pour la persistance des fichiers - minio_data:/data # Commande pour démarrer MinIO et lancer la console sur le bon port command: server /data --console-address ":9001" networks: - e-cosplay_network # Assignation au réseau commun # --- Service de Gestion des Secrets (HashiCorp Vault) --- vault: image: hashicorp/vault:latest container_name: e-cosplay_vault ports: - "8210:8200" # Mappe le port 8210 de l'hôte au port 8200 du conteneur Vault - "8211:8201" # Mappe le port 8210 de l'hôte au port 8200 du conteneur Vault - "8212:8202" # Mappe le port 8212 de l'hôte au port 8200 du conteneur Vault volumes: # Volume pour la persistance des données - vault_data:/vault # Volume pour monter notre fichier de configuration environment: VAULT_DEV_ROOT_TOKEN_ID: myroot VAULT_DEV_LISTEN_ADDRESS: 0.0.0.0:8201 VAULT_LOCAL_CONFIG: '{"storage": {"file": {"path": "/vault/file"}}, "listener": [{"tcp": { "address": "0.0.0.0:8200", "tls_disable": true}}], "default_lease_ttl": "168h", "max_lease_ttl": "720h", "ui": true,"disable_mlock": false}' # Lance Vault en mode serveur avec notre fichier de configuration cap_add: - IPC_LOCK command: "server -dev" networks: - e-cosplay_network # Assignation au réseau commun # Définition des volumes pour la persistance des données volumes: db_data: # Pour la base de données principale de Symfony minio_data: # Pour le stockage de fichiers MinIO vault_data: # Pour les données de HashiCorp Vault # Définition des réseaux networks: e-cosplay_network: # Définition du réseau commun driver: bridge # Le type de driver le plus courant