Objetivo: OpenClaw Gateway ejecutándose en una máquina de Fly.io con almacenamiento persistente, HTTPS automático y acceso a Discord/canales.Documentation Index
Fetch the complete documentation index at: https://docs.openclaw.ai/llms.txt
Use this file to discover all available pages before exploring further.
Lo que necesitas
- flyctl CLI instalado
- Cuenta de Fly.io (el plan gratuito funciona)
- Autenticación del modelo: clave de API para el proveedor de modelos que elijas
- Credenciales de canales: token de bot de Discord, token de Telegram, etc.
Ruta rápida para principiantes
- Clona el repositorio → personaliza
fly.toml - Crea la aplicación + volumen → configura secretos
- Despliega con
fly deploy - Entra por SSH para crear la configuración o usa la UI de control
Crear la aplicación de Fly
lhr (Londres), iad (Virginia), sjc (San José).Configurar fly.toml
Edita La imagen Docker de OpenClaw usa
fly.toml para que coincida con el nombre de tu aplicación 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 deploy/fly.private.toml.tini como punto de entrada. Los comandos de proceso de Fly reemplazan el CMD de Docker sin reemplazar el ENTRYPOINT, por lo que el proceso sigue ejecutándose bajo tini.Configuraciones clave:| Configuración | Por qué |
|---|---|
--bind lan | Se enlaza a 0.0.0.0 para que el proxy de Fly pueda alcanzar el gateway |
--allow-unconfigured | Inicia sin archivo de configuración (crearás uno 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" | Persiste el estado en el volumen |
Configurar secretos
- Los enlaces que no son local 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-proxysin local loopback correctamente configurado también satisfacen el requisito. - Trata estos tokens como contraseñas.
- Prefiere 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.
Desplegar
Crear archivo de configuración
Entra por SSH en 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: Reemplaza https://my-openclaw.fly.dev por el origen real de tu aplicación de Fly. El arranque del Gateway inicializa los orígenes locales de la UI de control desde los valores de runtime --bind y --port para que el primer arranque pueda continuar antes de que exista la configuración, pero el acceso desde el navegador a través de Fly aún necesita que el origen HTTPS exacto esté incluido en gateway.controlUi.allowedOrigins.Nota: El token de Discord puede venir de cualquiera de estas fuentes:- Variable de entorno:
DISCORD_BOT_TOKEN(recomendado para secretos) - Archivo de configuración:
channels.discord.token
DISCORD_BOT_TOKEN automáticamente.Reinicia para aplicar:Acceder al Gateway
Solución de problemas
”App is not listening on expected address”
El gateway se está enlazando a127.0.0.1 en lugar de 0.0.0.0.
Solución: Añade --bind lan a tu comando de proceso en fly.toml.
Fallan las 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 (configura --port 3000 o OPENCLAW_GATEWAY_PORT=3000).
Problemas de OOM / memoria
El contenedor sigue reiniciándose o se termina. Señales:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration o reinicios silenciosos.
Solución: Aumenta la memoria en fly.toml:
Problemas con el 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 persiste en el volumen. Solución: Elimina el archivo de bloqueo:/data/gateway.*.lock (no en un subdirectorio).
No se lee la configuración
--allow-unconfigured solo omite la protección de arranque. 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 arranque normal del gateway local.
Verifica que la configuración exista:
Escribir configuración por SSH
El comandofly ssh console -C no admite redirección de 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é configurado 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 restablecerse a lo que haya 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, lo que hace que tu gateway sea accesible enhttps://your-app.fly.dev. Esto es cómodo, pero significa que tu despliegue puede ser descubierto por escáneres de internet (Shodan, Censys, etc.).
Para un despliegue reforzado sin exposición pública, usa la plantilla privada.
Cuándo usar el despliegue privado
- Solo haces llamadas/mensajes salientes (sin Webhooks entrantes)
- Usas túneles de ngrok o Tailscale para cualquier devolución de llamada de Webhook
- Accedes al gateway mediante SSH, proxy o WireGuard en lugar del navegador
- Quieres que el despliegue esté oculto para escáneres de internet
Configuración
Usadeploy/fly.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 (más simple)Webhooks con despliegue privado
Si necesitas callbacks de Webhook (Twilio, Telnyx, etc.) sin exposición pública:- Túnel ngrok - Ejecuta ngrok dentro del contenedor o como contenedor auxiliar
- 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.
Beneficios de seguridad
| Aspecto | Público | Privado |
|---|---|---|
| Escáneres de Internet | Detectable | Oculto |
| Ataques directos | Posibles | Bloqueados |
| Acceso a la IU de control | Navegador | Proxy/VPN |
| Entrega de Webhook | Directa | Mediante túnel |
Notas
- Fly.io usa arquitectura x86 (no ARM)
- El Dockerfile es compatible con ambas arquitecturas
- Para la incorporación de WhatsApp/Telegram, usa
fly ssh console - Los datos persistentes residen 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.
Costo
Con la configuración recomendada (shared-cpu-2x, 2 GB de RAM):
- ~$10-15/mes según el uso
- El nivel gratuito incluye cierta asignación
Siguientes pasos
- Configura los canales de mensajería: Canales
- Configura el Gateway: Configuración del Gateway
- Mantén OpenClaw actualizado: Actualización