From 2061d680f9c26e129cb65bb10d5b4fff2d5e54a3 Mon Sep 17 00:00:00 2001 From: julien Date: Fri, 20 Mar 2026 23:28:05 +0100 Subject: [PATCH] Docker config update to fit project --- docker-compose.yml | 89 ++++++++++++++++++++++++++-------------------- 1 file changed, 50 insertions(+), 39 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 31d7101..666569f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,42 +1,42 @@ -x-app-common: &app-common - image: netslim-app:latest - build: - context: . - dockerfile: docker/php/Dockerfile - volumes: - # Répertoire public partagé avec Nginx. - # L'entrypoint y synchronise index.php et les assets compilés. - - ./data/public:/data/public - - # Base SQLite persistée entre redéploiements. - - ./data/database:/var/www/app/database - - # Cache applicatif et logs persistés entre redémarrages. - - ./data/var:/var/www/app/var - - # Uploads utilisateurs. - - ./data/public/media:/var/www/app/public/media - - # phpdotenv requiert un fichier physique lisible depuis le conteneur. - - ./.env:/var/www/app/.env:ro - env_file: - - .env - environment: - TRUSTED_PROXIES: ${TRUSTED_PROXIES:-*} - services: app: - <<: *app-common + 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 - # Vérifie que PHP-FPM écoute bien sur le port 9000. - # Pas de dépendance à bash : on utilise PHP directement. + # Base SQLite et migrations : persistés entre redéploiements. + - ./data/database:/var/www/app/database + + # Cache Twig/HTMLPurifier et logs : persistés entre redémarrages. + - ./data/var:/var/www/app/var + + # Uploads : PHP écrit dans public/media/, Nginx le sert en lecture seule. + - ./data/public/media:/var/www/app/public/media + + # 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 + + # Rend les variables accessibles via getenv() / $_SERVER en dehors de phpdotenv + # (scripts CLI, healthchecks…). + env_file: .env + + # 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", - "php -r '$s=@fsockopen(\"127.0.0.1\", 9000); if(!$s){exit(1);} fclose($s);'" - ] + test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9000'"] interval: 10s timeout: 3s retries: 3 @@ -52,14 +52,25 @@ services: - "127.0.0.1:8888:80" volumes: - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - - # Nginx sert directement le répertoire public synchronisé par l'entrypoint. + # Fichiers statiques servis directement par Nginx sans passer par PHP. - ./data/public:/var/www/app/public:ro provision: - <<: *app-common + 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" - - # Réutilise exactement la même image que le runtime HTTP. command: ["php", "bin/provision.php"]