Qué se necesita
- CLI flyctl instalada
- Cuenta de Fly.io (el nivel gratuito funciona)
- Autenticación del modelo: clave de API del proveedor de modelos elegido
- Credenciales del canal: token de bot de Discord, token de Telegram, etc.
Ruta rápida para principiantes
- Clonar el repositorio y personalizar
fly.toml - Crear la aplicación y el volumen, y establecer los secretos
- Desplegar con
fly deploy - Acceder mediante SSH para crear la configuración o usar la interfaz de control
1
Crear la aplicación de Fly
lhr (Londres), iad (Virginia), sjc (San José).2
Configurar fly.toml
Edite El punto de entrada de la imagen Docker de OpenClaw es
fly.toml para que coincida con el nombre y los requisitos de la aplicación. El archivo fly.toml incluido en el repositorio es la plantilla pública que se muestra a continuación; deploy/fly.private.toml es la variante reforzada sin IP pública (consulte Despliegue privado).tini, que ejecuta node openclaw.mjs gateway de forma predeterminada. El [processes] de Fly sustituye el CMD de Docker (aquí ejecuta directamente node dist/index.js gateway ..., el mismo punto de entrada compilado) sin modificar ENTRYPOINT, por lo que el proceso continúa ejecutándose bajo tini.Configuración clave:3
Establecer los secretos
--bind lan) requieren una ruta válida de autenticación del Gateway. Este ejemplo usa OPENCLAW_GATEWAY_TOKEN, pero gateway.auth.password o un despliegue de proxy de confianza fuera de loopback correctamente configurado también satisfacen el requisito. Consulte Gestión de secretos para conocer el contrato de SecretRef.Trate estos tokens como contraseñas. Es preferible usar variables de entorno/fly secrets en lugar del archivo de configuración para las claves de API y los tokens, de modo que los secretos no se incluyan en openclaw.json.4
Desplegar
gateway ready una vez que el servidor HTTP/WebSocket está activo. La comprobación de estado propia de Fly supervisa internal_port = 3000 según fly.toml; además, la directiva Docker HEALTHCHECK de la imagen consulta /healthz en su puerto predeterminado 18789, que no se utiliza aquí porque este despliegue sustituye el puerto del Gateway por --port 3000.5
Crear el archivo de configuración
Acceda a la máquina mediante SSH para crear una configuración adecuada:Con
OPENCLAW_STATE_DIR=/data, la ruta de configuración es /data/openclaw.json.Sustituya https://my-openclaw.fly.dev por el origen real de la aplicación de Fly. El inicio del Gateway genera los orígenes locales de la interfaz de control a partir de los valores de tiempo de ejecución --bind y --port, de modo que el primer arranque pueda continuar antes de que exista la configuración; sin embargo, el acceso desde el navegador a través de Fly sigue requiriendo que el origen HTTPS exacto aparezca en gateway.controlUi.allowedOrigins.El token de Discord puede proceder de cualquiera de estas fuentes:- Variable de entorno
DISCORD_BOT_TOKEN(recomendada para secretos); no es necesario añadirla a la configuración, ya que el Gateway la lee automáticamente - Archivo de configuración
channels.discord.token
Solución de problemas
«La aplicación no escucha en la dirección esperada»
El Gateway se enlaza a127.0.0.1 en lugar de 0.0.0.0.
Solución: añada --bind lan al comando del proceso en fly.toml.
Las comprobaciones de estado fallan o se rechaza la conexión
Fly no puede acceder al Gateway en el puerto configurado. Solución: asegúrese de queinternal_port coincida con el puerto del Gateway (--port 3000 o OPENCLAW_GATEWAY_PORT=3000).
Problemas de memoria/OOM
El contenedor continúa reiniciándose o el sistema finaliza su proceso. Indicadores: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 iniciarse con errores de «ya está en ejecución» después de reiniciar un contenedor. Los archivos de bloqueo del entorno de ejecución se encuentran en<tmpdir>/openclaw-<uid>/gateway.<hash>.lock
y gateway.state.<hash>.lock (Linux:
/tmp/openclaw-<uid>/gateway.*.lock), no en el volumen persistente /data, por lo que
un reinicio completo del contenedor normalmente los elimina junto con el resto del
sistema de archivos del contenedor. Si un bloqueo persiste (por ejemplo, un fly machine restart
que conserva el sistema de archivos del contenedor) e impide el inicio, elimínelo
manualmente:
No se lee la configuración
--allow-unconfigured solo omite la protección de inicio. No crea ni repara /data/openclaw.json, así que asegúrese de que la configuración real exista e incluya "gateway": { "mode": "local" } para iniciar normalmente un Gateway local.
Compruebe que la configuración exista:
Escritura de la configuración mediante SSH
fly ssh console -C no admite la 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 se pierden los perfiles de autenticación, el estado del canal/proveedor o las sesiones después de reiniciar, el directorio de estado está escribiendo en el sistema de archivos del contenedor en lugar de hacerlo en el volumen. Solución: asegúrese de queOPENCLAW_STATE_DIR=/data esté definido en fly.toml y vuelva a desplegar.
Actualización
git pull + fly deploy es la ruta supervisada en este caso: recompila la imagen a partir del Dockerfile, por lo que la versión de la CLI/del Gateway, la imagen base del sistema operativo y cualquier cambio en el Dockerfile se actualizan conjuntamente. Ejecutar openclaw update dentro del contenedor no es la misma operación, ya que la imagen se distribuye como un árbol dist/ compilado con Docker, sin un repositorio .git y sin una instalación global administrada por npm que pueda detectar; consulte Actualización para conocer ese flujo en instalaciones de tipo VM.
Actualización del comando de la máquina
Para cambiar el comando de inicio sin realizar un despliegue completo:fly deploy posterior restablece el comando de la máquina al valor definido en fly.toml; vuelva a aplicar los cambios manuales después de volver a desplegar.
Despliegue privado (reforzado)
De forma predeterminada, Fly asigna IP públicas, por lo que el Gateway está disponible enhttps://your-app.fly.dev y puede ser descubierto por escáneres de Internet (Shodan, Censys, etc.).
Use deploy/fly.private.toml para un despliegue reforzado sin IP pública: omite [http_service], por lo que no se asigna ninguna entrada pública.
Cuándo usar un despliegue privado
- Solo llamadas/mensajes salientes (sin webhooks entrantes)
- Los túneles de ngrok o Tailscale gestionan cualquier devolución de llamada de Webhook
- Se accede al Gateway mediante SSH, proxy o WireGuard en lugar de un navegador
- El despliegue debe permanecer oculto para los escáneres de Internet
Configuración
fly ips list debería mostrar solo una IP de tipo private:
Acceso a un despliegue privado
Opción 1: proxy local (la más sencilla)Webhooks con un despliegue privado
Para devoluciones de llamada de Webhook (Twilio, Telnyx, etc.) sin exposición pública:- túnel de ngrok: ejecutar ngrok dentro del contenedor o como contenedor auxiliar
- Tailscale Funnel: exponer rutas específicas mediante Tailscale
- Solo saliente: algunos proveedores (Twilio) funcionan para llamadas salientes sin webhooks
plugins.entries.voice-call.config:
webhookSecurity.allowedHosts en el nombre de host del túnel para que se acepten las cabeceras de host reenviadas.
Consideraciones de seguridad
Notas
- Fly.io utiliza arquitectura x86; el Dockerfile es compatible tanto con x86 como con ARM.
- Para la incorporación de WhatsApp/Telegram, utilice
fly ssh console. - Los datos persistentes se almacenan en el volumen ubicado en
/data. - Signal requiere signal-cli (una CLI basada en Java) en la imagen; utilice una imagen personalizada y mantenga la memoria en 2 GB o más.
Coste
Con la configuración recomendada (shared-cpu-2x, 2 GB de RAM), el coste aproximado es de $10-15 al mes, según el uso; el nivel gratuito cubre parte de la asignación básica. Consulte los precios de Fly.io para conocer las tarifas actuales.
Siguientes pasos
- Configurar canales de mensajería: Canales
- Configurar el Gateway: Configuración del Gateway
- Mantener OpenClaw actualizado: Actualización