Traefik Reverse Proxy: Guia Completo com Docker e SSL

9 min de leitura Docker e Containers
Traefik Reverse Proxy: Guia Completo com Docker e SSL

Gerenciar o tráfego de entrada em uma infraestrutura de containers pode ser complexo. Sem um gerenciador adequado, cada aplicação Docker precisa expor suas portas diretamente para a internet, criando conflitos de porta e dificultando a gestão de certificados SSL. O Traefik surge como a solução moderna para esse problema, atuando como um Edge Router inteligente que redireciona o tráfego para os serviços corretos com base em regras definidas dinamicamente.

Neste tutorial técnico, vamos configurar o Traefik como um reverse proxy em uma VPS Linux utilizando Docker e Docker Compose. Abordaremos desde a instalação até a configuração de SSL automático via Let's Encrypt, garantindo que sua aplicação seja acessível de forma segura e escalável.

Pré-requisitos e Arquitetura do Projeto

Antes de começar, certifique-se de ter os seguintes itens prontos:

  • Uma VPS com sistema operacional Linux (Ubuntu 22.04 ou Debian 11 recomendados).
  • Docker e Docker Compose instalados na máquina.
  • Um domínio registrado apontando para o IP da sua VPS via registro A.
  • Conhecimento básico de comandos Linux e edição de arquivos de configuração.

A arquitetura proposta é simples: o Traefik rodará em um container dedicado. Ele ouvirá as portas 80 (HTTP) e 443 (HTTPS). Quando uma requisição chegar, o Traefik verificará o nome do host (domínio) e encaminhará o tráfego para o serviço Docker correto, que neste exemplo será um servidor web simples (Nginx).

Passo 1: Preparação do Ambiente

Crie uma estrutura de diretórios organizada para manter a configuração limpa. Isso facilita a manutenção e o backup no futuro.

mkdir -p ~/traefik-demo/{config,data,logs}
cd ~/traefik-demo

Dentro da pasta config, criaremos os arquivos de configuração do Traefik. No Traefik v2 e v3, a configuração principal é feita em TOML ou YAML. Utilizaremos YAML para maior legibilidade.

Crie o arquivo traefik.yml:

nano config/traefik.yml

Insira o seguinte conteúdo, definindo os pontos de entrada (entrypoints) e o log:

api:
  dashboard: true

entryPoints:
  web:
    address: ":80"
  websecure:
    address: ":443"

providers:
  docker:
    endpoint: "unix:///var/run/docker.sock"
    exposedByDefault: false
    network: web

certificatesResolvers:
  letsencrypt:
    acme:
      email: seu-email@exemplo.com
      storage: /data/acme.json
      httpChallenge:
        entryPoint: web

Explicação dos campos importantes:

  • api.dashboard: Habilita a interface web de monitoramento do Traefik.
  • entryPoints: Define as portas que o Traefik ouvirá. web para HTTP e websecure para HTTPS.
  • providers.docker: Configura o Traefik para ler labels dos containers Docker. Note que exposedByDefault: false impede que qualquer container vaze sem configuração explícita, aumentando a segurança.
  • certificatesResolvers: Define como os certificados SSL serão obtidos. Usaremos o protocolo ACME com o Let's Encrypt.

Defina permissões restritas para o arquivo de armazenamento de certificados, pois ele conterá suas chaves privadas:

touch data/acme.json
chmod 600 data/acme.json

Passo 2: Criando o Docker Compose

Agora, vamos definir os serviços no arquivo docker-compose.yml. Este arquivo orquestrará o Traefik e um container de teste.

nano docker-compose.yml

Insira a seguinte configuração:

version: "3.8"

services:
  traefik:
    image: traefik:v2.10
    container_name: traefik
    restart: unless-stopped
    security_opt:
      - no-new-privileges:true
    ports:
      - "80:80"
      - "443:443"
      - "8080:8080"
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock:ro
      - ./config/traefik.yml:/traefik.yml:ro
      - ./data:/data
      - ./logs:/logs
    networks:
      - web

  whoami:
    image: containous/whoami
    container_name: simple-service
    restart: unless-stopped
    labels:
      - "traefik.enable=true"
      - "traefik.http.routers.whoami.rule=Host(`meudominio.com`)"
      - "traefik.http.routers.whoami.entrypoints=websecure"
      - "traefik.http.routers.whoami.tls.certresolver=letsencrypt"
    networks:
      - web

networks:
  web:
    external: true

Análise da configuração:

  1. Serviço Traefik: Mapeamos as portas 80, 443 e 8080. A porta 8080 é necessária apenas para acesso local à dashboard de administração (não exponha esta porta publicamente em produção). O volume /var/run/docker.sock permite que o Traefik veja os outros containers.
  2. Serviço Whoami: É um container leve que retorna informações sobre a requisição HTTP. Ele serve para testar se o roteamento está funcionando.
  3. Labels do Docker: Esta é a parte mágica. Em vez de arquivos de configuração complexos, injetamos metadados diretamente no container:
  • traefik.enable=true: Ativa o roteamento para este container.
  • traefik.http.routers.whoami.rule=Host(...): Define que esse roteador só deve responder se o domínio for meudominio.com.
  • traefik.http.routers.whoami.entrypoints=websecure: Indica que este serviço deve usar a porta 443 (HTTPS).
  • traefik.http.routers.whoami.tls.certresolver=letsencrypt: Solicita ao Traefik buscar um certificado SSL usando o resolver definido anteriormente.

