Aller au contenu

Debug — Caddy Docker : 127.0.0.1 injoignable depuis un container

Symptôme

Tous les sous-domaines tekdhi.dev retournent 502 Bad Gateway. Les logs Caddy montrent :

dial tcp 127.0.0.1:8080: connect: connection refused
Pourtant les services backend tournent correctement sur le host.

Environnement

  • VPS Hetzner, Linux
  • Caddy 2 dans un container Docker (shared_infra)
  • Services cibles liés à 127.0.0.1:PORT sur le host (psycho-frontend, psycho-backend, hermes, ttyd, datasette, wikijs...)

Cause identifiée

Dans un container Docker, 127.0.0.1 pointe vers la loopback du container lui-même, pas celle du host. Même avec extra_hosts: ["host.docker.internal:host-gateway"], host.docker.internal résout vers l'interface réseau du host — mais les services liés à 127.0.0.1 ne sont accessibles que via la loopback, pas l'interface réseau.

Solution

Passer Caddy en network_mode: host dans docker-compose.yml :

caddy:
  image: caddy:2
  container_name: shared-caddy
  restart: unless-stopped
  network_mode: host          # ← clé de la solution
  volumes:
    - ./Caddyfile:/etc/caddy/Caddyfile:ro
    - ...
  # PAS de ports: (inutile en host mode)
  # PAS de networks: (incompatible avec host mode)

Le Caddyfile reste inchangé avec 127.0.0.1:PORT — Caddy "voit" le réseau du host directement.

À retenir

  • Règle : un container Caddy qui proxy vers des services 127.0.0.1 doit être en network_mode: host
  • Incompatibilité : network_mode: host + networks: → erreur Docker, choisir l'un ou l'autre
  • Alternative écartée : extra_hosts: host.docker.internal:host-gateway + remplacer 127.0.0.1 par host.docker.internal — ne fonctionne pas si les services cibles sont liés à 127.0.0.1 (loopback uniquement)

Liens connexes