From 2e4b7ef34e35307b206e19649124062b878de046 Mon Sep 17 00:00:00 2001 From: julien Date: Fri, 20 Mar 2026 23:24:44 +0100 Subject: [PATCH] Docker config update to fit project --- docker-compose.yml | 89 +++++++++++++++------------------ docker/php/Dockerfile | 2 +- docker/php/entrypoint.sh | 103 ++++++++++++++++++++++++++------------- 3 files changed, 110 insertions(+), 84 deletions(-) diff --git a/docker-compose.yml b/docker-compose.yml index 666569f..31d7101 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: - image: netslim-app:latest - build: - context: . - dockerfile: docker/php/Dockerfile + <<: *app-common 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 - # 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. + # Vérifie que PHP-FPM écoute bien sur le port 9000. + # Pas de dépendance à bash : on utilise PHP directement. healthcheck: - test: ["CMD-SHELL", "bash -c 'echo > /dev/tcp/localhost/9000'"] + test: + [ + "CMD-SHELL", + "php -r '$s=@fsockopen(\"127.0.0.1\", 9000); if(!$s){exit(1);} fclose($s);'" + ] interval: 10s timeout: 3s retries: 3 @@ -52,25 +52,14 @@ services: - "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. + + # Nginx sert directement le répertoire public synchronisé par l'entrypoint. - ./data/public:/var/www/app/public:ro provision: - image: netslim-app:latest + <<: *app-common 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"] diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 1d1f446..5e3c802 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -31,7 +31,7 @@ WORKDIR /var/www/app COPY composer.json composer.lock ./ RUN composer install --no-dev --optimize-autoloader --no-interaction -# Code source + assets compilés depuis le stage 1 +# Code source + assets compilés depuis le stage assets COPY . . COPY --from=assets /build/public/assets/ public/assets/ diff --git a/docker/php/entrypoint.sh b/docker/php/entrypoint.sh index 37bbe7f..10a33d3 100644 --- a/docker/php/entrypoint.sh +++ b/docker/php/entrypoint.sh @@ -1,39 +1,76 @@ -#!/bin/sh -set -eu +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 -# 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 +# Base SQLite et migrations : persistés entre redéploiements. +- ./data/database:/var/www/app/database -# 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 {} + +# Cache Twig/HTMLPurifier et logs : persistés entre redémarrages. +- ./data/var:/var/www/app/var -for item in /var/www/app/public/*; do - [ -e "$item" ] || continue - name=$(basename "$item") - [ "$name" = "media" ] && continue - cp -a "$item" /data/public/ -done +# Uploads : PHP écrit dans public/media/, Nginx le sert en lecture seule. +- ./data/public/media:/var/www/app/public/media -# 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 +# 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 -# 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/* +# Rend les variables accessibles via getenv() / $_SERVER en dehors de phpdotenv +# (scripts CLI, healthchecks…). +env_file: .env -# Passe la main au processus principal (php-fpm). -exec "$@" +# 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"]