介绍
# Deploy Moltbot to Fly.io
将 Moltbot (Clawdbot) 部署到 Fly.io,配置正确的环境、持久化存储和设备配对。
## 概述
将 Moltbot 部署到 Fly.io 需要: 1. 搭建带有持久化卷的 Fly 应用 2. 配置环境密钥(API keys、gateway token) 3. 创建包含令牌认证的配置文件 4. 批准设备配对以访问 Web UI
## 前置条件
在开始之前: - 已安装 Fly.io CLI (`brew install flyctl` 或 `curl -L https://fly.io/install.sh | sh`) - 已拥有 Fly.io 账户并登录 (`fly auth login`) - Anthropic API key(以及可选的 OpenAI API key) - 已安装 Git
## 第一阶段:克隆与设置
### 1.1 克隆 Moltbot 仓库
```bash git clone https://github.com/clawdbot/clawdbot.git moltbot-deploy cd moltbot-deploy ```
### 1.2 生成 Gateway Token
生成一个安全令牌用于认证:
```bash openssl rand -hex 32 ```
**重要:** 保存此令牌 - 你将在以下场景用到它: - Fly secrets - 配置文件 - Web UI 访问 URL
## 第二阶段:Fly.io 配置
### 2.1 创建 fly.toml
创建 `fly.toml` 并填入正确的配置:
```toml app = 'your-app-name' primary_region = 'iad'
[build] dockerfile = 'Dockerfile'
[env] NODE_ENV = 'production' CLAWDBOT_PREFER_PNPM = '1' CLAWDBOT_STATE_DIR = '/data' NODE_OPTIONS = '--max-old-space-size=1536'
[processes] app = "node dist/index.js gateway --allow-unconfigured --port 3000 --bind lan"
[http_service] internal_port = 3000 force_https = true auto_stop_machines = false auto_start_machines = true min_machines_running = 1 processes = ["app"]
[[vm]] size = 'shared-cpu-2x' memory = '2048mb'
[mounts] source = 'moltbot_data' destination = '/data' ```
**关键设置:** - `CLAWDBOT_STATE_DIR = '/data'` - 配置持久化所必需 - `--bind lan` - 允许 Fly 的代理访问网关 - `http_service` - 较新的 Fly 格式(非 `[[services]]`) - `memory = '2048mb'` - 512MB 太小;建议 2GB
### 2.2 创建应用和卷
```bash fly apps create your-app-name fly volumes create moltbot_data --region iad --size 1 -a your-app-name -y ```
选择一个离你较近的区域: - `iad` - 弗吉尼亚 (美国东部) - `lhr` - 伦敦 - `sjc` - 圣何塞 (美国西部)
### 2.3 设置 Fly Secrets
```bash # Set your generated token fly secrets set CLAWDBOT_GATEWAY_TOKEN="YOUR-TOKEN-HERE" -a your-app-name
# Set API keys fly secrets set ANTHROPIC_API_KEY="sk-ant-xxxxx" -a your-app-name fly secrets set OPENAI_API_KEY="sk-xxxxx" -a your-app-name # Optional ```
**注意:** Secrets 会在第一次 `fly deploy` 时部署,而非立即生效。
## 第三阶段:部署
部署应用:
```bash fly deploy -a your-app-name ```
首次部署大约需要 3-5 分钟(构建 Docker 镜像)。
**等待网关启动:** ```bash fly logs -a your-app-name --no-tail | grep "listening on" ```
你应该看到: ``` [gateway] listening on ws://0.0.0.0:3000 (PID xxx) ```
## 第四阶段:创建配置文件
**关键:** 配置文件必须包含与环境变量相同的令牌,认证才能生效。
### 4.1 SSH 进入机器
```bash fly ssh console -a your-app-name ```
### 4.2 创建配置文件
```bash cat > /data/moltbot.json << 'EOF' { "gateway": { "mode": "local", "bind": "lan", "auth": { "mode": "token", "token": "YOUR-TOKEN-HERE" } }, "agents": { "defaults": { "model": { "primary": "anthropic/claude-opus-4-5" } } }, "auth": { "profiles": { "anthropic:default": { "mode": "token", "provider": "anthropic" } } } } EOF ```
**将 `YOUR-TOKEN-HERE` 替换为你实际的令牌!**
### 4.3 退出并重启
```bash exit fly machine restart <machine-id> -a your-app-name ```
使用以下命令获取机器 ID:`fly machines list -a your-app-name`
## 第五阶段:访问与设备配对
### 5.1 等待 DNS 传播
DNS 可能需要 2-5 分钟传播。检查状态:
```bash nslookup your-app-name.fly.dev 8.8.8.8 ```
如果你的机器无法解析 DNS,请刷新 DNS 缓存:
**macOS:** ```bash sudo dscacheutil -flushcache; sudo killall -HUP mDNSResponder ```
**Linux:** ```bash sudo systemd-resolve --flush-caches ```
### 5.2 访问 Web UI
在浏览器中使用带令牌的 URL 打开:
``` https://your-app-name.fly.dev/?token=YOUR-TOKEN-HERE ```
你会看到 "disconnected (1008): pairing required" - 这是正常的!
### 5.3 批准设备配对
在浏览器保持打开并尝试连接时,批准配对:
```bash fly ssh console -a your-app-name ```
然后运行:
```bash node -e " const fs = require('fs'); const pending = JSON.parse(fs.readFileSync('/data/devices/pending.json')); const paired = JSON.parse(fs.readFileSync('/data/devices/paired.json') || '{}'); const requestId = Object.keys(pending)[0]; if (requestId) { const device = pending[requestId]; paired[device.deviceId] = { deviceId: device.deviceId, publicKey: device.publicKey, platform: device.platform, clientId: device.clientId, role: device.role, roles: device.roles, scopes: device.scopes, approvedAt: Date.now(), approvedBy: 'cli' }; delete pending[requestId]; fs.writeFileSync('/data/devices/pending.json', JSON.stringify(pending, null, 2)); fs.writeFileSync('/data/devices/paired.json', JSON.stringify(paired, null, 2)); console.log('Approved device:', device.deviceId); } else { console.log('No pending devices'); } " ```
### 5.4 刷新浏览器
批准后,刷新你的浏览器。现在你应该已经连接上了!🎉
## 故障排除
### Gateway Token 不匹配
**症状:** `unauthorized: gateway token mismatch`
**修复:** 配置文件中的令牌必须与环境变量匹配:
```bash # Check env var token fly ssh console -a your-app-name -C "printenv CLAWDBOT_GATEWAY_TOKEN"
# Update config file to match fly ssh console -a your-app-name # Edit /data/moltbot.json and update gateway.auth.token ```
### 应用未监听 / 连接被拒绝
**症状:** `instance refused connection` 或 `not listening on expected address`
**修复:** 确保 fly.toml 中包含 `--bind lan` 且网关已完全启动:
```bash fly logs -a your-app-name --no-tail | tail -50 ```
部署后等待 30-60 秒以供网关初始化。
### DNS 无法解析
**症状:** `Could not resolve host`
**修复:** 1. 等待 2-5 分钟以供 DNS 传播 2. 使用 Google DNS:`8.8.8.8` 或 `1.1.1.1` 3. 刷新本地 DNS 缓存(见第五阶段 5.1)
### 配置验证错误
**症状:** 网关退出并提示 "Invalid input" 或验证错误
**修复:** 检查配置语法:
```bash fly ssh console -a your-app-name -C "cat /data/moltbot.json" ```
常见问题: - **无效的 `auth.mode`**:只有 `"token"` 是有效的(而非 `"off"`) - JSON 中缺少逗号 - 引号不匹配
### 状态未持久化
**症状:** 重启后配置/设备重置
**修复:** 确保在 fly.toml 的 `[env]` 部分设置了 `CLAWDBOT_STATE_DIR=/data`。
### 部署卡住
**症状:** 机器不断重启或无法稳定运行
**终极方案(最快):**
```bash fly apps destroy your-app-name -y # Then re-run Phase 2 onwards with fresh setup ```
## 高级:受信任代理(可选)
如果在日志中看到代理警告,添加受信任代理:
```bash fly ssh console -a your-app-name ```
```bash node -e " const fs = require('fs'); const config = JSON.parse(fs.readFileSync('/data/moltbot.json')); config.gateway.trustedProxies = [ '172.16.0.0/12', '10.0.0.0/8' ]; fs.writeFileSync('/data/moltbot.json', JSON.stringify(config, null, 2)); console.log('Trusted proxies configured'); " ```
更改后重启机器。
## 快速参考
```bash # Check status fly status -a APP
# View logs fly logs -a APP --no-tail | tail -50
# SSH into machine fly ssh console -a APP
# Restart machine fly machines list -a APP # Get machine ID fly machine restart <machine-id> -a APP
# Check secrets fly secrets list -a APP
# Get gateway token fly ssh console -a APP -C "printenv CLAWDBOT_GATEWAY_TOKEN"
# Redeploy fly deploy -a APP ```
## 更新
要更新 Moltbot:
```bash cd moltbot-deploy git pull fly deploy -a your-app-name ```
配置和已配对的设备在更新过程中会保留在卷上。
## 关键要点
1. **`CLAWDBOT_STATE_DIR=/data`** 至关重要 - 没有它,配置位置将出错 2. **令牌必须同时存在于** 环境变量**和**配置文件中 3. **使用 `http_service`** 而非 `[[services]]`(较新的 Fly 格式) 4. **即使使用了令牌认证,设备配对也是必需的** 5. **DNS 需要时间** - 等待 2-5 分钟,如有需要请刷新缓存 6. **全新部署通常比** 调试损坏的状态**更快** 7. **最低 2GB RAM** - 512MB 会导致 OOM,1GB 或许可行但建议 2GB
## 资源
- [Fly.io 文档](https://fly.io/docs/) - [Moltbot 官方文档](https://docs.molt.bot/platforms/fly) - [Clawdbot GitHub](https://github.com/clawdbot/clawdbot)