comparativo: Traefik vs Caddy para roteamento HTTPS em ambientes Docker
Por Kevin Marcondes · Publicado em · Atualizado em · 8 min de leitura
Este comparativo de Traefik vs Caddy para roteamento HTTPS em ambientes Docker foca no que importa para equipes DevOps: discovery automático, HTTPS com Let's Encrypt, middlewares, métricas e operação. Você verá diferenças práticas, exemplos mínimos e critérios claros para decidir qual encaixa melhor no seu stack atual.
Escopo do comparativo e perfis de uso
O foco é roteamento HTTP/HTTPS, terminação TLS e balanceamento para múltiplos containers em um host Docker. Não cobrimos Kubernetes. A análise considera automação, simplicidade operacional e extensibilidade.
Perfis típicos: times que usam Docker Compose, Portainer ou orquestração própria e querem HTTPS automático com o mínimo de retrabalho. Se você ainda está montando o ambiente, veja antes como instalar Docker e Compose.
Pré-requisitos comuns: DNS apontado para o servidor, portas 80/443 abertas e rede Docker compartilhada entre proxy e apps.
- Times com diversos serviços por host e domínios distintos.
- Ambientes CI/CD que recriam containers com frequência.
- Necessidade de métricas e logs confiáveis para troubleshooting.
- Exigência de HTTP/2 e HTTP/3/QUIC para latência menor.
Configuração e discovery no Docker
A principal diferença está no modelo de configuração e na descoberta de serviços a partir do Docker. Traefik tem provider Docker nativo com roteamento por labels. Caddy usa Caddyfile/JSON; para discovery automático via labels é comum empregar um plugin (ex.: caddy-docker-proxy) ou geração de config.
Se você prefere declarar tudo no compose com labels e ter reload imediato ao subir/parar containers, Traefik costuma ser mais direto. Se quer um arquivo único e legível de regras HTTP, Caddyfile agrada bastante.
| Aspecto | Traefik | Caddy |
|---|---|---|
| Discovery Docker | Nativo por labels (provider Docker) | Via Caddyfile/JSON; discovery automático demanda plugin/gerador |
| Estilo de config | Estática + dinâmica (YAML/TOML + labels) | Caddyfile simples ou JSON por API de administração |
| Hot reload | Eventos do Docker e arquivos (sem queda) | Reload por API/CLI; Caddyfile é fácil de revisar |
| Plugins | Ecossistema de middlewares e providers | Ecossistema forte; muitos recursos via módulos |
| Curva de aprendizado | Labels e conceitos de routers/services/middlewares | DSL do Caddyfile é enxuta e legível |
HTTPS automático e gestão de certificados
Ambos automatizam certificados com ACME/Let's Encrypt. O Traefik integra resolvers e armazena o acervo em arquivo/volume. O Caddy também emite e renova automaticamente; o armazenamento é local por padrão e pode ser configurado.
Desafios ACME suportados: HTTP‑01 e TLS‑ALPN‑01 são usuais em ambos. Para DNS‑01, Traefik oferece integrações; no Caddy, o DNS‑01 requer módulo de provedor de DNS. Garanta DNS, portas 80/443 e clock corretos para evitar falhas.
Se você precisa entender a base do Let's Encrypt, veja um guia introdutório antes de montar o proxy.
- TLS por domínio e SAN, com renovação automática.
- Redirect HTTP→HTTPS e HSTS configuráveis.
- SNI para múltiplos hosts no mesmo IP.
- HTTP/2 e HTTP/3/QUIC disponíveis.
Roteamento, middlewares e balanceamento
Traefik oferece roteamento por host, path, headers, métodos e mais, com middlewares prontos (rate limit, compressão, headers, auth forward). Já o Caddy tem matchers e handlers poderosos no Caddyfile; muitos recursos avançados vêm via módulos.
Para balanceamento, ambos suportam múltiplos backends e políticas com pesos. TLS passthrough é nativo no Traefik; no Caddy, recursos L4 e passthrough exigem módulo específico. Transformações mais complexas podem afetar throughput.
- Reescritas, strip prefix e redirects.
- Header security e CSP via middlewares/handlers.
- Autenticação básica e integração com SSO via forward-auth.
- Canário/blue‑green com pesos por serviço.
Observabilidade, logs e troubleshooting
Traefik exporta métricas Prometheus nativamente e possui access logs estruturados. O Caddy expõe logs detalhados e pode exportar métricas via módulo Prometheus. Ambos funcionam bem com stacks de observabilidade em Docker.
Para monitorar latência, taxa de erros e certificados, integre com Prometheus e Grafana. Logs estruturados ajudam a rastrear correlações por request-id. Não deixe métricas sem retenção, isso prejudica RCA.
- Métricas: latência P95/P99, taxa de 5xx, tráfego por host.
- Logs de acesso com campos úteis (host, path, upstream, tempo).
- Health checks ativos para evitar enviar tráfego a backends ruins.
- Tracing distribuído via middlewares/plugins quando aplicável.
Exemplo rápido: Traefik com Docker labels (HTTPS automático)
Exemplo mínimo com Traefik 2.x e um app containerizado. Substitua o domínio e garanta DNS apontado e portas 80/443 abertas. O certResolver usa ACME para Let's Encrypt e persiste em um volume. Útil em Docker Compose.
Se você está começando com Docker/Compose, revise a instalação e boas práticas antes de rodar em produção.
version: "3.8"
services:
traefik:
image: traefik:v2.10
command:
- --providers.docker=true
- --providers.docker.exposedbydefault=false
- --entrypoints.web.address=:80
- --entrypoints.websecure.address=:443
- [email protected]
- --certificatesresolvers.le.acme.storage=/letsencrypt/acme.json
- --certificatesresolvers.le.acme.httpchallenge=true
- --certificatesresolvers.le.acme.httpchallenge.entrypoint=web
- --api.dashboard=true
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- traefik_letsencrypt:/letsencrypt
labels:
- "traefik.enable=true"
app:
image: yourorg/yourapp:latest
labels:
- "traefik.enable=true"
- "traefik.http.routers.app.rule=Host(`app.example.com`)"
- "traefik.http.routers.app.entrypoints=websecure"
- "traefik.http.routers.app.tls.certresolver=le"
- "traefik.http.services.app.loadbalancer.server.port=3000"
volumes:
traefik_letsencrypt: {}
Exemplo rápido: Caddy com Caddyfile + Docker
Caddy emite e renova certificados de forma automática. No exemplo, um Caddyfile simples faz proxy para o container "app" na rede compartilhada. Para discovery automático por labels, use um módulo adequado. Revise o firewall e certifique-se de que o domínio resolve para o host.
version: "3.8"
services:
caddy:
image: caddy:2
ports:
- "80:80"
- "443:443"
volumes:
- ./Caddyfile:/etc/caddy/Caddyfile:ro
- caddy_data:/data
- caddy_config:/config
app:
image: yourorg/yourapp:latest
expose:
- "3000"
volumes:
caddy_data: {}
caddy_config: {}
# Caddyfile (salve ao lado do compose)
# app.example.com {
# reverse_proxy app:3000
# }
Critérios de escolha rápidos e trade-offs
Se o seu fluxo é todo orientado a Docker labels e você quer discovery imediato sem plugins, Traefik tende a encaixar melhor. Se valoriza um arquivo de configuração legível, direto e fácil de versionar, o Caddyfile é um diferencial do Caddy.
Em ambientes com requisitos fortes de métricas Prometheus out‑of‑the‑box e rate limiting embutido, Traefik sai na frente. Para cenários HTTP complexos com regras claras e curtas, Caddy simplifica a leitura e revisão de PRs.
Se considerar outras opções baseadas em configuração tradicional, veja também um comparativo com Nginx para entender o trade‑off com proxies mais clássicos.
- Escolha Traefik quando: labels no Compose são padrão, precisa de provider Docker nativo, métricas Prometheus imediatas, TLS passthrough sem plugins.
- Escolha Caddy quando: quer Caddyfile claro, HTTP/3 maduro, módulos sob demanda, regras HTTP legíveis para revisão.
- Ambos atendem produção; a operação e o tooling do seu time devem guiar a decisão.
Perguntas frequentes
Traefik ou Caddy é mais simples para Docker Compose?
Para quem prefere declarar roteamento por labels no próprio docker-compose, Traefik costuma ser mais direto. Se você quer centralizar regras em um arquivo humano‑legível, o Caddyfile simplifica muito a revisão e versionamento.
Ambos cuidam do Let's Encrypt automaticamente?
Sim. Traefik e Caddy automatizam emissão e renovação via ACME. Use HTTP‑01 ou TLS‑ALPN‑01. Para DNS‑01, Traefik oferece integrações; no Caddy é necessário adicionar o módulo do provedor de DNS. Garanta DNS e portas 80/443 abertas.
Eles suportam HTTP/3 (QUIC)?
Sim. Traefik e Caddy já suportam HTTP/3/QUIC. Verifique compatibilidade do cliente, sistema e rede. Em casos de proxies intermediários, o HTTP/3 pode cair para HTTP/2, o que ainda traz bons ganhos de latência.
Consigo recarregar a configuração sem derrubar conexões?
Sim. Ambos suportam recarga dinâmica da configuração. O Traefik reage a eventos do Docker e arquivos. O Caddy aplica mudanças via API/CLI ou recarregando o Caddyfile, mantendo conexões ativas sempre que possível.
Como expor métricas para Prometheus?
O Traefik exporta métricas Prometheus nativamente. No Caddy, use o módulo de métricas Prometheus. Em ambos, colete com Prometheus e visualize painéis no Grafana para acompanhar latência, erros e tráfego por host.
Posso usar TLS passthrough?
No Traefik, TLS passthrough é suportado nativamente. No Caddy, esse recurso exige módulo específico de camada 4. Use passthrough apenas quando precisar rotear TLS sem terminação, pois limita inspeção e recursos de HTTP.
Precisa decidir entre Traefik e Caddy para seu Docker?
Descreva seu cenário, domínios e requisitos de observabilidade. Podemos avaliar rapidamente o encaixe, riscos e um caminho de migração seguro.
Converse sobre sua stackVeja também
- Ceph vs NFS vs GlusterFS para storage compartilhado em VPS com containers
- Comparativo: Prometheus+Grafana vs Loki+Tempo para observabilidade de aplicações PHP
- Comparativo: Amazon SQS vs RabbitMQ gerenciado para integrações entre ERP e marketplaces
- Comparativo: estratégias de deploy zero‑downtime em Kubernetes — RollingUpdate vs Blue/Green vs Canary