【OpenClaw】一台 Windows 主机部署双 Gateway:两个微信 + 一台主机 + 模型隔离完整踩坑实录
如何在一台 Windows 宿主机上跑两个完全独立的 OpenClaw Gateway,各自绑定不同微信、使用不同 AI 模型,还能互不干扰?本文记录完整的配置、踩坑和修复过程。
前言
需求:一个微信号对接 DeepSeek Flash(快速、便宜、日常对话),另一个微信号对接 DeepSeek Pro(翻译审校、长文档处理)。虽然 OpenClaw 单个 Gateway 原生支持多微信账号,但所有账号共享同一个 AI 模型和 Workspace。
如果你需要不同微信使用不同模型、独立会话上下文、互不干扰,就需要两个独立 Gateway。
本文将基于 openclaw 2026.3.23-2 + Node.js 24.2.0 + Windows 11,从头配置双 Gateway 并记录所有踩坑。
架构

关键设计原则:端口隔离、配置隔离、状态隔离、Agent 隔离。四个维度全部独立,才能保证稳定。
环境准备
| 组件 | 版本 | 说明 |
|---|---|---|
| OpenClaw | 2026.3.23-2 | npm 全局安装 |
| Node.js | 24.2.0 | Windows 端 |
| 微信插件 | @tencent-weixin/openclaw-weixin 2.0.1 | 已安装 |
| OS | Windows 11 | — |
确认当前只有一个 Gateway 在运行:
curl http://127.0.0.1:18789/health
# {"ok":true,"status":"live"}
第一步:创建第二个配置文件
以当前 openclaw.json 为模板:
cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw-gateway2.json
用 Node.js 修改关键字段:
const fs = require('fs');
const path = 'C:/Users/<用户名>/.openclaw/openclaw-gateway2.json';
const cfg = JSON.parse(fs.readFileSync(path, 'utf8'));
// 修改端口和模型
cfg.gateway.port = 19789;
cfg.agents.defaults.model.primary = 'deepseek/deepseek-v4-pro[1m]';
cfg.agents.defaults.workspace = String.raw`C:\Users\<用户名>\.openclaw\workspace-gateway2`;
cfg.agents.defaults.timeoutSeconds = 600;
fs.writeFileSync(path, JSON.stringify(cfg, null, 2), 'utf8');
⚠️ 端口间隔:G2 使用 19789,与 G1 的 18789 间隔至少 20,因为 browser control(+2)、canvas 等端口是自动派生的。
第二步:创建独立目录
mkdir $env:USERPROFILE\.openclaw\workspace-gateway2
mkdir $env:USERPROFILE\.openclaw\state-gateway2
⚠️ 最关键的一个坑
绝对不要用 junction/symlink 共享 agents 目录!
# ❌ 错误做法:会导致两 Gateway 共享 session 文件,产生锁冲突
mklink /J state-gateway2\agents ~\.openclaw\agents
# ✅ 正确做法:extensions 可以共享,agents 必须独立
mklink /J state-gateway2\extensions ~\.openclaw\extensions
共享 agents 的后果:
| 现象 | 原因 |
|---|---|
| Gateway 进程静默崩溃 | 两个进程争抢同一个 session 文件的写锁 |
| 日志无任何错误 | 文件锁竞争发生在 OS 层,JS 层捕获不到 |
| 微信消息"请求超时" | Session 被锁住,模型无法写入回复 |
第三步:Agent 初始化
清空 G2 的 agents 目录,让 openclaw 首次启动时自动创建:
rm -rf ~/.openclaw/state-gateway2/agents/*
启动后 openclaw 自动生成独立 Agent:
Agent ID: gateway2
Session Key: agent:gateway2:main
与 G1 的 agent:main:main 完全隔离。
第四步:编写启动脚本
# start-openclaw-gateway2.ps1
$ErrorActionPreference = 'Stop'
# === 独立配置 ===
$env:OPENCLAW_CONFIG_PATH = "$env:USERPROFILE\.openclaw\openclaw-gateway2.json"
$env:OPENCLAW_STATE_DIR = "$env:USERPROFILE\.openclaw\state-gateway2"
# === 只杀自己的端口进程 ===
$gatewayPid = Get-NetTCPConnection -LocalPort 19789 -State Listen `
-ErrorAction SilentlyContinue | Select-Object -ExpandProperty OwningProcess -First 1
if ($gatewayPid) {
Stop-Process -Id $gatewayPid -Force
}
Start-Sleep -Seconds 1
# === PATH 修正:避免 spawn openclaw ENOENT ===
$npmGlobalBin = Join-Path $env:APPDATA 'npm'
$env:PATH = "$npmGlobalBin;$env:PATH"
# === 启动 ===
$nodeExe = (Get-Command node).Source
$openclawMjs = "$env:APPDATA\npm\node_modules\openclaw\openclaw.mjs"
Start-Process -FilePath "cmd.exe" -ArgumentList "/d /c `"$nodeExe`" `"$openclawMjs`" gateway --port 19789 > `"$env:USERPROFILE\openclaw-gateway2-manual.log`" 2>&1" -WindowStyle Hidden
同样,G1 的启动脚本也要改为按端口查杀:
# ✅ G1 只杀 18789 端口的进程,不会误杀 G2
$gatewayPid = Get-NetTCPConnection -LocalPort 18789 -State Listen `
| Select-Object -ExpandProperty OwningProcess -First 1
❌ 不要用
CommandLine -like "*openclaw*"来匹配进程,那会把另一个 Gateway 也杀掉。
第五步:登录第二个微信
$env:OPENCLAW_CONFIG_PATH = "$env:USERPROFILE\.openclaw\openclaw-gateway2.json"
$env:OPENCLAW_STATE_DIR = "$env:USERPROFILE\.openclaw\state-gateway2"
openclaw channels login --channel openclaw-weixin
⏱️ 二维码约 2 分钟有效,拿另一个微信扫码。超时需要重新执行。
第六步:配置 Workspace
复制基础文件到 G2:
cp ~/.openclaw/workspace/AGENTS.md ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/SOUL.md ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/USER.md ~/.openclaw/workspace-gateway2/
cp ~/.openclaw/workspace/TOOLS.md ~/.openclaw/workspace-gateway2/
根据 G2 的用途定制 AGENTS.md。比如 G2 侧重翻译审校,可以加入技能调度规则:
## Deep Review Mode
触发词:深度审校、深度翻译、法律翻译、合同翻译
当触发时,分三步处理:
1. 直译,保持原文结构
2. 检查术语一致性、逻辑连贯性
3. 优化中文表达,附审校说明
验证
健康检查
curl http://127.0.0.1:18789/health # G1
# {"ok":true,"status":"live"}
curl http://127.0.0.1:19789/health # G2
# {"ok":true,"status":"live"}
端口确认
netstat -ano | findstr "18789 18791 19789 19791"
预期输出:
TCP 127.0.0.1:18789 LISTENING <PID1>
TCP 127.0.0.1:18791 LISTENING <PID1>
TCP 127.0.0.1:19789 LISTENING <PID2>
TCP 127.0.0.1:19791 LISTENING <PID2>
双微信确认
openclaw channels list
# G1: openclaw-weixin a2dbb69f5a80-im-bot: configured, enabled
$env:OPENCLAW_CONFIG_PATH = "..."
openclaw channels list
# G2: openclaw-weixin 5c21986455d7-im-bot: configured, enabled
互不干扰测试
重启 G1,验证 G2 不受影响:
# 重启 G1
./start-openclaw-gateway.ps1
# G2 仍然存活
curl http://127.0.0.1:19789/health
# {"ok":true,"status":"live"}
完整的踩坑记录
| # | 问题 | 日志表现 | 根因 | 修复 |
|---|---|---|---|---|
| 1 | G1 重启后 G2 消失 | G2 端口消失 | 查杀脚本 CommandLine -like "*openclaw*" 误杀 |
按端口查杀进程 |
| 2 | Gateway 静默崩溃 | 进程消失,无错误日志 | junction 共享 agents 目录,session 文件锁冲突 | 独立 agents 目录 |
| 3 | spawn openclaw ENOENT |
崩溃日志有 ENOENT | npm bin 不在 Gateway 进程 PATH | 启动脚本加 $env:PATH |
| 4 | Request timed out | embedded run timeout |
默认 timeout 30s,系统 prompt 41KB+ 首次请求慢 | 设 600s |
| 5 | 微信消息无回复 | 有 typing 无回复 | DeepSeek 超时 / session 锁冲突 | 修 1+2+4 |
| 6 | 图片分析卡住 | Navigation blocked: file:// |
浏览器不支持本地文件协议 | 改用多模态模型直调 API |
| 7 | JSON 解析失败 | Unexpected token |
PowerShell Set-Content -Encoding UTF8 写入 BOM |
Node.js 写配置,不带 BOM |
最终配置对照
| 维度 | Gateway 1 | Gateway 2 |
|---|---|---|
| 端口 | 18789 / 18791 | 19789 / 19791 |
| 配置文件 | openclaw.json |
openclaw-gateway2.json |
| State 目录 | ~/.openclaw/ |
~/.openclaw/state-gateway2/ |
| Workspace | ~/.openclaw/workspace/ |
~/.openclaw/workspace-gateway2/ |
| 启动脚本 | start-openclaw-gateway.ps1 |
start-openclaw-gateway2.ps1 |
| AI 模型 | DeepSeek V4 Flash | DeepSeek V4 Pro |
| Agent ID | main |
gateway2 |
| Session Key | agent:main:main |
agent:gateway2:main |
| 上下文窗口 | 128K | 1M |
| 微信账号 | 账号 A | 账号 B |
| 超时设置 | 600s | 600s |
FAQ
Q: 能不能在同一台机器上跑三个 Gateway?
可以。端口再加 20(19789 + 20 = 19809),依此类推。注意内存占用和 DeepSeek API 并发限制。
Q: 双 Gateway 能用同一个 API Key 吗?
可以。DeepSeek 按 token 计费,两个 Gateway 共享同一个 Key,所有消耗合并计入同一个账单。如果需要分开核算(例如不同部门/项目),可以申请两个 API Key 分别配置。
Q: 一号微信的消息会不会串到二号?
不会。每个 Gateway 监听自己的端口,微信账号绑定不同的 im-bot ID,会话完全隔离。
Q: 需要每次开机手动启动两个 Gateway 吗?
可以把两个启动脚本都加入 Windows 启动文件夹或计划任务,开机自动启动。注意 G1 和 G2 之间加 30 秒延迟,避免同时初始化冲突。
如果您觉得有用,欢迎 点赞、转发、评论、关注。
更多推荐


所有评论(0)