Démarrage de la pile par un simple docker compose up

La pile de test de la branche ne démarrait pas : « Connexion à la base
impossible ». Trois causes cumulées, toutes corrigées.

1. PTA_DB_PORT et DB_PORT étaient passés à 9306. Ces variables désignent le
   port joint À L'INTÉRIEUR du réseau Docker, où MariaDB écoute sur 3306, et
   non un port publié sur l'hôte : la connexion était refusée. Elles reviennent
   à 3306, et le port hôte 9306 est désormais réellement publié par le service
   db (sur la boucle locale), pour un client SQL externe.

2. Le service db-migrate manquait sur la branche. Le schéma d'initialisation ne
   contient aucune des tables et vues d'accès V7.8 : sur un volume neuf,
   l'application refusait de démarrer. db-migrate applique maintenant tous les
   database/migration_*.sql, dont celle du tableau de bord V7.9 — plus aucune
   étape SQL manuelle.

3. Le défaut de PTA_DB_PASS (change_me) différait de celui de MARIADB_PASSWORD
   (pta). Sans fichier .env — et ce répertoire n'en a pas, il est ignoré par
   git — l'authentification échouait. Les deux défauts sont alignés.

Le bandeau du tableau de bord ne prétend plus que « tous les lieux ont des
horaires attendus » quand aucun lieu n'est enregistré.

Vérifié : volume détruit puis « docker compose up -d --build » seul suffit à
obtenir les onze pages en 200, l'atterrissage sur le tableau de bord et les deux
migrations appliquées ; un second up les ignore ; la base répond sur
127.0.0.1:9306 ; la pile principale sur 8080 est restée intacte.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
This commit is contained in:
PTA
2026-08-11 11:53:19 +02:00
parent b68ac15de5
commit 13ee16e25d
5 changed files with 280 additions and 31 deletions

View File

@@ -1,7 +1,36 @@
# ============================================================================
# Pile de test de la branche V7.9.
# ============================================================================
# Noms de conteneurs, réseau, volume et ports publiés sont suffixés « test » :
# cette pile tourne EN PARALLÈLE de la pile principale (pta-db, pta-php, …)
# sans lui prendre ni ses conteneurs, ni ses données, ni ses ports.
#
# `docker compose up -d --build` suffit : le service db-migrate applique
# lui-même les migrations SQL, dont celle du tableau de bord V7.9.
#
# Ce répertoire n'a volontairement pas de fichier .env (il est ignoré par git) :
# les valeurs par défaut ci-dessous s'appliquent donc telles quelles, et les
# ports publiés (9080 / 9081 / 9306) ne peuvent pas entrer en conflit avec la
# pile principale (8080 / 8081). Si vous y copiez le .env de la pile principale,
# pensez à y changer APP_PORT et PMA_PORT.
#
# ATTENTION — deux familles de ports à ne pas confondre :
#
# · ports PUBLIÉS sur la machine hôte, dans les blocs `ports:` :
# 9080 application 9081 phpMyAdmin 9306 MariaDB
# Ceux-là se changent librement, ce sont eux qu'on tape dans un navigateur
# ou dans un client SQL.
#
# · ports JOINTS À L'INTÉRIEUR du réseau Docker, dans les blocs
# `environment:` (PTA_DB_PORT, DB_PORT, PMA_PORT) : MariaDB y écoute
# TOUJOURS sur 3306, quel que soit le port publié. Y mettre autre chose
# coupe l'accès à la base et l'application renvoie « Connexion à la base
# impossible ».
# ============================================================================
services:
db:
image: mariadb:11.4
container_name: pta-db
container_name: pta-db-test
restart: unless-stopped
environment:
MARIADB_DATABASE: ${DB_NAME:-pta}
@@ -13,9 +42,14 @@ services:
- --character-set-server=utf8mb4
- --collation-server=utf8mb4_unicode_ci
volumes:
- mariadb_data:/var/lib/mysql
- mariadb_data_test:/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
ports:
# Base joignable depuis la machine hôte pour un client SQL externe, sur la
# boucle locale uniquement. À l'intérieur du réseau Docker, les services
# continuent de joindre MariaDB sur son port natif 3306.
- "${DB_BIND:-127.0.0.1}:${DB_PORT_HOST:-9306}:3306"
healthcheck:
test: ["CMD-SHELL", "mariadb-admin ping -h 127.0.0.1 -uroot -p\"$${MARIADB_ROOT_PASSWORD}\" --silent"]
interval: 10s
@@ -23,21 +57,54 @@ services:
retries: 10
start_period: 20s
networks:
- pta
- pta-test
# 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-test
restart: "no"
environment:
DB_HOST: db
# Port joint À L'INTÉRIEUR du réseau Docker : MariaDB y écoute sur 3306.
# Le port publié sur l'hôte (9306) n'a pas cours ici.
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-test
php:
build:
context: .
dockerfile: Dockerfile
target: php
container_name: pta-php
container_name: pta-php-test
restart: unless-stopped
environment:
PTA_DB_HOST: db
# Port joint À L'INTÉRIEUR du réseau Docker, où MariaDB écoute sur 3306.
# Ce n'est pas le port publié sur l'hôte : pour joindre la base depuis la
# machine, utiliser 127.0.0.1:9306, publié par le service db ci-dessus.
PTA_DB_PORT: 3306
PTA_DB_NAME: ${DB_NAME:-pta}
PTA_DB_USER: ${DB_USER:-pta}
PTA_DB_PASS: ${DB_PASSWORD:-change_me}
# Le défaut doit rester identique à MARIADB_PASSWORD du service db :
# deux défauts différents rendent la pile inutilisable sans fichier .env.
PTA_DB_PASS: ${DB_PASSWORD:-pta}
# 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}
@@ -45,29 +112,32 @@ services:
depends_on:
db:
condition: service_healthy
db-migrate:
condition: service_completed_successfully
networks:
- pta
- pta-test
nginx:
build:
context: .
dockerfile: Dockerfile
target: nginx
container_name: pta-nginx
container_name: pta-nginx-test
restart: unless-stopped
ports:
- "${APP_BIND:-0.0.0.0}:${APP_PORT:-8080}:80"
- "${APP_BIND:-0.0.0.0}:${APP_PORT:-9080}:80"
depends_on:
- php
networks:
- pta
- pta-test
phpmyadmin:
image: phpmyadmin:5.2.2
container_name: pta-phpmyadmin
container_name: pta-phpmyadmin-test
restart: unless-stopped
environment:
PMA_HOST: db
# Port interne au réseau Docker, jamais un port publié.
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à
@@ -76,18 +146,19 @@ services:
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:-127.0.0.1}:${PMA_PORT:-8081}:80"
# phpMyAdmin n'écoute que sur la boucle locale : il donne un accès complet
# à la base. Pour y accéder à distance, passer par un tunnel SSH
# (voir README_DOCKER.md), plutôt que d'ouvrir ce port sur le réseau.
- "${PMA_BIND:-127.0.0.1}:${PMA_PORT:-9081}:80"
depends_on:
db:
condition: service_healthy
networks:
- pta
- pta-test
networks:
pta:
pta-test:
driver: bridge
volumes:
mariadb_data:
mariadb_data_test: