ADR-007 — Déploiement Docusaurus (nginx:alpine) sur Coolify
Date : 2026-04-28 · Statut : Accepté
Contexte
Docusaurus est servi via nginx:alpine dans un Docker Compose multi-services géré par Coolify v4. Lors du premier déploiement en production, deux problèmes bloquants ont empêché le service docs d'être accessible, malgré un nginx qui démarrait correctement :
- Le container docs était systématiquement marqué unhealthy par Docker
- Traefik retournait "no available server" même quand nginx répondait
Options considérées
Problème 1 — Health check qui échoue
- Option A :
HEALTHCHECK CMD wget -q --spider http://localhost/(existant) - Option B :
HEALTHCHECK CMD wget -q --spider http://127.0.0.1/ - Option C : Ajouter
listen [::]:80;dans nginx.conf pour écouter aussi en IPv6
Problème 2 — Traefik "no available server"
- Option A : Laisser Coolify gérer automatiquement le réseau (existant)
- Option B : Connecter explicitement le service docs au réseau Docker externe
coolify - Option C : Ajouter des labels Traefik manuels dans le compose
Décision
Problème 1 → Option B (127.0.0.1 dans le HEALTHCHECK)
Sur Alpine Linux, localhost résout en ::1 (IPv6) via /etc/hosts. nginx:alpine n'écoute que sur IPv4 (0.0.0.0:80) par défaut, car notre nginx.conf custom remplace le fichier par défaut avant que le script 10-listen-on-ipv6-by-default.sh ne puisse y ajouter [::]:80. Résultat : wget http://localhost/ échoue toujours → container unhealthy → Traefik refuse de router. Utiliser 127.0.0.1 force l'IPv4 et résout le problème sans modifier nginx.conf.
Problème 2 → Option B (réseau coolify explicite)
Traefik (coolify-proxy) est configuré avec --providers.docker.network=coolify. Sans connexion explicite au réseau coolify, Traefik détecte les labels du container mais ne trouve pas de backend valide sur ce réseau. L'app Next.js fonctionnait car elle partage une autre route réseau, mais le service docs en était exclu. La solution propre est de déclarer le réseau coolify comme externe dans le compose et d'y connecter le service docs.
Conséquences
Positives :
- Le container docs est healthy dès le premier health check
- Traefik route correctement vers nginx
- La solution est déclarative dans le compose, pérenne entre les redéploiements
Risques acceptés :
- Dépendance au nom du réseau Docker
coolify(propre à Coolify v4) — si Coolify change le nom de réseau, le compose doit être mis à jour
Pattern à généraliser : Ces deux fixes s'appliquent à tout service non-Node.js dans un compose Coolify :
- Toujours utiliser
127.0.0.1(jamaislocalhost) dans les HEALTHCHECK sur Alpine - Toujours connecter les services au réseau
coolifyexterne pour activer le routing Traefik
Révision
Cette décision sera remise en question si Coolify change son réseau proxy par défaut, ou si nginx:alpine ajoute le support IPv6 par défaut dans ses versions futures.