Deployment Fly.io
Obiettivo: Gateway OpenClaw in esecuzione su una macchina Fly.io con storage persistente, HTTPS automatico e accesso Discord/canali.Cosa ti serve
- CLI
flyctlinstallata - Account Fly.io (il piano gratuito va bene)
- Autenticazione modello: API key per il provider di modelli scelto
- Credenziali canale: token bot Discord, token Telegram, ecc.
Percorso rapido per principianti
- Clona il repo → personalizza
fly.toml - Crea app + volume → imposta i secret
- Esegui il deployment con
fly deploy - Accedi via SSH per creare la configurazione oppure usa la UI di controllo
Crea l'app Fly
lhr (Londra), iad (Virginia), sjc (San Jose).Configura fly.toml
Modifica Impostazioni chiave:
fly.toml in modo che corrisponda al nome della tua app e ai tuoi requisiti.Nota di sicurezza: la configurazione predefinita espone un URL pubblico. Per un deployment con hardening senza IP pubblico, vedi Deployment privato oppure usa fly.private.toml.| Impostazione | Motivo |
|---|---|
--bind lan | Effettua il bind a 0.0.0.0 così il proxy di Fly può raggiungere il gateway |
--allow-unconfigured | Avvia senza un file di configurazione (lo creerai dopo) |
internal_port = 3000 | Deve corrispondere a --port 3000 (o OPENCLAW_GATEWAY_PORT) per gli health check di Fly |
memory = "2048mb" | 512MB sono troppo pochi; 2GB consigliati |
OPENCLAW_STATE_DIR = "/data" | Mantiene lo stato sul volume |
Imposta i secret
- I bind non loopback (
--bind lan) richiedono un percorso di autenticazione gateway valido. Questo esempio Fly.io usaOPENCLAW_GATEWAY_TOKEN, ma anchegateway.auth.passwordo un deploymenttrusted-proxynon loopback configurato correttamente soddisfano il requisito. - Tratta questi token come password.
- Preferisci le env var al file di configurazione per tutte le API key e i token. In questo modo i secret restano fuori da
openclaw.json, dove potrebbero essere esposti o registrati accidentalmente nei log.
Esegui il deployment
Crea il file di configurazione
Accedi via SSH alla macchina per creare una configurazione corretta:Crea la directory e il file di configurazione:Nota: con
OPENCLAW_STATE_DIR=/data, il percorso della configurazione è /data/openclaw.json.Nota: il token Discord può provenire da:- Variabile d’ambiente:
DISCORD_BOT_TOKEN(consigliato per i secret) - File di configurazione:
channels.discord.token
DISCORD_BOT_TOKEN.Riavvia per applicare:Risoluzione dei problemi
”App is not listening on expected address”
Il gateway sta facendo bind a127.0.0.1 invece che a 0.0.0.0.
Correzione: aggiungi --bind lan al comando del processo nel tuo fly.toml.
Health check che falliscono / connessione rifiutata
Fly non riesce a raggiungere il gateway sulla porta configurata. Correzione: assicurati cheinternal_port corrisponda alla porta del gateway (imposta --port 3000 o OPENCLAW_GATEWAY_PORT=3000).
OOM / problemi di memoria
Il container continua a riavviarsi o viene terminato. Segnali:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration oppure riavvii silenziosi.
Correzione: aumenta la memoria in fly.toml:
Problemi di lock del Gateway
Il Gateway rifiuta di avviarsi con errori del tipo “already running”. Questo succede quando il container si riavvia ma il file lock PID resta sul volume. Correzione: elimina il file lock:/data/gateway.*.lock (non in una sottodirectory).
La configurazione non viene letta
--allow-unconfigured aggira solo il controllo all’avvio. Non crea né ripara /data/openclaw.json, quindi assicurati che la tua configurazione reale esista e includa gateway.mode="local" quando vuoi un normale avvio locale del gateway.
Verifica che la configurazione esista:
Scrittura della configurazione via SSH
Il comandofly ssh console -C non supporta la redirezione della shell. Per scrivere un file di configurazione:
fly sftp può fallire se il file esiste già. Eliminalo prima:
Lo stato non persiste
Se perdi profili auth, stato del canale/provider o sessioni dopo un riavvio, la directory di stato sta scrivendo nel filesystem del container. Correzione: assicurati cheOPENCLAW_STATE_DIR=/data sia impostato in fly.toml e ridistribuisci.
Aggiornamenti
Aggiornamento del comando della macchina
Se devi cambiare il comando di avvio senza un nuovo deployment completo:fly deploy, il comando della macchina può tornare a quello in fly.toml. Se hai apportato modifiche manuali, riapplicale dopo il deployment.
Deployment privato (con hardening)
Per impostazione predefinita, Fly alloca IP pubblici, rendendo il tuo gateway accessibile suhttps://your-app.fly.dev. È pratico, ma significa che il tuo deployment è rilevabile dagli scanner internet (Shodan, Censys, ecc.).
Per un deployment con hardening senza esposizione pubblica, usa il template privato.
Quando usare il deployment privato
- Fai solo chiamate/messaggi in uscita (nessun webhook in ingresso)
- Usi tunnel ngrok o Tailscale per eventuali callback webhook
- Accedi al gateway tramite SSH, proxy o WireGuard invece che dal browser
- Vuoi che il deployment sia nascosto agli scanner internet
Configurazione
Usafly.private.toml invece della configurazione standard:
fly ips list dovrebbe mostrare solo un IP di tipo private:
Accesso a un deployment privato
Poiché non esiste un URL pubblico, usa uno di questi metodi: Opzione 1: proxy locale (più semplice)Webhook con deployment privato
Se hai bisogno di callback webhook (Twilio, Telnyx, ecc.) senza esposizione pubblica:- Tunnel ngrok - Esegui ngrok dentro il container o come sidecar
- Tailscale Funnel - Esponi percorsi specifici tramite Tailscale
- Solo uscita - Alcuni provider (Twilio) funzionano bene per chiamate in uscita anche senza webhook
webhookSecurity.allowedHosts sull’hostname pubblico del tunnel, in modo che gli header host inoltrati vengano accettati.
Vantaggi di sicurezza
| Aspetto | Pubblico | Privato |
|---|---|---|
| Scanner internet | Rilevabile | Nascosto |
| Attacchi diretti | Possibili | Bloccati |
| Accesso UI di controllo | Browser | Proxy/VPN |
| Consegna webhook | Diretta | Tramite tunnel |
Note
- Fly.io usa architettura x86 (non ARM)
- Il Dockerfile è compatibile con entrambe le architetture
- Per l’onboarding di WhatsApp/Telegram, usa
fly ssh console - I dati persistenti si trovano sul volume in
/data - Signal richiede Java + signal-cli; usa un’immagine personalizzata e mantieni la memoria a 2GB+.
Costo
Con la configurazione consigliata (shared-cpu-2x, 2GB RAM):
- ~$10-15/mese a seconda dell’utilizzo
- Il piano gratuito include una certa quota
Passi successivi
- Configura i canali di messaggistica: Canali
- Configura il Gateway: Configurazione del Gateway
- Mantieni OpenClaw aggiornato: Aggiornamento