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á.
webpara HTTP ewebsecurepara HTTPS. - providers.docker: Configura o Traefik para ler labels dos containers Docker. Note que
exposedByDefault: falseimpede 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:
- 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.sockpermite que o Traefik veja os outros containers. - Serviço Whoami: É um container leve que retorna informações sobre a requisição HTTP. Ele serve para testar se o roteamento está funcionando.
- 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 formeudominio.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:
- Autenticação no Dashboard: Configure Basic Auth para a API do Traefik.
- Middlewares Avançados: Adicione headers de segurança (HSTS, CSP) e rate limiting.
- Monitoramento: Integre o Prometheus e Grafana para visualizar métricas de tráfego.
- Backup do ACME: Faça backup regular do arquivo
acme.jsonpara 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.