Despliegue en Fly.io
Objetivo: Gateway de OpenClaw ejecutándose en una máquina de Fly.io con almacenamiento persistente, HTTPS automático y acceso a Discord/canales.Qué necesitas
- flyctl CLI instalada
- Cuenta de Fly.io (el nivel gratuito funciona)
- Autenticación del modelo: clave de API para el proveedor de modelos que elijas
- Credenciales de canal: token de bot de Discord, token de Telegram, etc.
Ruta rápida para principiantes
- Clonar el repositorio → personalizar
fly.toml - Crear app + volumen → establecer secretos
- Desplegar con
fly deploy - Acceder por SSH para crear la configuración o usar la UI de Control
Crear la app de Fly
lhr (Londres), iad (Virginia), sjc (San José).Configurar fly.toml
Edita Ajustes clave:
fly.toml para que coincida con el nombre de tu app y tus requisitos.Nota de seguridad: La configuración predeterminada expone una URL pública. Para un despliegue reforzado sin IP pública, consulta Despliegue privado o usa fly.private.toml.| Ajuste | Motivo |
|---|---|
--bind lan | Vincula a 0.0.0.0 para que el proxy de Fly pueda alcanzar el gateway |
--allow-unconfigured | Inicia sin archivo de configuración (lo crearás después) |
internal_port = 3000 | Debe coincidir con --port 3000 (o OPENCLAW_GATEWAY_PORT) para las comprobaciones de estado de Fly |
memory = "2048mb" | 512 MB es demasiado poco; se recomiendan 2 GB |
OPENCLAW_STATE_DIR = "/data" | Conserva el estado en el volumen |
Establecer secretos
- Las vinculaciones no loopback (
--bind lan) requieren una ruta válida de autenticación del gateway. Este ejemplo de Fly.io usaOPENCLAW_GATEWAY_TOKEN, perogateway.auth.passwordo un desplieguetrusted-proxyno loopback correctamente configurado también cumplen este requisito. - Trata estos tokens como contraseñas.
- Prefiere variables de entorno en lugar del archivo de configuración para todas las claves de API y tokens. Así los secretos no quedan en
openclaw.json, donde podrían exponerse o registrarse accidentalmente.
Desplegar
Crear el archivo de configuración
Accede por SSH a la máquina para crear una configuración adecuada:Crea el directorio y el archivo de configuración:Nota: Con
OPENCLAW_STATE_DIR=/data, la ruta de configuración es /data/openclaw.json.Nota: El token de Discord puede venir de:- Variable de entorno:
DISCORD_BOT_TOKEN(recomendado para secretos) - Archivo de configuración:
channels.discord.token
DISCORD_BOT_TOKEN automáticamente.Reinicia para aplicar los cambios:Acceder al Gateway
Solución de problemas
”App is not listening on expected address”
El gateway se está vinculando a127.0.0.1 en lugar de 0.0.0.0.
Solución: Añade --bind lan al comando del proceso en fly.toml.
Fallos en comprobaciones de estado / conexión rechazada
Fly no puede alcanzar el gateway en el puerto configurado. Solución: Asegúrate de queinternal_port coincida con el puerto del gateway (establece --port 3000 o OPENCLAW_GATEWAY_PORT=3000).
OOM / problemas de memoria
El contenedor sigue reiniciándose o siendo terminado. Señales:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration o reinicios silenciosos.
Solución: Aumenta 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 de PID permanece en el volumen. Solución: Elimina el archivo de bloqueo:/data/gateway.*.lock (no en un subdirectorio).
La configuración no se está leyendo
--allow-unconfigured solo omite la protección de inicio. No crea ni repara /data/openclaw.json, así que asegúrate de que tu configuración real exista e incluya gateway.mode="local" cuando quieras un inicio local normal del gateway.
Verifica que exista la configuración:
Escribir configuración mediante 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ínalo primero:
El estado no persiste
Si pierdes perfiles de autenticación, estado de canales/proveedores o sesiones después de un reinicio, el directorio de estado se está escribiendo en el sistema de archivos del contenedor. Solución: Asegúrate de queOPENCLAW_STATE_DIR=/data esté establecido en fly.toml y vuelve a desplegar.
Actualizaciones
Actualizar el comando de la máquina
Si necesitas cambiar el comando de inicio sin un redespliegue completo:fly deploy, el comando de la máquina puede volver a lo que esté en fly.toml. Si hiciste cambios manuales, vuelve a aplicarlos después del despliegue.
Despliegue privado (reforzado)
De forma predeterminada, Fly asigna IP públicas, haciendo que tu gateway sea accesible enhttps://your-app.fly.dev. Esto es conveniente, pero significa que tu despliegue es detectable por escáneres de Internet (Shodan, Censys, etc.).
Para un despliegue reforzado con cero exposición pública, usa la plantilla privada.
Cuándo usar un despliegue privado
- Solo haces llamadas/mensajes salientes (sin webhooks entrantes)
- Usas túneles ngrok o Tailscale para cualquier devolución de llamada webhook
- Accedes al gateway mediante SSH, proxy o WireGuard en lugar del navegador
- Quieres que el despliegue quede oculto a escáneres de Internet
Configuración
Usafly.private.toml en lugar de la configuración estándar:
fly ips list debería mostrar solo una IP de tipo private:
Acceder a un despliegue privado
Como no hay URL pública, usa uno de estos métodos: Opción 1: proxy local (la más sencilla)Webhooks con despliegue privado
Si necesitas devoluciones de llamada webhook (Twilio, Telnyx, etc.) sin exposición pública:- Túnel ngrok - Ejecuta ngrok dentro del contenedor o como sidecar
- Tailscale Funnel - Expón rutas específicas mediante Tailscale
- Solo saliente - Algunos proveedores (Twilio) funcionan bien para llamadas salientes sin webhooks
webhookSecurity.allowedHosts en el nombre de host público del túnel para que se acepten los encabezados de host reenviados.
Ventajas 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 | Mediante túnel |
Notas
- Fly.io usa arquitectura x86 (no ARM)
- El Dockerfile es compatible con ambas arquitecturas
- Para el onboarding de WhatsApp/Telegram, usa
fly ssh console - Los datos persistentes viven en el volumen en
/data - Signal requiere Java + signal-cli; usa una imagen personalizada y mantén la memoria en 2 GB o más.
Coste
Con la configuración recomendada (shared-cpu-2x, 2 GB de RAM):
- ~10-15 USD/mes según el uso
- El nivel gratuito incluye cierta asignación
Siguientes pasos
- Configura canales de mensajería: Channels
- Configura el Gateway: Configuración del gateway
- Mantén OpenClaw actualizado: Updating