Docker config update to fit project

This commit is contained in:
julien
2026-03-20 23:24:44 +01:00
parent 59f9eab93d
commit 2e4b7ef34e
3 changed files with 110 additions and 84 deletions

View File

@@ -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: services:
app: app:
image: netslim-app:latest <<: *app-common
build:
context: .
dockerfile: docker/php/Dockerfile
restart: unless-stopped 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. # Vérifie que PHP-FPM écoute bien sur le port 9000.
- ./data/database:/var/www/app/database # Pas de dépendance à bash : on utilise PHP directement.
# 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: 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 interval: 10s
timeout: 3s timeout: 3s
retries: 3 retries: 3
@@ -52,25 +52,14 @@ services:
- "127.0.0.1:8888:80" - "127.0.0.1:8888:80"
volumes: volumes:
- ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf:ro - ./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 - ./data/public:/var/www/app/public:ro
provision: provision:
image: netslim-app:latest <<: *app-common
profiles: ["manual"] 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" restart: "no"
# Réutilise exactement la même image que le runtime HTTP.
command: ["php", "bin/provision.php"] command: ["php", "bin/provision.php"]

View File

@@ -31,7 +31,7 @@ WORKDIR /var/www/app
COPY composer.json composer.lock ./ COPY composer.json composer.lock ./
RUN composer install --no-dev --optimize-autoloader --no-interaction 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 . .
COPY --from=assets /build/public/assets/ public/assets/ COPY --from=assets /build/public/assets/ public/assets/

View File

@@ -1,39 +1,76 @@
#!/bin/sh services:
set -eu 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. # Base SQLite et migrations : persistés entre redéploiements.
mkdir -p \ - ./data/database:/var/www/app/database
/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.) # Cache Twig/HTMLPurifier et logs : persistés entre redémarrages.
# vers le volume partagé. Le répertoire media est exclu car il contient les - ./data/var:/var/www/app/var
# uploads utilisateurs et est géré séparément.
find /data/public -mindepth 1 -maxdepth 1 -exec rm -rf {} +
for item in /var/www/app/public/*; do # Uploads : PHP écrit dans public/media/, Nginx le sert en lecture seule.
[ -e "$item" ] || continue - ./data/public/media:/var/www/app/public/media
name=$(basename "$item")
[ "$name" = "media" ] && continue
cp -a "$item" /data/public/
done
# Permissions sur les répertoires persistants. Doit s'exécuter en root avant # phpdotenv requiert un fichier physique sur le disque (Dotenv::createImmutable) ;
# le démarrage de PHP-FPM. # `env_file` seul ne suffit pas car il injecte uniquement dans l'environnement
chown -R www-data:www-data /data /var/www/app/database /var/www/app/var /var/www/app/public/media # 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. # Rend les variables accessibles via getenv() / $_SERVER en dehors de phpdotenv
# - Twig : les templates compilés peuvent être obsolètes après modification d'une vue # (scripts CLI, healthchecks…).
# ou d'une extension Twig. env_file: .env
# - 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 au processus principal (php-fpm). # Vérifie que PHP-FPM écoute sur le port 9000 avant de déclarer le service sain.
exec "$@" 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"]