第 39 章

生产部署: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 执行以下操作:

  1. 创建 ~/.openclaw/ 目录结构
  2. 引导配置主 LLM Provider 和 API Key
  3. 设置 Gateway 端口和认证
  4. 生成 Agent ID(agentId,全局唯一)
  5. 初始化记忆目录结构
  6. 运行环境健康检查

步骤 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 端口存在以下风险:

Tailscale 基于 WireGuard 协议,提供:

安装 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 实例(如区分生产/测试环境,或为不同用户提供隔离实例)时:

隔离原则

每个实例需要:

多实例 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 上建立了一个:

的生产级 OpenClaw Gateway。下一章将深入性能调优,从 Token 成本到并发控制,进一步压榨性能潜力。


下一章:第40章 — 性能调优:Token 成本控制、Context 预算管理与并发 Lane 配置

本章评分
4.8  / 5  (3 评分)

💬 留言讨论