Implantação no Fly.io
Objetivo: Gateway OpenClaw em execução 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 do Fly.io (o nível gratuito funciona)
- Autenticação de modelo: chave de API do provedor de modelo escolhido
- Credenciais de canal: token de bot do Discord, token do Telegram etc.
Caminho rápido para iniciantes
- Clone o repositório → personalize
fly.toml - Crie app + volume → defina segredos
- Implante com
fly deploy - Entre por SSH para criar a configuração ou use a interface de Control
Crie o app no Fly
lhr (Londres), iad (Virgínia), sjc (San Jose).Configure o fly.toml
Edite Principais definições:
fly.toml para corresponder ao nome do seu app e aos seus requisitos.Observação de segurança: a configuração padrão expõe uma URL pública. Para uma implantação reforçada sem IP público, consulte Implantação privada ou use fly.private.toml.| Setting | Why |
|---|---|
--bind lan | Faz bind em 0.0.0.0 para que o proxy do Fly possa 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 as verificações de integridade do Fly |
memory = "2048mb" | 512MB é pouco; 2GB é recomendado |
OPENCLAW_STATE_DIR = "/data" | Persiste o estado no volume |
Defina os segredos
- Binds sem loopback (
--bind lan) exigem um caminho válido de autenticação do gateway. Este exemplo do Fly.io usaOPENCLAW_GATEWAY_TOKEN, masgateway.auth.passwordou uma implantaçãotrusted-proxysem loopback configurada corretamente também satisfazem esse requisito. - Trate esses tokens como senhas.
- Prefira variáveis de ambiente em vez de arquivo de configuração para todas as chaves de API e tokens. Isso mantém segredos fora de
openclaw.json, onde poderiam ser expostos ou registrados acidentalmente.
Implante
Crie o arquivo de configuração
Entre na máquina por SSH para criar uma configuração adequada:Crie o diretório e o arquivo de configuração:Observação: com
OPENCLAW_STATE_DIR=/data, o caminho de configuração é /data/openclaw.json.Observação: o token do Discord pode vir de:- Variável de ambiente:
DISCORD_BOT_TOKEN(recomendado para segredos) - Arquivo de configuração:
channels.discord.token
DISCORD_BOT_TOKEN automaticamente.Reinicie para aplicar:Solução de problemas
”App is not listening on expected address”
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 no seu fly.toml.
Verificações de integridade falhando / conexão recusada
O Fly não consegue alcançar o gateway na porta configurada. Correção: verifique seinternal_port corresponde à 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 reinicializações silenciosas.
Correção: aumente a memória em fly.toml:
Problemas de lock 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).
A configuração não está sendo lida
--allow-unconfigured apenas ignora a proteção de inicialização. Ele não cria nem repara /data/openclaw.json, então verifique se sua configuração real existe e inclui gateway.mode="local" quando você quiser uma inicialização local normal do gateway.
Verifique se a configuração existe:
Gravando configuração via SSH
O comandofly ssh console -C não oferece suporte a redirecionamento de shell. Para gravar um arquivo de configuração:
fly sftp pode falhar se o arquivo já existir. Exclua-o antes:
O estado não persiste
Se você perder perfis de autenticação, estado de canal/provedor ou sessões após uma reinicialização, o diretório de estado está gravando no sistema de arquivos do contêiner. Correção: verifique seOPENCLAW_STATE_DIR=/data está definido em fly.toml e implante novamente.
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 ao 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 pode ser descoberta por scanners da internet (Shodan, Censys etc.).
Para uma implantação reforçada sem exposição pública, use o modelo privado.
Quando usar implantação privada
- Você só faz chamadas/mensagens de saída (sem webhooks de entrada)
- Você usa túneis ngrok ou Tailscale para qualquer callback de webhook
- Você acessa o gateway via SSH, proxy ou WireGuard em vez do navegador
- Você quer que a implantação fique oculta de scanners da internet
Configuração
Usefly.private.toml em vez da configuração padrão:
fly ips list deverá 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 para o nome de host do túnel público para que cabeçalhos de host encaminhados sejam aceitos.
Benefícios de segurança
| Aspect | Público | Privado |
|---|---|---|
| Scanners da internet | Detectável | Oculto |
| Ataques diretos | Possíveis | Bloqueados |
| Acesso à interface de Control | Navegador | Proxy/VPN |
| Entrega de webhook | Direta | Via túnel |
Observações
- O Fly.io usa arquitetura x86 (não ARM)
- O Dockerfile é compatível com ambas as arquiteturas
- Para onboarding de WhatsApp/Telegram, use
fly ssh console - Os dados persistentes ficam no volume em
/data - O Signal exige Java + signal-cli; use uma imagem personalizada e mantenha a memória em 2GB+.
Custo
Com a configuração recomendada (shared-cpu-2x, 2GB RAM):
- ~US$10-15/mês dependendo do uso
- O nível gratuito inclui alguma franquia
Próximos passos
- Configure canais de mensagens: Canais
- Configure o Gateway: Configuração do gateway
- Mantenha o OpenClaw atualizado: Atualização