Pular para o conteúdo principal

Deploy Fly.io

Este guia cobre o deploy dos backends do edgeProxy no Fly.io com rede overlay WireGuard para distribuição global.

Visão Geral​

Fly.io Infrastructure

O Fly.io oferece computação de borda com máquinas em mais de 30 regiões mundiais. Usamos para fazer deploy dos servidores backend que conectam ao POP central do edgeProxy via WireGuard.

Pré-requisitos​

# Instalar Fly CLI
curl -L https://fly.io/install.sh | sh

# Login no Fly.io
fly auth login

# Verificar autenticação
fly auth whoami

Regiões Disponíveis​

CódigoLocalizaçãoContinente
gruSão PauloAmérica do Sul
iadVirginiaAmérica do Norte
ordChicagoAmérica do Norte
laxLos AngelesAmérica do Norte
lhrLondresEuropa
fraFrankfurtEuropa
cdgParisEuropa
nrtTóquioÁsia Pacífico
sinSingapuraÁsia Pacífico
sydSydneyOceania

Estrutura do Projeto​

fly-backend/
├── fly.toml # Configuração do Fly.io
├── Dockerfile # Build multi-stage com WireGuard
├── main.go # Servidor backend (Go)
├── entrypoint.sh # Startup do WireGuard + backend
└── wireguard/
└── keys/ # Chaves WireGuard por região

Dockerfile​

Build multi-stage com suporte a WireGuard:

FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o backend main.go

FROM alpine:3.19
RUN apk --no-cache add ca-certificates wireguard-tools iptables ip6tables iproute2 bash
WORKDIR /app
COPY --from=builder /app/backend .
COPY entrypoint.sh .
RUN chmod +x entrypoint.sh

EXPOSE 8080
EXPOSE 51820/udp

ENTRYPOINT ["./entrypoint.sh"]

Script de Entrypoint​

O entrypoint configura o WireGuard baseado na região do Fly:

#!/bin/bash
set -e

# Endpoint central do edgeProxy
EC2_ENDPOINT="54.171.48.207:51820"
EC2_PUBKEY="bzM6rw/efq+75VGhBgkCRChDnKfFlXQY560ejhvKCQY="

# Mapear região para IP WireGuard
case "${FLY_REGION}" in
gru) WG_IP="10.50.1.1/32"; WG_PRIVATE="${WG_KEY_GRU}" ;;
iad) WG_IP="10.50.2.1/32"; WG_PRIVATE="${WG_KEY_IAD}" ;;
ord) WG_IP="10.50.2.2/32"; WG_PRIVATE="${WG_KEY_ORD}" ;;
lax) WG_IP="10.50.2.3/32"; WG_PRIVATE="${WG_KEY_LAX}" ;;
lhr) WG_IP="10.50.3.1/32"; WG_PRIVATE="${WG_KEY_LHR}" ;;
fra) WG_IP="10.50.3.2/32"; WG_PRIVATE="${WG_KEY_FRA}" ;;
cdg) WG_IP="10.50.3.3/32"; WG_PRIVATE="${WG_KEY_CDG}" ;;
nrt) WG_IP="10.50.4.1/32"; WG_PRIVATE="${WG_KEY_NRT}" ;;
sin) WG_IP="10.50.4.2/32"; WG_PRIVATE="${WG_KEY_SIN}" ;;
syd) WG_IP="10.50.4.3/32"; WG_PRIVATE="${WG_KEY_SYD}" ;;
*) echo "Região desconhecida: ${FLY_REGION}"; exit 1 ;;
esac

# Criar configuração WireGuard
mkdir -p /etc/wireguard
cat > /etc/wireguard/wg0.conf << EOF
[Interface]
PrivateKey = ${WG_PRIVATE}
Address = ${WG_IP}

[Peer]
PublicKey = ${EC2_PUBKEY}
Endpoint = ${EC2_ENDPOINT}
AllowedIPs = 10.50.0.0/16
PersistentKeepalive = 25
EOF

# Iniciar WireGuard
wg-quick up wg0

