← Journal technique

networking

Caddy, parce qu'un certificat périmé est un problème de solo

Caddy, parce qu'un certificat périmé est un problème de solo

Plusieurs services doivent être joignables via un seul serveur sur 80/443 — l'API, l'application web, le panneau d'admin, la console d'exploitation — mais chacun tourne dans son propre conteneur sur son propre port interne. Un reverse proxy termine la connexion entrante et route chaque requête vers le bon service par domaine ou par chemin.

nginx est le défaut de longue date, extrêmement capable, et sa config est verbeuse avec le HTTPS comme préoccupation manuelle séparée — traditionnellement Certbot plus un cron de renouvellement câblé à la main. La caractéristique déterminante de Caddy est le HTTPS automatique : pointe-le sur un domaine et il obtient et renouvelle un certificat Let's Encrypt tout seul.

api.example.com {
  reverse_proxy backend:2000
}
admin.example.com {
  reverse_proxy admin:5002
}

C'est proche de toute la config pour un routage terminé en HTTPS vers deux services — vraiment plus court que l'équivalent nginx-plus-Certbot.

Pourquoi ça compte pour une personne

Chaque bout d'infrastructure qui a besoin d'attention manuelle périodique — renouveler des certificats, se souvenir d'un cron, déboguer un cron périmé — est un coût continu, pas une installation ponctuelle. Le renouvellement automatique supprime toute une catégorie de « quelque chose expire discrètement et casse la production parce que personne ne surveillait », ce qui compte le plus exactement quand il n'y a pas d'équipe pour l'attraper.

Internet → Cloudflare (CDN/DDoS/DNS) → Caddy (reverse proxy, TLS, routage) → conteneurs Docker

Caddy sait quel conteneur gère quel domaine. Cloudflare se trouve plus à l'extérieur — DNS, mise en cache CDN, protection DDoS — avant que le trafic n'atteigne le serveur.

Caddy gère le routage et la terminaison TLS. Ce n'est pas de la limitation de débit, ce n'est pas un WAF, ce n'est pas une protection DDoS en soi — ceux-là vivent à la couche Cloudflare, ou doivent être ajoutés explicitement. C'est aussi là que j'ai déplacé une vérification de mode maintenance qui vivait dans du JS côté client : un contrôle qui dépend du fait que le client contrôlé réussisse un appel réseau pour apprendre qu'il devrait se bloquer n'est pas un contrôle.