Files
netslim-blog/docker-compose.yml
2026-03-22 12:51:14 +01:00

77 lines
2.7 KiB
YAML

services:
app:
image: netslim-app:latest
build:
context: .
dockerfile: docker/php/Dockerfile
restart: unless-stopped
volumes:
# Répertoire public partagé : reçoit les assets versionnés copiés par
# l'entrypoint, puis sert de racine statique à Nginx.
- ./data/public:/data/public
# 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 préparer
# les répertoires runtime et de synchroniser les assets publics.
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/public:/data/public
- ./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"]