echo "WireGuard conectado: ${FLY_REGION} -> ${WG_IP}"

# Iniciar backend
exec ./backend

Configuração fly.toml​

app = "edgeproxy-backend"
primary_region = "gru"

[build]
dockerfile = "Dockerfile"

[env]
PORT = "8080"

[http_service]
internal_port = 8080
force_https = false
auto_stop_machines = false
auto_start_machines = true
min_machines_running = 1

[[vm]]
cpu_kind = "shared"
cpus = 1
memory_mb = 256

Configuração de Chaves WireGuard​

Gerar Chaves​

# Gerar par de chaves para cada região
for region in gru iad ord lax lhr fra cdg nrt sin syd; do
wg genkey > wireguard/keys/${region}-private.key
cat wireguard/keys/${region}-private.key | wg pubkey > wireguard/keys/${region}-public.key
done

Configurar Secrets no Fly.io​

# Definir chaves privadas WireGuard como secrets
fly secrets set \
WG_KEY_GRU="$(cat wireguard/keys/gru-private.key)" \
WG_KEY_IAD="$(cat wireguard/keys/iad-private.key)" \
WG_KEY_ORD="$(cat wireguard/keys/ord-private.key)" \
WG_KEY_LAX="$(cat wireguard/keys/lax-private.key)" \
WG_KEY_LHR="$(cat wireguard/keys/lhr-private.key)" \
WG_KEY_FRA="$(cat wireguard/keys/fra-private.key)" \
WG_KEY_CDG="$(cat wireguard/keys/cdg-private.key)" \
WG_KEY_NRT="$(cat wireguard/keys/nrt-private.key)" \
WG_KEY_SIN="$(cat wireguard/keys/sin-private.key)" \
WG_KEY_SYD="$(cat wireguard/keys/syd-private.key)"

Deploy​

Criar App​

cd fly-backend

# Criar novo app
fly apps create edgeproxy-backend

# Ou iniciar interativamente
fly launch --no-deploy

Deploy para Todas as Regiões​

# Deploy da aplicação
fly deploy --remote-only

# Escalar para múltiplas regiões (1 máquina por região)
fly scale count 1 --region gru,iad,ord,lax,lhr,fra,cdg,nrt,sin,syd

# Verificar deploy
fly status

Escalar Regiões Individuais​

# Adicionar mais máquinas em região específica
fly scale count 2 --region gru

# Remover máquinas de região
fly scale count 0 --region lax

Monitoramento​

Verificar Status​

# Status da aplicação
fly status

# Listar todas as máquinas
fly machines list

# Ver logs
fly logs

# Logs de região específica
fly logs --region gru

SSH na Máquina​

# SSH para máquina aleatória
fly ssh console

# SSH para região específica
fly ssh console --region gru

# Verificar status WireGuard dentro da máquina
wg show

Verificação de Saúde​

# Testar região específica
curl https://edgeproxy-backend.fly.dev/api/info

# Testar via edgeProxy (deve rotear para backend mais próximo)
curl http://54.171.48.207:8080/api/info

Troubleshooting​

WireGuard Não Conecta​

# SSH na máquina
fly ssh console

# Verificar status WireGuard
wg show

# Verificar se interface existe
ip addr show wg0

# Verificar logs
cat /var/log/wireguard.log

Máquina Não Inicia​

# Verificar logs da máquina
fly logs --instance <machine-id>

# Reiniciar máquina
fly machines restart <machine-id>

# Destruir e recriar
fly machines destroy <machine-id>
fly scale count 1 --region <region>

Secrets Não Configurados​

# Listar secrets
fly secrets list

# Definir secret faltante
fly secrets set WG_KEY_GRU="<private-key>"

Otimização de Custos​

Máquinas com CPU Compartilhada​

[[vm]]
cpu_kind = "shared"
cpus = 1
memory_mb = 256 # Mínimo para WireGuard

Auto-Stop de Máquinas Ociosas​

[http_service]
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0 # Escalar para zero quando ocioso

Documentação Relacionada​