Fly.io Deployment
Goal: Clawdbot Gateway running on a Fly.io machine with persistent storage, automatic HTTPS, and Discord/channel access.What you need
- flyctl CLI installed
- Fly.io account (free tier works)
- Model auth: Anthropic API key (or other provider keys)
- Channel credentials: Discord bot token, Telegram token, etc.
Beginner quick path
- Clone repo → customize
fly.toml - Create app + volume → set secrets
- Deploy with
fly deploy - SSH in to create config or use Control UI
1) Create the Fly app
lhr (London), iad (Virginia), sjc (San Jose).
2) Configure fly.toml
Editfly.toml to match your app name and requirements:
| Setting | Why |
|---|---|
--bind lan | Binds to 0.0.0.0 so Fly’s proxy can reach the gateway |
--allow-unconfigured | Starts without a config file (you’ll create one after) |
memory = "2048mb" | 512MB is too small; 2GB recommended |
CLAWDBOT_STATE_DIR = "/data" | Persists state on the volume |
3) Set secrets
- Non-loopback binds (
--bind lan) requireCLAWDBOT_GATEWAY_TOKENfor security. - Treat these tokens like passwords.
4) Deploy
5) Create config file
SSH into the machine to create a proper config:CLAWDBOT_STATE_DIR=/data, the config path is /data/clawdbot.json.
Note: The Discord token can come from either:
- Environment variable:
DISCORD_BOT_TOKEN(recommended for secrets) - Config file:
channels.discord.token
DISCORD_BOT_TOKEN automatically.
Restart to apply:
6) Access the Gateway
Control UI
Open in browser:https://my-clawdbot.fly.dev/
Paste your gateway token (the one from CLAWDBOT_GATEWAY_TOKEN) to authenticate.
Logs
SSH Console
Troubleshooting
”App is not listening on expected address”
The gateway is binding to127.0.0.1 instead of 0.0.0.0.
Fix: Add --bind lan to your process command in fly.toml.
OOM / Memory Issues
Container keeps restarting or getting killed. Signs:SIGABRT, v8::internal::Runtime_AllocateInYoungGeneration, or silent restarts.
Fix: Increase memory in fly.toml:
Gateway Lock Issues
Gateway refuses to start with “already running” errors. This happens when the container restarts but the PID lock file persists on the volume. Fix: Delete the lock file:/data/gateway.*.lock (not in a subdirectory).
Config Not Being Read
If using--allow-unconfigured, the gateway creates a minimal config. Your custom config at /data/.clawdbot/clawdbot.json should be read on restart.
Verify the config exists:
Writing Config via SSH
Thefly ssh console -C command doesn’t support shell redirection. To write a config file:
fly sftp may fail if the file already exists. Delete first:
Updates
Updating Machine Command
If you need to change the startup command without a full redeploy:fly deploy, the machine command may reset to what’s in fly.toml. If you made manual changes, re-apply them after deploy.
Notes
- Fly.io uses x86 architecture (not ARM)
- The Dockerfile is compatible with both architectures
- For WhatsApp/Telegram onboarding, use
fly ssh console - Persistent data lives on the volume at
/data
Cost
With the recommended config (shared-cpu-2x, 2GB RAM):
- ~$10-15/month depending on usage
- Free tier includes some allowance