corentin_wakdo/docker/php-fpm/php.ini
Imugiii ac8b6a6791 feat(docker): complete stack with compose and 4 services
Deliver the full Docker stack for Bloc 5 DevOps (Cr 7.c.3 and 7.c.4):

- docker/apache/    Custom httpd:2.4-alpine with hardened main config,
                    MPM event tuning and 3 vhosts (healthz, kiosk static,
                    admin reverse FCGI to wakdo-app:9000). Kiosk vhost
                    explicitly denies .php to enforce Bloc 1 isolation.
- docker/php-fpm/   Custom php:8.3-fpm-alpine3.20 with pdo_mysql, opcache,
                    intl, exif, zip and tini for signal handling.
                    Dynamic pool 3-10 workers listening on TCP 9000.
- docker/cron/      Custom alpine:3.20 with dcron, mariadb-client, gzip.
                    Nightly mysqldump at 03h00 with 14-day rotation and
                    512-byte sanity check. Purge and stats jobs templated.
- docker-compose.yml  4 services orchestrated on 2 networks (internal
                      bridge + external reverse-proxy). 2 named volumes
                      for DB and uploads, bind-mount for backups.
                      Traefik labels for 2 routers with HTTPS redirect.

Makefile adds `make backup` (manual dump) and `make backup-ls`.
.gitignore adds /var/ for backup bind-mount path.
docs/journal/2026-04-24--infra-docker.md documents 5 decisions with
alternatives, maps 16 RNCP criteria to artefacts and prepares 6 jury Q&A.

Validated: `docker compose config --quiet` passes. Smoke test deferred
to next session (requires server .env).
2026-04-24 15:59:19 +00:00

67 lines
2.2 KiB
INI

; Wakdo - configuration PHP runtime (surcharge le php.ini par defaut)
; Charge en dernier via le prefixe zz- pour avoir le dernier mot.
[PHP]
; --- Erreurs ---
; En dev : on affiche les erreurs a l'ecran. En prod : surcharge via override
; docker-compose.prod.yml qui remplace ce fichier (display_errors=0, log_errors=1).
display_errors = On
display_startup_errors = On
error_reporting = E_ALL
log_errors = On
error_log = /proc/self/fd/2
; --- Memoire et temps ---
memory_limit = 256M
max_execution_time = 30
max_input_time = 60
; --- Upload images produits (voir .env UPLOAD_MAX_SIZE_MB=5) ---
; post_max_size >= upload_max_filesize + overhead des autres champs du form.
file_uploads = On
upload_max_filesize = 5M
post_max_size = 8M
max_file_uploads = 5
; --- Timezone ---
; Cr technique : eviter les warnings et les decalages date silencieux.
date.timezone = Europe/Paris
; --- Sessions ---
; Le nom du cookie et la lifetime sont surcharges par l'appli au runtime via
; session_set_cookie_params() a partir des variables SESSION_* du .env.
; Ce qui est fixe ici = les defaults securises.
session.use_strict_mode = 1
session.use_cookies = 1
session.use_only_cookies = 1
session.cookie_httponly = 1
session.cookie_samesite = "Strict"
session.cookie_secure = 1
; session.save_path est laisse par defaut (/tmp dans le conteneur).
; Persistance inter-container non necessaire : chaque session est liee a une
; instance unique du service wakdo-app (pas de scale horizontal pour ce projet).
; --- Expose_php = Off : ne pas leak la version PHP dans l'entete HTTP ---
expose_php = Off
; --- OPcache (perf + stabilite) ---
[opcache]
opcache.enable = 1
opcache.enable_cli = 0
opcache.memory_consumption = 128
opcache.interned_strings_buffer = 16
opcache.max_accelerated_files = 10000
opcache.validate_timestamps = 1
; En dev : revalidate toutes les 2s pour prendre en compte les modifs du bind-mount.
; En prod : validate_timestamps=0 via override (invalidation manuelle au deploy).
opcache.revalidate_freq = 2
opcache.fast_shutdown = 1
; --- PDO / MySQL ---
[PDO]
; Pas de persistent connections pour un projet a faible volume : plus simple
; a debugger et moins de risques de fuite de sessions BDD.
[MySQLi]
mysqli.default_host = wakdo-db
mysqli.default_port = 3306