龙虾3.13部署避坑指南:环境、配置与命令失效的深层根因
1. “一键部署”背后的三重幻觉:为什么龙虾3.13的安装脚本从不告诉你真实成本
“OpenClaw 龙虾 3.13 一键部署成功!”——这句话在技术社区里出现频率极高,截图里终端窗口绿字滚动、服务端口亮起、Web界面弹出,看起来毫无破绽。我去年帮三个团队落地龙虾时,前两次都信了这句宣传,结果上线第三天就集体崩溃:技能调用超时、模型加载失败、配置修改后重启即丢失。直到第三次,我把官方安装脚本install.sh拆开逐行重写,才真正看清所谓“一键”的本质:它不是省事,而是把复杂度打包成黑盒,再把故障点均匀撒进你整个系统环境里。
龙虾3.13(即 OpenClaw v3.13)不是传统意义上的单体应用,而是一套策略驱动型AI工作流引擎。它的核心逻辑是:用户定义 Skill(技能),Skill 调用 Connector(连接器)对接外部服务(飞书/微信/数据库/API),Connector 再触发 Model Adapter(模型适配层)加载本地或远程大模型。这个链条里任何一环出问题,都会表现为“命令无法识别”“json 配置无效”“技能添加失败”等表层报错——而这些报错,90%以上和“一键脚本”本身无关,全藏在它默认跳过的底层环节中。
最典型的幻觉有三层:
第一层是环境幻觉:脚本自动检测 Python 版本、安装 pip 包、拉取 Docker 镜像,但它从不验证 CUDA 驱动与 PyTorch 编译版本是否匹配。我在一台 Ubuntu 22.04 服务器上执行./install.sh后,openclaw start命令能运行,但所有调用千问模型的 Skill 全部卡在Loading model...状态。查日志才发现,脚本安装的torch==2.1.0+cu118依赖的是 NVIDIA Driver 525.x,而服务器实际装的是 470.199.02——差一个主版本号,GPU 就直接降级为 CPU 推理,吞吐量暴跌 17 倍。这不是 bug,是脚本故意绕开的兼容性校验。
第二层是路径幻觉:所有教程都说“配置文件在~/.openclaw/openclaw.json”,但没人告诉你这个路径由OPENCLAW_HOME环境变量决定,而一键脚本只在首次运行时写入一次,后续无论你移动项目目录、切换用户、甚至用sudo启动,它都固执地读取最初那个位置。我曾遇到客户在群晖 NAS 上部署,脚本在admin用户下运行,但 Docker 容器以root身份启动,导致容器内根本找不到openclaw.json,报错却是openclaw: command not found——因为PATH里没加/usr/local/bin,而这个路径恰恰是脚本在非 root 用户下安装二进制文件的位置。
第三层是权限幻觉:脚本默认用chmod +x给所有 shell 文件加执行权限,却对openclaw.json的文件权限只字不提。在 Windows WSL 或 macOS 上,JSON 文件若被编辑器保存为 UTF-8 with BOM 格式,或包含 Windows 风格换行符(CRLF),龙虾进程会静默忽略整个文件,连 warning 都不打。你改了十遍配置,重启十次服务,它始终按默认值运行——因为你根本不知道openclaw.json是个“娇气”的 YAML 兼容 JSON 文件,必须满足 RFC 8259 的严格解析规则。
提示:龙虾3.13 的配置解析器基于
pydantic v2.6+,它对 JSON Schema 的校验比以往任何版本都严格。一个多余的逗号、一个未加引号的布尔值(如debug: true写成debug: True)、甚至一个缩进空格数不对(必须是 2 个空格,不能是 tab),都会导致整个配置加载失败,且错误日志只显示Failed to load config: validation error,不指明具体哪一行。
所以,“别被一键部署忽悠了”不是反对自动化,而是提醒你:真正的部署成本,永远不在下载和解压,而在环境契约的显性化、路径依赖的可追溯性、以及配置语义的精确性。接下来我会带你一层层剥开龙虾3.13的底层结构,不是教你怎么点按钮,而是让你清楚每个按钮按下后,系统里到底发生了什么。
2. openclaw.json 的七处致命陷阱:从语法校验到语义绑定的完整避坑链
openclaw.json是龙虾3.13的“神经系统”,它不只定义服务端口和日志级别,更决定了 Skill 如何被发现、Connector 如何被实例化、Model Adapter 如何被调度。但官方文档把它简化为“配置文件”,社区教程则直接贴出模板,导致大量用户复制粘贴后陷入“配置已改,效果不变”的死循环。实际上,这个文件有七个关键区域,每个区域都存在极易踩中的语义陷阱,且错误表现高度相似——都是服务启动无报错,但功能完全失效。
2.1skills数组:路径不是字符串,而是模块导入路径
绝大多数教程教你这样写:
"skills": [ "/path/to/my_skill.py" ]这是龙虾3.13之前版本的写法,但在 v3.13 中已被废弃。新规范要求skills必须是 Python 模块路径,格式为package.module:SkillClass。例如你的技能文件在~/projects/finance_skill/analysis.py,类名为StockAnalyzer,那么正确写法是:
"skills": [ "finance_skill.analysis:StockAnalyzer" ]为什么?因为龙虾3.13 使用importlib.util.spec_from_file_location()动态加载技能,它需要完整的模块命名空间来支持热重载和依赖注入。如果你坚持用文件路径,龙虾会静默跳过该技能,日志里只有一行Skipping non-module skill path: /path/to/my_skill.py,而这一行默认被设为DEBUG级别,不会输出到控制台。
更隐蔽的陷阱是相对路径。有人写"skills": ["./analysis.py"],这在当前工作目录下可能生效,但一旦用 systemd 或 Docker 启动,工作目录变为/或/app,路径立即失效。解决方案是统一使用绝对路径导入,并在项目根目录下创建__init__.py文件,让整个目录成为 Python 包。
2.2connectors字段:不是配置列表,而是运行时注册表
connectors看似是连接飞书、微信的参数集合,实则是龙虾的服务发现中心。它不存储密钥,只存储 Connector 的类名和初始化参数。例如飞书 Connector 的标准写法是:
"connectors": { "feishu": { "type": "feishu", "config": { "app_id": "cli_xxx", "app_secret": "xxx", "encrypt_key": "xxx", "verification_token": "xxx" } } }这里type字段必须与龙虾内置 Connector 类名完全一致(区分大小写),且config中的字段名必须与该类的__init__方法签名严格匹配。比如FeishuConnector.__init__(self, app_id, app_secret, encrypt_key, verification_token),如果你把encrypt_key错写成encryption_key,龙虾不会报错,而是用None初始化该字段,导致后续签名验证失败,飞书回调全部 401。
另一个致命点是connectors的键名(如"feishu")——它将成为 Skill 中调用 Connector 的唯一标识。你在 Skill 代码里写self.connector("feishu").send_message(...),如果openclaw.json里写的是"feishu_bot": {...},那么调用时就会抛出ConnectorNotFoundError: feishu。这个错误不会在启动时校验,只在 Skill 第一次执行时触发,且堆栈信息极难定位。
2.3model_adapters:模型加载不是“选一个”,而是“建一条流水线”
龙虾3.13 支持多模型并行,但model_adapters的配置逻辑常被误解为“选择哪个模型”。实际上,它定义的是模型推理流水线的拓扑结构。一个典型配置如下:
"model_adapters": { "qwen_local": { "type": "transformers", "config": { "model_path": "/models/Qwen2-7B-Instruct", "device_map": "auto", "torch_dtype": "bfloat16", "max_new_tokens": 1024 } }, "qwen_api": { "type": "openai", "config": { "base_url": "https://api.tongyi.com/v1", "api_key": "sk-xxx", "model": "qwen-max" } } }这里有两个关键陷阱:第一,type字段不是模型类型,而是后端适配器类型。transformers对应 HuggingFace 模型,openai对应 OpenAI 兼容 API,它们的config结构完全不同,混用必报错;第二,model_adapters的键名(如"qwen_local")是 Skill 中调用模型的句柄,但 Skill 代码里必须显式指定使用哪个适配器,例如:
# 正确:显式指定 adapter response = await self.model_adapter("qwen_local").chat(messages) # 错误:试图用模型名,龙虾不认识 "Qwen2-7B-Instruct" response = await self.model_adapter("Qwen2-7B-Instruct").chat(messages)2.4logging配置:日志级别不是开关,而是过滤器链
很多人以为把"level": "DEBUG"就能看到所有细节,但龙虾3.13 的日志系统采用分层过滤机制。logging字段实际控制的是openclaw根 logger 的级别,而各组件(skill,connector,model_adapter)有自己的子 logger,它们的级别默认继承自根 logger,但可以被单独覆盖。例如:
"logging": { "level": "INFO", "handlers": ["console", "file"], "loggers": { "openclaw.skill": {"level": "DEBUG"}, "openclaw.connector.feishu": {"level": "WARNING"} } }如果你没配置loggers子项,那么即使根级别是DEBUG,feishu连接器的日志也只会输出WARNING及以上,导致你完全看不到回调接收过程。更麻烦的是,handlers里的"file"默认写入~/.openclaw/logs/openclaw.log,但该目录的父路径~/.openclaw/logs/必须存在且有写权限,否则日志会静默丢弃——而这个检查,脚本从不执行。
2.5server字段:端口只是表象,真正决定可用性的是host和cors
server配置常被简化为"port": 8000,但host字段才是跨网络访问的生命线。默认值是"host": "127.0.0.1",这意味着服务只监听本地回环地址,外部机器(包括同一局域网的飞书服务器)根本无法访问。你必须显式改为"host": "0.0.0.0"才能对外提供服务。但改完立刻面临第二个问题:CORS(跨域资源共享)。飞书或微信的前端页面向你的龙虾服务发请求时,浏览器会先发OPTIONS预检请求,如果server.cors没配置,预检失败,后续所有请求都被拦截。正确配置是:
"server": { "host": "0.0.0.0", "port": 8000, "cors": { "allow_origins": ["https://open.feishu.cn", "https://qyapi.weixin.qq.com"], "allow_methods": ["GET", "POST", "OPTIONS"], "allow_headers": ["*"] } }注意allow_origins必须是飞书/微信的官方域名,不能写*(龙虾3.13 的 cors 中间件会拒绝通配符),否则预检仍失败。
2.6storage:不是“存数据的地方”,而是状态同步的仲裁者
storage字段常被忽略或留空,但它决定了 Skill 的状态(如会话历史、用户偏好)能否跨进程、跨机器持久化。默认配置"type": "memory"表示所有状态存在内存里,一旦服务重启,所有会话记录清零。生产环境必须切换为"type": "redis"或"type": "postgresql"。但陷阱在于:redis配置必须包含connection_url,且 URL 格式必须是redis://[:password@]host:port/db,少一个斜杠或端口写错,龙虾启动时不报错,但所有需要状态的 Skill(如多轮对话)都会退化为单轮模式,且无任何提示。
2.7secrets:密钥管理不是“放进去”,而是“动态注入”
secrets字段设计初衷是集中管理敏感信息,避免硬编码在 Skill 代码里。但它的实现方式是:启动时读取secrets下的键值对,注入到进程环境变量中。例如:
"secrets": { "FEISHU_APP_SECRET": "xxx", "DB_PASSWORD": "yyy" }那么在 Skill 代码里,你应该用os.getenv("FEISHU_APP_SECRET")获取,而不是直接读openclaw.json。但如果secrets里某个密钥值为空字符串(""),龙虾会把它当作None注入,导致os.getenv()返回None,Skill 报错。更严重的是,secrets不支持嵌套结构,所有键必须是扁平字符串,"feishu": {"app_secret": "xxx"}这种写法会被忽略。
注意:
openclaw.json的 JSON Schema 在龙虾3.13 中已升级为 v3.13.0 版本,它强制要求skills、connectors、model_adapters字段必须存在(即使为空数组/对象),否则启动失败。你可以用官方提供的openclaw validate-config命令校验,但该命令必须在openclawCLI 已正确安装的前提下运行——而这恰恰是很多用户卡住的第一步。
3. openclaw 命令失效的五层根因分析:从 PATH 到进程树的完整排查路径
当你在终端输入openclaw start却收到openclaw: command not found,或者openclaw status返回No such process,这绝不是简单的“没装好”,而是系统环境、进程模型、权限边界三者交织的结果。我整理了过去半年处理的 47 个同类工单,将故障原因归纳为五个递进层级,每一层都需要不同的排查工具和思路。
3.1 第一层:PATH 环境变量污染——最常见却最易被忽略
90% 的command not found问题源于 PATH。龙虾3.13 的安装脚本默认将 CLI 二进制文件放在/usr/local/bin/openclaw(Linux/macOS)或C:\Program Files\OpenClaw\openclaw.exe(Windows),但它不会自动把该路径加入 PATH。你手动执行./install.sh后,脚本可能提示Installation complete! Add /usr/local/bin to your PATH.,但大多数人直接关掉终端,PATH 从未更新。
验证方法:运行echo $PATH(Linux/macOS)或echo %PATH%(Windows),检查输出中是否包含/usr/local/bin或C:\Program Files\OpenClaw。如果没有,临时修复是export PATH="/usr/local/bin:$PATH"(Linux/macOS)或set PATH="C:\Program Files\OpenClaw;%PATH%"(Windows),但永久修复需编辑 shell 配置文件(~/.bashrc、~/.zshrc或 Windows 系统环境变量)。
更隐蔽的情况是 PATH 被覆盖。某些 IDE(如 VS Code)或终端模拟器(如 iTerm2)会重置 PATH,导致你在 GUI 环境下打开的终端 PATH 与纯终端不同。此时which openclaw在纯终端返回/usr/local/bin/openclaw,但在 VS Code 集成终端返回空。解决方案是在 VS Code 设置中启用"terminal.integrated.env.linux": { "PATH": "/usr/local/bin:${env:PATH}" }。
3.2 第二层:Python 解释器冲突——当openclaw不是你想的那个
龙虾3.13 的 CLI 实际是一个 Python 脚本包装器,它通过#!/usr/bin/env python3调用系统 Python。但如果你的系统有多个 Python 版本(如 pyenv、conda、系统自带),env python3可能指向错误的解释器。例如,你用 conda 创建了openclaw-env环境并安装了所有依赖,但openclaw命令调用的是系统/usr/bin/python3,导致ImportError: No module named 'openclaw'。
验证方法:运行head -1 $(which openclaw),查看 shebang 行。如果是#!/usr/bin/env python3,再运行python3 -c "import openclaw; print(openclaw.__file__)",确认路径是否在你的目标环境中。如果不是,有两种解决方式:一是修改openclaw脚本的 shebang 为绝对路径(如#!/home/user/miniconda3/envs/openclaw-env/bin/python);二是用python3 -m openclaw start替代openclaw start,强制使用当前 Python 解释器。
3.3 第三层:进程守护机制失效——systemd、supervisord 与 nohup 的博弈
openclaw start命令在后台启动服务,它默认使用nohup+&方式,但这种方式在非交互式 shell(如 cron、CI/CD 流水线)中不可靠。更健壮的方式是用 systemd(Linux)或 launchd(macOS)管理。但问题在于:一键脚本生成的 systemd service 文件(如/etc/systemd/system/openclaw.service)可能配置错误。
典型错误有三:第一,WorkingDirectory指向错误路径,导致openclaw.json无法加载;第二,User字段设为root,但openclaw.json在普通用户家目录下,权限不足;第三,Restart=always但没配RestartSec=10,导致频繁崩溃重启时被 systemd 限流。
验证方法:运行systemctl status openclaw,查看Active:状态和最近日志。如果显示inactive (dead),运行journalctl -u openclaw -n 50 --no-pager查看最后 50 行日志。常见错误如Permission denied: '/home/user/.openclaw/openclaw.json',说明User配置与文件所有者不匹配。
3.4 第四层:Docker 容器网络隔离——当宿主机能访问,容器内却不行
在 NAS(如群晖)或云服务器上,很多人用 Docker 部署龙虾。docker run -p 8000:8000 openclaw:3.13看似正确,但龙虾服务在容器内监听127.0.0.1:8000,而-p参数只映射宿主机端口到容器端口,容器内127.0.0.1仍是容器自己的回环地址,导致内部 Connector(如调用本地数据库)无法连接。正确做法是让龙虾监听0.0.0.0:8000,并在openclaw.json中设置"server": {"host": "0.0.0.0"}。
另一个网络陷阱是 DNS。Docker 容器默认使用 Google DNS(8.8.8.8),但某些企业内网或 NAS 环境 DNS 解析异常,导致飞书回调 URL 无法解析。解决方案是在docker run时加--dns 114.114.114.114,或在docker-compose.yml中配置dns字段。
3.5 第五层:进程树残留与端口占用——重启失败的终极元凶
openclaw stop命令有时无法彻底杀死所有子进程。龙虾3.13 启动时会 fork 出多个子进程(如模型加载进程、WebSocket 监听进程),stop命令只 kill 主进程 PID,子进程变成孤儿进程继续运行,并占用端口。此时openclaw start会因端口被占而失败,报错Address already in use。
验证方法:运行lsof -i :8000(Linux/macOS)或netstat -ano | findstr :8000(Windows),查看占用 8000 端口的 PID。再用ps -p <PID> -o pid,ppid,cmd查看该进程的父进程和命令行。如果 PPID 是 1(init 进程),说明它是孤儿进程。
彻底清理命令:
# Linux/macOS:杀掉所有 openclaw 相关进程 pkill -f "openclaw.*start" && pkill -f "python.*openclaw" # Windows:根据 netstat 找到 PID 后强制结束 taskkill /F /PID <PID>但更可靠的做法是,在openclaw.json中配置"server": {"reuse_port": true},启用端口复用,避免重启时端口冲突。
提示:
openclaw命令的退出码是诊断关键。openclaw start成功返回 0,配置错误返回 1,端口占用返回 2,权限不足返回 13。在 CI/CD 脚本中,务必检查$?值,而不是只看终端输出文字。
4. 彻底卸载龙虾的四个不可逆动作:从文件清理到状态清除的完整清单
“如何彻底卸载龙虾”是搜索热词中排名前三的问题,但几乎所有教程只告诉你rm -rf ~/.openclaw或docker system prune -a,这只能清除 30% 的残留。龙虾3.13 的分布式架构决定了它的痕迹散落在系统各处:用户空间、系统服务、Docker 层、甚至 Shell 历史记录。一次“彻底卸载”必须覆盖以下四个不可逆动作,缺一不可。
4.1 动作一:清除用户级安装产物——不只是.openclaw目录
~/.openclaw是主配置和日志目录,但龙虾3.13 还会在以下位置留下文件:
~/.local/bin/openclaw:当用户没有 root 权限时,安装脚本会把 CLI 放在这里;~/.cache/openclaw/:缓存模型分片、Connector 令牌、Skill 依赖包;~/.config/openclaw/:某些桌面环境(如 GNOME)会把配置存到这里;~/Library/Application Support/openclaw/(macOS)或%APPDATA%\openclaw\(Windows):GUI 应用兼容路径。
必须执行的清理命令:
# Linux/macOS rm -rf ~/.openclaw ~/.local/bin/openclaw ~/.cache/openclaw ~/.config/openclaw # macOS 额外清理 rm -rf ~/Library/Application\ Support/openclaw # Windows(PowerShell) Remove-Item -Path "$env:USERPROFILE\.openclaw" -Recurse -Force Remove-Item -Path "$env:LOCALAPPDATA\openclaw" -Recurse -Force Remove-Item -Path "$env:APPDATA\openclaw" -Recurse -Force注意:~/.local/bin/openclaw是符号链接,指向/usr/local/bin/openclaw,所以卸载时要先删符号链接,再删源文件(如果有 root 权限)。
4.2 动作二:清除系统级服务注册——systemd、launchd 与 Windows 服务
一键脚本在安装时会注册系统服务,但卸载脚本往往缺失。必须手动清理:
- Linux systemd:删除
/etc/systemd/system/openclaw.service和/etc/systemd/system/multi-user.target.wants/openclaw.service,然后运行systemctl daemon-reload; - macOS launchd:删除
~/Library/LaunchAgents/io.openclaw.plist(用户级)或/Library/LaunchDaemons/io.openclaw.plist(系统级),然后运行launchctl unload io.openclaw; - Windows 服务:以管理员身份运行
sc delete openclaw,再手动删除C:\Program Files\OpenClaw\目录。
验证是否清理干净:运行systemctl list-unit-files | grep openclaw(Linux)、launchctl list | grep openclaw(macOS)、sc query openclaw(Windows),输出应为空。
4.3 动作三:清除 Docker 镜像与卷——不只是docker system prune
docker system prune -a会删掉所有未使用的镜像、容器、网络,但龙虾相关的 Docker 卷(Volume)默认不会被清理,因为它们被标记为“已使用”。龙虾3.13 的官方镜像通常创建两个卷:openclaw-config(存openclaw.json)和openclaw-models(存模型文件)。这些卷即使容器删除,数据依然存在,下次docker run会自动挂载,导致你以为卸载了,其实配置还在。
必须执行的清理命令:
# 列出所有 openclaw 相关卷 docker volume ls | grep openclaw # 强制删除(假设卷名为 openclaw-config 和 openclaw-models) docker volume rm openclaw-config openclaw-models # 如果不确定卷名,用通配符删除(谨慎!) docker volume ls -q | grep openclaw | xargs -r docker volume rm此外,检查docker network ls是否有openclaw_default网络,如有则docker network rm openclaw_default。
4.4 动作四:清除 Shell 环境与历史记录——防止“幽灵命令”重现
最后一个常被忽视的动作:清理 Shell 环境变量和命令历史。openclaw命令可能被 alias 或 function 覆盖,例如某教程教你alias openclaw='python3 -m openclaw',卸载后这个 alias 依然存在,导致你输入openclaw时实际执行的是旧 Python 环境。
必须执行的清理步骤:
- 检查
~/.bashrc、~/.zshrc、~/.profile中是否有alias openclaw=或function openclaw,手动删除; - 清理命令历史:
history -c(清空当前会话历史),再编辑~/.bash_history或~/.zsh_history,删除所有含openclaw的行; - 重启终端或运行
source ~/.zshrc使环境变更生效。
完成这四个动作后,运行which openclaw、openclaw --version、systemctl status openclaw均应返回空或“command not found”,这才是真正意义上的“彻底卸载”。
注意:“养龙虾”“扣子和龙虾”等热词暗示部分用户将龙虾与其他 AI 工具(如字节扣子)混用。卸载龙虾时,请勿删除
~/.cache/huggingface/目录——这是 HuggingFace 模型缓存,被多个工具共享,误删会导致其他 AI 工具重新下载 GB 级模型。
5. 生产环境部署 checklist:从单机测试到高可用集群的七项硬性指标
当你完成本地调试,准备将龙虾3.13 推向生产环境时,“能跑通”和“能扛住”之间隔着七道硬性指标。这些指标不是可选项,而是龙虾3.13 架构设计隐含的约束条件。我根据三个金融客户的真实上线案例,总结出必须逐项验证的 checklist,每项不达标,都会在流量高峰时暴露为雪崩式故障。
5.1 指标一:模型加载时间 ≤ 90 秒——GPU 显存与 PCIe 带宽的双重校验
龙虾3.13 加载 Qwen2-7B 模型的标准时间是 65±10 秒(A10G GPU)。如果超过 90 秒,说明硬件瓶颈已触发。验证方法不是看openclaw start的终端输出,而是抓取openclaw.json中model_adapters的startup_timeout字段(默认 120 秒),并在启动时加--log-level DEBUG,观察日志中Loading model from ...到Model loaded successfully的时间戳。
超时根因通常是:第一,GPU 显存不足。Qwen2-7B FP16 需要 ≥14GB 显存,如果系统有其他进程占用(如监控代理、CUDA 驱动自身),可用显存低于 12GB,加载会卡在allocating memory阶段;第二,PCIe 带宽不足。A10G 是 PCIe 4.0 x16,但某些服务器主板只提供 PCIe 3.0 x8 插槽,带宽减半,模型权重加载速度下降 40%。解决方案是更换插槽或升级主板。
5.2 指标二:Skill 并发请求数 ≥ 50 QPS——连接池与事件循环的容量测试
龙虾3.13 默认使用asyncio事件循环,单进程理论并发上限是 1000+,但实际受限于 Connector 连接池。例如飞书 Connector 默认连接池大小是 10,意味着最多同时处理 10 个飞书回调。当 QPS 超过 10,后续请求排队,平均延迟飙升。
验证方法:用wrk -t12 -c100 -d30s http://localhost:8000/skill/stock模拟 100 并发请求 30 秒,观察openclaw status输出的requests_per_second和avg_latency_ms。生产环境要求requests_per_second ≥ 50且avg_latency_ms ≤ 800。
优化方案:在openclaw.json的connectors.feishu.config中增加pool_size: 50,并确保model_adapters.qwen_local.config中device_map: "balanced"(而非"auto"),让模型层也能并行处理。
5.3 指标三:配置热重载响应时间 ≤ 3 秒——文件系统 inotify 的可靠性
龙虾3.13 支持修改openclaw.json后自动重载配置,但前提是文件系统支持 inotify。某些 NAS(如群晖早期型号)或容器挂载卷(docker run -v)禁用了 inotify,导致配置修改后服务无反应。
验证方法:启动龙虾后,用inotifywait -m -e modify ~/.openclaw/openclaw.json监听文件变化。如果修改文件后inotifywait无输出,说明 inotify 不可用。此时必须关闭热重载,在openclaw.json中设"hot_reload": false,改为手动openclaw restart。
5.4 指标四:跨节点状态一致性——Redis Cluster 的最小分片数
当部署多实例龙虾(如负载均衡集群)时,storage.type: "redis"是必须的,但单 Redis 实例无法满足高可用。龙虾3.13 要求 Redis 至少 3 个分片(shard)组成集群,因为它的状态键使用HASH结构,且 key 名包含 Skill ID 哈希,单节点故障会导致部分 Skill 状态丢失。
验证方法:连接 Redis 集群,运行CLUSTER NODES,确认节点数 ≥3 且connected状态为connected。在openclaw.json中,storage.config必须用redis://URL 指向集群入口,而非单节点 IP。
5.5 指标五:日志留存周期 ≥ 90 天——磁盘 I/O 与压缩策略
龙虾3.13 默认日志轮转策略是按大小(100MB)和时间(每天)双维度。但生产环境要求至少保留 90 天日志用于审计。如果磁盘 I/O 性能差(如 NAS 机械硬盘),日志压缩(gzip)会阻塞主线程,导致请求延迟。
验证方法:检查~/.openclaw/logs/目录下.log.gz文件的生成时间,用zcat *.log.gz | wc -l统计总行数。如果 90 天日志总大小 > 50GB,需在openclaw.json中调整logging.handlers.file的max_size(如"max_size": "500MB")和backup_count(如"backup_count": 180)。
5.6 指标六:HTTPS 端到端加密——TLS 1.3 与证书链完整性
飞书/微信要求回调 URL 必须是 HTTPS
