Traefik en Caddy: twee Go-gebaseerde oplossingen voor moderne webinfrastructuur
Traefik is gebouwd rond orchestrators. Het scant continu je Docker-daemon of Kubernetes API en zet routes op basis van wat het daar vindt. Start je een container met de juiste labels, dan staat er binnen seconden een route naar die service. Stop je hem, dan verdwijnt de route weer. Geen herstart van de proxy, geen handmatige configuratie.
Caddy begint bij de webserver. Zijn kernfunctie is automatic HTTPS: configureer een domein, en Caddy vraagt zelf een TLS-certificaat aan via ACME, meestal van Let's Encrypt. Het verlengt dat certificaat ook zelf. Geen losse client, geen cronjob, geen handmatige stap.
De keuze ertussen is een keuze tussen twee werelden. Werk je met Kubernetes of Docker Swarm en wil je dat routing meebeweegt met je services, dan past Traefik. Wil je een webserver die snel staat en veilig is zonder dat je erover nadenkt, dan past Caddy.
Traefik: edge router voor dynamische omgevingen
Traefik verscheen in 2016. De maker, Emile Vauge, zag dat traditionele reverse proxies niet meebewogen met containers die komen en gaan. Traefik lost dat op met providers: bronnen zoals Docker, Kubernetes, Marathon of Nomad die Traefik continu uitleest.De configuratie is opgesplitst in twee delen. De statische configuratie — via een TOML- of YAML-bestand of command-line flags — bepaalt de basis: poorten, logniveau, welke providers actief zijn. De dynamische configuratie genereert Traefik zelf uit de metadata van actieve services. In Docker zijn dat labels, in Kubernetes annotations.
Wat dit kost: je moet de concepten van Traefik leren. Router, service, middleware — het zijn geen moeilijke begrippen, maar je moet ze wel kennen voordat je een route werkend hebt. De documentatie is uitgebreid, maar niet altijd kort.
Een minimale `docker-compose.yml` voor Traefik v3 ziet er zo uit:
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: trueDeze opzet gebruikt een extern Docker network genaamd `proxy`. Maak dat eerst aan:
docker network create proxy
Je hebt ook een `.env`-bestand nodig met daarin je Cloudflare API-token (voor DNS-01 challenges) en een basis-auth hash:
echo "CF_DNS_API_TOKEN=je_token" > .env
echo "TRAEFIK_AUTH=$(htpasswd -nb admin je_wachtwoord | sed -e s/\\$/\\$\\$/g)" >> .envDe statische configuratie in `/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: je@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.ymlLet op: `exposedByDefault: false` betekent dat je elk label `traefik.enable=true` moet zetten. Dat is bewust — Traefik stelt niets bloot zonder dat je erom vraagt. De prijs is een label extra per container.
In 2023 bracht Traefik Labs Traefik Hub uit, een Kubernetes-native API-managementdienst die voortbouwt op Traefik. Het voegt API-gateway-functionaliteit, beveiliging en monitoring toe. Voor wie alleen een reverse proxy nodig heeft, is dat overkill. Voor wie een API-platform zoekt, is het een optie om te onderzoeken.
Caddy: automatische HTTPS als uitgangspunt
Caddy verscheen in 2015. De focus lag vanaf het begin op eenvoud en veiligheid. De grootste troef is automatic HTTPS: configureer een domein, en Caddy regelt de rest.De configuratie gebeurt in de Caddyfile, een formaat dat dichter bij een natuurlijke taal ligt dan YAML of JSON. Een minimale setup:
example.com {
reverse_proxy localhost:8080
}Dat is alles. Caddy vraagt het certificaat aan, verlengt het, en stuurt verkeer door naar je backend. HTTP/2 en HTTP/3 werken out of the box.
Caddy v2, uitgebracht in 2020, bracht een volledig herschreven architectuur met een module-systeem. In plaats van alles in de binary te compileren, bouw je alleen wat je nodig hebt. Het hulpmiddel daarvoor is xcaddy:
xcaddy build v2.8.4 --with github.com/caddy-dns/cloudflare
Dit bouwt een Caddy-binary met Cloudflare DNS-ondersteuning. De prijs van die flexibiliteit: je moet zelf compileren als je modules nodig hebt die niet in de standaardbinary zitten. De standaardbinary heeft geen DNS-provider voor DNS-01 challenges ingebouwd.
Caddy ondersteunt ook basicauth en JWT-validatie ingebouwd. Voor geavanceerdere authenticatie kun je modules toevoegen.
Integratie met Authelia
Beide tools werken goed samen met Authelia, een open-source authenticatie- en autorisatieserver die single sign-on en two-factor authentication biedt. Authelia fungeert als toegangscontrole voor applicaties; Traefik of Caddy sturen verkeer alleen door na verificatie.Met Traefik zet je Authelia als middleware op. Met Caddy gebruik je een module of forward_auth. De opzet verschilt per tool, maar het principe is hetzelfde: de proxy vraagt eerst aan Authelia of de gebruiker geautoriseerd is.
Verificatie
Controleer of je installatie werkt:<h2>Traefik: check de API</h2>
curl -s http://localhost:8080/api/rawdata | jq '.routers'
<h2>Caddy: check of het certificaat geldig is</h2>
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Veelgestelde problemen
Traefik start maar de dashboard is niet bereikbaar. Controleer of je het label `traefik.http.routers.traefik.service=api@internal` hebt gezet. Zonder dat label weet Traefik niet dat het zijn eigen API moet exposeren.Caddy kan geen certificaat aanvragen. Controleer of poort 80 en 443 bereikbaar zijn vanaf het internet. Voor DNS-01 challenges heb je een API-token nodig van je DNS-provider; voor HTTP-01 challenges moet de server direct bereikbaar zijn.
Traefik ziet nieuwe containers niet. Controleer of de Docker-socket correct is gemount en of `exposedByDefault` niet op `true` staat terwijl je labels vergeet. De container moet expliciet `traefik.enable=true` hebben.
De keuze
Traefik en Caddy zijn beide Go, beide open source, beide gericht op automatisering. Het verschil zit in het uitgangspunt.Traefik is gebouwd voor orchestrators. Het integreert met Kubernetes en Docker, ontdekt services automatisch, en past zich aan aan een omgeving die continu verandert. Dat maakt het de standaardkeuze voor grootschalige containerinfrastructuur.
Caddy is een webserver die toevallig ook een goede reverse proxy is. Het is de keuze voor wie snel een veilige website of API wil draaien zonder TLS-beheer. Voor kleinere en middelgrote projecten is het vaak de eenvoudigste optie.
De versies die je vandaag tegenkomt zijn Traefik v3.6 en Caddy v2.9. Beide projecten brengen regelmatig updates uit met nieuwe features en beveiligingsfixes. De communities zijn actief, de documentatie is goed.
Wat je ook kiest: je vervangt handmatige configuratie door automatisering. De vraag is alleen welke automatisering je nodig hebt — die van de orchestrator, of die van de webserver.