生产部署:AWS ARM64 + systemd + Tailscale 参考架构
第39章:生产部署:AWS ARM64 + systemd + Tailscale 参考架构
概述
将 OpenClaw 部署到生产环境,意味着它需要 7×24 小时稳定运行,具备自动恢复能力,同时保持数据安全和访问安全。本章提供一套完整的参考架构:以 AWS t4g.xlarge ARM64 Graviton 实例为计算平台,systemd 管理服务生命周期,Tailscale 实现零公网暴露的安全访问,并配套完整的备份和更新策略。
39.1 AWS t4g.xlarge ARM64 Graviton 选型理由
为什么选择 ARM64 Graviton?
AWS Graviton3 系列处理器是 AWS 自研的 ARM64 芯片,在 OpenClaw 场景下有三项核心优势:
性价比
同类配置对比(4vCPU / 16GB RAM):
t4g.xlarge (ARM64): $0.1344/小时 → ~$98/月
t3.xlarge (x86_64): $0.1664/小时 → ~$121/月
成本节省: 约 19%
Node.js 性能
Node.js 22 在 ARM64 上经过专门优化,V8 引擎的 JIT 编译在 Graviton3 上性能出色。OpenClaw Gateway 的核心工作负载(JSON 序列化/反序列化、WebSocket 帧处理、Promise 链调度)在 ARM64 上的表现与 x86 基本持平甚至略优。
能耗与散热
ARM64 架构在同等性能下能耗更低,在 AWS 数据中心意味着更好的热密度表现,实例稳定性更高。
推荐实例规格
| 场景 | 实例类型 | vCPU | RAM | 月费(按需) |
|---|---|---|---|---|
| 个人/小团队 | t4g.medium | 2 | 4 GB | ~$24 |
| 标准生产 | t4g.xlarge | 4 | 16 GB | ~$98 |
| 高并发 | t4g.2xlarge | 8 | 32 GB | ~$196 |
| 多 Agent 实例 | c7g.2xlarge | 8 | 16 GB | ~$232 |
推荐用 Reserved Instance(1年期)可再节省约 38%,标准生产场景年费约 $728。
39.2 完整生产部署流程
步骤 1:创建 EC2 实例
# 使用 AWS CLI 创建实例(或通过控制台)
aws ec2 run-instances \
--image-id ami-0xxxxxxxxxxxxxxxxx \ # Ubuntu 24.04 LTS ARM64 AMI
--instance-type t4g.xlarge \
--key-name your-key-pair \
--security-group-ids sg-xxxxxxxxx \
--subnet-id subnet-xxxxxxxxx \
--block-device-mappings '[{
"DeviceName": "/dev/sda1",
"Ebs": {"VolumeSize": 50, "VolumeType": "gp3"}
}]' \
--tag-specifications 'ResourceType=instance,Tags=[{Key=Name,Value=openclaw-gateway}]'
安全组规则(最小化暴露原则):
入站规则:
SSH (22): 你的 IP 地址/32 (不要 0.0.0.0/0)
无其他入站端口
出站规则:
所有流量: 0.0.0.0/0 (允许 LLM API 调用)
18789 端口不对公网开放,通过 Tailscale 访问。
步骤 2:系统基础配置
# SSH 连接到实例
ssh -i ~/.ssh/your-key.pem ubuntu@<instance-ip>
# 更新系统
sudo apt update && sudo apt upgrade -y
# 安装基础工具
sudo apt install -y \
git curl wget unzip \
htop iotop nethogs \
fail2ban ufw \
logrotate
# 配置时区(UTC 推荐用于日志一致性)
sudo timedatectl set-timezone UTC
# 设置主机名
sudo hostnamectl set-hostname openclaw-gateway
# 配置 fail2ban(防暴力 SSH)
sudo systemctl enable fail2ban
sudo systemctl start fail2ban
步骤 3:防火墙配置
# 配置 UFW
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow from <your-ip>/32 to any port 22 # 仅允许你的 IP SSH
sudo ufw enable
# 验证规则
sudo ufw status verbose
步骤 4:安装 Node.js 24
# 方式一:NodeSource(推荐生产环境)
curl -fsSL https://deb.nodesource.com/setup_24.x | sudo -E bash -
sudo apt install -y nodejs
# 方式二:nvm(适合需要多版本管理)
curl -o- https://raw.githubusercontent.com/nvm-sh/nvm/v0.40.0/install.sh | bash
source ~/.bashrc
nvm install 24
nvm alias default 24
# 验证
node --version # v24.x.x
npm --version # 11.x.x
node -e "console.log(process.arch)" # arm64
步骤 5:安装 OpenClaw
# 全局安装 OpenClaw CLI
sudo npm install -g @openclaw/cli
# 验证
openclaw --version
# 运行生产初始化向导
openclaw onboard --mode production
openclaw onboard --mode production 执行以下操作:
- 创建
~/.openclaw/目录结构 - 引导配置主 LLM Provider 和 API Key
- 设置 Gateway 端口和认证
- 生成 Agent ID(
agentId,全局唯一) - 初始化记忆目录结构
- 运行环境健康检查
步骤 6:配置环境变量
不推荐将 API Key 直接写入配置文件。推荐使用环境变量或 AWS Secrets Manager。
# 创建环境变量文件(600 权限)
sudo mkdir -p /etc/openclaw
sudo tee /etc/openclaw/gateway.env > /dev/null << 'EOF'
ANTHROPIC_API_KEY=sk-ant-api03-xxxxxxxxxxxxxxxxxx
OPENAI_API_KEY=sk-proj-xxxxxxxxxxxxxxxxxx
OPENCLAW_GATEWAY_SECRET=your-random-secret-here
NODE_ENV=production
LOG_LEVEL=info
EOF
sudo chmod 600 /etc/openclaw/gateway.env
sudo chown root:openclaw-gateway /etc/openclaw/gateway.env
使用 AWS Secrets Manager(推荐企业环境):
# 从 Secrets Manager 获取密钥注入环境
aws secretsmanager get-secret-value \
--secret-id openclaw/production/api-keys \
--query SecretString \
--output text | \
jq -r 'to_entries[] | "\(.key)=\(.value)"' > /tmp/env-inject
步骤 7:生产 openclaw.json 配置
cat > ~/.openclaw/openclaw.json << 'EOF'
{
"model": "anthropic/claude-sonnet-4-6",
"fallbackModel": "openai/gpt-4.1-mini",
"agentId": "prod-gateway-01",
"gateway": {
"port": 18789,
"host": "127.0.0.1",
"authRequired": true
},
"thinking": {
"enabled": true,
"budget": 8000
},
"skills": {
"lazy": true,
"enabled": ["web-search", "code-exec"]
},
"context": {
"reserveFloor": 8000,
"softThreshold": 0.85
},
"lanes": {
"global": 4,
"subAgent": 8
},
"logging": {
"level": "info",
"output": "file",
"file": "/var/log/openclaw/gateway.log",
"maxSize": "100m",
"maxFiles": 14
},
"memory": {
"dir": "/var/lib/openclaw/memory",
"compaction": {
"enabled": true,
"threshold": 50000
}
}
}
EOF
步骤 8:创建专用用户和目录
# 创建系统用户
sudo useradd --system \
--home-dir /var/lib/openclaw \
--create-home \
--shell /usr/sbin/nologin \
openclaw-gateway
# 创建必要目录
sudo mkdir -p /var/log/openclaw /etc/openclaw
sudo chown openclaw-gateway:openclaw-gateway /var/log/openclaw
sudo chown -R openclaw-gateway:openclaw-gateway /var/lib/openclaw
# 移动配置到系统路径
sudo cp -r ~/.openclaw/* /var/lib/openclaw/
sudo chown -R openclaw-gateway:openclaw-gateway /var/lib/openclaw
步骤 9:创建 systemd 服务单元文件
sudo tee /etc/systemd/system/openclaw-gateway.service > /dev/null << 'EOF'
[Unit]
Description=OpenClaw AI Gateway
Documentation=https://docs.openclaw.ai
After=network-online.target
Wants=network-online.target
StartLimitIntervalSec=300
StartLimitBurst=5
[Service]
Type=simple
User=openclaw-gateway
Group=openclaw-gateway
# 执行命令
ExecStart=/usr/bin/openclaw gateway start \
--config /var/lib/openclaw/openclaw.json
# 工作目录
WorkingDirectory=/var/lib/openclaw
# 环境变量(不含密钥,密钥在 EnvironmentFile 中)
Environment=NODE_ENV=production
EnvironmentFile=/etc/openclaw/gateway.env
# 重启策略
Restart=always
RestartSec=10s
TimeoutStopSec=30s
# 日志
StandardOutput=append:/var/log/openclaw/gateway.log
StandardError=append:/var/log/openclaw/gateway-error.log
# 安全加固
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=strict
ProtectHome=read-only
ReadWritePaths=/var/lib/openclaw /var/log/openclaw
CapabilityBoundingSet=
AmbientCapabilities=
# 资源限制
LimitNOFILE=65536
LimitNPROC=512
MemoryMax=8G
CPUWeight=100
[Install]
WantedBy=multi-user.target
EOF
步骤 10:启动并验证服务
# 加载 systemd 配置
sudo systemctl daemon-reload
# 启用开机自启
sudo systemctl enable openclaw-gateway
# 启动服务
sudo systemctl start openclaw-gateway
# 检查状态
sudo systemctl status openclaw-gateway
# 实时日志
sudo journalctl -u openclaw-gateway -f
# 验证 Gateway 健康检查
curl http://127.0.0.1:18789/health
# {"status": "ok", "version": "4.2.1", "uptime": 45, "sessions": 0}
39.3 Tailscale 安装与 Serve 配置
为什么用 Tailscale 替代公网暴露?
直接在安全组开放 18789 端口存在以下风险:
- 端口扫描攻击
- 暴力破解 WebSocket 认证
- DDoS 攻击使 Gateway 过载
- 未加密的 WebSocket(若未配置 TLS)
Tailscale 基于 WireGuard 协议,提供:
- 零公网暴露:18789 端口仅在 Tailscale 虚拟网络内可访问
- 身份验证:所有客户端必须经过 Tailscale 认证,防止未授权访问
- 端到端 WireGuard 加密:比应用层 TLS 更底层
- NAT 穿透:无需为 Node 设备的网络做任何配置
安装 Tailscale
# 安装
curl -fsSL https://tailscale.com/install.sh | sh
# 启动并认证(使用你的 Tailscale 账号)
sudo tailscale up --authkey=tskey-auth-xxxxxxxx
# 获取 Tailscale IP 地址
tailscale ip -4
# 100.x.x.x
配置 Tailscale Serve
Tailscale Serve 将 Gateway 的本地端口通过 Tailscale 网络暴露,无需手动配置 TLS:
# 将本地 18789 通过 Tailscale 的 HTTPS 代理暴露(自动 TLS)
sudo tailscale serve --bg https / proxy 18789
# 查看 Serve 状态
tailscale serve status
# 输出示例:
# https://openclaw-gateway.tail-xxxx.ts.net/
# |-- / proxy http://127.0.0.1:18789
配置后,你可以通过以下地址访问 Control UI:
https://openclaw-gateway.tail-xxxx.ts.net/
只有加入同一 Tailscale 网络的设备才能访问此地址。
Node 设备连接配置
各 Node 设备(iPhone/Android/树莓派)通过以下方式连接 Gateway:
# 树莓派 Node 连接
openclaw node run \
--host openclaw-gateway.tail-xxxx.ts.net \
--port 443 \
--tls \
--display-name "Pi Node"
iOS/Android App 中配置 Gateway 地址时,同样填入 Tailscale 地址。
ACL 访问控制(可选)
在 Tailscale 管理控制台配置 ACL,限制哪些设备可以访问 Gateway:
{
"acls": [
{
"action": "accept",
"src": ["tag:openclaw-client"],
"dst": ["tag:openclaw-gateway:18789"]
}
],
"tagOwners": {
"tag:openclaw-gateway": ["autogroup:admin"],
"tag:openclaw-client": ["autogroup:admin"]
}
}
39.4 ~/.openclaw 的 git 化备份策略
OpenClaw 的核心数据(配置、记忆、技能)都存储在 ~/.openclaw/(或生产环境的 /var/lib/openclaw/)目录中。记忆以 Markdown 格式存储,天然适合 git 版本控制。
初始化 git 仓库
cd /var/lib/openclaw
# 初始化 git 仓库
git init
git config user.email "[email protected]"
git config user.name "OpenClaw Gateway"
# 创建 .gitignore
cat > .gitignore << 'EOF'
# 不提交 API Key 和敏感数据
*.env
.env*
logs/
*.log
# 不提交临时文件
tmp/
cache/
.tmp/
# 不提交二进制文件
uploads/
media/
*.mp4
*.jpg
*.png
EOF
# 首次提交
git add .
git commit -m "initial: openclaw production config"
配置远程仓库(私有)
# 使用 GitHub 私有仓库
git remote add origin [email protected]:your-org/openclaw-config.git
git push -u origin main
自动备份脚本
创建 /usr/local/bin/openclaw-backup.sh:
#!/bin/bash
set -euo pipefail
OPENCLAW_DIR="/var/lib/openclaw"
LOG_FILE="/var/log/openclaw/backup.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
cd "$OPENCLAW_DIR"
# 检查是否有变更
if git diff --quiet && git diff --cached --quiet; then
echo "[$DATE] No changes to commit" >> "$LOG_FILE"
exit 0
fi
# 提交变更
git add -A
git commit -m "auto: backup $(date '+%Y-%m-%d %H:%M')" >> "$LOG_FILE" 2>&1
# 推送到远程(静默失败,不影响 Gateway 运行)
git push origin main >> "$LOG_FILE" 2>&1 || \
echo "[$DATE] Push failed (will retry next cycle)" >> "$LOG_FILE"
echo "[$DATE] Backup completed" >> "$LOG_FILE"
chmod +x /usr/local/bin/openclaw-backup.sh
自动备份 systemd Timer
创建 /etc/systemd/system/openclaw-backup.timer:
[Unit]
Description=OpenClaw Config Backup Timer
[Timer]
OnCalendar=*:0/30 # 每30分钟运行一次
Persistent=true
[Install]
WantedBy=timers.target
创建 /etc/systemd/system/openclaw-backup.service:
[Unit]
Description=OpenClaw Config Backup
After=openclaw-gateway.service
[Service]
Type=oneshot
User=openclaw-gateway
ExecStart=/usr/local/bin/openclaw-backup.sh
sudo systemctl daemon-reload
sudo systemctl enable openclaw-backup.timer
sudo systemctl start openclaw-backup.timer
39.5 多实例部署隔离
当需要在同一台服务器运行多个 OpenClaw 实例(如区分生产/测试环境,或为不同用户提供隔离实例)时:
隔离原则
每个实例需要:
- 独立的 agentId:避免记忆和配置混淆
- 独立的工作目录:
/var/lib/openclaw-prod/、/var/lib/openclaw-staging/ - 独立的端口:18789(生产)、18790(测试)
- 独立的 systemd 服务:
openclaw-gateway-prod、openclaw-gateway-staging
多实例 systemd 服务(使用模板单元)
创建 /etc/systemd/system/[email protected]:
[Unit]
Description=OpenClaw Gateway (%i instance)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=openclaw-%i
EnvironmentFile=/etc/openclaw/%i.env
ExecStart=/usr/bin/openclaw gateway start \
--config /var/lib/openclaw-%i/openclaw.json
WorkingDirectory=/var/lib/openclaw-%i
Restart=always
RestartSec=10s
[Install]
WantedBy=multi-user.target
启动方式:
# 启动生产实例
sudo systemctl enable --now openclaw-gateway@prod
# 启动测试实例
sudo systemctl enable --now openclaw-gateway@staging
39.6 更新策略
更新渠道说明
| 渠道 | 稳定性 | 更新频率 | 适用场景 |
|---|---|---|---|
stable |
最稳定 | 每 4-8 周 | 生产环境(推荐) |
beta |
较稳定 | 每 1-2 周 | 测试环境、早期用户 |
dev |
可能不稳定 | 每天 | 开发和贡献者 |
配置更新渠道
# 查看当前渠道
openclaw update --channel
# 切换到 stable 渠道(生产推荐)
openclaw update --channel stable
# 检查可用更新(不执行更新)
openclaw update --check
# OpenClaw 4.2.1 → 4.2.2 (stable)
# Changelog: [Fix] Memory compaction edge case, [Perf] Tool routing 15% faster
自动更新脚本(维护窗口内执行)
创建 /usr/local/bin/openclaw-update.sh:
#!/bin/bash
set -euo pipefail
LOG="/var/log/openclaw/update.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')
echo "[$DATE] Checking for updates..." >> "$LOG"
# 检查更新
UPDATE_AVAILABLE=$(openclaw update --check --json | jq -r '.available')
if [ "$UPDATE_AVAILABLE" != "true" ]; then
echo "[$DATE] No update available" >> "$LOG"
exit 0
fi
NEW_VERSION=$(openclaw update --check --json | jq -r '.newVersion')
echo "[$DATE] Updating to $NEW_VERSION..." >> "$LOG"
# 备份当前配置
/usr/local/bin/openclaw-backup.sh
# 执行更新
sudo npm update -g @openclaw/cli >> "$LOG" 2>&1
# 重启服务
sudo systemctl restart openclaw-gateway
# 验证
sleep 5
HEALTH=$(curl -sf http://127.0.0.1:18789/health | jq -r '.status')
if [ "$HEALTH" = "ok" ]; then
echo "[$DATE] Update to $NEW_VERSION completed successfully" >> "$LOG"
else
echo "[$DATE] ERROR: Health check failed after update!" >> "$LOG"
exit 1
fi
使用 systemd Timer 在每周日凌晨2点执行:
# /etc/systemd/system/openclaw-update.timer
[Timer]
OnCalendar=Sun 02:00:00
Persistent=true
39.7 故障恢复流程
故障场景 1:Gateway 服务崩溃
# 检查服务状态
sudo systemctl status openclaw-gateway
# 查看最近错误日志
sudo journalctl -u openclaw-gateway --since "10 minutes ago" -p err
# 重启服务
sudo systemctl restart openclaw-gateway
# 若持续崩溃,检查 OOM
sudo dmesg | grep -i "oom\|killed"
# 临时增加内存限制
sudo systemctl set-property openclaw-gateway MemoryMax=12G
故障场景 2:配置损坏
# 回滚到上一次 git 提交
cd /var/lib/openclaw
git log --oneline -10 # 查看历史
git checkout HEAD~1 -- openclaw.json # 回滚单个文件
# 验证配置
openclaw config validate /var/lib/openclaw/openclaw.json
# 重启服务
sudo systemctl restart openclaw-gateway
故障场景 3:磁盘空间不足
# 检查磁盘使用
df -h /
# 清理日志
sudo journalctl --vacuum-size=500M
sudo find /var/log/openclaw -name "*.log.gz" -mtime +30 -delete
# 清理记忆中的大文件
du -sh /var/lib/openclaw/memory/*
故障场景 4:API Key 泄露紧急处置
# 立即停止 Gateway(断开所有连接)
sudo systemctl stop openclaw-gateway
# 在 LLM Provider 控制台吊销旧 Key,生成新 Key
# 更新环境变量文件
sudo vi /etc/openclaw/gateway.env
# 更新 ANTHROPIC_API_KEY 等
# 重启 Gateway
sudo systemctl start openclaw-gateway
# 审计最近调用日志
grep "api_key" /var/log/openclaw/gateway.log | tail -100
39.8 监控与健康检查
Gateway 健康检查端点
# 基础健康检查
curl http://127.0.0.1:18789/health
# {
# "status": "ok",
# "version": "4.2.1",
# "uptime": 86400,
# "sessions": {
# "active": 2,
# "total": 47
# },
# "nodes": {
# "online": 3,
# "offline": 1
# }
# }
# 详细状态(命令行)
openclaw gateway status
关键监控指标
| 指标 | 正常范围 | 告警阈值 |
|---|---|---|
| Session 成功率 | > 98% | < 95% |
| 工具错误率 | < 2% | > 5% |
| Compaction 频率 | < 5次/小时 | > 20次/小时 |
| Node 离线率 | < 5% | > 20% |
| 内存使用率 | < 70% | > 90% |
| API 响应时间 | < 2s | > 10s |
与 AWS CloudWatch 集成
# 安装 CloudWatch Agent
sudo apt install -y amazon-cloudwatch-agent
# 配置自定义指标推送
# 创建 /etc/openclaw/cloudwatch-config.json
39.9 小结
通过本章的完整部署流程,你已在 AWS ARM64 上建立了一个:
- 高可用:systemd Restart=always + 自动健康检查
- 安全:Tailscale 零公网暴露 + 最小权限用户
- 可维护:git 版本控制记忆 + 自动更新脚本
- 可观测:结构化日志 + 健康检查端点
的生产级 OpenClaw Gateway。下一章将深入性能调优,从 Token 成本到并发控制,进一步压榨性能潜力。
下一章:第40章 — 性能调优:Token 成本控制、Context 预算管理与并发 Lane 配置