OpenClaw 重装配置踩坑

11 阅读3分钟

OpenClaw 重装配置踩坑:代理 + Session 锁死,两个坑叠在一起最难排查

最近把本机的 OpenClaw(一个 Node.js 的多渠道 AI 网关)重装了一遍,打算重新配置中转站模型和 Telegram Bot。结果配完之后,怎么发消息都没反应,Telegram 一直显示 typing,Dashboard 也是死的。折腾了好一阵才定位到问题,记录一下排查过程。


背景

OpenClaw 是通过 npm 全局安装的,它在本地跑一个 Gateway 服务,可以对接 Telegram Bot,让你在 Telegram 里直接和大模型对话。我的模型走的是第三方中转站(OpenAI 兼容接口),本机还常驻着 Clash Verge 做代理,默认开着 TUN 模式。

遇到的痛点

1. Clash Verge TUN 模式劫持了 API 请求

配置完中转站的 Base URL 和 API Key 之后,OpenClaw 的 Telegram Bot 能连上,但发消息后一直显示 "typing",永远不回复。

用 curl 直接测试 API:

curl --max-time 15 -X POST https://api.edgefn.net/v1/chat/completions \
  -H "Authorization: Bearer sk-xxx" \
  -H "Content-Type: application/json" \
  -d '{"model": "MiniMax-M2.5", "messages": [{"role":"user","content":"Hi"}]}'

直接超时,exit code 28。

查 DNS 解析,发现 api.edgefn.net 被解析到了 198.18.0.31。这个 IP 段(198.18.x.x)是 Clash TUN 模式分配的虚拟地址,说明 Clash 的 TUN 接管了这个域名的流量,但没有正确转发出去。

试了 HTTP 代理(7897)和 SOCKS5 代理(7898)也都不通。关掉 Clash Verge 之后,curl 直连立刻成功返回了模型响应。

2. 关掉代理后还是不工作:Session 文件锁死

代理问题解决了,但 OpenClaw 还是没反应。用 CLI 手动测试:

openclaw agent --local -m "Say hello" --agent main

报错:

session file locked (timeout 10000ms): pid=8496
C:\Users\xxx\.openclaw\agents\main\sessions\xxx.jsonl.lock

原来是之前 API 超时的时候,Gateway 进程一直在等模型响应,持有 Session 文件锁不释放。后续所有请求(包括 Dashboard、Telegram、CLI)都要获取同一个锁,全部排队等待超时。

更坑的是,即使重启 Gateway,新的 Gateway 进程会立即接管之前卡住的请求,重新锁住 Session 文件,形成死循环。

3. 修复过程

最终的修复步骤:

# 1. 停掉 Gateway
openclaw gateway stop

# 2. 找到并杀掉占锁的 node 进程
taskkill /PID 8496 /F

# 3. 清理锁文件和会话记录
rm -f ~/.openclaw/agents/main/sessions/*.lock
rm -f ~/.openclaw/agents/main/sessions/*.jsonl

# 4. 重置 sessions.json
echo '{}' > ~/.openclaw/agents/main/sessions/sessions.json

# 5. 重启 Gateway
openclaw gateway start

重启后一切恢复正常。

4. 给 Clash Verge 添加直连规则

为了以后开代理也不影响 OpenClaw,需要在 Clash Verge 里给中转站域名加直连规则。

Clash Verge 的订阅配置关联了一个 Merge 文件,编辑它就能注入自定义规则:

# 文件位置:%APPDATA%/io.github.clash-verge-rev.clash-verge-rev/profiles/xxx.yaml

prepend-rules:
  - DOMAIN-SUFFIX,edgefn.net,DIRECT

prepend-rules 会把规则插到订阅规则列表最前面,优先级最高。修改后在 Clash Verge 订阅页面点刷新即可生效。


总结

这次问题的核心在于两个问题叠加:代理导致 API 不通,API 不通又导致 Session 锁死。单看任何一个都不难修,但叠在一起的时候,解决了第一个问题(关掉代理),症状没变(还是不回复),很容易让人怀疑方向搞错了。

排查这类问题的思路:

  1. 先隔离网络层:用 curl 直接打 API,确认模型服务本身是通的。
  2. 再看应用层:跑 openclaw doctor 检查有没有 Session Lock、进程残留等问题。
  3. 最后做预防:给代理加直连规则,避免下次再踩同样的坑。

以后碰到 OpenClaw 卡在 typing 不回复,第一反应应该是查网络,第二反应是查 Session 锁。