Caddyfile.example : Caddy sur machine séparée (IP Docker + sécurité réseau)

Configuration reverse_proxy vers l'IP de la machine Docker (port 8080 publié par le
compose), en-têtes X-Forwarded-*, sonde /health, et recommandations de sécurité
(restreindre le port 8080 à l'IP de Caddy / réseau privé) pour éviter un accès HTTP
direct contournant le TLS.
This commit is contained in:
2026-09-15 12:36:50 +02:00
parent a11f3c4a10
commit e9178e3c20
+42 -20
View File
@@ -1,29 +1,51 @@
# Exemple de configuration Caddy pour exposer SchotzIAD KM Tracker en HTTPS. # Exemple de configuration Caddy pour exposer SchotzIAD KM Tracker en HTTPS,
# avec Caddy sur une machine SÉPARÉE de la machine Docker.
# #
# Architecture (option la plus simple) : Caddy est placé DEVANT le docker-compose # Topologie :
# existant. Le service `frontend` (nginx) sert l'application Angular et reverse-proxie # Internet ──HTTPS──> [Machine Caddy] ──HTTP──> [Machine Docker] : port 8080
# déjà /api vers le backend en interne. Caddy n'a donc qu'à : # (frontend nginx du compose,
# - terminer le TLS (certificat automatique Let's Encrypt) ; # qui sert l'app et proxifie /api)
# - transmettre tout le trafic au port publié par le compose (8080 par défaut).
# #
# Remplace `schotz.exemple.fr` par ton domaine, et l'adresse cible par l'IP:port # Remplace :
# de la machine/container qui publie le compose (par défaut le frontend nginx sur 8080). # - `schotz.exemple.fr` par ton domaine (doit pointer en DNS vers la machine Caddy) ;
# - `192.168.1.50` par l'IP (LAN/VPN) de la machine Docker qui publie le compose.
schotz.exemple.fr { schotz.exemple.fr {
encode zstd gzip encode zstd gzip
# Le compose publie le frontend nginx sur le port hôte 8080 (voir docker-compose.yml). # La machine Docker publie le frontend nginx sur son port 8080 (voir docker-compose.yml).
# nginx sert l'app et proxifie /api vers backend:8080 en interne : rien d'autre à router ici. # nginx sert l'app Angular et proxifie /api vers le backend en interne.
reverse_proxy 127.0.0.1:8080 reverse_proxy 192.168.1.50:8080 {
# En-têtes transmis au backend pour qu'il connaisse le schéma/hôte d'origine.
header_up X-Forwarded-Proto {scheme}
header_up X-Forwarded-Host {host}
header_up X-Forwarded-For {remote_host}
# Caddy gère automatiquement le certificat TLS pour ce domaine (HTTP-01/TLS-ALPN). # Sonde de santé optionnelle (le compose expose GET /health via nginx -> backend).
# Aucune configuration TLS manuelle nécessaire si le domaine pointe vers cette machine. health_uri /health
health_interval 30s
}
# Caddy gère automatiquement le certificat TLS (Let's Encrypt) pour ce domaine,
# à condition que le DNS de schotz.exemple.fr pointe vers CETTE machine (Caddy)
# et que les ports 80/443 y soient ouverts.
} }
# --- Points importants côté application --- # --- SÉCURITÉ RÉSEAU (important, machines séparées) ---
# 1) Renseigne dans ton fichier .env (non commité) : # Le port 8080 de la machine Docker devient joignable sur le réseau : sans filtrage,
# AUTH_FRONTEND_BASE_URL=https://schotz.exemple.fr # l'application serait accessible en HTTP direct (sans TLS), en contournant Caddy.
# afin que les liens de réinitialisation de mot de passe pointent vers l'URL publique. # Recommandations :
# 2) Définis un JWT_SECRET_KEY aléatoire et long dans .env (obligatoire au démarrage). # 1) Restreindre l'accès au port 8080 de la machine Docker à la seule IP de la machine
# 3) Le backend écoute en HTTP dans le conteneur ; la terminaison TLS est faite par Caddy # Caddy (pare-feu : ufw/iptables/nftables ou security group), ex. (ufw) :
# (l'application ne fait pas de redirection HTTPS interne). # ufw allow from <IP_CADDY> to any port 8080 proto tcp
# ufw deny 8080
# 2) Idéalement, faire communiquer les deux machines via un réseau privé/VPN
# (WireGuard, réseau interne du datacenter) plutôt qu'en clair sur Internet.
# 3) Ne pas publier le backend (8080 du service backend) directement : seul le frontend
# nginx est exposé ; le backend reste sur le réseau interne du compose.
# --- Points côté application (fichier .env sur la machine Docker) ---
# AUTH_FRONTEND_BASE_URL=https://schotz.exemple.fr # liens de réinitialisation
# JWT_SECRET_KEY=<valeur aléatoire longue> # obligatoire au démarrage
# ORS_API_KEY=<ta clé OpenRouteService>
# Le backend écoute en HTTP dans le conteneur ; la terminaison TLS est faite par Caddy.