OpenClaw部署实战:AI工具链落地的最后一公里
1. OpenClaw 是什么?它解决的不是“部署问题”,而是“AI 工具链落地的最后一公里”
OpenClaw 这个名字在最近三个月的技术社区里出现频率陡增,但绝大多数人点开 GitHub 仓库后第一反应是:“这到底是个 CLI 工具?还是个 Agent 框架?抑或又一个 LangChain 封装层?”——这种困惑非常真实,也恰恰说明了 OpenClaw 的定位特殊性:它不生产模型,不训练参数,也不提供 UI 界面;它是一套面向“已具备基础大模型能力”的开发者,专为快速串联、调度、验证和交付 AI 原子能力而设计的轻量级运行时中枢。
我第一次接触 OpenClaw 是在帮一家做智能合同审核的客户做 PoC。他们已有微调好的 Llama-3-70B 模型(跑在 vLLM 上)、一套用 Python 写的 PDF 文本结构化解析逻辑、以及一个基于 MongoDB 的条款知识库。但当需要把“上传 PDF → 提取关键字段 → 匹配知识库条款 → 生成风险摘要 → 推送飞书”这个完整链路串起来时,团队花了整整 11 天写胶水代码、调试接口超时、处理异步回调失败、重试逻辑混乱……最后交付的脚本连日志都分不清是哪个环节出的错。直到同事甩来一条命令:openclaw run --flow contract-review.yaml,整个流程 3 分钟内跑通,且每一步输入/输出、耗时、状态码全在终端实时打印。那一刻我才意识到:OpenClaw 解决的根本不是“能不能部署”,而是“部署之后,怎么让 AI 能力真正被业务系统稳定、可观测、可迭代地用起来”。
它的核心价值,藏在三个关键词里:Skill(技能)、Flow(流程)、Runtime(运行时)。
- Skill不是抽象概念,而是带明确输入 Schema、输出 Schema、执行协议(HTTP/gRPC/Local)和健康检查端点的可注册单元。比如
pdf_parser_skill必须声明它接受{"file_url": "string"},返回{"text": "string", "tables": "[{...}]"},且/health返回200才算就绪。 - Flow是 YAML 定义的有向无环图(DAG),节点是 Skill ID,边是数据流向。它不写 Python 逻辑,只描述“谁的输出给谁用”,把控制流和数据流彻底解耦。
- Runtime是那个默默启动所有 Skill 进程、管理它们生命周期、注入环境变量、收集指标、处理失败重试与降级策略的“隐形管家”。你不用关心 Skill 是 Python 还是 Rust 写的,Runtime 只认标准协议。
所以,“OpenClaw 部署”这件事,本质是把一个分布式的、多语言的、带状态的 AI 工具链,变成一个可一键启停、可观测、可配置的单一服务实体。它不像 Dify 那样要搭前端+后端+数据库三件套,也不像 Ollama 那样只管模型加载——OpenClaw 的部署对象,是“协作关系”本身。这也是为什么网上搜“openclaw 部署”会混入大量“dify本地部署”“ollama部署”等无关结果:大家默认“部署 AI 工具 = 部署大模型”,但 OpenClaw 的起点,恰恰是模型已经就位之后。
提示:如果你正在看这篇文档,大概率你已有一个或多个可用的 AI 能力(比如一个 FastAPI 接口、一个本地运行的 LLM API、甚至是一个 curl 可调用的公开服务)。OpenClaw 不要求你重构它们,只要求你按约定加一层薄薄的包装(通常 5~10 行代码),它就能把你现有的“散装能力”瞬间组织成可复用的“AI 流水线”。这才是它值得花时间部署的根本原因。
2. 为什么官方没给“一键部署脚本”?因为 OpenClaw 的部署形态由你的 Skill 架构决定
翻遍 OpenClaw 官方 GitHub 的README.md和docs/目录,你会发现一个反直觉的事实:它没有提供./install.sh或docker-compose.yml这类开箱即用的部署包。这不是疏忽,而是设计使然。OpenClaw Runtime 本身确实可以单进程启动(openclaw server start),但它真正的价值,只有在与你的 Skill 生态深度耦合后才释放。而 Skill 的部署方式,完全取决于你如何设计它们——这直接决定了 OpenClaw 整体的部署架构。
我们来拆解三种最典型的 Skill 部署形态,以及它们对应的 OpenClaw Runtime 部署策略:
2.1 形态一:全本地 Skill(All-Local),适合开发与验证
这是新手上手最快的方式:所有 Skill 都是本地 Python 脚本,通过openclaw skill register注册到 Runtime。例如:
# 你的项目目录结构 my-ai-project/ ├── skills/ │ ├── pdf_parser.py # 实现 SkillProtocol 接口 │ └── clause_matcher.py # 同上 ├── flows/ │ └── contract-review.yaml └── openclaw.yaml # Runtime 配置此时部署 OpenClaw,只需三步:
pip install openclaw(确保 Python 3.9+)cd my-ai-project && openclaw server start(自动加载openclaw.yaml)openclaw flow run contract-review(触发流程)
优势:零 Docker、零网络配置、断网可用、调试极其方便(改完 Python 保存,openclaw skill reload即生效)。
代价:所有 Skill 运行在同一进程内存空间,一个 Skill OOM 会导致整个 Runtime 崩溃;无法水平扩展单个 Skill;不满足生产环境隔离性要求。
我在客户现场做首次演示时,就用这种形态。从 clone 仓库到跑通 end-to-end 流程,严格计时 4 分 38 秒。但我也明确告诉客户:“这只是证明链路可行,上线前必须切换到形态二。”
2.2 形态二:混合部署(Hybrid),生产环境推荐方案
90% 的真实场景属于这一类:核心模型服务(如 vLLM、Ollama)跑在独立容器或服务器上,而轻量级 Skill(PDF 解析、JSON 格式化、飞书推送)仍用本地 Python。此时 OpenClaw Runtime 不再是“中心”,而是“协调者”。
部署结构如下:
[Client] ↓ HTTP POST /flows/contract-review [OpenClaw Runtime] ←→ [vLLM Server: http://vllm:8000/v1/chat/completions] ↓ (gRPC) [pdf_parser_skill: http://localhost:8001] ↓ (HTTP) [clause_matcher_skill: http://mongo-skill:8002] ↓ (HTTP webhook) [Feishu Bot]关键配置在openclaw.yaml中:
skills: - id: pdf_parser endpoint: "http://localhost:8001" protocol: "http" - id: vllm_model endpoint: "http://vllm:8000/v1/chat/completions" protocol: "http" auth: "Bearer ${VLLM_API_KEY}" # 支持环境变量注入 - id: feishu_notifier endpoint: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx" protocol: "http" method: "POST"部署实操要点:
- Runtime 本身用
docker run -p 8080:8080 -v $(pwd):/app -e VLLM_API_KEY=xxx openclaw/server:latest启动; vLLM单独用docker run --gpus all -p 8000:8000 vllm/vllm-openai:latest --model meta-llama/Meta-Llama-3-70B-Instruct启动;pdf_parser_skill用uvicorn skills.pdf_parser:app --port 8001启动(需实现 FastAPI 兼容接口);- 所有服务通过 Docker Network 或 Kubernetes Service DNS 互通。
为什么这是生产首选?因为你可以对每个组件独立做:
- vLLM:GPU 资源限制、请求队列长度、KV Cache 优化;
- pdf_parser:CPU 限制、并发数控制、文件大小熔断;
- Runtime:流量限速、失败重试次数、超时阈值(
timeout: 30s); - 它们互不影响,故障域隔离,监控粒度精细。
2.3 形态三:全容器化(All-Containerized),大规模编排场景
当 Skill 数量超过 20 个,且涉及 Java/Skill、Rust/Skill、Go/Skill 多语言混布时,推荐此形态。OpenClaw Runtime 不再启动任何本地 Skill,所有 Skill 都是独立容器,通过 Kubernetes Service 名称发现。
此时openclaw.yaml变成:
skills: - id: pdf_parser endpoint: "http://pdf-parser-svc.default.svc.cluster.local:8000" - id: clause_matcher endpoint: "http://clause-matcher-svc.default.svc.cluster.local:8000" - id: embedding_service endpoint: "http://embedding-svc.default.svc.cluster.local:8000"部署关键动作:
- 为每个 Skill 编写
Dockerfile,暴露标准/health和/invoke端点; - 用 Helm Chart 或 Kustomize 统一管理所有 Skill 的 Deployment、Service、HPA(水平 Pod 自动伸缩);
- OpenClaw Runtime 作为 StatefulSet 部署,挂载 ConfigMap 存储
openclaw.yaml; - 用 Prometheus + Grafana 监控每个 Skill 的
http_request_duration_seconds和openclaw_flow_step_duration_seconds。
经验之谈:我在一个金融风控项目中采用此形态,将 37 个 Skill(含 4 个 Java 微服务、12 个 Python Skill、21 个 Rust Skill)全部容器化。最大的收益不是性能提升,而是发布效率:每次更新一个 Skill,只需kubectl rollout restart deployment/pdf-parser-svc,5 秒内新版本就绪,且不影响其他 Skill。而过去用形态一,改一行代码就要重启整个 Runtime,平均中断 47 秒。
注意:网上搜索“railway部署”“群晖 docker openclaw”等词,本质上都是在问“如何把形态二或三落地到特定 PaaS 平台”。Railway 适合快速验证形态二(它原生支持多服务互联),群晖则需手动创建 Docker Network 并指定
--network参数,否则 Skill 容器间无法通信——这是新手踩坑最多的地方。
3. “openclaw : 无法将‘openclaw’项识别为 cmdlet”?Windows 用户的 PowerShell 权限陷阱
这是 Windows 用户部署 OpenClaw 时,遇到频率最高、最让人抓狂的报错。它看似是环境问题,实则是 PowerShell 的执行策略(Execution Policy)在作祟。当你在 PowerShell 中输入openclaw --version,系统不是找不到命令,而是根本拒绝执行任何未签名的脚本——而pip install openclaw安装的openclaw.exe(Windows 下是.exe文件,非.ps1脚本)恰好触发了这一安全机制。
我们来还原这个错误的完整发生链:
- 你用
pip install openclaw成功安装(pip show openclaw显示已安装); openclaw命令被写入Scripts/目录(如C:\Users\XXX\AppData\Roaming\Python\Python311\Scripts\openclaw.exe);- PowerShell 在 PATH 中找到
openclaw.exe,但根据当前 ExecutionPolicy,它会先检查该.exe是否被微软签名; - 由于
openclaw.exe是 Python 打包工具(PyInstaller)生成的,未经过微软 EV 证书签名,PowerShell 直接拦截并抛出那句经典错误。
解决方案不是“禁用 PowerShell 安全策略”(那是危险操作),而是绕过它:
3.1 最稳妥方案:改用 CMD 或 Windows Terminal(默认启用 CMD)
- 按
Win+R,输入cmd,回车; - 在 CMD 窗口中执行
openclaw --version,100% 成功; - 或在 Windows Terminal 中新建“命令提示符”标签页,而非“PowerShell”标签页。
为什么有效?因为 CMD 的执行策略是宽松的,它只检查文件扩展名(
.exe,.bat),不校验数字签名。而 OpenClaw 的 Windows 发行版就是标准.exe,CMD 天然兼容。
3.2 如果必须用 PowerShell:临时提升当前会话策略
在 PowerShell 中执行:
Set-ExecutionPolicy RemoteSigned -Scope CurrentUser然后关闭并重新打开 PowerShell。此时openclaw命令即可使用。
原理:RemoteSigned策略允许运行本地编写的脚本(无需签名),只对从互联网下载的脚本要求签名。openclaw.exe是pip从 PyPI 下载后本地生成的,符合此策略。
⚠️ 注意:不要用
Set-ExecutionPolicy Unrestricted!这会降低整个系统的安全性。RemoteSigned -Scope CurrentUser是最小权限原则的体现——只影响当前用户,且仅放宽对本地脚本的限制。
3.3 终极一劳永逸方案:用 Scoop 包管理器安装(推荐给长期使用者)
Scoop 是 Windows 下类比 Homebrew 的包管理器,它安装的所有软件都放在~/scoop/apps/下,并自动添加到 PATH,且绕过 PowerShell 签名检查。
安装步骤:
# 1. 安装 Scoop(在 PowerShell 中执行) Set-ExecutionPolicy RemoteSigned -Scope CurrentUser irm get.scoop.sh | iex # 2. 添加 extras bucket(包含 openclaw) scoop bucket add extras # 3. 安装 openclaw scoop install openclaw此后,无论你在 CMD、PowerShell 还是 Git Bash 中,openclaw命令都永久可用。且scoop update openclaw可一键升级,比pip install --upgrade openclaw更可靠(避免 pip 依赖冲突)。
实测对比:我在三台不同配置的 Windows 11 机器上测试,用 Scoop 安装的 OpenClaw,首次运行成功率 100%;用 pip 安装的,在 PowerShell 中失败率 83%(均因 ExecutionPolicy)。这不是 OpenClaw 的 bug,而是 Windows 安全机制与 Python 包管理生态的天然摩擦点——知道它,就能避开 90% 的 Windows 部署卡点。
4. 从零构建一个可运行的 OpenClaw Flow:以“PDF 合同风险摘要”为例
光讲理论不够,我们来动手构建一个真实可用的 OpenClaw Flow。目标:上传一份 PDF 合同,自动提取文本、识别关键条款(金额、期限、违约责任)、查询知识库匹配高风险条款、生成中文摘要并推送到飞书群。全程不写一行业务逻辑代码,只靠配置和标准 Skill 组合。
4.1 前置准备:四个必备 Skill 的获取与启动
我们不从零开发,而是复用社区成熟 Skill(全部开源,可直接git clone):
| Skill 名称 | 作用 | 获取方式 | 启动命令 |
|---|---|---|---|
pdf-parser-skill | 解析 PDF 为纯文本+表格 | git clone https://github.com/openclaw-community/pdf-parser-skill | cd pdf-parser-skill && pip install -r requirements.txt && python app.py |
llm-router-skill | 调用本地 vLLM/Ollama 模型 | git clone https://github.com/openclaw-community/llm-router-skill | OPENCLAW_LLM_ENDPOINT=http://localhost:8000/v1/chat/completions python app.py |
mongo-query-skill | 查询 MongoDB 知识库 | git clone https://github.com/openclaw-community/mongo-query-skill | MONGO_URI=mongodb://localhost:27017 MONGO_DB=risk_db python app.py |
feishu-notifier-skill | 推送消息到飞书 | git clone https://github.com/openclaw-community/feishu-notifier-skill | FEISHU_WEBHOOK=https://open.feishu.cn/open-apis/bot/v2/hook/xxx python app.py |
关键细节:
- 所有 Skill 默认监听
localhost:8000~8003,端口冲突时修改app.py中的uvicorn.run(..., port=800X); mongo-query-skill需提前在 MongoDB 中创建risk_db.clause_collection,插入示例数据:{ "clause_id": "CLAUSE_001", "category": "违约责任", "content": "若乙方逾期付款超过30日,甲方有权解除合同并要求支付合同总额20%的违约金。", "risk_level": "HIGH" }feishu-notifier-skill的 Webhook URL 从飞书开放平台创建机器人后获得,务必开启“自定义机器人”权限。
4.2 编写openclaw.yaml:定义 Runtime 行为
# openclaw.yaml server: host: "0.0.0.0" port: 8080 log_level: "INFO" skills: - id: pdf_parser endpoint: "http://localhost:8000" protocol: "http" timeout: "30s" - id: llm_router endpoint: "http://localhost:8001/v1/chat/completions" protocol: "http" timeout: "120s" auth: "Bearer ${VLLM_API_KEY}" - id: mongo_query endpoint: "http://localhost:8002" protocol: "http" timeout: "10s" - id: feishu_notifier endpoint: "http://localhost:8003" protocol: "http" timeout: "5s" # 全局重试策略:所有 Skill 调用失败时,最多重试 2 次,间隔 1s retry: max_attempts: 2 backoff_factor: 1.04.3 编写flows/contract-review.yaml:定义业务流程
# flows/contract-review.yaml name: "合同风险摘要生成" description: "解析PDF合同,识别高风险条款,生成摘要并推送飞书" steps: # Step 1: 解析 PDF - id: parse_pdf skill: "pdf_parser" input: file_url: "${input.file_url}" # 输入由外部传入 output: text: "$.text" tables: "$.tables" # Step 2: 提取关键字段(金额、期限等) - id: extract_fields skill: "llm_router" input: messages: - role: "system" content: "你是一个专业的合同分析师。请从以下文本中精准提取:合同总金额(单位:万元)、合同期限(格式:X年X个月)、违约责任条款原文。只返回 JSON,字段名为amount、duration、breach_clause。" - role: "user" content: "${parse_pdf.text}" output: amount: "$.choices[0].message.content.amount" duration: "$.choices[0].message.content.duration" breach_clause: "$.choices[0].message.content.breach_clause" # Step 3: 查询知识库匹配高风险条款 - id: query_risk skill: "mongo_query" input: collection: "clause_collection" filter: category: "违约责任" risk_level: "HIGH" projection: ["clause_id", "content"] output: matched_clauses: "$.result" # Step 4: 生成最终摘要 - id: generate_summary skill: "llm_router" input: messages: - role: "system" content: "你是一个资深法务。请根据以下信息,用中文生成一段 200 字内的专业风险摘要:1. 合同金额:${extract_fields.amount}万元;2. 期限:${extract_fields.duration};3. 违约条款:${extract_fields.breach_clause};4. 匹配到的高风险条款:${query_risk.matched_clauses[0].content}。重点指出风险点和建议。" - role: "user" content: "请生成摘要。" output: summary: "$.choices[0].message.content" # Step 5: 推送飞书 - id: notify_feishu skill: "feishu_notifier" input: message: title: "【合同风险预警】${input.contract_name}" content: | ${generate_summary.summary} --- *由 OpenClaw AI 流水线自动生成* output: status: "$.status" # 定义流程输入 Schema(供 API 调用时校验) input_schema: type: "object" properties: file_url: type: "string" description: "PDF 文件的可公开访问 URL" contract_name: type: "string" description: "合同名称,用于飞书标题" required: ["file_url", "contract_name"]4.4 启动与验证:五步走通全流程
启动所有 Skill(按顺序,确保依赖就绪):
# 终端1:启动 pdf-parser cd pdf-parser-skill && python app.py # 终端2:启动 mongo-query(确保 MongoDB 已运行) cd mongo-query-skill && MONGO_URI=mongodb://localhost:27017 MONGO_DB=risk_db python app.py # 终端3:启动 feishu-notifier cd feishu-notifier-skill && FEISHU_WEBHOOK=xxx python app.py # 终端4:启动 vLLM(或 Ollama) docker run --gpus all -p 8000:8000 vllm/vllm-openai:latest --model meta-llama/Llama-3-70B-Instruct # 终端5:启动 llm-router(指向 vLLM) cd llm-router-skill && OPENCLAW_LLM_ENDPOINT=http://localhost:8000/v1/chat/completions python app.py启动 OpenClaw Runtime:
openclaw server start --config openclaw.yaml用 curl 触发流程(替换为你的 PDF URL):
curl -X POST http://localhost:8080/flows/contract-review \ -H "Content-Type: application/json" \ -d '{ "file_url": "https://example.com/sample-contract.pdf", "contract_name": "2024年度技术服务合同" }'观察终端输出:Runtime 会逐行打印每个 Step 的耗时、状态码、输入/输出摘要。成功时最后显示
"status": "success"。检查飞书群:应收到格式工整的风险摘要卡片。
实操心得:第一次跑通时,我卡在 Step 2 的
llm_router超时(120s 不够 Llama-3-70B 生成长文本)。解决方案不是加超时,而是在llm_router的app.py中增加流式响应支持(stream: true),让 Runtime 能实时接收 token 并计算进度。这体现了 OpenClaw 的核心哲学:Runtime 不干预 Skill 内部逻辑,但提供标准化的“可观测性接口”——你只需让 Skill 输出符合约定的event: token格式,Runtime 就能自动渲染进度条。这个细节,官方文档没写,但社区 Wiki 里有。
5. 生产环境避坑指南:那些文档里不会写的 7 个致命细节
部署 OpenClaw 到生产环境,最难的往往不是技术实现,而是那些“看起来很合理,实际会崩盘”的隐性假设。以下是我在 5 个不同行业客户现场踩过的坑,按严重程度排序,每一个都曾导致线上服务中断超 2 小时。
5.1 坑一:MongoDB 查询 Skill 的连接池泄漏(最高危)
现象:mongo-query-skill运行 24 小时后,MongoDB 连接数飙升至 500+,数据库响应变慢,最终openclaw flow run报Connection refused。
根因:Skill 使用pymongo时,未显式创建MongoClient单例,而是在每次/invoke请求中新建MongoClient()。pymongo的MongoClient是线程安全的,但每个实例会维护自己的连接池。OpenClaw Runtime 默认并发处理 10 个 Flow 请求,每个请求新建一个MongoClient,等于同时打开 10 个连接池(每个池默认 100 连接),瞬间打爆 MongoDB。
修复方案(mongo-query-skill/app.py):
# ❌ 错误:每次请求都新建 client @app.post("/invoke") def invoke(request: Request): client = MongoClient(MONGO_URI) # 危险! db = client[MONGO_DB] # ... 查询逻辑 # ✅ 正确:全局单例 client client = MongoClient(MONGO_URI, maxPoolSize=20, minPoolSize=5) # 显式控制池大小 db = client[MONGO_DB] @app.post("/invoke") def invoke(request: Request): # 直接使用全局 client,无需新建 collection = db[request.json()["collection"]] # ... 查询逻辑经验:所有 Skill 的数据库客户端、HTTP 会话(
requests.Session)、大模型推理客户端(vLLMAsyncClient)都必须做成全局单例。OpenClaw Runtime 不负责资源管理,它只负责调用——资源生命周期由 Skill 自己掌控。
5.2 坑二:Flow 中的${input.xxx}变量未转义,导致 JSON 注入
现象:当input.contract_name包含双引号(如"2024"年度合同),Step 4 的llm_router输入 JSON 格式错误,openclaw报JSONDecodeError: Invalid control character。
根因:OpenClaw 的变量插值是字符串替换,不做任何 JSON 转义。"${input.contract_name}"直接拼进 JSON 字符串,"2024"年度合同变成"title": "2024"年度合同",破坏了 JSON 结构。
修复方案:在openclaw.yaml中启用strict_json_mode: true(v0.8.2+ 版本支持):
server: strict_json_mode: true # 自动对所有插值变量做 json.dumps() 转义或手动在 Flow YAML 中用json_escape函数:
- id: notify_feishu skill: "feishu_notifier" input: message: title: "【合同风险预警】${json_escape(input.contract_name)}"5.3 坑三:Docker 容器内时区错误,导致日志时间戳全乱
现象:所有 Skill 容器的日志时间显示为1970-01-01或UTC 时间,运维排查问题时无法对齐时间线。
根因:Alpine Linux 基础镜像(python:3.11-alpine)默认不安装tzdata包,且未设置TZ环境变量。
修复方案(Dockerfile):
FROM python:3.11-alpine # 安装时区数据 RUN apk add --no-cache tzdata # 设置时区(中国) ENV TZ=Asia/Shanghai # 复制时区文件 RUN cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime5.4 坑四:vLLM Skill 的--max-num-seqs参数未调优,吞吐暴跌 60%
现象:vLLM 服务 CPU 利用率仅 30%,但openclaw flow run平均延迟高达 8 秒,远高于单次 LLM 调用的 1.2 秒。
根因:vLLM 默认--max-num-seqs 256,但 OpenClaw Runtime 默认并发 10 个 Flow,每个 Flow 可能触发多个 Skill 调用(如 Step 2 和 Step 4 都调 vLLM),导致 vLLM 队列积压。
修复方案:根据硬件调整 vLLM 参数:
# A10G(24G GPU)推荐 docker run --gpus all -p 8000:8000 vllm/vllm-openai:latest \ --model meta-llama/Llama-3-70B-Instruct \ --max-num-seqs 64 \ --max-model-len 8192 \ --gpu-memory-utilization 0.95.5 坑五:飞书 Webhook 速率限制,导致通知丢失
现象:高并发时(>5 QPS),部分飞书消息未送达,feishu-notifier-skill日志显示429 Too Many Requests。
根因:飞书机器人默认 20 QPS 限额,且feishu-notifier-skill未实现退避重试。
修复方案:在 Skill 中加入指数退避:
import time import requests from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, min=1, max=10)) def send_to_feishu(webhook, message): resp = requests.post(webhook, json=message) if resp.status_code == 429: raise Exception("Rate limited") resp.raise_for_status()5.6 坑六:OpenClaw Runtime 的--log-level DEBUG开启后,磁盘爆满
现象:开启 debug 日志一周后,/var/log/openclaw/占用 42GB,容器因磁盘满而崩溃。
根因:DEBUG 日志包含每个 Skill 的完整 HTTP 请求/响应 Body(含 Base64 图片),单次 Flow 日志可达 10MB。
修复方案:生产环境永远用--log-level INFO,调试时用--log-level WARN+--log-file /tmp/openclaw-debug.log临时捕获,并配合 logrotate:
# /etc/logrotate.d/openclaw /var/log/openclaw/*.log { daily missingok rotate 30 compress delaycompress notifempty create 644 openclaw openclaw }5.7 坑七:Kubernetes 中 Skill 的 readinessProbe 配置不当,导致流量涌入未就绪实例
现象:K8s 滚动更新时,新 Pod 启动后立即收到流量,但mongo-query-skill还未连上 MongoDB,返回 503。
根因:readinessProbe只检查/health端点 HTTP 状态码,但/health未校验下游依赖(如 MongoDB 连通性)。
修复方案:修改 Skill 的/health端点,加入依赖检查:
@app.get("/health") def health(): # 检查 MongoDB try: client.admin.command('ping') mongo_ok = True except: mongo_ok = False # 检查自身状态 return { "status": "ok" if mongo_ok else "degraded", "checks": {"mongodb": mongo_ok} }并在 K8s Deployment 中配置:
readinessProbe: httpGet: path: /health port: 8000 initialDelaySeconds: 10 periodSeconds: 5 # 只有当 /health 返回 status: "ok" 时才认为就绪最后一句真心话:OpenClaw 的文档(包括官网和 GitHub Wiki)写得其实很清晰,但它默认读者已经理解“分布式系统可观测性”“容器化资源管理”“K8s 生命周期钩子”这些前置概念。而现实是,很多团队是第一次把 AI 能力当微服务来治理。所以,部署 OpenClaw 的过程,本质上是一次团队工程能力的集体升级——你填的每一个坑,都在为下一次更复杂的 AI 流水线铺路。
