Docker config update to fit project
This commit is contained in:
@@ -1,42 +1,42 @@
|
|||||||
services:
|
x-app-common: &app-common
|
||||||
app:
|
|
||||||
image: netslim-app:latest
|
image: netslim-app:latest
|
||||||
build:
|
build:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: docker/php/Dockerfile
|
dockerfile: docker/php/Dockerfile
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
volumes:
|
||||||
# Répertoire de travail de l'entrypoint : reçoit public/ compilé,
|
# Répertoire public partagé avec Nginx.
|
||||||
# puis partagé avec Nginx via le mount ci-dessous.
|
# L'entrypoint y synchronise index.php et les assets compilés.
|
||||||
- ./data:/data
|
- ./data/public:/data/public
|
||||||
|
|
||||||
# Base SQLite et migrations : persistés entre redéploiements.
|
# Base SQLite persistée entre redéploiements.
|
||||||
- ./data/database:/var/www/app/database
|
- ./data/database:/var/www/app/database
|
||||||
|
|
||||||
# Cache Twig/HTMLPurifier et logs : persistés entre redémarrages.
|
# Cache applicatif et logs persistés entre redémarrages.
|
||||||
- ./data/var:/var/www/app/var
|
- ./data/var:/var/www/app/var
|
||||||
|
|
||||||
# Uploads : PHP écrit dans public/media/, Nginx le sert en lecture seule.
|
# Uploads utilisateurs.
|
||||||
- ./data/public/media:/var/www/app/public/media
|
- ./data/public/media:/var/www/app/public/media
|
||||||
|
|
||||||
# phpdotenv requiert un fichier physique sur le disque (Dotenv::createImmutable) ;
|
# phpdotenv requiert un fichier physique lisible depuis le conteneur.
|
||||||
# `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
|
- ./.env:/var/www/app/.env:ro
|
||||||
|
env_file:
|
||||||
# Rend les variables accessibles via getenv() / $_SERVER en dehors de phpdotenv
|
- .env
|
||||||
# (scripts CLI, healthchecks…).
|
|
||||||
env_file: .env
|
|
||||||
|
|
||||||
# Vérifie que PHP-FPM écoute sur le port 9000 avant de déclarer le service sain.
|
|
||||||
environment:
|
environment:
|
||||||
TRUSTED_PROXIES: ${TRUSTED_PROXIES:-*}
|
TRUSTED_PROXIES: ${TRUSTED_PROXIES:-*}
|
||||||
|
|
||||||
# bash /dev/tcp est disponible sur l'image Debian php:8.4-fpm sans dépendance
|
services:
|
||||||
# supplémentaire. start_period laisse le temps à entrypoint.sh de terminer
|
app:
|
||||||
# (sync public/, permissions, caches) avant que les échecs ne comptent.
|
<<: *app-common
|
||||||
|
restart: unless-stopped
|
||||||
|
|
||||||
|
# Vérifie que PHP-FPM écoute bien sur le port 9000.
|
||||||
|
# Pas de dépendance à bash : on utilise PHP directement.
|
||||||
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"]
|
||||||
|
|||||||
@@ -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/
|
||||||
|
|
||||||
|
|||||||
@@ -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"]
|
||||||
|
|||||||
Reference in New Issue
Block a user