Proxy reverso com Traefik para serviços Docker: configuração prática de produção

Quando você roda vários serviços Docker no mesmo host, o gerenciamento de portas fica confuso rapidamente. O Traefik resolve isso atuando como proxy reverso dinâmico: ele descobre containers por labels e aplica rotas automaticamente.

Este guia apresenta uma base pronta para produção com TLS automático, roteamento limpo por domínio e uma estratégia segura para o dashboard.

Visão de arquitetura

Um cenário comum inclui:

  • Um ponto de entrada externo nas portas 80/443
  • Uma rede Docker interna compartilhada entre Traefik e aplicações
  • Labels por serviço para hostnames, middlewares e portas internas
  • Resolver ACME para HTTPS automático

O Traefik monitora eventos do Docker e atualiza rotas sem reload manual, o que reduz o esforço operacional em ambientes que mudam com frequência.

1) Crie a rede compartilhada

docker network create edge

Use essa rede para o Traefik e todos os containers expostos.

2) Implante Traefik com Docker Compose

Exemplo de docker-compose.yml:

services:
  traefik:
    image: traefik:v3.1
    container_name: traefik
    restart: unless-stopped
    command:
      - --providers.docker=true
      - --providers.docker.exposedbydefault=false
      - --entrypoints.web.address=:80
      - --entrypoints.websecure.address=:443
      - --certificatesresolvers.letsencrypt.acme.email=admin@example.com
      - --certificatesresolvers.letsencrypt.acme.storage=/letsencrypt/acme.json
      - --certificatesresolvers.letsencrypt.acme.httpchallenge=true
      - --certificatesresolvers.letsencrypt.acme.httpchallenge.entrypoint=web
      - --api.dashboard=true
    ports:
      - "80:80"
      - "443:443"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./letsencrypt:/letsencrypt
    networks:
      - edge

networks:
  edge:
    external: true

Crie o arquivo ACME com permissões restritas:

mkdir -p letsencrypt
touch letsencrypt/acme.json
chmod 600 letsencrypt/acme.json

3) Roteie uma aplicação com labels

Exemplo de serviço:

services:
  app:
    image: ghcr.io/example/myapp:latest
    restart: unless-stopped
    networks:
      - edge
    labels:
      - traefik.enable=true
      - traefik.http.routers.myapp.rule=Host(`app.example.com`)
      - traefik.http.routers.myapp.entrypoints=websecure
      - traefik.http.routers.myapp.tls.certresolver=letsencrypt
      - traefik.http.services.myapp.loadbalancer.server.port=8080

O DNS de app.example.com deve apontar para o IP público do servidor.

4) Proteja endpoints operacionais

Não exponha o dashboard sem autenticação. Quando necessário, use middleware:

labels:
  - traefik.http.middlewares.admin-auth.basicauth.users=admin:$$apr1$$...
  - traefik.http.routers.traefik.rule=Host(`traefik.example.com`)
  - traefik.http.routers.traefik.service=api@internal
  - traefik.http.routers.traefik.entrypoints=websecure
  - traefik.http.routers.traefik.tls.certresolver=letsencrypt
  - traefik.http.routers.traefik.middlewares=admin-auth

5) Hardening para produção

  • Mantenha exposedByDefault=false
  • Docker socket somente leitura
  • Firewall liberando apenas portas necessárias
  • Rate limit em endpoints públicos
  • Headers de segurança (HSTS, anti-sniff, etc.)

Exemplo de middleware de headers:

- traefik.http.middlewares.secure-headers.headers.stsSeconds=31536000
- traefik.http.middlewares.secure-headers.headers.browserXssFilter=true
- traefik.http.middlewares.secure-headers.headers.contentTypeNosniff=true

Anexe os middlewares aos routers que expõem aplicações sensíveis.

Checklist de validação

docker ps
docker logs traefik --tail=100
curl -I https://app.example.com

Resultado esperado:

  • Certificado válido emitido
  • Resposta HTTP/2 200 (ou status esperado da app)
  • Sem erro de certificado no navegador

Conclusão

Traefik é uma escolha forte para ambientes Docker-first com serviços dinâmicos. Com roteamento por labels e TLS automático, você reduz manutenção manual e melhora previsibilidade operacional.

Os maiores ganhos de confiabilidade vêm de segmentação de rede, proteção real do dashboard e políticas explícitas de middleware por aplicação.