corentin_wakdo/docker/apache/httpd.conf
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

99 lines
3.5 KiB
ApacheConf

#
# Wakdo - configuration Apache httpd 2.4 (main)
#
# Derivee de la conf par defaut fournie par httpd:2.4-alpine, adaptee au
# projet : on active les modules necessaires, on pointe les vhosts Wakdo,
# on desactive les defaults indesirables.
#
ServerRoot "/usr/local/apache2"
Listen 80
# === Modules charges ===
# Core :
LoadModule mpm_event_module modules/mod_mpm_event.so
LoadModule authn_file_module modules/mod_authn_file.so
LoadModule authn_core_module modules/mod_authn_core.so
LoadModule authz_host_module modules/mod_authz_host.so
LoadModule authz_groupfile_module modules/mod_authz_groupfile.so
LoadModule authz_user_module modules/mod_authz_user.so
LoadModule authz_core_module modules/mod_authz_core.so
LoadModule access_compat_module modules/mod_access_compat.so
LoadModule auth_basic_module modules/mod_auth_basic.so
LoadModule reqtimeout_module modules/mod_reqtimeout.so
LoadModule filter_module modules/mod_filter.so
LoadModule mime_module modules/mod_mime.so
LoadModule log_config_module modules/mod_log_config.so
LoadModule env_module modules/mod_env.so
LoadModule headers_module modules/mod_headers.so
LoadModule setenvif_module modules/mod_setenvif.so
LoadModule version_module modules/mod_version.so
LoadModule unixd_module modules/mod_unixd.so
LoadModule status_module modules/mod_status.so
LoadModule autoindex_module modules/mod_autoindex.so
LoadModule dir_module modules/mod_dir.so
LoadModule alias_module modules/mod_alias.so
LoadModule rewrite_module modules/mod_rewrite.so
LoadModule deflate_module modules/mod_deflate.so
# Reverse proxy FastCGI vers PHP-FPM (le coeur de notre setup) :
LoadModule proxy_module modules/mod_proxy.so
LoadModule proxy_fcgi_module modules/mod_proxy_fcgi.so
# === Identite du serveur ===
# User/Group : utilisateur par defaut de l'image httpd:2.4-alpine.
# Ne lit pas le code PHP (PHP-FPM s'en charge dans son propre conteneur).
User daemon
Group daemon
# Masquer la version Apache dans les headers et les pages d'erreur.
# Defense en profondeur : en cas de breach, un attaquant doit faire du work
# pour identifier la version exacte.
ServerTokens Prod
ServerSignature Off
# ServerName par defaut evite le warning "Could not reliably determine
# the server's fully qualified domain name". Les vrais hostnames sont
# dans les vhosts.
ServerName wakdo-web
# === Limites et timeouts (defense anti-slowloris) ===
Timeout 30
KeepAlive On
MaxKeepAliveRequests 100
KeepAliveTimeout 5
RequestReadTimeout header=10-20,MinRate=500 body=20,MinRate=500
# === Types MIME ===
TypesConfig conf/mime.types
# === Logs ===
# stderr du conteneur = agregation par docker logs (Cr 7.d.1 observabilite).
ErrorLog /proc/self/fd/2
LogLevel warn
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog /proc/self/fd/1 combined
# === Securite des headers par defaut (les vhosts peuvent surcharger) ===
<IfModule mod_headers.c>
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
Header always set Referrer-Policy "strict-origin-when-cross-origin"
Header unset Server
</IfModule>
# === MPM event (tuning workers) ===
Include conf/extra/wakdo-mpm.conf
# === Configuration root globale (refus par defaut) ===
# Refuse tout acces hors des <Directory> explicitement autorises dans le vhost.
<Directory />
AllowOverride none
Require all denied
</Directory>
# === Vhosts du projet ===
# Kiosk (borne, sert du statique + relaye les API calls) et admin (back-office).
Include conf/extra/wakdo-vhost.conf