Observe que definimos networks: web em ambos os serviços e declaramos a rede como externa. Isso garante que eles estejam no mesmo bridge network, permitindo comunicação interna via nome de serviço Docker.

Passo 3: Iniciando a Infraestrutura

Crie a rede externa primeiro para evitar erros:

docker network create web

Agora, inicie os containers:

docker compose up -d

Verifique se os containers estão rodando corretamente:

docker ps

Você deve ver o traefik e o simple-service (ou whoami) como "Up". Verifique os logs do Traefik para garantir que não há erros de configuração:

docker logs traefik

Passo 4: Testando a Conexão e o SSL

Abra um navegador e acesse http://meudominio.com. O Traefik deve redirecionar automaticamente para HTTPS (isso requer uma regra adicional de redirect, que adicionaremos no próximo passo). Inicialmente, você pode receber um aviso de certificado não confiável se o Let's Encrypt ainda não tiver emitido o certificado ou se estiver em modo staging.

Para forçar o redirecionamento HTTP para HTTPS e garantir a segurança, atualize o arquivo config/traefik.yml adicionando uma regra global de redirect:

http:
  routers:
    redirect-to-https:
      rule: "HostRegexp(`{host:.+}`)"
      entrypoints:
        - web
      service: noop
  services:
    noop:
      loadBalancer:
        servers:
          - url: ""

No docker-compose.yml, adicione o label para forçar o redirect no serviço whoami ou globalmente. Uma abordagem mais limpa é adicionar um middleware:

# Adicionar ao traefik.yml na seção http
middlewares:
  https-redirect:
    redirectScheme:
      scheme: https
      permanent: true

# Aplicar aos entrypoints ou routers específicos

Para simplificar neste exemplo básico, assuma que o acesso via https://meudominio.com está funcionando. Se você vir a página do Whoami com as informações do container, parabéns! Seu reverse proxy está operante.

Passo 5: Troubleshooting Comum

Erros de configuração são frequentes no início. Aqui estão os problemas mais comuns e como resolvê-los:

1. Erro 404 Not Found

Se você acessa o domínio mas recebe 404, verifique:

  • O registro DNS está apontando corretamente para a VPS?
  • A regra Host(...) no label do container corresponde exatamente ao domínio digitado?
  • O container do serviço está na mesma rede Docker que o Traefik?

2. Erro de Certificado SSL (502 Bad Gateway)

Se o Traefik tenta obter o certificado mas falha:

  • Verifique se a porta 80 está aberta no firewall da VPS (ufw ou iptables). O Let's Encrypt precisa acessar /.well-known/acme-challenge.
  • Certifique-se de que não há outros serviços ocupando as portas 80 e 443 na VPS.
  • Verifique o arquivo data/acme.json. Se ele estiver vazio ou com permissões erradas, o Traefik não salvará os certificados.

3. Dashboard do Traefik Inacessível

A dashboard roda na porta 8080 por padrão. Para acessá-la de forma segura, você deve protegê-la com autenticação básica ou restrigir o acesso via IP.

# Exemplo de label para proteger a API do Traefik no container whoami (ou criando um serviço api)
# Note: A melhor prática é expor a API apenas localmente ou usar SSH tunnel

No docker-compose.yml, remova a exposição da porta 8080 para a internet pública se não for estritamente necessário, ou adicione autenticação:

# No traefik.yml
api:
  dashboard: true
  insecure: false # Desativa o acesso sem auth em produção

Passo 6: Manutenção com Watchtower

Para manter seus containers atualizados automaticamente, integre o Watchtower. Ele verifica novas imagens no Docker Hub e reinicia os containers se houver atualização.

nano docker-compose.yml

Adicione o serviço watchtower:

  watchtower:
    image: containrrr/watchtower
    container_name: watchtower
    restart: unless-stopped
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock

Inicie o Watchtower:

docker compose up -d

O Watchtower irá monitorar as imagens traefik:v2.10 e containous/whoami. Quando novas versões forem lançadas, ele atualizará os containers automaticamente, mantendo sua infraestrutura segura e atualizada.

Conclusão e Próximos Passos

Você configurou com sucesso um ambiente de produção básico utilizando Traefik como reverse proxy. Esta configuração oferece:

  • Segurança: SSL automático via Let's Encrypt.
  • Simplicidade: Gerenciamento de rotas via labels Docker, sem necessidade de editar arquivos e reiniciar o proxy a cada nova aplicação.
  • Escalabilidade: Fácil adição de novos serviços apenas criando containers com as labels corretas.

Para produção, considere implementar:

  1. Autenticação no Dashboard: Configure Basic Auth para a API do Traefik.
  2. Middlewares Avançados: Adicione headers de segurança (HSTS, CSP) e rate limiting.
  3. Monitoramento: Integre o Prometheus e Grafana para visualizar métricas de tráfego.
  4. Backup do ACME: Faça backup regular do arquivo acme.json para não perder seus certificados.

O Traefik é uma ferramenta poderosa que simplifica a orquestração de microsserviços. Com esta base sólida, você está pronto para expandir sua infraestrutura Docker em VPS com confiança e profissionalismo.

Compartilhar: Link copiado!
Esse tutorial foi útil?

Comentários (0)

Seja o primeiro a comentar.

Deixe seu comentário

Seu comentário será analisado antes de ser publicado.

0/2000