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
Neste post

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.com vai para o Vaultwarden;
  • fotos.casa.seudominio.com vai para o app de fotos;
  • e assim por diante.

O proxy cuida de três coisas:

  1. Roteamento por nome: um IP só, vários serviços.
  2. HTTPS: obtém e renova os certificados, num lugar só.
  3. 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 exposedByDefault vem 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 #

CaddyNginx Proxy ManagerTraefik
ConfiguraçãoArquivo (Caddyfile)Interface webRótulos nos containers e arquivo
HTTPS automáticoSim, padrãoSim, por hostSim, configurando
Melhor comQualquer coisaDockerDocker com muitos containers
Versiona no gitFácilDifícil (fica no banco)Fácil
Curva de aprendizadoBaixaBaixaMaior

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.

Fontes e documentação