Deploy no Fly.io

Objetivo: Gateway OpenClaw rodando em uma maquina Fly.io com armazenamento persistente, HTTPS automatico e acesso a canais Discord/mensagens.

O que voce precisa

  • CLI flyctl instalado
  • Conta Fly.io (tier gratuito funciona)
  • Auth de modelo: chave API para seu provedor de modelos
  • Credenciais de canal: token de bot Discord, token Telegram, etc.

Caminho rapido para iniciantes

  1. Clonar repo → personalizar fly.toml
  2. Criar app + volume → definir secrets
  3. Deploy com fly deploy
  4. SSH para criar config ou usar a Interface de Controle

1) Criar o app Fly

git clone https://github.com/openclaw/openclaw.git
cd openclaw
fly apps create my-openclaw
fly volumes create openclaw_data --size 1 --region iad

Dica: Escolha uma regiao proxima. Opcoes comuns: lhr (Londres), iad (Virginia), sjc (San Jose).

2) Configurar fly.toml

Edite fly.toml para corresponder ao nome do seu app e requisitos.

Nota de seguranca: A config padrao expoe uma URL publica. Para um deploy hardened sem IP publico, veja Deploy Privado ou use fly.private.toml.

app = "my-openclaw"
primary_region = "iad"

[build]
  dockerfile = "Dockerfile"

[env]
  NODE_ENV = "production"
  OPENCLAW_PREFER_PNPM = "1"
  OPENCLAW_STATE_DIR = "/data"
  NODE_OPTIONS = "--max-old-space-size=1536"

[processes]
  app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan"

[http_service]
  internal_port = 3000
  force_https = true
  auto_stop_machines = false
  auto_start_machines = true
  min_machines_running = 1
  processes = ["app"]

[[vm]]
  size = "shared-cpu-2x"
  memory = "2048mb"

[mounts]
  source = "openclaw_data"
  destination = "/data"

Configuracoes-chave:

ConfiguracaoMotivo
--bind lanEscuta em 0.0.0.0 para que o proxy do Fly alcance o gateway
--allow-unconfiguredInicia sem arquivo de config (voce cria depois)
internal_port = 3000Deve corresponder a --port 3000 (ou OPENCLAW_GATEWAY_PORT) para health checks
memory = "2048mb"512MB e muito pouco; 2GB recomendados
OPENCLAW_STATE_DIR = "/data"Persiste estado no volume

3) Definir secrets

fly secrets set OPENCLAW_GATEWAY_TOKEN=$(openssl rand -hex 32)
fly secrets set ANTHROPIC_API_KEY=sk-ant-...
fly secrets set OPENAI_API_KEY=sk-...
fly secrets set GOOGLE_API_KEY=...
fly secrets set DISCORD_BOT_TOKEN=MTQ...

Notas:

  • Bindings nao-loopback (--bind lan) requerem OPENCLAW_GATEWAY_TOKEN para seguranca.
  • Trate esses tokens como senhas.
  • Prefira variaveis de ambiente ao arquivo de config para todas as chaves API e tokens.

4) Deploy

fly deploy

Primeiro deploy constroi a imagem Docker (~2-3 minutos). Deploys subsequentes sao mais rapidos.

Apos o deploy, verifique:

fly status
fly logs

5) Criar arquivo de configuracao

SSH na maquina para criar uma config adequada:

fly ssh console

Crie o diretorio e arquivo de config:

mkdir -p /data
cat > /data/openclaw.json << 'EOF'
{
  "agents": {
    "defaults": {
      "model": {
        "primary": "anthropic/claude-opus-4-6",
        "fallbacks": ["anthropic/claude-sonnet-4-5", "openai/gpt-4o"]
      },
      "maxConcurrent": 4
    },
    "list": [
      {
        "id": "main",
        "default": true
      }
    ]
  },
  "auth": {
    "profiles": {
      "anthropic:default": { "mode": "token", "provider": "anthropic" },
      "openai:default": { "mode": "token", "provider": "openai" }
    }
  },
  "bindings": [
    {
      "agentId": "main",
      "match": { "channel": "discord" }
    }
  ],
  "channels": {
    "discord": {
      "enabled": true,
      "groupPolicy": "allowlist",
      "guilds": {
        "YOUR_GUILD_ID": {
          "channels": { "general": { "allow": true } },
          "requireMention": false
        }
      }
    }
  },
  "gateway": {
    "mode": "local",
    "bind": "auto"
  },
  "meta": {
    "lastTouchedVersion": "2026.1.29"
  }
}
EOF

Reinicie para aplicar:

exit
fly machine restart <machine-id>

6) Acessar o Gateway

Interface de Controle

fly open

Ou visite https://my-openclaw.fly.dev/

Cole seu token do gateway (OPENCLAW_GATEWAY_TOKEN) para autenticar.

Logs

fly logs
fly logs --no-tail

Console SSH

fly ssh console

Solucao de problemas

”App is not listening on expected address”

O gateway esta escutando em 127.0.0.1 em vez de 0.0.0.0.

Correcao: Adicione --bind lan ao comando do processo em fly.toml.

Health checks falhando / conexao recusada

O Fly nao consegue alcancar o gateway na porta configurada.

Correcao: Garanta que internal_port corresponde a porta do gateway (--port 3000 ou OPENCLAW_GATEWAY_PORT=3000).

OOM / Problemas de memoria

Container reiniciando ou sendo morto. Sinais: SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration, ou reinicializacoes silenciosas.

Correcao: Aumente a memoria em fly.toml:

[[vm]]
  memory = "2048mb"

Nota: 512MB e muito pouco. 2GB e recomendado.

Problemas de lock do Gateway

Gateway recusa iniciar com erros “already running”. Isso acontece quando o container reinicia mas o arquivo de lock PID persiste no volume.

Correcao:

fly ssh console --command "rm -f /data/gateway.*.lock"
fly machine restart <machine-id>

Atualizacoes

git pull
fly deploy
fly status
fly logs

Deploy Privado (Hardened)

Por padrao, o Fly aloca IPs publicos. Para um deploy hardened sem exposicao publica, use o template privado.

Configuracao

fly deploy -c fly.private.toml

Acessando um deploy privado

Opcao 1: Proxy local

fly proxy 3000:3000 -a my-openclaw

Opcao 2: VPN WireGuard

fly wireguard create

Opcao 3: Apenas SSH

fly ssh console -a my-openclaw

Beneficios de seguranca

AspectoPublicoPrivado
Scanners InternetDescobrivelOculto
Ataques diretosPossivelBloqueado
Acesso interfaceNavegadorProxy/VPN
WebhooksDiretoVia tunel

Notas

  • Fly.io usa arquitetura x86 (nao ARM)
  • O Dockerfile e compativel com ambas arquiteturas
  • Para onboarding WhatsApp/Telegram, use fly ssh console
  • Dados persistentes ficam no volume em /data
  • Signal requer Java + signal-cli; use uma imagem personalizada e mantenha a memoria em 2GB+.

Custo

Com a config recomendada (shared-cpu-2x, 2GB RAM):

  • ~10-15 dolares/mes dependendo do uso
  • Tier gratuito inclui alguma cota

Consulte precos Fly.io para detalhes.