comparativo: Traefik vs Caddy para roteamento HTTPS em ambientes Docker

Por · Publicado em · Atualizado em · 8 min de leitura

Contêineres marítimos coloridos formando arcos contra o céu azul
Composição limpa e simbólica para containers e orquestração Docker Foto: Jan van der Wolf / Pexels

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 stack

Veja também