#!/bin/sh set -e # 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/ 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. 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 config/container.php. Sans cette ligne, la première requête compile # un container incohérent et toutes les suivantes échouent avec une erreur 500. 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. exec "$@"