Documentation technique de la dockerisation du projet. Pour la procédure de
démarrage quotidienne, voir run_local.md.
- Reproduire fidèlement le runtime Google App Engine
php83(Nginx + PHP-FPM 8.3 + extensions identiques). - Supprimer toute dépendance à un toolchain local (brew, nvm, sphp, PECL, Apache/httpd, Composer global…).
- Rendre le stack portable (macOS Intel/ARM, Linux, CI) et modulaire
(passage futur à PHP 8.5 via un simple
--build-arg PHP_VERSION=8.5).
La base MySQL n'appartient pas à ce stack. Elle tourne dans le conteneur
rcq_mysql(port hôte3316) fourni par le projet dashboard.run_local.shse contente de vérifier qu'il est démarré.
┌──────────────────┐ ┌──────────────────┐ ┌──────────────────┐
│ node-client │ │ nginx (8080) │◄─────┤ php-fpm (9000) │
│ gulp serve 3000 │─────►│ mime GAE serve │ │ PHP 8.3 + exts │
│ Node 10.24.1 │ /rest│ basePath /rest │ │ grpc, protobuf, │
│ │ │ │ │ xdebug, sodium │
└──────────────────┘ └──────────────────┘ └────────┬─────────┘
│ │ rcq:3316
└────────────── network rcq_net ────────────────────┤ (host-gateway)
▼
┌──────────────────┐
│ rcq_mysql (3316) │
│ (EXTERNE: projet│
│ dashboard) │
└──────────────────┘
| Service | Image | Port host | Rôle |
|---|---|---|---|
php-fpm |
php:8.3-fpm-bookworm (custom) |
— | Runtime PHP-FPM, cible dev = + xdebug |
nginx |
nginx:1.27-alpine (custom) |
8080 |
Reproduction du wrapper GAE serve |
node-client |
node:10-buster (custom) |
3000, 3001 |
Build & gulp serve du front AngularJS |
rcq_mysql |
externe (projet dashboard) | 3316 |
MySQL partagé entre les projets RCQ |
| Côté GAE (prod) | Côté Docker (dev) |
|---|---|
runtime: php83 (Nginx + PHP-FPM) |
nginx + php-fpm containers |
entrypoint: serve public/rest/… |
nginx vhost pointe sur /app/server/public/rest/ |
| Cloud SQL Unix socket | TCP vers rcq:3316 (host-gateway → conteneur rcq_mysql) |
| Secret Manager (prod) | Secret Manager (dev) via GOOGLE_APPLICATION_CREDENTIALS ; secrets préfixés local- (cf. SecretManagerService) |
env_variables: dans app.yaml |
environment: dans docker-compose.yml (alimenté par .env) |
| Extensions natives bundled | pecl install grpc protobuf + docker-php-ext-install |
Tous les composants versionnés sont paramétrables via .env :
PHP_VERSION=8.3 # bump to 8.5 when GAE exposes php85
NODE_VERSION=10.24.1 # bump when the front is migrated off AngularJS 1.xAprès modification : make rebuild && make up.
.
├── docker-compose.yml Orchestration (3 services, 1 network)
├── .env.example Template de config — copié en .env
├── run_local.sh Bootstrap one-shot
├── Makefile Cibles développeur (`make help`)
├── .dockerignore Exclusions du build context
└── docker/
├── php/
│ ├── Dockerfile ARG PHP_VERSION, cibles `base` et `dev`
│ ├── php.ini timezone Europe/Paris, opcache
│ ├── www.conf PHP-FPM pool
│ └── xdebug.ini XDEBUG_MODE piloté par .env
├── nginx/
│ ├── Dockerfile
│ ├── nginx.conf
│ └── rcq-backend.conf basePath /rest, FastCGI -> php-fpm:9000
└── node/
├── Dockerfile Node 22 + gulp-cli + socat
└── entrypoint.sh forward localhost:8080 -> nginx:8080
server/src/settings.php est semé depuis server/src/settings.sample.php
au premier lancement (jamais écrasé). Ce fichier utilise getenv() pour
toute sa configuration, comme sur GAE — les mots de passe sont récupérés
à l'exécution via Google Secret Manager (préfixe local- détecté
automatiquement par SecretManagerService quand l'appUrl contient
localhost ou rcq).
Les scripts GCP/deploy_back.sh et GCP/deploy_front.sh ont été adaptés :
- Build front : exécuté dans le conteneur
node-client(docker compose run --rm --no-deps --entrypoint "" node-client bash -lc …). Plus besoin de Node 10 sur le host. - Migration Phinx : exécutée dans
php-fpm;sedréécrithost: 127.0.0.1→host: host.docker.internalpour que le conteneur atteigne lecloud-sql-proxylancé sur le host (ports 3305/3307/3308/3310 selon l'env). cloud-sql-proxyreste piloté depuis le host (pas de conteneur dédié) car c'estgcp-deploy.shqui l'orchestre déjà et gère le kill -15.
deploy_cloudFunctions.sh n'est pas modifié : il opère sur un autre repo
(~/RedCrossQuestCloudFunctions/).
| Volume | Contenu |
|---|---|
composer-cache |
Cache /tmp/composer |
php-di-cache |
Cache PHP-DI compilé (/tmp/php-di-compiled) |
node-modules |
client/node_modules (isolé du bind mount) |
make clean supprime les containers et volumes. La base MySQL n'est
pas affectée (elle vit dans le conteneur externe rcq_mysql).
| Élément | Valeur |
|---|---|
| Conteneur | rcq_mysql (projet dashboard, non géré ici) |
| Port hôte | 3316 |
| Hostname applicatif | rcq (entrée /etc/hosts côté hôte, extra_hosts côté conteneur) |
| Schéma local | rcq_fr_dev_db |
| Utilisateur applicatif | rcq-fr-dev-user |
| Mot de passe | Secret Manager, clé local-MYSQL_PASSWORD (projet rcq-fr-dev) |
Le DSN mysql:host=rcq;port=3316;dbname=rcq_fr_dev_db;charset=utf8mb4
fonctionne à l'identique depuis l'hôte (DBeaver, mysql CLI) et depuis
le conteneur php-fpm grâce à l'alias rcq:host-gateway.
Dans .env, mettre XDEBUG_MODE=debug. IntelliJ :
- PHP → Servers : host
localhost, port8080, path mapping./server→/app/server. - PHP → Debug : port
9003. - Xdebug Helper (Chrome) : activer sur
localhost:3000.
Le conteneur résout host.docker.internal → host gateway (configuré dans
docker-compose.yml via extra_hosts).
.env,server/src/settings.phpetserver/phinx.ymlsont dans.gitignoreET.dockerignore.- Aucun secret n'est baké dans les images.
- Les credentials GCP vivent dans
~/.cred/sur l'hôte, monté read-only sur/run/secretsdansphp-fpm. - Les mots de passe sont récupérés à l'exécution depuis GCP Secret Manager — jamais écrits sur disque ni committés.
Le service node-client héberge la toolchain AngularJS modernisée :
- Node 22 (LTS, image
node:22-bookworm-slim, multi-arch amd64 + arm64 — natif sur Apple Silicon, plus deplatform: linux/amd64). - Gulp 5 +
gulp-cli@3(Gulp 3 +node-sassretirés au profit degulp-sass@5+sassdart-sass). - Chromium +
karma-chrome-launcherheadless pour les tests Karma (PhantomJS retiré). git(utilisé par npm pour résoudre les forks GitHubangular-qr-*-updated).- Plus de Bower : les 24 dépendances front sont dans
client/package.json; le pipelinegulpinjecte les vendors viagulp-inject+ une liste explicite de cheminsnode_modules/(cf.client/gulp/conf.js).
⚠️ Ne jamais fairenpm install/gulpdepuis l'hôte. Le conteneur fige les versions et l'OS sous-jacent ; certains modules natifs (chromium-launcher, dart-sass binary) varient avec l'arch hôte. Passer parmake npm/make gulp-serve(oudocker compose exec node-client <cmd>).L'audit d'upgrade frontend (vulnérabilités, plan de migration historique) est consigné dans
docs/frontend_upgrade_audit.md.