Implantação no Fly.io
Objetivo: Gateway do OpenClaw rodando em uma máquina do Fly.io com armazenamento persistente, HTTPS automático e acesso a Discord/canais.O que você precisa
- CLI flyctl instalada
- Conta no Fly.io (o plano gratuito funciona)
- Autenticação do modelo: chave de API da Anthropic (ou chaves de outros provedores)
- Credenciais de canal: token de bot do Discord, token do Telegram etc.
Caminho rápido para iniciantes
- Clonar o repositório → personalizar
fly.toml - Criar app + volume → definir secrets
- Implantar com
fly deploy - Acessar via SSH para criar a configuração ou usar a UI de Controle
1) Criar o app no Fly
lhr (Londres), iad (Virgínia), sjc (San Jose).
2. Configurar o fly.toml
Editefly.toml para corresponder ao nome do seu app e aos requisitos.
Nota de segurança: A configuração padrão expõe uma URL pública. Para uma implantação reforçada sem IP público, veja Implantação Privada ou use fly.private.toml.
| Configuração | Por quê |
|---|---|
--bind lan | Vincula a 0.0.0.0 para que o proxy do Fly consiga alcançar o gateway |
--allow-unconfigured | Inicia sem um arquivo de configuração (você criará um depois) |
internal_port = 3000 | Deve corresponder a --port 3000 (ou OPENCLAW_GATEWAY_PORT) para os health checks do Fly |
memory = "2048mb" | 512MB é muito pouco; 2GB recomendado |
OPENCLAW_STATE_DIR = "/data" | Persiste o estado no volume |
3. Definir secrets
- Bindings fora do loopback (
--bind lan) exigemOPENCLAW_GATEWAY_TOKENpor segurança. - Trate esses tokens como senhas.
- Prefira variáveis de ambiente ao arquivo de configuração para todas as chaves de API e tokens. Isso mantém os secrets fora de
openclaw.json, onde poderiam ser expostos ou registrados acidentalmente.
4. Implantar
5. Criar arquivo de configuração
Acesse a máquina via SSH para criar uma configuração adequada:OPENCLAW_STATE_DIR=/data, o caminho da configuração é /data/openclaw.json.
Nota: O token do Discord pode vir de:
- Variável de ambiente:
DISCORD_BOT_TOKEN(recomendado para secrets) - Arquivo de configuração:
channels.discord.token
DISCORD_BOT_TOKEN automaticamente.
Reinicie para aplicar:
6. Acessar o Gateway
UI de Controle
Abra no navegador:https://my-openclaw.fly.dev/
Cole seu token do gateway (o mesmo de OPENCLAW_GATEWAY_TOKEN) para autenticar.
Registros
Console SSH
Solução de problemas
”O aplicativo não está escutando no endereço esperado”
O gateway está fazendo bind em127.0.0.1 em vez de 0.0.0.0.
Correção: Adicione --bind lan ao comando do processo em fly.toml.
Health checks falhando / conexão recusada
O Fly não consegue alcançar o gateway na porta configurada. Correção: Garanta queinternal_port corresponda à porta do gateway (defina --port 3000 ou OPENCLAW_GATEWAY_PORT=3000).
OOM / Problemas de memória
O contêiner continua reiniciando ou sendo encerrado. Sinais:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration ou reinícios silenciosos.
Correção: Aumente a memória em fly.toml:
Problemas de bloqueio do Gateway
O Gateway se recusa a iniciar com erros de “already running”. Isso acontece quando o contêiner reinicia, mas o arquivo de lock de PID persiste no volume. Correção: Exclua o arquivo de lock:/data/gateway.*.lock (não em um subdiretório).
Configuração não está sendo lida
Se estiver usando--allow-unconfigured, o gateway cria uma configuração mínima. Sua configuração personalizada em /data/openclaw.json deve ser lida após o reinício.
Verifique se a configuração existe:
Escrever configuração via SSH
O comandofly ssh console -C não suporta redirecionamento de shell. Para escrever um arquivo de configuração:
fly sftp pode falhar se o arquivo já existir. Exclua primeiro:
Estado não persistindo
Se você perder credenciais ou sessões após um reinício, o diretório de estado está gravando no filesystem do contêiner. Correção: Garanta queOPENCLAW_STATE_DIR=/data esteja definido em fly.toml e reimplante.
Atualizações
Atualizando o comando da máquina
Se você precisar alterar o comando de inicialização sem uma reimplantação completa:fly deploy, o comando da máquina pode voltar para o que está em fly.toml. Se você fez alterações manuais, reaplique-as após a implantação.
Implantação Privada (Reforçada)
Por padrão, o Fly aloca IPs públicos, tornando seu gateway acessível emhttps://your-app.fly.dev. Isso é conveniente, mas significa que sua implantação é detectável por scanners da internet (Shodan, Censys etc.).
Para uma implantação reforçada sem exposição pública, use o template privado.
Quando usar implantação privada
- Você faz apenas chamadas/mensagens de saída (sem webhooks de entrada)
- Você usa túneis ngrok ou Tailscale para quaisquer callbacks de webhook
- Você acessa o gateway via SSH, proxy ou WireGuard em vez do navegador
- Você quer a implantação oculta de scanners da internet
Configuração
Usefly.private.toml em vez da configuração padrão:
fly ips list deve mostrar apenas um IP do tipo private:
Acessando uma implantação privada
Como não há URL pública, use um destes métodos: Opção 1: Proxy local (mais simples)Webhooks com implantação privada
Se você precisar de callbacks de webhook (Twilio, Telnyx etc.) sem exposição pública:- Túnel ngrok – Execute o ngrok dentro do contêiner ou como sidecar
- Tailscale Funnel – Exponha caminhos específicos via Tailscale
- Somente saída – Alguns provedores (Twilio) funcionam bem para chamadas de saída sem webhooks
webhookSecurity.allowedHosts como o hostname público do túnel para que headers de host encaminhados sejam aceitos.
Benefícios de segurança
| Aspecto | Público | Privado |
|---|---|---|
| Scanners da internet | Detectável | Oculto |
| Ataques diretos | Possíveis | Bloqueados |
| Acesso à UI de Controle | Navegador | Proxy/VPN |
| Entrega de webhook | Direta | Via túnel |
Notas
- O Fly.io usa arquitetura x86 (não ARM)
- O Dockerfile é compatível com ambas as arquiteturas
- Para onboarding do WhatsApp/Telegram, use
fly ssh console - Os dados persistentes ficam no volume em
/data - O Signal requer Java + signal-cli; use uma imagem personalizada e mantenha a memória em 2GB+.
Custo
Com a configuração recomendada (shared-cpu-2x, 2GB de RAM):
- ~$10–15/mês dependendo do uso
- O plano gratuito inclui alguma franquia