Traefik et Caddy : deux solutions basées sur Go pour une infrastructure web moderne
Traefik est construit autour des orchestrateurs. Il scanne en continu votre daemon Docker ou l'API Kubernetes et établit des routes en fonction de ce qu'il y trouve. Vous démarrez un conteneur avec les bons labels, et en quelques secondes une route vers ce service est en place. Vous l'arrêtez, et la route disparaît. Pas de redémarrage du proxy, pas de configuration manuelle.
Caddy commence par le serveur web. Sa fonction centrale est le HTTPS automatique : configurez un domaine, et Caddy demande lui-même un certificat TLS via ACME, généralement auprès de Let's Encrypt. Il renouvelle aussi ce certificat lui-même. Pas de client séparé, pas de cronjob, pas d'étape manuelle.
Le choix entre les deux est un choix entre deux mondes. Si vous travaillez avec Kubernetes ou Docker Swarm et que vous voulez que le routage suive vos services, Traefik convient. Si vous voulez un serveur web qui se met en place rapidement et qui est sécurisé sans que vous ayez à y penser, Caddy convient.
Traefik : routeur de périphérie pour environnements dynamiques
Traefik est apparu en 2016. Son créateur, Emile Vauge, a constaté que les reverse proxies traditionnels ne suivaient pas le mouvement des conteneurs qui vont et viennent. Traefik résout cela avec des providers : des sources telles que Docker, Kubernetes, Marathon ou Nomad que Traefik lit en continu.La configuration est divisée en deux parties. La configuration statique — via un fichier TOML ou YAML ou des flags de ligne de commande — détermine les bases : ports, niveau de journalisation, quels providers sont actifs. La configuration dynamique, Traefik la génère lui-même à partir des métadonnées des services actifs. Dans Docker, ce sont les labels ; dans Kubernetes, les annotations.
Ce que cela coûte : il faut apprendre les concepts de Traefik. Router, service, middleware — ce ne sont pas des notions difficiles, mais il faut les connaître avant d'avoir une route fonctionnelle. La documentation est complète, mais pas toujours concise.
Un `docker-compose.yml` minimal pour Traefik v3 ressemble à ceci :
version: '3.8'</p><p>services:
traefik:
image: traefik:v3.1
container_name: traefik
restart: unless-stopped
security_opt:
- no-new-privileges:true
networks:
- proxy
ports:
- 80:80
- 443:443
environment:
- CF_DNS_API_TOKEN=${CF_DNS_API_TOKEN}
volumes:
- /etc/traefik:/etc/traefik
- /var/run/docker.sock:/var/run/docker.sock:ro
labels:
- "traefik.enable=true"
- "traefik.http.routers.traefik.entrypoints=http"
- "traefik.http.routers.traefik.rule=Host(`traefik.example.com`)"
- "traefik.http.middlewares.traefik-auth.basicauth.users=${TRAEFIK_AUTH}"
- "traefik.http.middlewares.traefik-https-redirect.redirectscheme.scheme=https"
- "traefik.http.middlewares.sslheader.headers.customrequestheaders.X-Forwarded-Proto=https"
- "traefik.http.routers.traefik.middlewares=traefik-https-redirect"
- "traefik.http.routers.traefik-secure.entrypoints=https"
- "traefik.http.routers.traefik-secure.rule=Host(`traefik.example.com`)"
- "traefik.http.routers.traefik-secure.middlewares=traefik-auth"
- "traefik.http.routers.traefik-secure.tls=true"
- "traefik.http.routers.traefik-secure.tls.certresolver=letsencrypt"
- "traefik.http.routers.traefik-secure.service=api@internal"</p><p>networks:
proxy:
external: trueCette configuration utilise un réseau Docker externe nommé `proxy`. Créez-le d'abord :
docker network create proxy
Vous avez aussi besoin d'un fichier `.env` contenant votre jeton API Cloudflare (pour les défis DNS-01) et un hash d'authentification de base :
echo "CF_DNS_API_TOKEN=votre_jeton" > .env
echo "TRAEFIK_AUTH=$(htpasswd -nb admin votre_mot_de_passe | sed -e s/\\$/\\$\\$/g)" >> .envLa configuration statique dans `/etc/traefik/traefik.yml` :
global:
sendAnonymousUsage: false</p><p>api:
dashboard: true
debug: true</p><p>log:
level: INFO</p><p>entryPoints:
http:
address: ":80"
http:
redirections:
entryPoint:
to: https
scheme: https
permanent: true
https:
address: ":443"</p><p>certificatesResolvers:
letsencrypt:
acme:
email: votre@email.com
storage: /etc/traefik/acme.json
dnsChallenge:
provider: cloudflare
resolvers:
- "1.1.1.1:53"
- "1.0.0.1:53"</p><p>providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
file:
filename: /etc/traefik/config.ymlNotez que `exposedByDefault: false` signifie que vous devez définir le label `traefik.enable=true` sur chaque conteneur. C'est voulu — Traefik n'expose rien sans que vous le demandiez. Le prix, c'est un label supplémentaire par conteneur.
En 2023, Traefik Labs a publié Traefik Hub, un service de gestion d'API natif Kubernetes qui s'appuie sur Traefik. Il ajoute des fonctionnalités de passerelle API, de sécurité et de surveillance. Pour qui n'a besoin que d'un reverse proxy, c'est excessif. Pour qui cherche une plateforme API, c'est une option à examiner.
Caddy : le HTTPS automatique comme point de départ
Caddy est apparu en 2015. L’accent a été mis dès le départ sur la simplicité et la sécurité. Son principal atout est le HTTPS automatique : configurez un domaine, et Caddy s’occupe du reste.La configuration se fait dans le fichier Caddyfile, un format plus proche du langage naturel que YAML ou JSON. Une configuration minimale :
example.com {
reverse_proxy localhost:8080
}C’est tout. Caddy demande le certificat, le renouvelle et transmet le trafic vers votre backend. HTTP/2 et HTTP/3 fonctionnent directement, sans configuration supplémentaire.
Caddy v2, sorti en 2020, a apporté une architecture entièrement réécrite avec un système de modules. Au lieu de tout compiler dans le binaire, vous ne construisez que ce dont vous avez besoin. L’outil pour cela est xcaddy :
xcaddy build v2.8.4 --with github.com/caddy-dns/cloudflare
Cela construit un binaire Caddy avec le support DNS Cloudflare. Le prix de cette flexibilité : vous devez compiler vous-même si vous avez besoin de modules qui ne sont pas dans le binaire standard. Le binaire standard n’intègre aucun fournisseur DNS pour les défis DNS-01.
Caddy prend également en charge basicauth et la validation JWT de manière intégrée. Pour une authentification plus avancée, vous pouvez ajouter des modules.
Intégration avec Authelia
Les deux outils fonctionnent bien avec Authelia, un serveur open source d’authentification et d’autorisation qui offre l’authentification unique (SSO) et l’authentification à deux facteurs. Authelia sert de contrôle d’accès pour les applications ; Traefik ou Caddy ne transmettent le trafic qu’après vérification.Avec Traefik, vous configurez Authelia comme middleware. Avec Caddy, vous utilisez un module ou forward_auth. La configuration diffère selon l’outil, mais le principe est le même : le proxy demande d’abord à Authelia si l’utilisateur est autorisé.
Vérification
Vérifiez que votre installation fonctionne :<h2>Traefik : vérifiez l’API</h2>
curl -s http://localhost:8080/api/rawdata | jq '.routers'
<h2>Caddy : vérifiez que le certificat est valide</h2>
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Problèmes fréquents
Traefik démarre mais le tableau de bord est inaccessible. Vérifiez que vous avez défini le label `traefik.http.routers.traefik.service=api@internal`. Sans ce label, Traefik ne sait pas qu’il doit exposer sa propre API.Caddy ne peut pas demander de certificat. Vérifiez que les ports 80 et 443 sont accessibles depuis Internet. Pour les défis DNS-01, vous avez besoin d’un jeton API de votre fournisseur DNS ; pour les défis HTTP-01, le serveur doit être directement accessible.
Traefik ne voit pas les nouveaux conteneurs. Vérifiez que le socket Docker est correctement monté et que `exposedByDefault` n’est pas défini sur `true` si vous oubliez les labels. Le conteneur doit avoir explicitement `traefik.enable=true`.
Le choix
Traefik et Caddy sont tous deux en Go, tous deux open source, tous deux axés sur l’automatisation. La différence réside dans le point de départ.Traefik est conçu pour les orchestrateurs. Il s’intègre à Kubernetes et Docker, découvre les services automatiquement et s’adapte à un environnement en constante évolution. Cela en fait le choix standard pour les infrastructures de conteneurs à grande échelle.
Caddy est un serveur web qui se trouve être aussi un bon reverse proxy. C’est le choix pour qui veut rapidement faire tourner un site web ou une API sécurisée sans gestion TLS. Pour les projets de petite et moyenne envergure, c’est souvent l’option la plus simple.
Les versions que vous rencontrez aujourd’hui sont Traefik v3.6 et Caddy v2.9. Les deux projets publient régulièrement des mises à jour avec de nouvelles fonctionnalités et des correctifs de sécurité. Les communautés sont actives, la documentation est bonne.
Quel que soit votre choix : vous remplacez la configuration manuelle par l’automatisation. La seule question est de savoir quelle automatisation vous avez besoin — celle de l’orchestrateur, ou celle du serveur web.