J’ai monté un CouchDB sur Coolify (Docker Compose Empty) pour ma sync Obsidian LiveSync. Archi : Apache devant termine le TLS (cert Let’s Encrypt via Terraform DNS-01 OVH), ProxyPass vers le Traefik de Coolify qui route par Host vers le container. Pattern Supabase déjà éprouvé.
Sauf que https://bro.example.com/ renvoie 502 Bad Gateway alors que le container est healthy.
Symptôme
- Container CouchDB
healthy, écoute sur0.0.0.0:5984. - Apache configtest OK, cert LE valide, ProxyPass
https://127.0.0.1:8443/. - Traefik : rule
Host(\bro.example.com`)` bien posée. - Depuis le container Traefik :
wget couchdb-<uuid>:5984/→ Welcome banner OK. Connectivité interne OK.
Mais de l’extérieur (ou via Apache) : 502.
Cause
La magic var SERVICE_FQDN_<SERVICE>_<PORT>=https://bro.example.com génère automatiquement :
...couchdb.rule=Host(`bro.example.com`) && PathPrefix(`/`)
...couchdb.tls=true
...couchdb.tls.certresolver=letsencrypt
Coolify dit à Traefik d’obtenir son propre cert LE via HTTP-01 sur bro.example.com. Mais c’est Apache qui répond sur le port 80 — le challenge ACME atterrit dans le vide :
ERR Unable to obtain ACME certificate ... 403 ::
Invalid response from http://bro.example.com/.well-known/acme-challenge/...: 404
Tant que Traefik n’a pas son cert, il refuse de servir la route HTTPS → 502 propagé à Apache puis au client.
Solution
Pour ce pattern (Apache TLS-front + container Coolify derrière), pas de Traefik dans le chemin. Apache tape directement le container via un port loopback :
- Compose :
ports: ["127.0.0.1:5984:5984"]. Coolify v4 respecte lesports:(cf LKD #42). - Supprimer l’env var
SERVICE_FQDN_<SERVICE>_<PORT>→ plus de labels Traefik → plus d’ACME parasite. - Vhost Apache :
ProxyPass / http://127.0.0.1:5984/(HTTP local), sansSSLProxyEngine. Redeploy.
services:
couchdb:
image: couchdb:3.4
ports:
- "127.0.0.1:5984:5984" # loopback host uniquement
# ... rien sur SERVICE_FQDN_...
Le préfixe 127.0.0.1: est crucial : sans lui, le port part sur 0.0.0.0 donc Internet.
Lessons learned
SERVICE_FQDNgénère un certresolver Traefik qui tente HTTP-01 dans le vide quand Apache occupe le port 80 → 502 silencieux.- Pattern Supabase ≠ universel : il marche car
*.dev.example.coma un wildcard ; un domaine perso non-wildcard casse tout. - Diag rapide :
docker exec coolify-proxy wget couchdb-<uuid>:5984/isole Traefik↔container ;docker logs coolify-proxy | grep <domaine>montre l’erreur ACME. - Apache devant → Coolify-Traefik n’est pas la vérité TLS : soit « pas de TLS », soit bypass via
ports:.