Skip to main content
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é 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

  1. Clonar el repositorio y personalizar fly.toml
  2. Crear la aplicación y el volumen, y establecer los secretos
  3. Desplegar con fly deploy
  4. Acceder mediante SSH para crear la configuración o usar la interfaz de control
1

Crear la aplicación de Fly

Elija una región cercana. Opciones habituales: lhr (Londres), iad (Virginia), sjc (San José).
2

Configurar fly.toml

Edite 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).
El punto de entrada de la imagen Docker de OpenClaw es 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

Los enlaces fuera de loopback (--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

El primer despliegue compila la imagen Docker. Verifique el resultado después del despliegue:
Los registros de inicio del Gateway muestran 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
Reinicie para aplicar los cambios:
6

Acceder al Gateway

Interfaz de control

También puede visitar https://my-openclaw.fly.dev/.Autentíquese con el secreto compartido configurado: el token del Gateway de OPENCLAW_GATEWAY_TOKEN o la contraseña si cambió a la autenticación mediante contraseña.

Registros

Consola SSH

Solución de problemas

«La aplicación no escucha en la dirección esperada»

El Gateway se enlaza a 127.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 que internal_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:
También puede actualizar una máquina existente:
512 MB es insuficiente. 1 GB puede funcionar, pero podría producirse un error OOM bajo carga o con registros detallados. Se recomiendan 2 GB.

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 que OPENCLAW_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:
Un 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 en https://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

También puede convertir un despliegue existente:
Después de esto, 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)
Opción 2: VPN WireGuard
Opción 3: solo SSH

Webhooks con un despliegue privado

Para devoluciones de llamada de Webhook (Twilio, Telnyx, etc.) sin exposición pública:
  1. túnel de ngrok: ejecutar ngrok dentro del contenedor o como contenedor auxiliar
  2. Tailscale Funnel: exponer rutas específicas mediante Tailscale
  3. Solo saliente: algunos proveedores (Twilio) funcionan para llamadas salientes sin webhooks
Ejemplo de configuración de llamadas de voz con ngrok, en plugins.entries.voice-call.config:
El túnel de ngrok se ejecuta dentro del contenedor y proporciona una URL pública de Webhook sin exponer la propia aplicación de Fly. Establezca 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

Contenido relacionado