Implementación en Fly.io
Objetivo: OpenClaw Gateway ejecutándose en una máquina de Fly.io con almacenamiento persistente, HTTPS automático y acceso a Discord/canales.Lo que necesita
- CLI flyctl instalado
- Cuenta de Fly.io (el nivel gratuito funciona)
- Autenticación del modelo: clave de API de Anthropic (u otras claves de proveedor)
- Credenciales de canales: token de bot de Discord, token de Telegram, etc.
Ruta rápida para principiantes
- Clonar el repositorio → personalizar
fly.toml - Crear la app + volumen → configurar secretos
- Implementar con
fly deploy - Acceder por SSH para crear la configuración o usar la UI de Control
1) Crear la app en Fly
lhr (Londres), iad (Virginia), sjc (San José).
2. Configurar fly.toml
Editefly.toml para que coincida con el nombre de su app y sus requisitos.
Nota de seguridad: La configuración predeterminada expone una URL pública. Para una implementación reforzada sin IP pública, consulte Implementación privada o use fly.private.toml.
| Configuración | Por qué |
|---|---|
--bind lan | Se vincula a 0.0.0.0 para que el proxy de Fly pueda alcanzar el gateway |
--allow-unconfigured | Inicia sin un archivo de configuración (lo creará después) |
internal_port = 3000 | Debe coincidir con --port 3000 (o OPENCLAW_GATEWAY_PORT) para los health checks de Fly |
memory = "2048mb" | 512MB es demasiado poco; se recomiendan 2GB |
OPENCLAW_STATE_DIR = "/data" | Persiste el estado en el volumen |
3. Configurar secretos
- Enlaces no loopback (
--bind lan) requierenOPENCLAW_GATEWAY_TOKENpor seguridad. - Trate estos tokens como contraseñas.
- Prefiera variables de entorno sobre el archivo de configuración para todas las claves de API y tokens. Esto mantiene los secretos fuera de
openclaw.json, donde podrían exponerse o registrarse accidentalmente.
4. Implementar
5. Crear el archivo de configuración
Acceda por SSH a la máquina para crear una configuración adecuada:OPENCLAW_STATE_DIR=/data, la ruta de configuración es /data/openclaw.json.
Nota: El token de Discord puede provenir de cualquiera de estos:
- Variable de entorno:
DISCORD_BOT_TOKEN(recomendado para secretos) - Archivo de configuración:
channels.discord.token
DISCORD_BOT_TOKEN automáticamente.
Reinicie para aplicar:
6. Acceder al Gateway
UI de Control
Abra en el navegador:https://my-openclaw.fly.dev/
Pegue su token del gateway (el de OPENCLAW_GATEWAY_TOKEN) para autenticarse.
Registros
Consola SSH
Solución de problemas
”La aplicación no está escuchando en la dirección esperada”
El gateway se está vinculando a127.0.0.1 en lugar de 0.0.0.0.
Solución: Agregue --bind lan al comando del proceso en fly.toml.
Fallan los health checks / conexión rechazada
Fly no puede alcanzar el gateway en el puerto configurado. Solución: Asegúrese de queinternal_port coincida con el puerto del gateway (establezca --port 3000 o OPENCLAW_GATEWAY_PORT=3000).
OOM / Problemas de memoria
El contenedor se reinicia constantemente o es terminado. Señales:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration o reinicios silenciosos.
Solución: Aumente la memoria en fly.toml:
Problemas de bloqueo del Gateway
El Gateway se niega a iniciar con errores de “already running”. Esto ocurre cuando el contenedor se reinicia pero el archivo de bloqueo PID persiste en el volumen. Solución: Elimine el archivo de bloqueo:/data/gateway.*.lock (no en un subdirectorio).
La configuración no se está leyendo
Si usa--allow-unconfigured, el gateway crea una configuración mínima. Su configuración personalizada en /data/openclaw.json debería leerse al reiniciar.
Verifique que la configuración exista:
Escribir la configuración vía SSH
El comandofly ssh console -C no admite redirección del shell. Para escribir un archivo de configuración:
fly sftp puede fallar si el archivo ya existe. Elimínelo primero:
El estado no persiste
Si pierde credenciales o sesiones después de un reinicio, el directorio de estado está escribiendo en el sistema de archivos del contenedor. Solución: Asegúrese de queOPENCLAW_STATE_DIR=/data esté configurado en fly.toml y vuelva a implementar.
Actualizaciones
Actualizar el comando de la máquina
Si necesita cambiar el comando de inicio sin una reimplementación completa:fly deploy, el comando de la máquina puede restablecerse a lo que esté en fly.toml. Si realizó cambios manuales, vuelva a aplicarlos después de implementar.
Implementación privada (reforzada)
De forma predeterminada, Fly asigna IP públicas, lo que hace que su gateway sea accesible enhttps://your-app.fly.dev. Esto es conveniente, pero significa que su implementación es detectable por escáneres de internet (Shodan, Censys, etc.).
Para una implementación reforzada sin exposición pública, use la plantilla privada.
Cuándo usar implementación privada
- Solo realiza llamadas/mensajes salientes (sin webhooks entrantes)
- Usa túneles ngrok o Tailscale para cualquier callback de webhook
- Accede al gateway mediante SSH, proxy o WireGuard en lugar del navegador
- Quiere la implementación oculta a los escáneres de internet
Configuración
Usefly.private.toml en lugar de la configuración estándar:
fly ips list debería mostrar solo una IP de tipo private:
Acceso a una implementación privada
Como no hay URL pública, use uno de estos métodos: Opción 1: Proxy local (la más simple)Webhooks con implementación privada
Si necesita callbacks de webhook (Twilio, Telnyx, etc.) sin exposición pública:- Túnel ngrok: ejecute ngrok dentro del contenedor o como sidecar
- Tailscale Funnel: exponga rutas específicas mediante Tailscale
- Solo saliente: algunos proveedores (Twilio) funcionan bien para llamadas salientes sin webhooks
webhookSecurity.allowedHosts con el nombre de host público del túnel para que se acepten los encabezados de host reenviados.
Beneficios de seguridad
| Aspecto | Público | Privado |
|---|---|---|
| Escáneres de internet | Detectable | Oculto |
| Ataques directos | Posibles | Bloqueados |
| Acceso a la UI de Control | Navegador | Proxy/VPN |
| Entrega de webhooks | Directa | Vía túnel |
Notas
- Fly.io usa arquitectura x86 (no ARM)
- El Dockerfile es compatible con ambas arquitecturas
- Para la incorporación de WhatsApp/Telegram, use
fly ssh console - Los datos persistentes viven en el volumen en
/data - Signal requiere Java + signal-cli; use una imagen personalizada y mantenga la memoria en 2GB+.
Costos
Con la configuración recomendada (shared-cpu-2x, 2GB de RAM):
- ~$10–15/mes según el uso
- El nivel gratuito incluye cierta asignación