Lo que necesitas
- CLI flyctl instalada
- Cuenta de Fly.io (el nivel gratuito funciona)
- Autenticación del modelo: clave de API para el proveedor de modelos elegido
- Credenciales de canal: token de bot de Discord, token de Telegram, etc.
Ruta rápida para principiantes
- Clona el repositorio, personaliza
fly.toml - Crea la app y el volumen, configura los secretos
- Despliega con
fly deploy - Entra por SSH para crear la configuración, o usa la Control UI
Crear la app de Fly
lhr (Londres), iad (Virginia), sjc (San José).Configurar fly.toml
Edita El punto de entrada de la imagen Docker de OpenClaw es
fly.toml para que coincida con el nombre de tu app y tus requisitos. El fly.toml rastreado del repositorio es la plantilla pública que se muestra abajo; deploy/fly.private.toml es la variante reforzada sin IP pública (consulta Despliegue privado).tini, que ejecuta node openclaw.mjs gateway de forma predeterminada. Fly [processes] reemplaza el CMD de Docker (aquí ejecuta node dist/index.js gateway ... directamente, el mismo punto de entrada compilado) sin tocar ENTRYPOINT, por lo que el proceso sigue ejecutándose bajo tini.Configuración clave:| Ajuste | Motivo |
|---|---|
--bind lan | Se enlaza a 0.0.0.0 para que el proxy de Fly pueda llegar al Gateway |
--allow-unconfigured | Inicia sin archivo de configuración (lo creas 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
--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 que no sea local loopback correctamente configurado también satisfacen el requisito. Consulta Gestión de secretos para el contrato SecretRef.Trata estos tokens como contraseñas. Prefiere variables de entorno/fly secrets frente al archivo de configuración para claves de API y tokens, de modo que los secretos no queden en openclaw.json.Desplegar
gateway ready cuando el listener HTTP/WebSocket está activo. La propia comprobación de estado de Fly supervisa internal_port = 3000 según fly.toml; la directiva Docker HEALTHCHECK de la imagen además consulta /healthz en su puerto predeterminado 18789, que aquí no se usa porque este despliegue sobrescribe el Gateway a --port 3000.Crear archivo de configuración
Entra por SSH en la máquina para crear una configuración adecuada:Con
OPENCLAW_STATE_DIR=/data, la ruta de configuración es /data/openclaw.json.Reemplaza https://my-openclaw.fly.dev por el origen real de tu app de Fly. El inicio del Gateway siembra los orígenes locales de Control UI a partir de los valores de runtime --bind y --port, de modo que el primer arranque pueda continuar antes de que exista la configuración, pero el acceso del navegador a través de Fly sigue necesitando el origen HTTPS exacto listado en gateway.controlUi.allowedOrigins.El token de Discord puede venir de cualquiera de estos lugares:- Variable de entorno
DISCORD_BOT_TOKEN(recomendado para secretos); no hace falta añadirlo a la configuración, el Gateway lo lee automáticamente - Archivo de configuración
channels.discord.token
Solución de problemas
”La app no está escuchando en la dirección esperada”
El Gateway se está vinculando a127.0.0.1 en lugar de 0.0.0.0.
Corrección: agrega --bind lan al comando de tu proceso en fly.toml.
Fallan las comprobaciones de estado / conexión rechazada
Fly no puede alcanzar el Gateway en el puerto configurado. Corrección: asegúrate de queinternal_port coincida con el puerto del Gateway (--port 3000 u 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.
Corrección: aumenta la memoria en fly.toml:
Problemas con el bloqueo del Gateway
El Gateway se niega a iniciar con errores de “already running” después de un reinicio del contenedor. El archivo de bloqueo de instancia única reside en<tmpdir>/openclaw-<uid>/gateway.<hash>.lock (Linux: /tmp/openclaw-<uid>/gateway.<hash>.lock), no en el volumen persistente /data, por lo que un reinicio completo del contenedor normalmente lo borra junto con el resto del sistema de archivos del contenedor. Si el bloqueo sobrevive (por ejemplo, un fly machine restart que conserva el sistema de archivos del contenedor) y bloquea el inicio, elimínalo manualmente:
La configuración no se lee
--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" } para un inicio normal del Gateway local.
Verifica que la configuración exista:
Escribir configuración mediante SSH
fly 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 canal/proveedor o sesiones después de un reinicio, el directorio de estado está escribiendo en el sistema de archivos del contenedor en lugar del volumen. Corrección: asegúrate de queOPENCLAW_STATE_DIR=/data esté configurado en fly.toml y vuelve a desplegar.
Actualización
git pull + fly deploy es la ruta supervisada aquí: reconstruye la imagen desde el Dockerfile, por lo que la versión de la CLI/Gateway, la imagen base del sistema operativo y cualquier cambio del Dockerfile se actualizan juntos. openclaw update dentro del contenedor en ejecución no es la misma operación, ya que la imagen se distribuye como un árbol dist/ construido con Docker sin checkout de .git ni instalación global administrada por npm que pueda detectar; consulta Actualización para ese flujo en instalaciones de tipo VM.
Actualizar el comando de la máquina
Para cambiar el comando de inicio sin un redespliegue completo:fly deploy posterior restablece el comando de la máquina a lo que esté en fly.toml; vuelve a aplicar los cambios manuales después de redesplegar.
Despliegue privado (reforzado)
De forma predeterminada, Fly asigna direcciones IP públicas, por lo que tu Gateway es accesible enhttps://your-app.fly.dev y detectable por escáneres de internet (Shodan, Censys, etc.).
Usa deploy/fly.private.toml para un despliegue reforzado sin IP pública: omite [http_service], por lo que no se asigna entrada pública.
Cuándo usar un despliegue privado
- Solo llamadas/mensajes salientes (sin Webhook entrantes)
- Los túneles de ngrok o Tailscale gestionan cualquier devolución de llamada de Webhook
- El acceso al Gateway es mediante SSH, proxy o WireGuard en lugar de un navegador
- El despliegue debe estar oculto de los escáneres de internet
Configuración
fly ips list debería mostrar solo una IP de tipo private:
Acceder a un despliegue privado
Opción 1: proxy local (la más sencilla)Webhooks con despliegue privado
Para callbacks de 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 para llamadas salientes sin Webhooks
plugins.entries.voice-call.config:
webhookSecurity.allowedHosts con el nombre de host del túnel para que se acepten los encabezados de host reenviados.
Compensaciones 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; el Dockerfile es compatible tanto con x86 como con ARM.
- Para la incorporación de WhatsApp/Telegram, usa
fly ssh console. - Los datos persistentes residen en el volumen en
/data. - Signal requiere signal-cli (una CLI basada en Java) en la imagen; 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), espera aproximadamente entre 10 y 15 USD al mes, según el uso; el nivel gratuito cubre cierta asignación básica. Consulta los precios de Fly.io para ver las tarifas actuales.
Próximos pasos
- Configura canales de mensajería: Canales
- Configura el Gateway: Configuración del Gateway
- Mantén OpenClaw actualizado: Actualización