Dica:
Otimizando Banda Larga com Redundância e Alta Disponibilidade
Considerando uma banda larga de 100,00 reais, é possível elevar essa solução a outro nível, gastando mais R$ 50 (cancelando o IP fixo), e obter redundância, alta disponibilidade e sem a necessidade de redirecionamento de portas.
Requisitos
- Duas conexões de fibra de banda larga ao cusrto de 100,00 cada.
- Servidor Ubuntu rodando Docker.
- Uso do Cloudflare Tunnel (com suporte a IPv6).
Configuração com Docker e Cloudflare Tunnel
Supondo que você tenha duas fibras e um servidor Ubuntu com Docker, o Cloudflare Tunnel pode rodar em duas instâncias (cada container conectado a uma faixa de rede diferente de cada ISP) mas ao mesmo tempo conectado à rede do seu app dentro do docker.
Se a sua aplicação (como Nginx, Apache, PHP, Node, .NET, etc) estiver rodando em um container escutando qualquer porta HTTP, a configuração do Cloudflare Tunnel no painel de controle seria simples:
Protocolo: http
Host: nomedoseucontainer ou nomedoseucontainer:porta se a porta for diferente de 80
O legal é que próprio tunnel avaliará os conectores ativos (instancias do tunnel) e fará o trabalho de distribuir as conexões de forma semelhante a um sistema de fail-over. Mas é possivel criar um Load Balance baseado em regras usando o painel da cloudflare, mas na prática eu acho desnecessário.
Terminação HTTPS Simplificada
Como o HTTPS é terminado na borda do Cloudflare, não há necessidade de configurar um Nginx para proxy reverso HTTPS, no seu app e nem de usar o Certbot. Isso simplifica a configuração e reduz o overhead no servidor, afinal a comunicação entre containers é segura por sí só.
Split DNS para Acessos da rede interna
O legal é que seu site é protegido pela cloudflare mesmo em acessos internos, neste caso pode ser que você prefera que o tráfego da rede interna não saia para a borda para depois voltar, e deseja acessar seu domínio via HTTPS diretamente na rede interna, será necessário:
- Configurar um Split DNS que resolva o domínio para o IP do Docker.
- Utilizar o Certbot-Cloudflare para gerar certificados Let's Encrypt e instalá-los em um container Nginx, que fará a terminação HTTPS internamente e direcionará a conexão ao seu app.
Com essa configuração, você garante segurança e redundância na sua infraestrutura sem complicações adicionais.
Exemplo de uma aplicação dotnet com 1 ISP
Abaixo um exemplo de docker compose usado em um portainer, para ficar simples, não estou cobrindo a parte da rede, mas basicamente você precisa de dois containers "cloudlfared" usando o mesmo token com suas redes ajustadas para conectar a ISPs de forma independente e ter reduncância.
A aplicação é um sistema feito em blazor com banco de dados sql server, e o tunnel (cloudflared) expôe ele em um host. é interessante notar que a aplicação e o banco de dados estão em uma rede docker sem acesso a internet, ou à rede local, assim em teoria se eles fossem comprometidos não teria acesso a nenhum recurso de rede.
version: '3.4'
services:
mssql-server:
image: mcr.microsoft.com/mssql/server
environment:
ACCEPT_EULA: "Y"
SA_PASSWORD: "********"
MSSQL_PID: Express
restart: always
volumes:
- /opt/anmtp/mssqldata:/var/opt/mssql/data
App:
depends_on:
- mssql-server
environment:
ConnectionStrings__DefaultConnection: "Server=mssql-server;Initial Catalog=Appdb;User ID=SA;Password=*******;TrustServerCertificate=true;"
image: myapp:latest
# ou poderia dar o buid se nao tiver a imagem
# build:
# context: /opt/
# dockerfile: myapp/Dockerfile
restart: always
volumes:
- /opt/anmtp/appdata:/app/Data
cloudflared:
depends_on:
- App
image: cloudflare/cloudflared:latest
restart: unless-stopped
command: tunnel --no-autoupdate run
container_name: myapp-cloudflared
environment:
TZ: "America/Sao_Paulo"
TUNNEL_TOKEN: "*********"
O legal é que para configurar o tunnel você so precisa de um token, e o resto da configuração é feita totalmente no painel da cloudflare, então você pode trocar o host ou apontar varios hosts diferente, criar regras, etc. E de brinde ganha proteção contra DDOS mantendo sua rede sem portas abertas.