最近后台几乎每天都能收到同一类问题:OpenClaw(Clawdbot)到底怎么部署?下载安装脚本之后,要么提示 node runtime not found,要么控制台没起来,要么换了 DeepSeek 之后直接报 unknown model。老实说,这些问题九成不是 OpenClaw 本身的问题,而是部署那几步没踩对。这篇我就把自己跑过多轮的实际过程整理出来,把常见的部署路径、模型接入、渠道对接和排错经验一次性讲清楚,照着走基本能避开所有我踩过的坑。
OpenClaw 是一个开源智能体运行时,Clawdbot 是项目早期的代码名,后来仓库对外统一叫 OpenClaw,但很多老教程和讨论里还在用 Clawdbot 这个叫法。它的定位并不是又一个聊天机器人,而是一个“个人数字员工”:负责把大模型、工具调用、消息渠道、长期记忆全部串起来。你给它一个模型 API,它就能读文档、调外部接口、在微信/飞书/钉钉里回消息,甚至连续执行一套任务。对于想在本地跑私有智能体、做自动写作、做个人助理,或者想二次开发的开发者来说,这个项目是很值得折腾的方向。
不过“一键部署”这四个字容易让人产生误解。OpenClaw 的一键并不等于零思考,官方脚本解决的是运行时安装和基础初始化,真正要让智能体跑起来并符合你的需求,还得想清楚三件事:部署环境选什么、模型接哪个、接入哪些渠道。下文就按这个逻辑来写。
1. 搞清楚 OpenClaw 到底在解决什么问题
1.1 它不是聊天机器人,而是智能体运行时
很多人第一次看到 OpenClaw,会下意识把它和 ChatGPT、Claude 这类聊天产品对比,然后产生困惑:我直接调 API 不就行了,为什么要多一层运行时?
这个区别很关键。你直接调 API 是“一问一答”模式:发一段 prompt,拿一段回复,结束。但 OpenClaw 做的事情更像一个操作系统:模型只是其中一个组件,它还负责接收消息、判断该调用哪个工具、维护会话状态、读写记忆、管理多模型路由。举个例子,你让它“帮我查一下明天的机票价格,然后整理成表格发到我的工作群”,如果只调模型 API,模型不知道你有工作群,也不知道去哪里查机票。但 OpenClaw 可以通过消息渠道拿到指令,调度一个查询机票的 Skill,再把输出格式化成表格,最后通过飞书/钉钉机器人发出去。这一整条链路,才是“智能体”和“聊天机器人”的本质区别。
所以部署 OpenClaw 的核心目标,是搭一个可以持续运行、可以挂工具、可以接渠道的骨架。模型可以随时换,Skill 可以不断加,渠道可以按需开。这才是它值得部署的原因。
1.2 “一键部署”到底一键了什么
如果你去看官方 README,会发现安装 OpenClaw 确实可以简化为一条命令。但这条命令背后做了很多事情:
- 检查系统架构和操作系统类型
- 安装或校验 Node.js 运行时(很多报错就出在这一步)
- 下载核心代码和默认依赖
- 在用户目录下初始化配置文件夹(Linux/macOS 是
~/.openclaw,Windows 是C:\Users\<用户名>\.openclaw) - 生成默认配置模板和一个可启动的控制台服务
这是“环境层面”的一键。但环境装完之后,还有“配置层面”的工作:填模型 API、选默认模型、决定是否启用长期记忆、接消息平台。这些通常是在控制台或配置文件里完成的。
理解这两层之后,你遇到报错时就不会慌。环境层面的问题,优先检查安装日志和 Node.js 版本;配置层面的问题,优先检查配置文件里的模型名、API Key 和 Base URL。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. 部署前的选型和环境准备
2.1 三种部署方式怎么选
我实际跑过的部署方式有四种:Windows 原生部署、macOS 用 Docker 部署、Linux 云服务器部署、虚拟机部署。每种方式的适用场景不太一样,先看清楚再动手能省很多事。
| 部署方式 | 适合场景 | 优点 | 需要注意的问题 |
|---|---|---|---|
| Windows 原生安装 | 日常开发、本地体验 | 启动快、日志直观、便于改代码 | Node.js 环境变量、PowerShell 执行策略、路径不能带中文 |
| macOS + Docker | Mac mini、MBP 本地长期跑 | 环境隔离、卸载干净、升级方便 | M1/M2 芯片需要 arm64 镜像,端口映射要配好 |
| Linux 云服务器 | 7x24 小时运行、团队共用 | 稳定、可以挂 systemd 守护 | 安全组端口、磁盘空间、内存至少 2GB 以上 |
| 虚拟机 / NAS | 不想污染宿主机、家里有 NAS | 快照回滚方便、资源隔离 | 网络模式建议选桥接或 host,否则外部渠道回调不到 |
如果你只是想尝鲜,首选 Windows 原生或 Mac 本地 Docker,出错容易排查。如果你打算长期当个人助理用,我建议直接上一台 Linux 云服务器或者家里 NAS,用 Docker 方案,稳定性和维护成本都更可控。
2.2 Node.js 环境先确认,再谈下一步
在 Windows 上经常看到的 oneclaw node runtime not found,本质上就是 OpenClaw 找不到可用的 Node.js。原因一般有两个:一是根本没装 Node.js,二是装了但没把 Node 安装目录加到 PATH。
OpenClaw 依赖 Node.js,建议装 18 或 20 的 LTS 版本,不要用太新的奇数版本,也不要为了方便去用某些“绿色版”。装完之后,先开一个新的 PowerShell 窗口验证:
powershell复制node -v
npm -v
如果能正常输出版本号,再继续。如果提示找不到命令,说明 PATH 没生效,要么重启终端,要么手动把 Node 安装目录加到系统环境变量。还有一点容易被忽略:Windows 上的 PowerShell 默认执行策略可能禁止运行脚本,你需要以管理员身份执行一次:
powershell复制Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser
这步只影响当前用户的脚本执行权限,不会降低系统安全性,但很多人把脚本下载下来双击运行,结果一闪而过,原因就是执行策略拦住了。
2.3 模型接入规划:别等到启动后才想
OpenClaw 本身不包含模型,它需要一个模型 API 才能回复消息。我第一次部署时犯的错就是先把服务拉起来,然后才去翻模型配置,结果控制台一直报 agent failed before producing a reply。所以建议你提前规划好模型来源。
常见的模型来源有三类:
- 云端模型 API:比如 DeepSeek、OpenAI、通义、文心等,直接填 API Key 和 Base URL 就行。搜索词里那个
unknown model: deepseek的报错,多半是模型 ID 写成了deepseek,实际应该是deepseek-chat或deepseek-reasoner。 - 本地模型:用 Ollama、vLLM 等工具在本地起一个模型服务,OpenClaw 通过 OpenAI 兼容接口去连。好处是数据不出本机,坏处是吃显卡/内存。
- NVIDIA NIM 这类推理服务:如果公司或自己有 GPU 服务器,可以跑 NIM 提供的 OpenAI 兼容端点。配置方式和云端 API 几乎一样,只是 Base URL 换成你自己的 NIM 服务地址。
我建议主对话模型选一个强模型,工具调用或轻量任务选一个便宜速度快的模型。这样既能保证复杂任务的质量,日常高频请求的费用也能压下来。
3. 三种常见场景下的完整部署过程
3.1 Windows 原生安装:PowerShell 一条龙
Windows 原生部署是很多人的第一站,因为我个人用过感觉最直接的排查方式。具体过程我拆成几步:
- 把 Node.js 装好,确认
node -v能输出版本号。 - 打开 PowerShell,执行官方 README 给出的安装脚本。
- 等待依赖下载完成。这一步会输出很多日志,看到
Installation complete或类似字样就是成功了,不要在中途按 Ctrl+C。 - 进入配置目录,执行初始化命令,通常类似
openclaw init,会引导你填写模型 API Key、默认模型等基础信息。 - 启动服务,执行
openclaw start或openclaw serve。 - 根据日志里的提示,用浏览器打开 Control UI,确认界面能正常访问。
整个过程中,我最想提醒的是:不要把项目装到带中文或空格的路径里,比如 C:\Users\我的账号\Clawdbot Project 这种,运行时会因为路径解析出一些很奇怪的问题,排查起来浪费一小时起步。
PowerShell 执行策略,和 Node 的 PATH 这两个前置条件,一定要在运行安装脚本前解决。否则你会看到提示“无法加载文件 xxx.ps1,因为在此系统上禁止运行脚本”,这其实和 OpenClaw 本身没关系,是 PowerShell 的安全策略。
3.2 Mac mini 用 Docker 本地部署
如果你用的是 Mac mini,尤其是 M 系列芯片,我非常推荐用 Docker 部署,原因很简单:不污染宿主机,想删干净随时删,升级也只需要拉新镜像。
Docker 部署的核心是一个 docker-compose.yml 文件。一个典型的结构长这样:
yaml复制version: "3.8"
services:
openclaw:
image: openclaw/openclaw:latest # 具体镜像名以官方仓库为准
container_name: openclaw
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- ~/.openclaw:/app/.openclaw
environment:
- OPENCLAW_PORT=8080
- OPENCLAW_DATA_DIR=/app/.openclaw
为什么要把 ~/.openclaw 挂载出来?因为 OpenClaw 的配置、日志、记忆数据都存在这个目录里。如果不挂载,容器一旦被删除,所有配置和记忆就全没了。我第一次用 Docker 部署时没挂载,升级镜像之后发现整个智能体“失忆”了,连模型的 API Key 都要重新填,非常痛苦。
启动命令很简单:
bash复制docker compose up -d
然后查看日志:
bash复制docker logs -f openclaw
看到服务启动后,访问 http://localhost:8080 即可打开 Control UI。如果打开一片空白,先看日志有没有报错,再看端口有没有被占用,最后用无痕窗口刷新一次,排除浏览器缓存问题。
3.3 云服务器 / 虚拟机 / NAS 上的部署
云服务器部署和本地部署最大的区别在于:你需要把它当成一个真正的“服务”来对待,而不是开一个终端跑一下。
如果是 Linux 云服务器,我建议也用 Docker 方案。步骤大体是:装 Docker、写 compose 文件、启动容器。但有三个额外注意点:
第一,安全组放行端口。云厂商的控制台里有一个安全组规则,你需要把 Control UI 的端口放行才行。这里我建议设置访问来源 IP 白名单,不要直接对全网开放,不然你的智能体控制台等于裸奔在公网上。
第二,用 systemd 或 Docker 的 restart: unless-stopped 保证进程退出后自动拉起。因为服务器上可能会有各种意外重启,不设置自动重启的话,你人不在电脑前,服务挂了就只能干等着。
第三,注意数据备份。OpenClaw 的配置和记忆都在 ~/.openclaw 目录下,服务器不是本地电脑,系统盘出问题的风险更高。我一般会定期把这个目录打包传到对象存储或另一台机器上。
虚拟机部署的逻辑和云服务器几乎一样,但有一个小坑:虚拟机的网络模式。如果你在 VirtualBox 或 VMware 里跑,建议把网络设为桥接模式或 host-only,否则宿主机访问不到虚拟机里的 Control UI。NAS 部署则是 Docker 套件的场景,只要 NAS 系统支持 Docker,流程和云服务器一致,但要注意存储池的路径映射,别把数据写到临时目录里。
4. 把智能体接好大脑和手脚
4.1 多模型配置与切换模型的正确姿势
OpenClaw 支持一个实例里配置多个模型,这是它非常实用的能力。我的建议是至少配两个:一个主力模型负责复杂对话和任务拆解,一个快速模型负责轻量任务或工具调用。
配置大致长这样:
yaml复制models:
main:
provider: openai-compatible
base_url: https://api.deepseek.com/v1
api_key: sk-xxxx
model: deepseek-chat
max_tokens: 8192
fast:
provider: openai-compatible
base_url: http://localhost:11434/v1
api_key: ollama
model: qwen2.5:7b
注意 provider 这一项决定了请求协议怎么拼。如果你接的是 OpenAI 兼容接口,几乎都可以用 openai-compatible 这个 provider。如果你接的是 NVIDIA NIM,只需要把 base_url 改成 NIM 服务和端口,模型名改成 NIM 里部署的模型名。
切换模型最常踩的坑是:配置改了,但服务没重启;或者模型名写错。例如 unknown model: deepseek 这个报错,我实际遇到的场景就是配置里写 deepseek,而 API 服务期望的是 deepseek-chat。解决方式很简单:先去模型服务商的文档里查准确模型 ID,然后重启 OpenClaw。
还有一个容易被忽略的点:切换模型之后,最好清一下会话。因为旧会话的历史消息里可能带了很多上一个模型的指令格式,新模型读不懂会行为异常。你可以从 Control UI 里新建一个会话再测试。
4.2 接入微信、飞书、钉钉等消息平台
消息渠道是 OpenClaw 最好玩的部分。接入之后,你可以在手机聊天软件里直接指挥智能体,体验完全不一样。
从实现原理上看,接入每个渠道的本质都是:把聊天软件里的消息转发到 OpenClaw,再把 OpenClaw 的回复发回聊天软件。所以你必须先到对应平台创建机器人或应用,拿到凭证。
先说飞书和钉钉。这两个平台都有完善的应用机器人机制,通常步骤是:在开发者后台创建应用 → 开通机器人能力 → 获得 App ID、App Secret 和加密密钥 → 把凭证填到 OpenClaw 的渠道配置里 → 设置消息订阅或回调地址。回调地址需要你的服务能被外网访问,所以上云服务器部署会更顺畅。
微信这边要谨慎。个人微信没有官方机器人接口,市面上所谓“接入个人微信”的方案基本都依赖第三方协议,有账号风险,也不符合平台规则。我不建议为了体验去把自己日常微信号搭进去。如果你确实需要微信场景,优先考虑企业微信或公众号。企业微信的自建应用机器人是官方支持的方式,安全性高很多。
配置渠道时的安全提醒:所有机器人的凭证都要当密码对待,千万不要写进公开的配置示例、GitHub 仓库或博客代码里。我见过有人把飞书 App Secret 直接贴在配置里发到群里,结果机器人被外面的人疯狂调用。现在的做法是尽量用环境变量注入敏感字段,比如 APP_SECRET=${FEISHU_APP_SECRET}。
4.3 编写自己的 Skill:让智能体会调 API
搜索热度里有一个词是 “openclaw 如何编写 skill 接入 api”,这说明很多人在部署完基础版之后,都希望智能体不只会聊天,还能去调业务系统、查天气、读数据库、发工单。
Skill 是 OpenClaw 的工具插件机制。一个最简单的 Skill 通常由两部分组成:一个是描述文件,说明这个工具什么时候触发;一个是实际执行脚本,接收参数并返回结果。
以“查天气”为例,描述文件里可以写:
yaml复制name: weather_lookup
description: 当用户询问天气情况时调用,比如“今天北京天气”
执行脚本用 Python 写一个最小示例:
python复制import sys
import json
def main(city: str):
# 这里替换成你的天气 API 请求
result = mock_query_weather(city)
return json.dumps({"city": city, "weather": result}, ensure_ascii=False)
if __name__ == "__main__":
city = sys.argv[1]
print(main(city))
流程就是:OpenClaw 收到用户消息后,根据描述文件的语义匹配决定调用哪个 Skill,把从消息里抽出来的参数传进去,再把脚本输出作为模型生成回复的上下文。所以 Skill 描述写得越清楚,模型的调用成功率就越高。
我开始写第一个 Skill 时走了弯路,把描述写了一整段,反而导致模型经常误判。后来我用一句话加几个关键词就够了,比如:
yaml复制description: 查询城市天气。当你需要获取天气信息时使用。参数:city(城市名)
这个细节很重要,因为模型是先读你的描述来决定调不调这个工具的,描述太泛或太啰嗦都会影响判断。
4.4 Active Memory 长期记忆配置要点
部署完之后你会发现,OpenClaw 默认的对话状态只在会话内有效。你问它“刚才让你查的资料呢”,它可能完全不记得——因为会话已经换了一个。这时候就需要 Active Memory(主动记忆)机制。
Active Memory 可以理解为给智能体接了一个长期书架。每次对话结束或任务完成后,智能体可以把关键信息写入记忆库,下次再对话时根据相关性自动取出来。配置上一般需要指定一个记忆存储后端。如果只是个人使用,本地文件就够了;如果数据量大或者想要语义检索效果更好,可以接向量库。
我的实操配置经验有几点:
- 记忆不是越全越好。什么都往里存,检索时反而噪音很大。建议用配置属性去限定只记住用户偏好、项目上下文、任务结论这类高价值信息。
- 定期做小结。OpenClaw 可以设置定时任务或触发词,把一段时间内的会话总结成几条要点,然后压缩记忆。这样长跑几个月之后,记忆库里不会塞满重复内容。
- 敏感信息不要写进记忆。API Key、密码这类信息,我宁可在后续对话里重新填,也不让智能体写进长期存储。
如果你搜索过 “openclaw active memory 高阶指南”,会发现高阶玩法是给记忆加标签和分层级。比如工作记忆、长期记忆、临时缓存各放一类,再设定不同的过期策略。这个思路对做长期个人助理非常有用,但第一次配置时别贪多,先把基础记忆跑通,再慢慢调。
5. 高频报错排查与避坑实录
5.1 最常遇到的 agent failed 报错
the agent run failed before producing a reply 这个报错,几乎每个部署 OpenClaw 的人都会遇到。我第一次看到的时候,第一反应是代码坏了,后来排查多了才发现,它就是一个“包装异常”,真正的原因藏在它上面的日志里。
常见的触发原因有三个:
第一,模型配置问题。API Key 无效、Base URL 填错、模型 ID 不存在、请求超时,都会让 agent 没产出回复就失败。打开日志看最顶部的错误,如果提示 401 或 403,就是鉴权问题;如果提示模型不存在,回模型配置那节把模型 ID 查清楚。
第二,上下文太长。当会话内容超过模型的 max_tokens 上限,请求直接失败。这种情况建议开启会话清理或截断策略。
第三,Skill 执行抛异常。如果你自定义了 Skill,而脚本崩溃了,agent 拿不到工具返回结果,也会直接报这个错。排查方法是先去控制台或日志里找到 Skill 的调用记录,单独手动执行一遍那个脚本,确认脚本本身没问题。
我自己的排查步骤是:先翻日志最后 50 行,定位是模型层还是工具层报错,再针对性处理。这个习惯帮我省了大量时间。
5.2 node runtime not found 与 Control UI 起不来
这两个问题往往同时出现。Windows 下的 node runtime not found,前面已经说过,是 Node.js 没装好或 PATH 没生效。还有一种情况是安装脚本用了 nvm(Node 版本管理器)装了多个 Node 版本,当前 shell 用的是 nvm 的临时路径,但服务由系统服务方式启动时,读不到那个临时路径,于是报 runtime not found。
解决办法是:要么配置全局 Node 路径,要么不要混用多种 Node 安装方式,统一用官方安装包。
Control UI 起不来的问题,我遇到的几率也比较高。可能的原因包括:
- 服务启动了但监听的不是你访问的端口。日志里会写明确地址,留意是
http://localhost:8080还是其他端口。 - 浏览器缓存旧页面。用无痕窗口访问一次,能排除缓存问题。
- 端口被占用。在 Windows 上用
netstat -ano | findstr 8080查端口占用,把占用进程结束或换端口。
5.3 文件读取失败和删除目录报错 EBUSY
OpenClaw 读取不了文档,是很多人搜索的高频问题。我实际跑下来,原因通常就三种:
- 路径问题。Windows 下路径里的反斜杠在配置文件里被当成转义符,需要写成双反斜杠或用正斜杠。
- 权限问题。服务以普通用户身份运行,但文档在系统目录或加密盘里,读不到。
- 格式问题。OpenClaw 对文档格式有支持范围,比如某些特殊编码的文本、损坏的 PDF 或者超大文件,都可能解析失败。
如果你确定文件本身没问题,先在另一个普通目录下放一份测试文档,看能不能读,能快速缩小原因范围。
至于 failed to remove ~\.openclaw: error: EBUSY: resource busy or locked,这是 Windows 特有的问题。意思是 ~\.openclaw 目录下有文件被某个进程占用着,删不掉。多半是 OpenClaw 服务还在后台运行,甚至你上次启动的 Node 进程没退出。
解决办法:
- 先停掉 OpenClaw 服务,不管是通过命令还是任务管理器。
- 检查有没有残留的 node 进程,在 PowerShell 执行:
powershell复制tasklist | findstr node
如果有 node 进程,确认是 OpenClaw 的,再执行:
powershell复制taskkill /F /IM node.exe
- 然后重新删除目录。
注意不要无差别杀掉所有 node 进程,如果你机器上还跑着其他 Node 项目,先看清楚进程的命令行再动手。
5.4 常见问题速查表
| 问题现象 | 可能原因 | 解决办法 |
|---|---|---|
| 安装脚本被拒绝 | PowerShell 执行策略限制 | 执行 Set-ExecutionPolicy RemoteSigned -Scope CurrentUser 后重装 |
| node runtime not found | Node 未安装或 PATH 未生效 | 安装 Node LTS,重启终端,确认 node -v 正常 |
| unknown model: deepseek | 模型 ID 写错 | 查服务商文档,改成 deepseek-chat 等真实 ID |
| agent failed before producing a reply | 模型配置错误 / 上下文超限 / Skill 异常 | 查日志顶部错误,按层处理 |
| Control UI 打不开 | 端口错误 / 缓存 / 端口被占 | 看日志确认端口,无痕窗口,查端口占用 |
| EBUSY 删除目录失败 | 服务进程仍在占用文件 | 停服务,杀残留 node 进程,再删除 |
| 文档读取不了 | 路径 / 权限 / 格式问题 | 换普通路径测试,检查文件格式 |
| 切换模型后行为异常 | 旧会话上下文干扰 | 清会话,重启服务后再测试 |
6. 最后给第一次上手的几个建议
最后想给准备部署的朋友们一点个人经验。第一次部署 OpenClaw 不要追求一步到位,先把最小的链路跑通:安装、填一个模型、启动、在控制台聊一句话。这个链路通了,后面加渠道、加 Skill、加记忆只是重复“配置 + 重启 + 看日志”的循环而已。
第二点是养成看日志的习惯。很多人报错时只贴一句最终错误提示,这就像去医院只跟医生说“我不舒服但不告诉你在哪疼”。OpenClaw 的日志信息量很大,往上翻 20 到 30 行,基本能定位到问题区域。如果你拿日志去搜索或者问别人,对方可以几分钟就告诉你答案。
第三点是数据安全。无论部署在哪里,~/.openclaw 这个目录都要定期备份。模型配置、记忆数据、渠道凭证全在这里,丢了几乎等于重新部署一遍。我自己的习惯是每周写个脚本打包上传一次,代价很小,挽回的损失很大。
如果你在手机上想随时体验,最稳妥的方式不是折腾手机端控制台,而是把智能体接入飞书或钉钉机器人。手机装好对应 App,走到哪里都能发消息指挥它干活,这也是我目前一直保持的使用方式。
OpenClaw 的二次开发空间很大。等基础跑通之后,建议去读一下源码里 Skill 的加载逻辑,再仿照现有 Skill 写自己的。到那个时候,你会发现“智能体”这个词不再是一个玄乎的概念,而是一套你可以随手改、随时加的工程系统。
