From ffc298d76159c865e95fb7bb7e230f77ebaa23b6 Mon Sep 17 00:00:00 2001 From: julien Date: Fri, 20 Mar 2026 23:26:40 +0100 Subject: [PATCH] Docker config update to fit project --- docker/php/entrypoint.sh | 99 ++++++++++++---------------------------- 1 file changed, 29 insertions(+), 70 deletions(-) diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index 10a33d3..be58777 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -1,76 +1,35 @@ -services: -app: -image: netslim-app:latest -build: -context: . -dockerfile: docker/php/Dockerfile -restart: unless-stopped -volumes: -# Répertoire de travail de l'entrypoint : reçoit public/ compilé, -# puis partagé avec Nginx via le mount ci-dessous. -- ./data:/data +#!/bin/sh +set -eu -# Base SQLite et migrations : persistés entre redéploiements. -- ./data/database:/var/www/app/database +# 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 -# Cache Twig/HTMLPurifier et logs : persistés entre redémarrages. -- ./data/var:/var/www/app/var +# 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 {} + -# Uploads : PHP écrit dans public/media/, Nginx le sert en lecture seule. -- ./data/public/media:/var/www/app/public/media +for item in /var/www/app/public/*; do + [ -e "$item" ] || continue + name=$(basename "$item") + [ "$name" = "media" ] && continue + cp -a "$item" /data/public/ +done -# phpdotenv requiert un fichier physique sur le disque (Dotenv::createImmutable) ; -# `env_file` seul ne suffit pas car il injecte uniquement dans l'environnement -# du process sans créer de fichier accessible via file_get_contents. -- ./.env:/var/www/app/.env:ro +# 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 -# Rend les variables accessibles via getenv() / $_SERVER en dehors de phpdotenv -# (scripts CLI, healthchecks…). -env_file: .env +# Invalide les caches compilés à chaque déploiement. +rm -rf /var/www/app/var/cache/twig/* +rm -rf /var/www/app/var/cache/di/* -# Vérifie que PHP-FPM écoute sur le port 9000 avant de déclarer le service sain. -environment: -TRUSTED_PROXIES: ${TRUSTED_PROXIES:-*} - -# bash /dev/tcp est disponible sur l'image Debian php:8.4-fpm sans dépendance -# supplémentaire. start_period laisse le temps à entrypoint.sh de terminer -# (sync public/, permissions, caches) avant que les échecs ne comptent. -healthcheck: -test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9000'"] -interval: 10s -timeout: 3s -retries: 3 -start_period: 20s - -nginx: -image: nginx:stable -restart: unless-stopped -depends_on: -app: -condition: service_healthy -ports: -- "127.0.0.1:8888:80" -volumes: -- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro -# Fichiers statiques servis directement par Nginx sans passer par PHP. -- ./data/public:/var/www/app/public:ro - -provision: -image: netslim-app:latest -profiles: ["manual"] -# Réutilise exactement la même image que `app` pour éviter tout écart entre -# le runtime HTTP et le runtime de provisionnement. -# Même environnement/fichiers que le runtime PHP pour provisionner exactement -# la même base SQLite persistée. -volumes: -- ./data:/data -- ./data/database:/var/www/app/database -- ./data/var:/var/www/app/var -- ./data/public/media:/var/www/app/public/media -- ./.env:/var/www/app/.env:ro -env_file: -- .env -environment: -TRUSTED_PROXIES: ${TRUSTED_PROXIES:-*} -restart: "no" -command: ["php", "bin/provision.php"] +# Passe la main au processus principal. +exec "$@"