diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 40af617..1d1f446 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -35,10 +35,6 @@ RUN composer install --no-dev --optimize-autoloader --no-interaction COPY . . COPY --from=assets /build/public/assets/ public/assets/ -# Archive les migrations hors du WORKDIR : le bind mount ./data/database/ -# écrase /var/www/app/database/ au démarrage — l'entrypoint recopie depuis ici. -RUN cp -r database /database.baked - COPY --chmod=755 docker/php/entrypoint.sh /usr/local/bin/entrypoint.sh ENTRYPOINT ["entrypoint.sh"] diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index fea5328..37bbe7f 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -1,42 +1,39 @@ #!/bin/sh -set -e +set -eu + +# Prépare les répertoires runtime/persistants. +mkdir -p \ + /data/public \ + /var/www/app/database \ + /var/www/app/public/media \ + /var/www/app/var/cache/twig \ + /var/www/app/var/cache/htmlpurifier \ + /var/www/app/var/cache/di \ + /var/www/app/var/logs + +# Synchronise les fichiers publics versionnés (index.php, assets compilés, etc.) +# vers le volume partagé. Le répertoire media est exclu car il contient les +# uploads utilisateurs et est géré séparément. +find /data/public -mindepth 1 -maxdepth 1 -exec rm -rf {} + -# public/ → assets compilés, index.php -# Synchronisé à chaque démarrage pour déployer les nouveaux assets. -# media/ est exclu : c'est un bind mount séparé contenant les uploads -# utilisateurs — le copier dans sa propre destination causerait une erreur. for item in /var/www/app/public/*; do - name=$(basename "$item") - [ "$name" = "media" ] && continue - cp -a "$item" /data/public/ + [ -e "$item" ] || continue + name=$(basename "$item") + [ "$name" = "media" ] && continue + cp -a "$item" /data/public/ done -# database/ → migrations depuis l'archive baked. -# /var/www/app/database/ est un bind mount vide au premier démarrage : -# les migrations sont copiées depuis /database.baked/ qui n'est pas monté. -# cp -rn préserve app.sqlite sur les déploiements suivants. -cp -rn /database.baked/. /var/www/app/database/ 2>/dev/null || true - -# Pré-création de public/media/ pour que les permissions soient fixées -# ici, en même temps que les autres répertoires persistants, plutôt qu'à -# la première requête par Bootstrap::checkDirectories(). -mkdir -p /var/www/app/public/media - -# Permissions sur les bind mounts : doit s'exécuter en root avant -# le démarrage de PHP-FPM. Bootstrap.php crée ensuite les sous-répertoires -# (var/cache/twig, var/cache/htmlpurifier, var/logs) à la première requête -# avec les bonnes permissions. +# Permissions sur les répertoires persistants. Doit s'exécuter en root avant +# le démarrage de PHP-FPM. chown -R www-data:www-data /data /var/www/app/database /var/www/app/var /var/www/app/public/media -# Invalider les caches compilés à chaque déploiement. -# - Twig : les templates compilés peuvent être obsolètes après modification d'une vue -# ou d'une extension Twig. -# - DI : le container PHP-DI compilé doit être regénéré après tout changement -# dans src/Kernel/Runtime/DI/container.php. Sans cette ligne, la première requête compile -# un container incohérent et toutes les suivantes échouent avec une erreur 500. +# Invalide les caches compilés à chaque déploiement. +# - Twig : les templates compilés peuvent être obsolètes après modification d'une vue +# ou d'une extension Twig. +# - DI : le container PHP-DI compilé doit être régénéré après tout changement +# de configuration du container. rm -rf /var/www/app/var/cache/twig/* rm -rf /var/www/app/var/cache/di/* -# Passe la main à la commande principale (php-fpm) en remplaçant le processus -# entrypoint par php-fpm PID 1 — requis pour la gestion des signaux Docker. +# Passe la main au processus principal (php-fpm). exec "$@"