Files
fzarifian b968ec8aa5 feat: implémentation initiale du reverse proxy de maintenance
Reverse proxy Nginx (image stable-alpine) qui sert l'app upstream ou une
page de maintenance 503 selon l'IP du client.

- Modes whitelist/blacklist commutables via MAINTENANCE_MODE
- Liste IPv4 via MAINTENANCE_IP_LIST (séparée par virgules, validée au boot)
- Logique en directives Nginx natives (geo + map), zéro Lua/njs
- Page statique sobre HTML+CSS inline, zéro JS, zéro réseau sortant
- Log dédié /var/log/nginx/maintenance.log pour les requêtes bloquées
- Validation des env vars dans /docker-entrypoint.d/10-init.sh
- Stack Docker + docker-compose pour dev local et tests
- 6 cas de tests d'intégration (whitelist/blacklist x autorisée/bloquée + log + nginx -t)
- Lint shellcheck propre sur tous les scripts shell
2026-05-05 13:52:13 +02:00

32 lines
1.4 KiB
Docker

FROM nginx:stable-alpine
# Limite envsubst aux seules variables explicitement utilisées dans le template,
# pour préserver les variables Nginx natives ($remote_addr, $host, ...).
ENV NGINX_ENVSUBST_FILTER='^(LISTEN_PORT|SERVER_NAME|UPSTREAM_HOST|MAINTENANCE_MODE)$'
# Le snippet de log est statique et copié une fois pour toutes.
COPY nginx/snippets/maintenance-log.conf /etc/nginx/snippets/maintenance-log.conf
# Le template est traité par /docker-entrypoint.d/20-envsubst-on-templates.sh
# fourni par l'image officielle, après notre hook 10-init.sh.
COPY nginx/templates/default.conf.template /etc/nginx/templates/default.conf.template
# Page de maintenance statique.
COPY public/maintenance.html /usr/share/nginx/html/maintenance.html
# Scripts utilitaires + hook d'initialisation.
COPY scripts/build-ip-list.sh /usr/local/bin/build-ip-list.sh
COPY scripts/entrypoint.sh /docker-entrypoint.d/10-init.sh
RUN chmod +x /usr/local/bin/build-ip-list.sh /docker-entrypoint.d/10-init.sh
# Crée le fichier maintenance.log à l'avance (sinon Nginx ne logge pas tant
# que le fichier n'existe pas) et délègue les logs standards à stdout/stderr.
RUN ln -sf /dev/stdout /var/log/nginx/access.log \
&& ln -sf /dev/stderr /var/log/nginx/error.log \
&& touch /var/log/nginx/maintenance.log
EXPOSE 8080
HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \
CMD wget -qO- "http://127.0.0.1:${LISTEN_PORT:-8080}/" >/dev/null 2>&1 || exit 1