Traefik en Caddy: twee Go-gebaseerde oplossingen voor moderne webinfrastructuur
Traefik is gebouwd rond orchestrators. Het scant voortdurend uw Docker-daemon of Kubernetes API en zet routes op basis van wat het daar aantreft. Start u een container met de juiste labels, dan staat er binnen enkele seconden een route naar die service. Stopt u 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 aparte client, geen cronjob, geen handmatige stap.
De keuze ertussen is een keuze tussen twee werelden. Werkt u met Kubernetes of Docker Swarm en wilt u dat routing meebeweegt met uw services, dan past Traefik. Wilt u een webserver die snel staat en veilig is zonder dat u erover moet nadenken, 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 voortdurend 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: u moet de concepten van Traefik leren. Router, service, middleware — het zijn geen moeilijke begrippen, maar u moet ze wel kennen vóór u 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
U hebt ook een `.env`-bestand nodig met daarin uw Cloudflare API-token (voor DNS-01 challenges) en een basis-auth hash:
echo "CF_DNS_API_TOKEN=uw_token" > .env
echo "TRAEFIK_AUTH=$(htpasswd -nb admin uw_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: uw@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 u elk label `traefik.enable=true` moet zetten. Dat is bewust — Traefik stelt niets bloot zonder dat u 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 uw 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, bouwt u alleen wat u 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: u moet zelf compileren als u 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 kunt u 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 u Authelia als middleware op. Met Caddy gebruikt u 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 uw 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 het dashboard is niet bereikbaar. Controleer of u 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 hebt u een API-token nodig van uw DNS-provider; voor HTTP-01 challenges moet de server rechtstreeks bereikbaar zijn.
Traefik ziet nieuwe containers niet. Controleer of de Docker-socket correct is gemount en of `exposedByDefault` niet op `true` staat terwijl u 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 u 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 u ook kiest: u vervangt handmatige configuratie door automatisering. De vraag is alleen welke automatisering u nodig hebt — die van de orchestrator, of die van de webserver.