services: db: image: mariadb:11.4 container_name: pta-db restart: unless-stopped environment: MARIADB_DATABASE: ${DB_NAME:-pta} MARIADB_USER: ${DB_USER:-pta} MARIADB_PASSWORD: ${DB_PASSWORD:-pta} MARIADB_ROOT_PASSWORD: ${DB_ROOT_PASSWORD:-pta} TZ: ${TZ:-Europe/Paris} command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_unicode_ci volumes: - mariadb_data:/var/lib/mysql # Ce fichier n'est exécuté QUE lors de l'initialisation d'un volume vide. - ./database/pta_prod_schema_mariadb.sql:/docker-entrypoint-initdb.d/01-pta-schema.sql:ro healthcheck: test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -uroot -p\"$${MARIADB_ROOT_PASSWORD}\" --silent"] interval: 10s timeout: 5s retries: 10 start_period: 20s networks: - pta # Service jetable : applique les migrations SQL puis s'arrête. Le service php # ne démarre qu'après sa sortie en succès, si bien qu'une migration en échec # empêche l'application de tourner sur une base incomplète. db-migrate: image: mariadb:11.4 container_name: pta-db-migrate restart: "no" environment: DB_HOST: db DB_PORT: 3306 DB_NAME: ${DB_NAME:-pta} # Les migrations créent tables et vues : elles passent par le compte # d'administration, jamais par le compte applicatif. DB_USER: root DB_PASSWORD: ${DB_ROOT_PASSWORD:-pta} TZ: ${TZ:-Europe/Paris} volumes: - ./database:/migrations:ro - ./docker/db/apply-migrations.sh:/usr/local/bin/apply-migrations.sh:ro entrypoint: ["/bin/sh", "/usr/local/bin/apply-migrations.sh"] depends_on: db: condition: service_healthy networks: - pta php: build: context: . dockerfile: Dockerfile target: php container_name: pta-php restart: unless-stopped environment: PTA_DB_HOST: db PTA_DB_PORT: 3306 PTA_DB_NAME: ${DB_NAME:-pta} PTA_DB_USER: ${DB_USER:-pta} PTA_DB_PASS: ${DB_PASSWORD:-change_me} # Aucun détail technique n'est renvoyé au navigateur tant que ce drapeau # n'est pas explicitement passé à 1. Ne jamais l'activer en production. PTA_DEBUG: ${PTA_DEBUG:-0} TZ: ${TZ:-Europe/Paris} depends_on: db: condition: service_healthy db-migrate: condition: service_completed_successfully networks: - pta nginx: build: context: . dockerfile: Dockerfile target: nginx container_name: pta-nginx restart: unless-stopped ports: - "${APP_BIND:-0.0.0.0}:${APP_PORT:-8080}:80" depends_on: - php networks: - pta phpmyadmin: image: phpmyadmin:5.2.2 container_name: pta-phpmyadmin restart: unless-stopped environment: PMA_HOST: db PMA_PORT: 3306 # PMA_USER / PMA_PASSWORD sont volontairement absents : leur présence fait # basculer phpMyAdmin en auth_type=config, c'est-à-dire une session déjà # authentifiée pour quiconque atteint le port. Sans eux, phpMyAdmin exige # un identifiant et un mot de passe MariaDB à chaque connexion. UPLOAD_LIMIT: 64M TZ: ${TZ:-Europe/Paris} ports: # phpMyAdmin n'écoute que sur la boucle locale. Pour y accéder à distance, # passer par un tunnel SSH (voir README_DOCKER.md). - "${PMA_BIND:-0.0.0.0}:${PMA_PORT:-8081}:80" depends_on: db: condition: service_healthy networks: - pta networks: pta: driver: bridge volumes: mariadb_data: