Pular para conteúdo

Acesso externo (domínio e túnel Cloudflare)

A internet de casa usa CGNAT: a operadora compartilha um IP público entre vários clientes, então não dá para abrir portas no roteador. A solução é o Cloudflare Tunnel: o programa cloudflared, rodando na VM, abre uma conexão de saída para a Cloudflare, e o tráfego do seu domínio volta por ela até o Nginx. Não precisa de IP público nem de port forwarding, e ainda ganha HTTPS grátis.

Pré-requisito: o site já abre pelo IP da VM na rede local (Frontend e Nginx).

1. Domínio na Cloudflare

O domínio braggo.com.br foi registrado no Registro.br e adicionado na Cloudflare (plano Free). Para ele funcionar, os servidores DNS no Registro.br precisam ser os nameservers que a Cloudflare indicou para a sua conta.

Confira em dash.cloudflare.com, no domínio, na tela de visão geral: o status deve estar Ativo. Depois de trocar os nameservers, pode levar de alguns minutos até cerca de 24 horas para a Cloudflare reconhecer. Enquanto o status estiver "Pendente", o túnel nomeado ainda não vai servir o domínio.

Invalid nameservers logo depois da troca

O Registro.br deixa o domínio "em transição" por cerca de 1h15 antes de publicar os novos servidores. Nesse tempo a Cloudflare mostra Invalid nameservers. Não refaça a troca: espere e clique em Check nameservers.

Depois de ativo, o e-mail do domínio tem seus próprios registros: veja E-mail (Resend).

2. Teste rápido, sem domínio (opcional)

Serve para provar que o caminho VM → Cloudflare funciona antes de configurar o túnel definitivo. Depois de instalar o cloudflared (passo 3):

cloudflared tunnel --url http://localhost:80

Ele imprime uma URL temporária https://algo-aleatorio.trycloudflare.com. Abra no navegador: deve aparecer o seu site. Encerre com Ctrl+C. Essa URL muda a cada execução e não deve ser usada em produção.

3. Instalar o cloudflared na VM

sudo mkdir -p --mode=0755 /usr/share/keyrings
curl -fsSL https://pkg.cloudflare.com/cloudflare-main.gpg | sudo tee /usr/share/keyrings/cloudflare-main.gpg >/dev/null
echo 'deb [signed-by=/usr/share/keyrings/cloudflare-main.gpg] https://pkg.cloudflare.com/cloudflared any main' | sudo tee /etc/apt/sources.list.d/cloudflared.list
sudo apt update
sudo apt install -y cloudflared
cloudflared --version

Os três primeiros comandos cadastram o repositório oficial da Cloudflare no apt, com a chave de assinatura, e o apt install instala o programa. Assim as atualizações chegam junto com as do sistema. Se algum desses endereços mudar, a página "Downloads" do cloudflared na documentação da Cloudflare tem as instruções atuais.

4. Criar o túnel nomeado

Este método é gerenciado pelo painel da Cloudflare, sem arquivos de configuração na VM. Os nomes de menu da Cloudflare mudam de vez em quando; se algo estiver diferente, procure o equivalente.

  1. Acesse o painel Zero Trust da Cloudflare (dash.cloudflare.com → Zero Trust). Na primeira vez, ele pede para escolher o nome da organização e o plano Free.
  2. Vá em Networks → Tunnels → Create a tunnel.
  3. Escolha o tipo Cloudflared e dê um nome, por exemplo braggo.
  4. Na tela de instalação, escolha Debian e 64-bit. O painel mostra um comando que começa com sudo cloudflared service install seguido de um token longo. Copie o comando inteiro.
  5. Cole e rode esse comando na VM:

    sudo cloudflared service install TOKEN_GERADO_PELO_PAINEL
    

    Ele instala o cloudflared como serviço do systemd, que sobe junto com a VM e reconecta sozinho se a internet cair.

  6. De volta ao painel, o conector deve aparecer como Healthy (ou "Connected").

O token é um segredo

Quem tem o token consegue se passar pelo seu túnel. Não cole em chats, repositórios ou prints. Se vazar, gere um novo no painel (Rotate token) e reinstale o serviço.

5. Apontar o domínio para o Nginx

Ainda no assistente do túnel (ou depois, em Networks → Tunnels → braggo → Configure → Published application routes), adicione uma rota:

Campo Valor
Subdomain (vazio, para o domínio raiz)
Domain braggo.com.br
Path (vazio)
Service type HTTP
URL localhost:80

Isso diz: "quem acessar braggo.com.br, entregue para o Nginx na própria VM, porta 80". A Cloudflare cria automaticamente o registro DNS (CNAME) do domínio para o túnel.

Para o www funcionar também, adicione uma segunda rota igual, com Subdomain www. (Se preferir redirecionar o www para o domínio raiz, faça isso por uma regra de redirecionamento no painel da Cloudflare em vez de uma segunda rota.)

6. Verificar

Na VM:

sudo systemctl status cloudflared
sudo journalctl -u cloudflared -n 50 --no-pager

O status deve ser active (running) e o log deve mostrar conexões registradas com a Cloudflare.

No navegador, abra https://braggo.com.br. O cadeado de HTTPS é fornecido pela Cloudflare; não é preciso instalar certificado no Nginx.

7. Segurança

  • Não abra portas no roteador. Com o túnel não é necessário, e o SSH e o PostgreSQL continuam acessíveis só dentro da sua rede.
  • O Nginx ouve na porta 80 apenas para o túnel e para a rede local. Não faz sentido configurar HTTPS nele neste desenho.
  • Se quiser proteger uma área (por exemplo, um painel administrativo ou esta documentação) com login, a Cloudflare Access faz isso no próprio painel, sem mexer na aplicação.
  • Mantenha o cloudflared atualizado com o resto do sistema: sudo apt update && sudo apt upgrade.

Se um dia o IP público ficar disponível

Com um IP público fora do CGNAT (a operadora cobra à parte), seria possível abrir as portas 80 e 443 no roteador, instalar um certificado no Nginx (Let's Encrypt) e apontar o DNS direto para o IP. O túnel continua sendo mais simples e mais seguro, porque esconde o IP de casa, então só vale mudar se houver um motivo claro.

Checklist ao final desta etapa

  • [ ] Domínio com status Ativo na Cloudflare
  • [ ] systemctl status cloudflared ativo e túnel Healthy no painel
  • [ ] https://braggo.com.br abre o front
  • [ ] Login ou qualquer chamada à API funciona pelo domínio
  • [ ] Teste de reinício: reinicie a VM e confirme que tudo volta sozinho