在 AICoder 上部署 OpenClaw
本文基于 OpenClaw 2026.5.22 (a374c3a) 编写。
本文介绍如何在平台提供的免费 2C4G AICoder 开发实例上部署 OpenClaw Gateway。完成配置后,您可以通过浏览器打开 Control UI,连接模型 API,并在网页对话中验证 OpenClaw 是否可用;模型 API 调用仍由上游模型服务按用量计费。
本文不使用 systemd 管理 Gateway。AICoder 更接近容器化开发环境,适合用 PM2 托管 openclaw gateway run 这样的前台进程。
信息
本文尽量使用可复制的 CLI 命令完成 OpenClaw 初始化、模型配置和 Gateway 启动。其中 OpenClaw onboarding 使用非交互模式,适合在 AICoder 终端、脚本或 Agent 辅助操作中复用。AICoder 实例连接、端口转发、Control UI 登录和设备批准仍需要人工确认。
Step 0 开始前确认版本、账号和密钥
开始之前,先准备好这些内容:
| 项目 | 说明 |
|---|---|
| AICoder 实例 | 用于运行 OpenClaw Gateway。 |
| SSH 连接信息 | 用于通过 VS Code Remote SSH 连接 AICoder。 |
| 模型 API Key | OpenClaw 调用模型时使用。 |
| 模型 Base URL | 例如 OpenAI-compatible 或 Anthropic-compatible API 地址。 |
| 模型 ID | 上游模型服务要求的模型 ID。 |
信息
本文只覆盖 OpenClaw Gateway、模型配置和 Control UI 验证。即时通讯渠道接入方式较多,且每个渠道的应用创建、权限、回调和配对流程都不同,建议在 OpenClaw 基础能力验证通过后再单独配置。
如果后续需要接入飞书,可以先参考:在飞书中安装插件。
确认 AICoder 的运行限制
AICoder 可以作为轻量开发实例使用,但它和完整云服务器不完全一样:
- AICoder 通常没有直接对公网暴露的 HTTP 入口。
- 容器内通常没有可用的
systemd --user。 - 免费实例更适合开发、验证和轻量长期任务;如果实例被重置,根文件系统里的安装和配置会丢失。
这些限制会影响操作方式:
- 不使用
openclaw gateway install/start/restart/stop这类依赖 daemon 的命令。 - 使用 PM2 管理 Gateway 进程。
- 通过 VS Code 端口转发或 SSH 隧道访问 Control UI。
Step 1 连接 AICoder 实例
先把本机 SSH 公钥加入平台,再用 VS Code Remote SSH 连接 AICoder。连接成功后,后续命令都在 AICoder 终端中执行。
添加 SSH 公钥
AICoder 使用 SSH 密钥连接。请先在智算云平台添加本机 SSH 公钥。
如果还没有 SSH 公钥,可以在本地终端生成:
ssh-keygen -t ed25519 -C "aicoder-openclaw"然后将公钥内容添加到智算云平台:
cat ~/.ssh/id_ed25519.pub复制 AICoder SSH 连接信息
登录智算云平台。
打开 AICoder。
等待实例初始化完成。
复制平台提供的 SSH 连接信息,通常包含
Host、HostName、ProxyJump和User。
使用 VS Code Remote SSH 连接实例
打开 VS Code,确保已安装 Remote - SSH 扩展。如果您不熟悉 VS Code 远程开发流程,可以先参考下面的教程:
在本地 ~/.ssh/config 中添加平台提供的 SSH 配置。下面只是示例,请替换成您自己的实例信息:
Host aic-example
HostName aic-example
ProxyJump ssh-jumper.neogpu.com
User root
ExitOnForwardFailure yes
ServerAliveInterval 30
ServerAliveCountMax 3打开 VS Code,使用 Remote - SSH 连接这个 Host。
验证实例可以访问外网
在 AICoder 终端中执行:
curl -I https://registry.npmjs.org/看到 HTTP/1.1 200 OK、HTTP/2 200 或重定向响应,都说明基础网络可用。
Step 2 安装运行环境
这一部分安装 OpenClaw 需要的 Node.js、pnpm 和 PM2。建议按顺序执行,先确认 Node.js 版本,再安装 OpenClaw。
安装 Node.js 22 或更高版本
OpenClaw 2026.5.22 需要 Node.js 22.19 或更高版本。先安装 Node.js 22:
apt-get update
apt-get install -y curl ca-certificates gnupg
curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt-get install -y nodejs执行下面的命令确认版本满足要求:
node -e '
const [major, minor] = process.versions.node.split(".").map(Number);
if (major < 22 || (major === 22 && minor < 19)) {
console.error(`Node.js 22.19+ required; found ${process.version}`);
process.exit(1);
}
console.log(process.version);
'安装 pnpm 和 PM2
OpenClaw 用 pnpm 安装,Gateway 用 PM2 托管。AICoder 环境里下载 npm 包可能受网络波动影响,建议先设置 npm 镜像源,再安装这两个命令:
npm config set registry https://registry.npmmirror.com
npm install -g pnpm pm2安装 pnpm 后,也把同一个镜像源写入 pnpm 配置:
pnpm config set registry https://registry.npmmirror.com安装 OpenClaw
本文推荐用 pnpm 安装 OpenClaw。我们在 OpenClaw 2026.5.22 上观察到,npm install -g openclaw@2026.5.22 可能在原生可选依赖解包阶段变得很慢;pnpm add -g 的安装路径更稳定。
先为 pnpm 配置全局命令目录:
export PNPM_HOME="$HOME/.local/share/pnpm"
mkdir -p "$PNPM_HOME"
case ":$PATH:" in
*":$PNPM_HOME:"*) ;;
*) export PATH="$PNPM_HOME:$PATH" ;;
esac
if ! grep -q 'PNPM_HOME' "$HOME/.bashrc" 2>/dev/null; then
cat >>"$HOME/.bashrc" <<'EOF'
export PNPM_HOME="$HOME/.local/share/pnpm"
export PATH="$PNPM_HOME:$PATH"
EOF
fi
pnpm config set global-bin-dir "$PNPM_HOME"安装本文使用的 OpenClaw 版本:
pnpm add -g openclaw@2026.5.22验证命令是否可用:
openclaw --version
pm2 --version期望看到类似输出:
OpenClaw 2026.5.22 (a374c3a)Step 3 初始化 OpenClaw
初始化会写入模型 Provider、默认模型和 Gateway 认证配置。这里先准备模型参数和 Gateway Token,再用非交互 onboarding 一次写入基础配置。
准备模型和 Gateway Token
先设置模型 API 信息。下面的值请替换成您的真实服务信息:
export MODEL_API_KEY="sk-your-model-api-key"
export MODEL_BASE_URL="https://api.example.com/v1"
export MODEL_ID="your-model-id"
export MODEL_PROVIDER_ID="custom-api-provider"
export MODEL_COMPATIBILITY="openai"MODEL_COMPATIBILITY 用来告诉 OpenClaw 这个自定义服务使用哪种协议:
- OpenAI Chat Completions-compatible 接口:使用
openai。 - Anthropic Messages-compatible 接口:使用
anthropic。
接下来生成一个 Gateway Token,并把它保存到 ~/.openclaw/.env。可以把这个 token 理解成 Control UI 登录 Gateway 的管理员密码:后面启动 Gateway、检查健康状态、生成登录 URL 时,都会从这个文件读取它。
mkdir -p "$HOME/.openclaw"
touch "$HOME/.openclaw/.env"
chmod 600 "$HOME/.openclaw/.env"
if ! grep -q '^OPENCLAW_GATEWAY_TOKEN=' "$HOME/.openclaw/.env"; then
printf 'OPENCLAW_GATEWAY_TOKEN=%s\n' \
"$(node -e 'console.log(require("crypto").randomBytes(24).toString("hex"))')" \
>> "$HOME/.openclaw/.env"
fi
set -a
. "$HOME/.openclaw/.env"
set +a警告
本文使用明确的 OPENCLAW_GATEWAY_TOKEN,是为了避免后续再从 openclaw dashboard --no-open 输出里寻找自动生成 token。OpenClaw 对 Control UI 认证比较严格,提前固定 token 来源会让排查更简单。
使用非交互模式写入基础配置
执行 onboarding:
openclaw onboard --non-interactive \
--accept-risk \
--mode local \
--auth-choice custom-api-key \
--custom-base-url "$MODEL_BASE_URL" \
--custom-model-id "$MODEL_ID" \
--custom-api-key "$MODEL_API_KEY" \
--custom-provider-id "$MODEL_PROVIDER_ID" \
--custom-compatibility "$MODEL_COMPATIBILITY" \
--secret-input-mode plaintext \
--gateway-port 18789 \
--gateway-bind loopback \
--gateway-auth token \
--gateway-token-ref-env OPENCLAW_GATEWAY_TOKEN \
--no-install-daemon \
--skip-skills \
--skip-health \
--skip-ui \
--suppress-gateway-token-output \
--json这条命令会完成这些事:
- 将 Gateway 设置为本地模式。
- 将 Gateway 绑定到
127.0.0.1:18789。 - 写入自定义模型 Provider。
- 使用
OPENCLAW_GATEWAY_TOKEN作为 Control UI 认证 token 的来源。 - 跳过 daemon 安装,避免在 AICoder 容器里触发
systemd相关错误。
提示
本文为了让步骤更容易复制,使用 --secret-input-mode plaintext 保存模型 API Key。单用户 AICoder 环境通常可以接受这种方式。若您需要更严格的密钥管理,可以改用 SecretRef,但要确保 Gateway 进程能读取对应环境变量或文件。
设置默认模型
把模型引用保存成变量:
export MODEL_REF="${MODEL_PROVIDER_ID}/${MODEL_ID}"将模型加入 OpenClaw 的 agent 模型列表:
cat >/tmp/openclaw-agent-models.json <<EOF
{
"$MODEL_REF": {
"alias": "$MODEL_ID"
}
}
EOF
openclaw config set agents.defaults.models "$(cat /tmp/openclaw-agent-models.json)" \
--strict-json \
--merge再把它设为默认模型:
openclaw models set "$MODEL_REF"信息
agents.defaults.models 决定模型是否出现在 OpenClaw 的模型选择列表里;agents.defaults.model.primary 决定新会话默认使用哪个模型。openclaw models set 会处理默认模型设置。这里先显式写入 agents.defaults.models,是为了让自定义模型在 UI 和 /model 相关入口里更明确。
验证配置文件可以通过校验
执行:
openclaw config validate
openclaw models status重点检查:
Configured models里包含${MODEL_PROVIDER_ID}/${MODEL_ID}。Default指向${MODEL_PROVIDER_ID}/${MODEL_ID}。- 没有配置校验错误。
Step 4 启动 Gateway
完成配置后,用 PM2 启动 openclaw gateway run。这样即使 SSH 会话断开,Gateway 也可以继续运行,并且可以通过 PM2 查看日志。
用 PM2 启动 OpenClaw Gateway
先确保没有旧的 PM2 进程占用同名服务:
pm2 delete openclaw-gateway 2>/dev/null || true再启动 Gateway:
OPENCLAW_BIN="$(command -v openclaw)"
pm2 start bash --name openclaw-gateway -- -lc \
"set -a; [ -f \"\$HOME/.openclaw/.env\" ] && . \"\$HOME/.openclaw/.env\"; set +a; OPENCLAW_NO_RESPAWN=1 exec \"$OPENCLAW_BIN\" gateway run --verbose"这个命令有两个重点:
- PM2 负责进程常驻、日志和重启。
bash -lc "... exec openclaw gateway run"会先加载~/.openclaw/.env,再用exec把 shell 替换成真正的 Gateway 进程。
保存 PM2 进程列表
pm2 savepm2 save 保存的是当前 PM2 进程清单。它不会让 AICoder 在实例被重置后自动恢复所有内容,但能在 PM2 状态恢复时保留这次启动结果。
查看状态和日志
pm2 status
pm2 logs openclaw-gateway --lines 50看到 openclaw-gateway 为 online 后,再检查 Gateway 健康状态:
set -a
. "$HOME/.openclaw/.env"
set +a
openclaw health --json"ok": true 表示 Gateway 已经可以响应。
重启或停止 Gateway
后续日常管理统一使用 PM2:
pm2 restart openclaw-gateway
pm2 stop openclaw-gateway
pm2 logs openclaw-gateway --lines 100
pm2 status在 AICoder 中不要使用 openclaw gateway start、openclaw gateway stop 或 openclaw gateway restart 作为主要管理方式。这些命令通常面向系统服务环境,而本文的 Gateway 是由 PM2 托管的前台进程。
Step 5 验证 OpenClaw 可用
启动后先用 CLI 检查 Gateway 和模型状态。确认这些检查通过后,再打开浏览器做真实对话测试。
检查 Gateway 健康状态
如果您打开了新的终端,先加载 Gateway Token,再检查健康状态:
set -a
. "$HOME/.openclaw/.env"
set +a
openclaw health --json重点看这些字段:
ok为true。plugins.errors为空数组。defaultAgentId通常为main。
如果刚启动后看到 eventLoop.degraded: true,可以等待几十秒后重试。启动阶段 CPU 或磁盘繁忙时,短暂的 event loop 降级不一定代表 Gateway 不可用。
检查模型配置状态
openclaw models status
openclaw models list确认默认模型和配置模型都指向您的 MODEL_REF。
检查整体状态
openclaw status如果 Gateway 行显示 reachable,并且模型状态正确,就可以打开 Control UI 做一次真实对话测试。
Step 6 打开 Control UI
Control UI 运行在 AICoder 实例内部的 127.0.0.1:18789。您需要先做端口转发,再使用 Gateway Token 打开页面。
配置端口转发
AICoder 是远程实例,http://127.0.0.1:18789/ 指的是 AICoder 实例内部。需要先把远程端口转发到本地。
如果您使用 VS Code Remote SSH,打开 PORTS / 端口 面板,添加端口:
18789也可以在本地终端使用 SSH 隧道。请把 aic-example 换成您的 SSH Host:
ssh -L 18789:127.0.0.1:18789 aic-example使用 Gateway Token 登录
在 AICoder 终端中生成带 token 的本地访问地址:
set -a
. "$HOME/.openclaw/.env"
set +a
printf 'http://127.0.0.1:18789/#token=%s\n' "$OPENCLAW_GATEWAY_TOKEN"复制输出的 URL,在本地浏览器打开。
警告
URL 里的 #token=... 是管理员凭据。不要发给别人,也不要贴到公开日志里。OpenClaw 2026.5.22 的 dashboard auto-auth URL 使用 URL fragment,而不是 ?token=... 查询参数;这样浏览器请求和服务端日志更不容易带上 token。
如果页面仍提示缺少 token,可以手动把 OPENCLAW_GATEWAY_TOKEN 的值粘贴到 Control UI 的认证输入框中。
批准浏览器设备请求
Control UI 第一次连接 Gateway 时,可能会触发设备授权请求。回到 AICoder 终端执行:
openclaw devices approve --latest--latest 只会展示最新待批准请求,不会直接批准。确认输出里的设备和请求范围后,按提示执行:
openclaw devices approve <requestId>批准后刷新 Control UI,进入 Chat 页面,发送一条简单消息:
您好,请用一句话介绍您自己。如果模型配置正确,OpenClaw 会返回模型回复。
处理 scope upgrade pending approval
如果批准设备时看到类似错误:
gateway connect failed: GatewayClientRequestError: scope upgrade pending approval
Direct scope access failed; using local fallback.
Approved ...这不是最终失败。含义是:当前 CLI 设备通过 Gateway 发起审批时,请求的权限比它已有权限更高;OpenClaw 阻止了这次 Gateway 路径的权限升级,但本地 CLI 又通过 local fallback 完成了审批。
接着执行:
openclaw devices approve --latest如果它提示某个已经配对的 CLI 设备正在请求更高权限,按提示批准那个 exact request:
openclaw devices approve <cli-upgrade-request-id>再执行一次:
openclaw devices approve --latest看到 No pending device pairing requests to approve 后,设备授权就处理完了。
Step 7 可选:调整模型能力
本节只在您的模型需要额外声明能力时使用。如果基础对话已经正常,可以先跳过。
设置上下文窗口和最大输出长度
自定义模型有时需要手动补充上下文窗口和最大输出长度。下面示例假设模型位于当前 Provider 的 models[0]:
openclaw config set "models.providers.${MODEL_PROVIDER_ID}.models[0].contextWindow" 128000
openclaw config set "models.providers.${MODEL_PROVIDER_ID}.models[0].maxTokens" 8192如果同一个 Provider 下有多个模型,请先查看当前配置再调整索引:
openclaw config get "models.providers.${MODEL_PROVIDER_ID}.models"声明图片输入能力
如果模型支持图片输入,可以把输入能力改成 ["text", "image"]:
openclaw config set "models.providers.${MODEL_PROVIDER_ID}.models[0].input" '["text","image"]' --strict-json再把它设置为图片理解模型:
openclaw models set-image "$MODEL_REF"配置 reasoning 或 thinking 参数
如果模型支持 reasoning,可以先声明模型具备 reasoning 能力:
openclaw config set "models.providers.${MODEL_PROVIDER_ID}.models[0].reasoning" true --strict-json官方内置 provider 通常已经包含对应模型家族需要的兼容处理。使用自定义 API provider 时,OpenClaw 只知道您声明的通用协议和字段,不会自动获得内置 provider 的专用处理。
因此,自定义 API provider 要特别谨慎:不要只因为模型名字包含 reasoning 或 thinking,就直接添加请求体字段。若模型需要额外参数,请先查阅对应模型家族的配置文档,再决定是否配置 extra_body、compat 或其他专用字段。
Step 8 可选:配置 Memory Search
OpenClaw 可以使用 Memory Search 检索历史会话和文件内容。AICoder 环境访问外部模型仓库可能较慢,如果本地 embedding 模型下载失败,可以改用远程 embedding API。
配置远程 Embedding 接口
下面示例使用 OpenAI-compatible embedding 接口。请替换成您自己的 embedding 模型、Base URL 和 API Key:
openclaw config set agents.defaults.memorySearch.provider "openai"
openclaw config set agents.defaults.memorySearch.model "text-embedding-3-small"
openclaw config set agents.defaults.memorySearch.remote.baseUrl "https://api.example.com/v1/"
openclaw config set agents.defaults.memorySearch.remote.apiKey "sk-your-embedding-api-key"如果需要自定义 Header:
openclaw config set agents.defaults.memorySearch.remote.headers '{"X-Organization":"org-id"}' --strict-json验证 Memory Search 状态
openclaw doctor --non-interactive查看输出里的 Memory Search 相关检查。如果只是想先完成 OpenClaw 基础部署,Memory Search 可以稍后再处理。
常见问题
下面列出的是在 AICoder 上部署 OpenClaw 时最容易遇到的问题。优先检查 PM2 进程、Gateway Token、设备授权和版本升级这几类问题。
为什么不使用 systemd 或 openclaw gateway start
AICoder 更像容器化开发环境,通常没有完整的 systemd --user。openclaw gateway install/start/restart/stop 这类命令在这种环境中容易遇到 systemctl --user unavailable。
本文使用 PM2,是为了让 Gateway 在 SSH 断开后继续运行,并提供统一的日志、状态和重启入口。
PM2 显示 online 但 Gateway 不可用怎么办
先确认谁在监听 18789:
pm2 describe openclaw-gateway
ss -ltnp | grep 18789 || true
ps -ef | grep openclaw | grep -v grep如果 PM2 托管的不是实际监听端口的进程,删除旧进程后重新启动:
pm2 delete openclaw-gateway 2>/dev/null || true
OPENCLAW_BIN="$(command -v openclaw)"
pm2 start bash --name openclaw-gateway -- -lc \
"set -a; [ -f \"\$HOME/.openclaw/.env\" ] && . \"\$HOME/.openclaw/.env\"; set +a; OPENCLAW_NO_RESPAWN=1 exec \"$OPENCLAW_BIN\" gateway run --verbose"OpenClaw 安装卡住怎么办
如果 npm install -g openclaw@2026.5.22 卡住,先确认是否有正在运行的 Gateway 使用同一个全局安装目录:
pm2 stop openclaw-gateway 2>/dev/null || true然后改用本文的 pnpm add -g openclaw@2026.5.22 安装方式。我们在实际环境中观察到,pnpm 对这个版本的全局安装更快也更稳定。
Control UI 为什么提示缺少 token
本文把 Gateway Token 存在 ~/.openclaw/.env 的 OPENCLAW_GATEWAY_TOKEN 中,并通过 SecretRef 提供给 OpenClaw。由于 token 来源是外部环境变量,openclaw dashboard --no-open 不一定会把 token 直接显示出来。
使用下面的命令生成可直接打开的 URL:
set -a
. "$HOME/.openclaw/.env"
set +a
printf 'http://127.0.0.1:18789/#token=%s\n' "$OPENCLAW_GATEWAY_TOKEN"为什么已经有 token 还要批准设备
Gateway Token 和设备批准是两层不同的保护:
- Gateway Token 证明浏览器知道 Gateway 的管理员入口凭据。
- 设备批准决定这个浏览器设备可以用哪些 operator scopes 操作 Gateway。
所以,即使 token 正确,第一次使用 Control UI 时仍可能需要执行:
openclaw devices approve --latest
openclaw devices approve <requestId>什么是 scope upgrade pending approval
它表示某个已配对设备正在请求比当前更多的权限。OpenClaw 不会静默扩大设备权限,而是创建一个新的 pending upgrade request。
处理方式是查看最新请求,然后批准 exact request:
openclaw devices approve --latest
openclaw devices approve <requestId>如果输出同时出现 Direct scope access failed; using local fallback. 和 Approved ...,说明 Gateway 路径先拒绝了权限升级,但本地 fallback 已经完成审批。再运行一次 openclaw devices approve --latest,确认没有 pending request。
如何升级 OpenClaw 版本
升级前先停止 Gateway,避免替换正在运行的全局包目录:
pm2 stop openclaw-gateway
pnpm add -g openclaw@2026.5.22
openclaw --version
pm2 restart openclaw-gateway --update-env
set -a
. "$HOME/.openclaw/.env"
set +a
openclaw health --json如果要升级到其他版本,把 2026.5.22 换成目标版本号。升级后请重新检查本文是否仍适用,因为 OpenClaw 的 CLI 和配置结构可能随版本变化。
如何更换默认模型
先把模型加入 agent 模型列表,再设为默认模型:
export MODEL_REF="custom-api-provider/another-model-id"
cat >/tmp/openclaw-agent-models.json <<EOF
{
"$MODEL_REF": {
"alias": "another-model-id"
}
}
EOF
openclaw config set agents.defaults.models "$(cat /tmp/openclaw-agent-models.json)" \
--strict-json \
--merge
openclaw models set "$MODEL_REF"新会话会使用新的默认模型。已有会话可能需要新开对话或发送 /new 后才会切换。
AICoder 没有公网 IP 会影响 OpenClaw 吗
不影响 Control UI。Control UI 通过 VS Code 端口转发或 SSH 隧道访问即可。
后续如果要接入消息渠道,需要选择能从 AICoder 主动连接外部服务的方式,例如 WebSocket、Socket Mode 或 long polling。需要公网回调的 webhook 模式通常不适合没有公网入口的 AICoder 实例。
重置 AICoder 会发生什么
重置 AICoder 会清空实例里的根文件系统。OpenClaw 安装目录、~/.openclaw/openclaw.json、~/.openclaw/.env 和 PM2 状态都可能丢失。
重置前请先备份:
tar czf openclaw-backup.tgz "$HOME/.openclaw"恢复时重新安装 Node.js、OpenClaw 和 PM2,然后解压备份并重新启动 Gateway。