Proxy reverso no homelab: Caddy, NPM ou Traefik
Caddy, Nginx Proxy Manager ou Traefik como proxy reverso no homelab: HTTPS, configuração e cuidados de cada um, e onde entra o Cloudflare Tunnel.
- Publicado
- Leitura
- 5 min
Quando o homelab passa de dois ou três serviços, decorar 192.168.1.30:8080 vira um problema. Proxy reverso é o que resolve isso: um ponto de entrada que recebe o pedido por nome, cuida do HTTPS e encaminha para o serviço certo.
Os três nomes que mais aparecem são Caddy, Nginx Proxy Manager e Traefik. Neste post comparo os três pelo que as documentações oficiais dizem, com o que eu olharia para escolher. Este blog, por exemplo, é servido por um Caddy num container LXC.
O que um proxy reverso faz #
Em vez de cada serviço ter a sua porta exposta, todos ficam atrás do proxy:
vault.casa.seudominio.comvai para o Vaultwarden;fotos.casa.seudominio.comvai para o app de fotos;- e assim por diante.
O proxy cuida de três coisas:
- Roteamento por nome: um IP só, vários serviços.
- HTTPS: obtém e renova os certificados, num lugar só.
- Controle: cabeçalhos, limites e, em alguns, login antes de chegar ao serviço.
O HTTPS não é detalhe. Alguns apps nem funcionam sem ele, como o cofre web do Vaultwarden, que contei no post sobre o Vaultwarden para a família.
E o Cloudflare Tunnel? #
No meu homelab, o que sai para a internet passa pelo Cloudflare Tunnel, que já entrega HTTPS e não exige porta aberta no roteador. Contei como ele resolveu os bots no SSH no post sobre SSH sem porta 22 aberta.
O tunnel e o proxy reverso não brigam. O tunnel cuida da entrada de fora. O proxy faz sentido para acesso dentro de casa com nomes e HTTPS, ou para juntar vários serviços atrás de um destino só do tunnel. Se você só acessa de fora e tudo passa pelo tunnel, talvez nem precise de proxy.
Caddy: HTTPS sem pensar #
O Caddy é um servidor web com proxy reverso embutido. A característica dele, pela documentação, é o HTTPS automático: por padrão, ele serve todo site por HTTPS, obtém e renova os certificados e redireciona HTTP para HTTPS.
A configuração de um proxy cabe em três linhas:
vault.casa.seudominio.com {
reverse_proxy 192.168.1.30:80
}
Detalhes da documentação que importam no homelab:
- para um domínio público com o desafio padrão, o DNS precisa apontar para o servidor e as portas 80 e 443 precisam estar acessíveis de fora;
- sem porta aberta, o caminho é o desafio por DNS, que precisa das credenciais do seu provedor de DNS e de um plugin específico, já que o suporte a provedores é feito pela comunidade;
- para nomes locais e IPs, o Caddy cria a própria autoridade certificadora e assina os certificados com ela.
Bom para quem gosta de arquivo de texto, versionado no git, e quer o mínimo de configuração.
Nginx Proxy Manager: tudo pela interface #
O Nginx Proxy Manager (NPM) é uma interface web em cima do Nginx, distribuída como imagem Docker. Pela documentação, ele traz:
- certificados Let’s Encrypt grátis, ou os seus;
- listas de acesso e autenticação HTTP básica por host;
- configuração avançada do Nginx para quem precisar;
- usuários, permissões e registro de auditoria.
A instalação é um Docker Compose com três portas: 80 (HTTP), 443 (HTTPS) e 81, a interface de administração:
services:
app:
image: 'jc21/nginx-proxy-manager:2.16.0'
restart: unless-stopped
ports:
- '80:80'
- '81:81'
- '443:443'
volumes:
- ./data:/data
- ./letsencrypt:/etc/letsencrypt
Bom para quem prefere clicar a editar arquivo, e para quem já usa Docker.
Traefik: configuração pelos containers #
O Traefik foi feito para ambientes com containers. Com o provedor Docker, ele lê os rótulos (labels) dos containers e monta as rotas sozinho. Subiu um container com o rótulo certo, a rota existe:
labels:
- traefik.http.routers.meu-app.rule=Host(`app.casa.seudominio.com`)
Dois cuidados da documentação:
- a opção
exposedByDefaultvem ligada (true): todo container é exposto, a menos que você desligue e marque só os que quer; - o Traefik precisa acessar a API do Docker, e a documentação avisa que dar esse acesso sem restrição é um risco: se o Traefik for atacado, o atacante pode chegar ao host.
Bom para quem roda muitos containers Docker e quer que as rotas acompanhem o ciclo de vida deles. Num homelab que é quase todo LXC, como o meu, ele perde a principal vantagem.
Lado a lado #
| Caddy | Nginx Proxy Manager | Traefik | |
|---|---|---|---|
| Configuração | Arquivo (Caddyfile) | Interface web | Rótulos nos containers e arquivo |
| HTTPS automático | Sim, padrão | Sim, por host | Sim, configurando |
| Melhor com | Qualquer coisa | Docker | Docker com muitos containers |
| Versiona no git | Fácil | Difícil (fica no banco) | Fácil |
| Curva de aprendizado | Baixa | Baixa | Maior |
Qual eu escolheria #
- Começando, com poucos serviços e LXC: Caddy. Um arquivo, três linhas por serviço, HTTPS sozinho.
- Prefere interface e já usa Docker: Nginx Proxy Manager.
- Muitos containers Docker que mudam toda hora: Traefik.
Resumindo #
- Proxy reverso dá nomes e HTTPS aos serviços, num ponto de entrada só.
- Cloudflare Tunnel cuida da entrada de fora. O proxy ajuda dentro de casa.
- Caddy: HTTPS automático e configuração mínima em arquivo.
- Nginx Proxy Manager: tudo pela interface, em Docker. Proteja a porta 81.
- Traefik: rotas pelos rótulos dos containers. Cuidado com o acesso à API do Docker.
O melhor proxy é aquele cuja configuração você consegue entender daqui a seis meses. Num homelab pequeno, um arquivo de texto no git costuma ganhar essa disputa.