17 min de leitura · Guia técnico
Traefik como proxy reverso para Docker é uma solução de roteamento dinâmico que detecta automaticamente novos containers via labels, gerencia certificados SSL com Let's Encrypt e elimina a necessidade de recarregar configurações manualmente. Para configurar o Traefik como proxy reverso no Docker, siga estes passos:
- Instale o Docker e o Docker Compose no servidor
- Crie a rede Docker externa compartilhada entre os serviços
- Crie o arquivo
traefik.ymlcom entrypoints, providers e resolvers SSL - Suba o container do Traefik via
docker-compose.ymlcom o socket do Docker montado - Adicione labels de roteamento nos containers das aplicações
- Valide o roteamento e os certificados pelo dashboard do Traefik
Pré-requisitos para configurar o Traefik como proxy reverso
- Servidor VPS ou dedicado com Linux (Debian 12, Ubuntu 22.04 ou Ubuntu 24.04 LTS recomendados)
- Docker Engine instalado (versão 24 ou superior) — veja o artigo Como Instalar e Configurar o Docker no VPS Linux para Hospedar Aplicações
- Docker Compose v2 instalado (
docker compose versiondeve retornar v2.x) - Acesso root ou usuário com permissão
sudoe no grupodocker - Domínio(s) com registro DNS tipo A apontando para o IP do servidor
- Portas 80 e 443 liberadas no firewall (UFW, nftables ou CSF)
- Endereço de e-mail válido para registro no Let's Encrypt
Entendendo a arquitetura do Traefik com Docker
O Traefik atua como edge router: ele escuta nas portas 80 e 443 do host e encaminha requisições HTTP/HTTPS para os containers corretos com base em regras de roteamento definidas por labels. Diferente do Nginx configurado manualmente, o Traefik usa o socket do Docker para observar eventos em tempo real — quando um container sobe ou desce, o Traefik atualiza suas rotas automaticamente, sem restart.
A arquitetura básica envolve três conceitos centrais:
- Entrypoints: pontos de entrada de tráfego (porta 80 para HTTP, porta 443 para HTTPS)
- Routers: regras que associam um domínio ou path a um serviço (definidos por labels no container)
- Services: o backend real — o container e a porta interna que receberá o tráfego
Além disso, o Traefik possui middlewares que permitem redirecionar HTTP para HTTPS, adicionar headers de segurança, limitar taxa de requisições e muito mais, tudo via labels no docker-compose.yml.
Para ambientes com múltiplos sites em containers, essa abordagem é mais eficiente do que manter arquivos de configuração do Nginx para cada virtual host. Se você ainda usa Nginx como proxy reverso estático, o artigo Como Configurar um Servidor Proxy Reverso com Nginx no VPS Linux oferece uma boa base comparativa.
Passo 1 — Criar a rede Docker e a estrutura de diretórios
O Traefik precisa de uma rede Docker externa para se comunicar com os containers das aplicações. Crie essa rede antes de qualquer coisa:
docker network create traefik-public
Em seguida, crie o diretório de trabalho do Traefik e o arquivo que armazenará os certificados SSL:
mkdir -p /opt/traefik
touch /opt/traefik/acme.json
chmod 600 /opt/traefik/acme.json
Atenção: o arquivo acme.json deve ter permissão 600 obrigatoriamente. O Traefik recusa iniciar se as permissões estiverem incorretas, pois esse arquivo armazena chaves privadas dos certificados TLS.
Output esperado ao verificar as permissões:
ls -la /opt/traefik/acme.json
-rw------- 1 root root 0 Jan 15 10:00 /opt/traefik/acme.json
Passo 2 — Criar o arquivo de configuração estática traefik.yml
A configuração estática do Traefik define os entrypoints, o provider Docker e o resolver de certificados. Crie o arquivo /opt/traefik/traefik.yml com o seguinte conteúdo:
api:
dashboard: true
insecure: false
entryPoints:
web:
address: ":80"
http:
redirections:
entryPoint:
to: websecure
scheme: https
permanent: true
websecure:
address: ":443"
providers:
docker:
endpoint: "unix:///var/run/docker.sock"
exposedByDefault: false
network: traefik-public
certificatesResolvers:
letsencrypt:
acme:
email: [email protected]
storage: /acme.json
httpChallenge:
entryPoint: web
log:
level: INFO
Pontos importantes desta configuração:
exposedByDefault: false— o Traefik só roteia containers que tiverem a labeltraefik.enable=true, evitando exposição acidental- O redirecionamento automático de HTTP para HTTPS está configurado no entrypoint
web - Substitua
[email protected]pelo seu e-mail real para receber alertas de renovação do Let's Encrypt - O
httpChallengeusa a porta 80 para validação do domínio — certifique-se de que a porta 80 está acessível publicamente
Passo 3 — Criar o docker-compose.yml do Traefik
Com a configuração estática pronta, crie o arquivo /opt/traefik/docker-compose.yml para subir o container do Traefik:
version: "3.8"
services:
traefik:
image: traefik:v3.0
container_name: traefik
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- /var/run/docker.sock:/var/run/docker.sock:ro
- ./traefik.yml:/traefik.yml:ro
- ./acme.json:/acme.json
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.dashboard.rule=Host(`traefik.seudominio.com`)"
- "traefik.http.routers.dashboard.entrypoints=websecure"
- "traefik.http.routers.dashboard.tls.certresolver=letsencrypt"
- "traefik.http.routers.dashboard.service=api@internal"
- "traefik.http.routers.dashboard.middlewares=auth"
- "traefik.http.middlewares.auth.basicauth.users=admin:$$apr1$$xyz$$hashedpassword"
networks:
traefik-public:
external: true
Atenção: o socket do Docker é montado como somente leitura (:ro) por segurança. O acesso ao socket concede controle total sobre o Docker — nunca exponha o dashboard sem autenticação. Para gerar o hash da senha do basicauth, use:
echo $(htpasswd -nB admin) | sed -e s/\\$/\\$\\$/g
Substitua o valor em basicauth.users pelo output gerado. Suba o Traefik:
cd /opt/traefik
docker compose up -d
Output esperado:
[+] Running 2/2
✔ Network traefik-public Created
✔ Container traefik Started
Verifique se o container está rodando:
docker compose ps
NAME IMAGE COMMAND SERVICE STATUS PORTS
traefik traefik:v3.0 "/entrypoint.sh trae…" traefik running 0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp
Passo 4 — Adicionar uma aplicação com labels de roteamento
Com o Traefik em execução, qualquer container pode ser roteado adicionando labels no seu docker-compose.yml. Veja um exemplo com uma aplicação Node.js rodando na porta 3000:
version: "3.8"
services:
minha-app:
image: minha-imagem:latest
container_name: minha-app
restart: unless-stopped
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.minha-app.rule=Host(`app.seudominio.com`)"
- "traefik.http.routers.minha-app.entrypoints=websecure"
- "traefik.http.routers.minha-app.tls.certresolver=letsencrypt"
- "traefik.http.services.minha-app.loadbalancer.server.port=3000"
networks:
traefik-public:
external: true
Explicação das labels essenciais:
traefik.enable=true— habilita o roteamento para este containertraefik.http.routers.minha-app.rule=Host(...)— define o domínio que aciona esta rotatraefik.http.routers.minha-app.tls.certresolver=letsencrypt— solicita certificado SSL automaticamentetraefik.http.services.minha-app.loadbalancer.server.port=3000— porta interna do container onde a aplicação escuta
Suba a aplicação:
docker compose up -d
Em segundos, o Traefik detecta o novo container, solicita o certificado ao Let's Encrypt e começa a rotear https://app.seudominio.com para a aplicação. Não é necessário reiniciar o Traefik.
Passo 5 — Configurar múltiplos domínios no mesmo VPS
O roteamento por múltiplos domínios com Traefik é um dos principais casos de uso em VPS com vários projetos. Cada serviço recebe suas próprias labels, e o Traefik gerencia os certificados de forma independente. Exemplo com dois serviços distintos:
version: "3.8"
services:
blog:
image: wordpress:6.5
container_name: blog
restart: unless-stopped
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.blog.rule=Host(`blog.seudominio.com`)"
- "traefik.http.routers.blog.entrypoints=websecure"
- "traefik.http.routers.blog.tls.certresolver=letsencrypt"
- "traefik.http.services.blog.loadbalancer.server.port=80"
api:
image: minha-api:latest
container_name: api
restart: unless-stopped
networks:
- traefik-public
labels:
- "traefik.enable=true"
- "traefik.http.routers.api.rule=Host(`api.seudominio.com`)"
- "traefik.http.routers.api.entrypoints=websecure"
- "traefik.http.routers.api.tls.certresolver=letsencrypt"
- "traefik.http.services.api.loadbalancer.server.port=8080"
networks:
traefik-public:
external: true
Cada router tem um nome único (blog, api) e regras independentes. O Traefik emite um certificado SSL separado para cada domínio via Let's Encrypt. Você pode adicionar quantos serviços precisar sem alterar a configuração do Traefik em si.
Passo 6 — Verificar logs e validar o funcionamento
Após subir os serviços, verifique os logs do Traefik para confirmar que os certificados foram emitidos e as rotas estão ativas:
docker logs traefik --tail 50
Procure por linhas como:
time="2025-01-15T10:05:00Z" level=info msg="Configuration loaded from file" file=/traefik.yml
time="2025-01-15T10:05:02Z" level=info msg="Obtaining ACME certificate" domain=app.seudominio.com
time="2025-01-15T10:05:08Z" level=info msg="Certificate obtained successfully" domain=app.seudominio.com
Para verificar o roteamento ativo via API do Traefik:
curl -s http://localhost:8080/api/http/routers | python3 -m json.tool
Teste o redirecionamento HTTP para HTTPS:
curl -I http://app.seudominio.com
HTTP/1.1 301 Moved Permanently
Location: https://app.seudominio.com/
E valide o certificado SSL:
curl -I https://app.seudominio.com
HTTP/2 200
server: traefik
Problemas comuns e como resolver
Sintoma: container não aparece nas rotas do Traefik
Causa: o container não está na rede traefik-public ou a label traefik.enable=true está ausente. Com exposedByDefault: false no traefik.yml, apenas containers com essa label são roteados.
Solução: verifique se o container está conectado à rede correta com docker inspect nome-container | grep -A 10 Networks. Confirme que a label traefik.enable=true está presente no docker-compose.yml e que o nome da rede no compose bate com a rede externa criada.
Sintoma: certificado SSL não é emitido — erro "acme: error 403"
Causa: o domínio não está apontando para o IP do servidor, ou a porta 80 está bloqueada no firewall. O Let's Encrypt precisa acessar o servidor via HTTP na porta 80 para validar o domínio pelo httpChallenge.
Solução: confirme o DNS com dig +short app.seudominio.com — deve retornar o IP do servidor. Verifique se a porta 80 está aberta: ufw status ou nft list ruleset. Se o servidor estiver atrás de um NAT ou load balancer, considere usar o tlsChallenge ou dnsChallenge no lugar do httpChallenge.
Sintoma: Traefik não inicia — erro "acme.json: unsafe permissions"
Causa: o arquivo acme.json tem permissões diferentes de 600. O Traefik recusa iniciar para proteger as chaves privadas dos certificados.
Solução: execute chmod 600 /opt/traefik/acme.json e reinicie o container com docker compose restart traefik. Verifique com ls -la /opt/traefik/acme.json que a permissão está correta antes de subir novamente.
Sintoma: rota retorna 404 mesmo com labels corretas
Causa: conflito de nomes de routers ou serviços entre containers. Dois containers com o mesmo nome de router causam comportamento indefinido.
Solução: certifique-se de que cada container usa um nome único nas labels (ex: traefik.http.routers.blog, traefik.http.routers.api). Verifique os routers ativos via dashboard do Traefik em https://traefik.seudominio.com ou via API em http://localhost:8080/api/http/routers.
Sintoma: loop de redirecionamento (ERR_TOO_MANY_REDIRECTS)
Causa: o container da aplicação também está tentando redirecionar HTTP para HTTPS internamente, criando um loop com o redirecionamento já configurado no Traefik.
Solução: desative o redirecionamento HTTPS dentro da aplicação (ex: no WordPress, remova o force_ssl ou ajuste o wp-config.php). O Traefik já cuida do redirecionamento na camada de proxy — a aplicação deve receber apenas tráfego HTTP internamente.
Perguntas frequentes sobre Traefik como proxy reverso para Docker
O Traefik substitui o Nginx como proxy reverso para Docker?
O Traefik foi projetado especificamente para ambientes de containers e detecta automaticamente novos serviços via labels do Docker, sem necessidade de recarregar configuração. O Nginx pode ser usado como proxy reverso para Docker, mas exige configuração manual a cada novo container. Para ambientes com múltiplos serviços em containers, o Traefik é mais prático; para sites estáticos ou aplicações sem containers, o Nginx continua sendo uma escolha sólida.
O Traefik emite certificado SSL automaticamente?
Sim. O Traefik possui integração nativa com o Let's Encrypt via protocolo ACME. Ao configurar um resolver de certificados no arquivo traefik.yml e adicionar a label traefik.http.routers.meu-app.tls.certresolver=letsencrypt no container, o Traefik solicita, emite e renova o certificado TLS automaticamente, sem intervenção manual.
Como o Traefik roteia requisições para o container correto?
O Traefik lê as labels definidas em cada container no docker-compose.yml para determinar o roteamento. A label traefik.http.routers.nome.rule define a regra de roteamento, como Host(`meudominio.com`). Quando uma requisição chega na porta 80 ou 443, o Traefik verifica qual container corresponde à regra e encaminha o tráfego para a porta interna do serviço.
É possível usar o Traefik com múltiplos domínios no mesmo VPS?
Sim. O Traefik suporta múltiplos domínios e subdomínios simultaneamente. Cada container pode ter sua própria regra de roteamento baseada em Host, Path ou combinação de ambos. Basta definir labels distintas em cada serviço no docker-compose.yml e o Traefik gerencia o roteamento e os certificados SSL de forma independente para cada domínio.
O Traefik funciona sem Docker Swarm ou Kubernetes?
Sim. O Traefik funciona perfeitamente com Docker standalone (sem Swarm ou Kubernetes) em um único VPS. Basta configurar o provider docker no traefik.yml e montar o socket do Docker no container do Traefik. Essa é a configuração mais comum para VPS com múltiplos sites ou aplicações em containers.
Conclusão
- Configure a rede externa e o acme.json antes de subir o Traefik — permissão
600no arquivo de certificados é obrigatória e o Traefik recusará iniciar sem ela. - Use
exposedByDefault: falsesempre — isso garante que apenas containers explicitamente marcados comtraefik.enable=truesejam expostos, evitando vazamentos acidentais de serviços internos. - Valide logs e rotas após cada deploy — o comando
docker logs traefik --tail 50e o dashboard emhttps://traefik.seudominio.comsão os primeiros lugares para diagnosticar problemas de roteamento ou emissão de certificados.
Leia também
- Guia Definitivo: Configurar Nginx como Proxy Reverso
- Configurar Alertas Automáticos com Zabbix no Ubuntu
- Como Configurar Backup Automatizado do MySQL sem Plugin
Precisa de ajuda com Docker e proxy reverso no VPS?
Configurar o Traefik corretamente exige atenção a detalhes de rede, permissões e DNS. Um VPS com recursos adequados e suporte técnico especializado faz toda a diferença para manter seus containers rodando com estabilidade e segurança.
Conheça os planos de VPS da AviraHost e hospede seus containers com performance