Traefik no Docker Compose: HTTPS automático, passo a passo
|

Traefik no Docker Compose: HTTPS automático, passo a passo

O Traefik 3.7 resolve um problema que todo mundo que roda Docker em produção já enfrentou: cada serviço novo exige editar a configuração do proxy reverso na mão e rodar o Certbot de novo para o certificado. O Traefik descobre os containers sozinho pela API do Docker, lê as regras direto dos labels do docker-compose.yml e emite e renova o certificado Let’s Encrypt automaticamente, sem tocar em arquivo nenhum depois da configuração inicial.

Por que trocar o Nginx manual pelo Traefik

Com Nginx + Certbot, subir um serviço novo é: escrever um server block, testar a sintaxe, recarregar o Nginx e rodar o Certbot para aquele domínio. Esquecer um passo derruba o site ou deixa o certificado vencer. O Traefik inverte a lógica: ele fica ouvindo o socket do Docker, e quando um container sobe com os labels certos, a rota e o certificado aparecem sozinhos — sem reload, sem Certbot separado. A desvantagem é a curva de aprendizado dos labels no início; ela se paga já no segundo ou terceiro serviço publicado.

Pré-requisitos

Docker Engine e Docker Compose plugin instalados no servidor, um domínio com registro A apontando para o IP público do servidor, e as portas 80 e 443 liberadas no firewall. Sem isso, o desafio HTTP do Let’s Encrypt não completa.

Passo 1: rede Docker e arquivo de certificados

Crie uma rede dedicada para o proxy e o arquivo onde o Traefik vai guardar os certificados emitidos. A permissão 600 é exigida pelo próprio Traefik — com permissão mais aberta, ele se recusa a gravar no arquivo por segurança.

mkdir -p ~/traefik && cd ~/traefik
docker network create proxy
touch acme.json
chmod 600 acme.json

Passo 2: docker-compose.yml do Traefik

O bloco command é a configuração estática: define os pontos de entrada (portas 80 e 443), ativa o provedor Docker e diz para o Traefik não expor nenhum container por padrão — só quem tiver o label traefik.enable=true aparece. Essa linha sozinha evita o erro mais comum: publicar sem querer um container interno (banco de dados, cache) na internet.

services:
  traefik:
    image: "traefik:v3.7"
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    networks:
      - proxy
    ports:
      - "80:80"
      - "443:443"
    command:
      - "--providers.docker=true"
      - "--providers.docker.exposedbydefault=false"
      - "--providers.docker.network=proxy"
      - "--entrypoints.web.address=:80"
      - "--entrypoints.websecure.address=:443"
      - "--entrypoints.web.http.redirections.entrypoint.to=websecure"
      - "--entrypoints.web.http.redirections.entrypoint.scheme=https"
      - "--certificatesresolvers.leresolver.acme.email=seu-email@dominio.com.br"
      - "--certificatesresolvers.leresolver.acme.storage=/acme.json"
      - "--certificatesresolvers.leresolver.acme.httpchallenge.entrypoint=web"
    volumes:
      - "/var/run/docker.sock:/var/run/docker.sock:ro"
      - "./acme.json:/acme.json"

networks:
  proxy:
    name: proxy

As duas linhas de redirections forçam todo acesso via HTTP (porta 80) a virar HTTPS automaticamente — sem elas, o site fica acessível sem criptografia em paralelo. Suba com docker compose up -d e confira o log com docker compose logs -f traefik.

Passo 3: publicando um serviço com HTTPS automático

Qualquer serviço que entre na rede proxy e receba os labels abaixo ganha certificado sozinho. Troque app.seudominio.com.br pelo domínio real — é ele que precisa estar apontado para o servidor.

services:
  minha-app:
    image: "traefik/whoami"
    restart: unless-stopped
    networks:
      - proxy
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.minha-app.rule=Host(`app.seudominio.com.br`)"
      - "traefik.http.routers.minha-app.entrypoints=websecure"
      - "traefik.http.routers.minha-app.tls.certresolver=leresolver"

networks:
  proxy:
    external: true

No primeiro docker compose up -d desse serviço, acompanhe o log do Traefik: a emissão do certificado leva alguns segundos. Se o domínio não resolver para o IP do servidor, o desafio HTTP falha e o Traefik tenta de novo sozinho a cada renovação — vale conferir o DNS antes de abrir chamado.

Passo 4: protegendo o painel do Traefik

O dashboard nunca deve ficar exposto sem senha — é a porta de entrada para toda a configuração do proxy. Gere um hash bcrypt e use como basic auth num router dedicado ao painel:

sudo apt install -y apache2-utils
htpasswd -nbB admin 'TrocaEssaSenha123' | sed -e 's/\$/\$\$/g'

Cole a saída no label abaixo, no serviço traefik, junto com as regras de rota do próprio painel:

      - "--api.dashboard=true"
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.dashboard.rule=Host(`traefik.seudominio.com.br`)"
      - "traefik.http.routers.dashboard.entrypoints=websecure"
      - "traefik.http.routers.dashboard.tls.certresolver=leresolver"
      - "traefik.http.routers.dashboard.service=api@internal"
      - "traefik.http.routers.dashboard.middlewares=dash-auth"
      - "traefik.http.middlewares.dash-auth.basicauth.users=admin:$$2y$$05$$(hash-gerado-acima)"

Perguntas frequentes

Traefik substitui completamente o Nginx?
Para proxy reverso na frente de containers Docker, sim. Se o servidor também serve arquivos estáticos fora de container ou faz processamento pesado de mídia, manter o Nginx para essa parte é comum — os dois convivem sem conflito, cada um numa porta ou função diferente.

O certificado Let’s Encrypt renova sozinho?
Sim. O Traefik verifica a validade e renova automaticamente antes do vencimento, sem cron nem intervenção manual — é o próprio processo do container que cuida disso enquanto ele estiver rodando.

Por que meu serviço não aparece mesmo com os labels certos?
Confira três coisas: se o container está na mesma rede Docker do Traefik (proxy), se o label traefik.enable=true está presente, e se o domínio no Host() resolve para o IP do servidor.

Dá para usar Traefik sem domínio próprio, só com IP?
Dá, mas sem certificado Let’s Encrypt válido — a emissão exige um domínio real que o desafio HTTP ou DNS consiga verificar. Com IP puro, o acesso fica em HTTP ou com certificado autoassinado.

Traefik funciona com Kubernetes também?
Sim, via Ingress Controller ou o CRD próprio do Traefik (IngressRoute) — a mesma lógica de descoberta automática se aplica, trocando os labels do Docker pelas anotações do Kubernetes.

Conclusão

Depois da configuração inicial, publicar um serviço novo com HTTPS vira questão de quatro linhas de label no docker-compose.yml — sem editar proxy, sem rodar Certbot, sem lembrar de renovar nada. Para quem já mantém vários serviços em Docker no mesmo servidor, essa automação sozinha justifica a migração.

Gostou? Compartilhe.

Posts Similares

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *