Caddy : le reverse proxy en pratique
Caddyfile, routage SPA, en-têtes de sécurité.
Objectifs
À la fin de cette leçon, vous saurez :
- installer et configurer Caddy comme porte d'entrée ;
- router /api vers le backend et le reste vers les fichiers statiques ;
- ajouter les en-têtes de sécurité et la compression.
🔗 Pour vous rafraîchir la mémoire : réseaux et volumes Docker · systemd, journalctl et permissions Linux · curl pas à pas
Installation et premier Caddyfile
Sur votre serveur (ou VM de test) :
sudo apt install caddy # ou via le paquet officiel cloudsmith
# /etc/caddy/Caddyfile
monsite.fr {
handle /api/* {
reverse_proxy localhost:3000
}
handle {
root * /srv/app/dist
try_files {path} /index.html
file_server
}
}
sudo systemctl reload caddy
curl -v https://monsite.fr/api/tasks # passe par le proxy !
Au premier démarrage sur un vrai domaine, Caddy obtient seul le certificat Let's Encrypt : HTTPS actif sans configuration supplémentaire. En local (localhost), il émet un certificat interne auto-signé.
Lire ce Caddyfile
| Directive | Rôle |
|---|---|
handle /api/* | tout ce qui commence par /api part au backend |
reverse_proxy | transfère la requête à l'upstream (votre Nest) |
root + file_server | sert les fichiers du build frontend |
try_files ... /index.html | fallback SPA : routes Angular servies par index.html |
Le bloc try_files mérite une pause : votre SPA a des routes client (/tasks/12). Sans lui, un refresh direct sur cette URL donnerait 404 fichier. Avec lui : index.html est servi, Angular démarre et affiche la bonne route.
Les en-têtes qui manquent
monsite.fr {
header {
Strict-Transport-Security "max-age=31536000"
X-Content-Type-Options "nosniff"
X-Frame-Options "DENY"
-Server # masque la version du serveur
}
# ... handles ...
}
Rappel chapitre sécurité : ces en-têtes coûtent une ligne chacun et ferment des classes entières d'attaques. Le proxy est LEUR emplacement naturel : appliqués uniformément à tout ce qui sort.
Vérifier la chaîne complète
curl -I https://monsite.fr # 200 + headers sécurité
curl -I https://monsite.fr/api/courses # proxifié (header Server: différent)
curl http://monsite.fr # redirection 308 → https automatique
Trois tests qui valident routage, en-têtes et redirection TLS — à rejouer après chaque modification du Caddyfile.
Exercice
- Installez Caddy et reproduisez cette config avec votre domaine (ou monsite.local via /etc/hosts).
- Ajoutez les en-têtes de sécurité et vérifiez-les au curl.
- Cassez volontairement le backend : que répond le proxy ? (indice : 502)
- Pourquoi le backend ne doit-il publier AUCUN port public ?
Résumé
- Un Caddyfile = TLS auto + routage + en-têtes + compression.
- try_files /index.html = condition de vie des SPAs.
- 502 du proxy = diagnostic immédiat « upstream mort ».
Correction disponibleCherchez d’abord par vous-même.Voir la correction
Correction
Réponses détaillées
Question 4. Si l'API écoute aussi directement sur Internet, elle contourne : TLS du proxy, rate limiting, en-têtes de sécurité, filtrage de chemins. Deux portes ouvertes = deux surfaces à défendre ; la règle est une seule entrée, tout le reste en réseau privé.