1. Ubuntu 虚拟机里跑 OpenClaw 2026.3.8 的真实场景与坑点
如果你手上只有一台 Windows 或 macOS 主机,却想完整跑一遍 OpenClaw 2026.3.8 加飞书机器人再加 Deepseek 模型的链路,Ubuntu 虚拟机是最省事的方案。OpenClaw 本身是个 Node 生态的 Agent 网关,它需要常驻进程、需要 WebSocket 长连接、需要能访问外部模型 API,这三件事在虚拟机里都能干净隔离,不会污染你主机的 Node 环境。我这次用的宿主是 Parallels Desktop,虚拟机装的是 Ubuntu 22.04 LTS,配置 4 核 8G,跑下来内存占用稳定在 1.2G 左右,完全够用。
先说清楚这套东西是什么、能做什么、适合谁。OpenClaw 是一个把大模型能力接到即时通讯渠道的网关程序,2026.3.8 这个版本对飞书渠道的支持已经比较成熟,支持长连接接收事件、支持群聊 @ 触发、支持配对码授权。飞书负责当你的聊天前端,Deepseek 负责当你的模型后端,OpenClaw 负责在中间转发和调度。适合谁?适合想给自己团队搭一个内部 AI 助手、又不想把数据往第三方 SaaS 里塞的开发者;也适合想研究 Agent 网关架构、想自己改渠道适配的人。
坑点集中在三个地方。第一是 Node 版本,OpenClaw 2026.3.8 要求 Node 22 以上,Ubuntu 自带的 apt 源里 Node 版本往往偏低,必须用 n 版本管理器切上去。第二是模型通道,默认向导会引导你走官方 OpenAI 通道,但国内直连不稳定,需要把 settings 里的 provider 改成自定义通道,指向 TaoToken 的统一 Key/API 入口,这样飞书里的对话请求才会走你配置的通道。第三是飞书权限,事件订阅必须选长连接模式,并且一定要添加im.message.receive_v1事件,否则机器人收不到任何消息,你会以为是 OpenClaw 挂了,其实是飞书那边没把消息推过来。
我试过在没装桌面环境的纯命令行 Ubuntu 里跑,结果openclaw dashboard打不开,因为 dashboard 依赖浏览器渲染。所以这篇流程里我会把 XFCE 桌面环境的安装也带上,这样你能在虚拟机里直接看 dashboard 面板,排查问题直观很多。整个流程从装系统依赖开始,到飞书里能正常对话结束,每一步都给可复制的命令和配置片段。
2. TaoToken 前置准备:统一 Key 与 API 通道配置
在动 OpenClaw 之前,先把模型通道这块理清楚。OpenClaw 的模型配置写在openclaw.json的models.providers字段里,每个 provider 需要baseUrl、apiKey、api三个核心字段。默认情况下向导会给你生成一个openai:default的 profile,走 OpenAI 官方地址,但实际用起来你会发现请求经常超时,尤其是在虚拟机网络环境里。所以更稳的做法是走 TaoToken 的统一通道,把 baseUrl 指向 TaoToken 的 API 入口,apiKey 用你在 TaoToken 控制台生成的 Key,api 字段保持openai-completions不变,因为 TaoToken 的接口是 OpenAI 兼容格式。
TaoToken 在这里扮演的角色是统一模型网关,你不需要为每个模型厂商单独维护一套 Key 和地址,一个 Key 就能调 Deepseek、GPT 系列等模型。对 OpenClaw 来说,它只认baseUrl + apiKey + model id这三样,所以你把这三样配好,OpenClaw 就认为自己在跟一个标准的 OpenAI 兼容服务对话。这样做的好处是,以后你想换模型,只改models里的 id 就行,不用动渠道配置。
具体操作上,先到 TaoToken 控制台创建一个 API Key,然后记下 API 入口地址。OpenClaw 的 provider 配置里,baseUrl填 TaoToken 的 API 地址,注意不要带多余的路径后缀,OpenClaw 会自己在后面拼/chat/completions。apiKey填你刚生成的 Key,api填openai-completions。模型 id 这块,Deepseek 系列填deepseek-chat,如果你要用推理模型就填对应的 id。配好之后,OpenClaw 的agents.defaults.model.primary指向这个 provider 下的模型 id,格式是provider名/模型id。
这里有个细节要注意,OpenClaw 的 provider 名字是可以自定义的,比如你叫taotoken-gateway,那模型引用就是taotoken-gateway/deepseek-chat。名字里不要带空格和特殊字符,用短横线连接最稳。另外models.mode字段建议保持merge,这样自定义 provider 会和内置的合并,不会覆盖掉内置的 fallback 配置。如果你把 mode 改成replace,那内置的 openai provider 就没了,fallback 会失效。
配好 Key 之后,建议先在命令行用 curl 验证一下通道是否通,再往 OpenClaw 里塞。验证命令很简单,把 baseUrl 和 Key 替换成你自己的,发一个最小的 chat completions 请求,看返回里有没有choices字段。这一步能通,后面 OpenClaw 里基本不会因为通道问题报错。如果这一步就 401,那说明 Key 不对或者 baseUrl 写错了,先解决这个再往下走。
3. 可复制配置:openclaw.json 完整 settings 片段
这一节直接给可复制的配置。OpenClaw 2026.3.8 的配置文件默认路径是/home/<你的用户名>/.openclaw/openclaw.json,如果你是用 Parallels 装的 Ubuntu,用户名可能是parallels,那路径就是/home/parallels/.openclaw/openclaw.json。这个文件在首次运行openclaw onboard之后会自动生成,你也可以手动创建。下面这份配置是我实测能跑通的版本,把模型通道改到了 TaoToken,飞书渠道也配好了,你只需要替换 apiKey、appId、appSecret、token 这几个占位值。
{ "meta": { "lastTouchedVersion": "2026.3.8", "lastTouchedAt": "2026-03-12T12:44:37.730Z" }, "wizard": { "lastRunAt": "2026-03-12T12:44:37.657Z", "lastRunVersion": "2026.3.8", "lastRunCommand": "configure", "lastRunMode": "local" }, "auth": { "profiles": { "taotoken:default": { "provider": "taotoken", "mode": "api_key" } } }, "models": { "mode": "merge", "providers": { "taotoken-gateway": { "baseUrl": "https://taotoken.net/api", "apiKey": "sk-你的TaoTokenKey", "api": "openai-completions", "models": [ { "id": "deepseek-chat", "name": "deepseek-chat (TaoToken)", "reasoning": false, "input": ["text"], "cost": { "input": 0, "output": 0, "cacheRead": 0, "cacheWrite": 0 }, "contextWindow": 16000, "maxTokens": 4096 } ] } } }, "agents": { "defaults": { "model": { "primary": "taotoken-gateway/deepseek-chat", "fallbacks": ["taotoken-gateway/deepseek-chat"] }, "models": { "taotoken-gateway/deepseek-chat": {} }, "workspace": "/home/parallels/.openclaw/workspace", "compaction": { "mode": "safeguard" }, "maxConcurrent": 4, "subagents": { "maxConcurrent": 8 } } }, "tools": { "profile": "coding" }, "messages": { "ackReactionScope": "group-mentions" }, "commands": { "native": "auto", "nativeSkills": "auto", "restart": true, "ownerDisplay": "raw" }, "session": { "dmScope": "per-channel-peer" }, "hooks": { "internal": { "enabled": true, "entries": { "session-memory": { "enabled": true } } } }, "channels": { "feishu": { "enabled": true, "appId": "cli_你的飞书AppID", "appSecret": "你的飞书AppSecret", "connectionMode": "websocket", "domain": "feishu", "groupPolicy": "allowlist" } }, "gateway": { "port": 18789, "mode": "local", "bind": "loopback", "auth": { "mode": "token", "token": "你的GatewayToken" }, "tailscale": { "mode": "off", "resetOnExit": false }, "nodes": { "denyCommands": [ "camera.snap", "camera.clip", "screen.record", "contacts.add", "calendar.add", "reminders.add", "sms.send" ] } }, "plugins": { "load": { "paths": [ "/home/parallels/.npm-global/lib/node_modules/openclaw/extensions/feishu" ] }, "entries": { "feishu": { "enabled": true } } } }这份配置里几个关键点解释一下。models.providers.taotoken-gateway.baseUrl填的是 TaoToken 的 API 入口,apiKey换成你自己的。agents.defaults.model.primary指向taotoken-gateway/deepseek-chat,这样默认对话就走 TaoToken 通道。channels.feishu.connectionMode必须是websocket,这是长连接模式,跟飞书后台的事件订阅方式要对应。gateway.bind是loopback,意味着只监听本机,如果你想让局域网其他设备访问 dashboard,需要改成0.0.0.0并配合openclaw onboard里的 LAN Access 选项。
plugins.load.paths这个路径要跟你实际安装 OpenClaw 的位置一致。如果你是用官方脚本装的,npm 全局包一般在/home/<用户名>/.npm-global/lib/node_modules/openclaw下面,飞书扩展在extensions/feishu。如果你用sudo npm install -g装的,路径可能是/usr/lib/node_modules/openclaw,这个要按实际情况改,路径错了飞书插件加载不起来,机器人不会响应。
改完配置后,不要直接重启,先用openclaw models list看一下模型有没有被正确识别。如果列表里能看到taotoken-gateway/deepseek-chat,说明 provider 配置生效了。如果看不到,检查 JSON 格式有没有语法错误,可以用python3 -m json.tool openclaw.json验证一下。JSON 里不能有注释,不能有尾逗号,这两个是最常见的格式错误。
4. 从零到跑通:Ubuntu 虚拟机安装与验证请求
这一节把安装和验证串起来。假设你已经在虚拟机里装好了 Ubuntu 22.04,并且能正常联网。第一步是装 Node 22。Ubuntu 自带的 apt 源里 Node 版本偏低,所以先用 apt 装一个基础 Node 和 npm,再用 n 版本管理器切到 22。
sudo apt update sudo apt install -y nodejs npm sudo npm install -g n sudo n 22.22.0 node -vnode -v输出应该是v22.22.0或更高。如果还是旧版本,关掉终端重新打开再查一次,因为 n 切换后需要新 shell 才能生效。接着装 OpenClaw 官方脚本:
curl -fsSL https://molt.bot/install.sh | bash安装过程中会问你是否继续,输入yes。装完之后,运行配置向导:
openclaw onboard --flow quickstart向导里会让你选 provider。这里不要选内置的 OpenAI,选custom provider,然后按提示填 baseUrl、apiKey、model id。baseUrl 填 TaoToken 的 API 地址,apiKey 填你的 TaoToken Key,model id 填deepseek-chat。填完之后向导会生成一份openclaw.json,你可以对照上一节的配置检查一遍,把缺的字段补上。
接下来装桌面环境,这样 dashboard 能打开:
sudo apt install -y xfce4 xfce4-goodies sudo apt install -y lightdm sudo dpkg-reconfigure lightdm sudo apt install -y fonts-noto-cjk sudo reboot重启后进入图形界面,打开终端,启动 gateway:
openclaw gateway status openclaw gateway probe openclaw logs --followgateway status里 Service 不应该是missing,probe应该显示Reachable: yes、Connect: ok、RPC: ok。如果 probe 显示不可达,检查gateway.port有没有被占用,用ss -tlnp | grep 18789看一下。日志里如果出现local proxy failed,通常是 baseUrl 写错了或者网络不通,先用 curl 验证 TaoToken 通道。
验证模型调用:
openclaw models list列表里应该能看到你配的taotoken-gateway/deepseek-chat。然后开一个 dashboard:
openclaw dashboard --no-open它会输出一个本地地址,在虚拟机浏览器里打开,就能看到对话界面。在 dashboard 里发一条消息,如果模型正常返回,说明模型通道通了。这一步是整个链路里最关键的验证点,模型通了,剩下的就是飞书渠道的事。
飞书这边,先到飞书开放平台创建应用,拿到 App ID 和 App Secret,填到openclaw.json的channels.feishu里。然后在飞书后台的权限管理里,用批量导入的方式把权限 JSON 粘进去,权限列表里必须包含im:message、im:message.p2p_msg:readonly、im:message:send_as_bot、im:resource这几个。事件订阅里选「使用长连接接收事件」,添加im.message.receive_v1事件。最后到版本管理与发布里创建版本并发布,不发布的话配置不生效。
发布之后,在飞书里找到你的机器人,发一条消息,它会回一个配对码。在终端里执行:
openclaw pairing approve feishu <配对码>配对成功后,再发消息就能正常对话了。如果机器人不回配对码,检查openclaw logs --follow里有没有飞书连接相关的报错,常见的是 appId 或 appSecret 填错,或者事件订阅没选长连接。
5. 常见报错排查:401、local proxy failed、reading choices、OAuth
这一节把几个高频报错单独拎出来说。第一个是 401,通常出现在模型调用阶段,日志里会写401 Unauthorized。原因基本是 apiKey 不对或者 baseUrl 写错。排查方法是用 curl 直接打 TaoToken 的 API,看返回是不是 401。如果是,重新生成 Key 并更新openclaw.json里的apiKey字段,然后openclaw gateway restart。注意 Key 前后不要有空格,JSON 里字符串要带引号。
第二个是local proxy failed,这个报错一般出现在 gateway 启动阶段,意思是本地代理层没起来。常见原因是gateway.port被占用,或者gateway.bind配成了loopback但 dashboard 想从外部访问。先ss -tlnp | grep 18789看端口占用,如果被占,改gateway.port到别的值,比如 18790。如果是要局域网访问,运行openclaw onboard,选Enable LAN Access,然后把gateway.bind改成0.0.0.0,重启 gateway。
第三个是reading choices相关报错,日志里可能出现cannot read property 'choices' of undefined或者reading 'choices'。这是模型返回体不符合预期导致的,通常是 baseUrl 指向的服务返回了非 OpenAI 格式的响应。检查baseUrl是不是指向了 TaoToken 的 API 入口,而不是某个网页地址。另外api字段必须是openai-completions,如果写成别的值,OpenClaw 会用错误的解析器去读响应,就会读不到choices。
第四个是 OAuth 相关报错,如果你在向导里误选了 OAuth 模式,日志里会出现OAuth token expired或OAuth flow failed。OpenClaw 的模型通道用 API Key 模式就够了,不需要 OAuth。解决办法是把auth.profiles里的 mode 改成api_key,provider 改成你的自定义 provider 名,然后重新openclaw configure,在模型配置那一步选 API Key 模式。
还有一个容易忽略的点是飞书配对码不生效。如果你关了终端再打开,配对状态可能丢了,需要重新跑openclaw onboard --flow quickstart恢复。如果配对码输入后提示无效,检查配对码有没有过期,配对码一般有时效,重新在飞书里发消息拿新的。另外openclaw pairing approve feishu后面的配对码要跟飞书里显示的一致,大小写敏感。
排查的时候养成看日志的习惯,openclaw logs --follow会实时输出,报错信息比 dashboard 上看到的详细得多。如果日志里出现feishu websocket disconnected,检查虚拟机的网络是不是断了,或者飞书后台的长连接配置有没有保存。长连接模式下,OpenClaw 主动连飞书,不需要公网 IP,这也是它在虚拟机里能跑通的原因。
6. 把 settings 改到 TaoToken 后的长期使用建议
配置改到 TaoToken 之后,日常使用基本不用再动openclaw.json。如果你想换模型,比如从deepseek-chat换成别的,只需要在models.providers.taotoken-gateway.models数组里加一条,然后在agents.defaults.model.primary里改引用就行。TaoToken 的 Key 是统一的,换模型不用换 Key,这是走统一通道最省事的地方。如果你团队里多人用,可以把 Key 放在环境变量里,openclaw.json里用${TAOTOKEN_API_KEY}这种占位符引用,避免 Key 明文写在配置文件里。
飞书渠道这边,如果要把机器人拉到群里用,groupPolicy保持allowlist,然后在飞书后台把群加到白名单里。群聊里默认是 @ 触发,messages.ackReactionScope设成group-mentions就是这个意思。如果想让机器人响应所有消息,改成all,但这样群里消息多了会消耗模型额度,建议还是保持 @ 触发。
长期跑的话,建议把 gateway 做成 systemd 服务,这样虚拟机重启后自动拉起。OpenClaw 本身有 daemon 模式,openclaw onboard --install-daemon会帮你装好。装完之后用systemctl status openclaw看状态。日志可以用journalctl -u openclaw -f跟,比openclaw logs更底层,适合排查启动阶段的问题。
最后说一个实用技巧。如果你在 dashboard 里测试模型通了,但飞书里发消息没反应,先看openclaw logs --follow里有没有收到飞书事件。如果日志里完全没有飞书事件,说明飞书那边没推过来,回去检查事件订阅是不是im.message.receive_v1,以及版本有没有发布。如果日志里有事件但模型没回,那就是模型通道的问题,回到第 5 节排查 401 或 choices 报错。把这两段日志分开看,定位问题会快很多。