
1. PVE 里跑 Ubuntu 24.04 装 OpenClaw 到底卡在哪很多人第一次在 PVE 上折腾 OpenClaw卡点其实不在 OpenClaw 本身而在「虚拟机网络模式 服务监听地址 模型通道」这三件事串不起来。PVE 默认给虚拟机的是 VirtIO 网卡桥接到 vmbr0 后 Ubuntu 拿到的是局域网 IP比如 192.168.100.6但 OpenClaw 的 gateway 默认只 bind 到 127.0.0.1也就是只有 Ubuntu 自己能访问。你在本机浏览器敲http://192.168.100.6:18789会直接连接被拒这不是防火墙问题是服务压根没监听局域网网卡。第二个卡点是安装脚本。OpenClaw 官方脚本会去拉 Node.js 的海外源国内网络下经常出现curl: (28) Failed to connect to openclaw.ai port 443 after 134230 ms或者卡在npm installing十几分钟不动。这不是你 PVE 配置错了是下载链路的问题换镜像源就能解决。第三个卡点才是模型通道。OpenClaw 装完默认没有可用模型你得把 endpoint 和 Key 指到一个能稳定调用的通道上。TaoToken 在这里的角色就是统一 Key 通道一个 Key 覆盖多家模型OpenClaw 的配置文件里只改 base_url 和 api_key 两个字段不用为每个模型单独维护一套凭证。这篇就按「PVE 建机 → Ubuntu 装 OpenClaw → 改 gateway 监听 → 接 TaoToken → 发一条最小请求验证」的顺序走一遍每一步都给可复制的命令和配置片段。适合谁看手里有 PVE 宿主机、想在内网跑一个自己的 AI 编码/对话服务、又不想在每台设备上重复配 Key 的人。全程不需要公网 IP局域网内用就行。先说清楚整体链路PVE 创建 Ubuntu 24.04 虚拟机 → 装 Node.js 和 OpenClaw → 改~/.openclaw/openclaw.json的 gateway 段让它监听局域网 → 在同一个配置文件里把模型 provider 指向 TaoToken → 浏览器登录 dashboard → 发一条 chat 请求确认通道通。下面逐段拆。2. PVE 创建 Ubuntu 24.04 虚拟机与网络模式确认先在 PVE 宿主机上确认桥接网卡存在。SSH 进 PVE执行cat /etc/network/interfaces正常应该能看到vmbr0桥接到物理网卡类似auto vmbr0 iface vmbr0 inet static address 192.168.100.1/24 gateway 192.168.100.1 bridge-ports enp3s0 bridge-stp off bridge-fd 0如果只有vmbr0没有地址说明桥接没配好虚拟机拿不到局域网 IP后面 dashboard 就访问不了。这一步必须先通。创建虚拟机可以用命令行也可以用 Web UI。命令行方式在 PVE shell 里qm create 200 \ --name ubuntu-openclaw \ --memory 4096 \ --cores 2 \ --net0 virtio,bridgevmbr0 \ --scsihw virtio-scsi-pci \ --ostype l26参数说明--memory 4096给 4G 内存OpenClaw 跑起来加上 Node 进程差不多够用--cores 2两核--net0 virtio,bridgevmbr0用 VirtIO 网卡桥接到 vmbr0这样虚拟机会从局域网 DHCP 拿到 192.168.100.x 的地址。--ostype l26是 Linux 2.6 内核类型Ubuntu 24.04 选这个没问题。然后挂载 Ubuntu 24.04 Server ISO 并启动安装。安装过程选默认的 Ubuntu Server磁盘用整个盘OpenSSH 记得勾上不然装完还得进控制台配。安装完成后登录虚拟机确认 IPip -4 addr show | grep inet假设拿到的是192.168.100.6记下来后面 dashboard 和配置文件都要用。再确认能通外网ping -c 3 223.5.5.5通的话说明 NAT 和路由都正常。如果 ping 不通检查 PVE 的/etc/resolv.conf和虚拟机的网关是不是指向 192.168.100.1。这里有个容易忽略的点PVE 默认可能开了防火墙但局域网内互访一般不受影响。如果你在 PVE 的 Datacenter → Firewall 里手动开过规则确认 18789 端口没被拦。内网环境建议先别开 PVE 防火墙减少变量。网络模式确认完之后Ubuntu 这边先更新一下包索引装几个后面要用的工具sudo apt update sudo apt install -y curl git python3 jqjq后面校验 JSON 配置很有用python3 -m json.tool也能校验两个都留着。3. 安装 OpenClaw 并改 gateway 监听局域网官方安装脚本curl -fsSL https://openclaw.ai/install.sh | bash国内网络下这条大概率超时报curl: (28) Failed to connect to openclaw.ai port 443。原因是脚本要从海外源拉 Node.js。换 Gitee 镜像脚本curl -fsSL https://gitee.com/openclaw/install/raw/main/install.sh | bash如果这条也慢用中文社区脚本curl -fsSL https://openclaw.cn/scripts/install.sh | bash装到一半卡在npm installing不动新开一个 SSH 窗口切 npm 镜像npm config set registry https://registry.npmmirror.com切完回原窗口等它继续或者 CtrlC 后重跑安装脚本npm 会走镜像源速度明显快。装完验证openclaw -v能打印版本号就说明二进制装好了。接着跑引导配置openclaw onboard按提示走完会在~/.openclaw/下生成openclaw.json。这时候服务默认只监听 127.0.0.1本机浏览器访问http://192.168.100.6:18789会连不上。先确认服务状态ps aux | grep openclaw ss -tulnp | grep 18789ss输出里如果看到127.0.0.1:18789而不是0.0.0.0:18789或192.168.100.6:18789就是只监听了回环。改配置前先备份cp ~/.openclaw/openclaw.json ~/.openclaw/openclaw.json.bak然后编辑~/.openclaw/openclaw.json找到gateway段改成下面这样IP 换成你自己的虚拟机 IPgateway: { port: 18789, mode: local, bind: lan, remote: { url: http://192.168.100.6:18789 }, controlUi: { allowInsecureAuth: true, allowedOrigins: [ http://192.168.100.6:18789, http://192.168.100.10:18789 ], dangerouslyDisableDeviceAuth: true } }几个字段解释一下。bind: lan让服务绑定到局域网网卡只有同网段设备能访问不写0.0.0.0是因为那样会绑到所有网卡有公网 IP 就直接暴露了。remote.url是远程访问地址手机 App 配对时靠它生成二维码不填会指向 127.0.0.1 导致配对失败。allowedOrigins是跨域白名单你从本机 192.168.100.10 访问虚拟机 192.168.100.6浏览器会做跨域检查得把本机地址加进去。dangerouslyDisableDeviceAuth: true是关掉设备认证内网方便用如果这台虚拟机有公网映射必须改回false否则任何人都能连。还要允许明文 WS否则 dashboard 连 gateway 会失败echo export OPENCLAW_ALLOW_INSECURE_PRIVATE_WS1 | sudo tee -a /etc/profile source /etc/profile改完校验 JSON 格式cat ~/.openclaw/openclaw.json | python3 -m json.tool /dev/null 21 echo JSON OK || echo JSON Error返回JSON OK就没问题。有错的话用备份还原cp ~/.openclaw/openclaw.json.bak ~/.openclaw/openclaw.json重启服务openclaw gateway restart再查监听ss -tulnp | grep 18789这次应该看到192.168.100.6:18789或0.0.0.0:18789。到这里 gateway 就通了。4. 把模型通道切到 TaoToken 并验证请求OpenClaw 的模型配置也在~/.openclaw/openclaw.json里找到providers或models段不同版本字段名略有差异以你本地文件为准。核心是三个字段Base URL、API Key、Model ID。TaoToken 的 API 地址是https://taotoken.net/apiKey 在控制台创建。先拿 Key。打开https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi_keysutm_campaignrewrite登录后创建一个 Key复制出来。这个 Key 就是统一通道凭证后面 OpenClaw 里只填这一个。配置片段参考把sk-xxxx换成你的真实 Keyproviders: { taotoken: { type: openai-compatible, baseUrl: https://taotoken.net/api, apiKey: sk-xxxx, models: [ { id: claude-sonnet-4-5, name: Claude Sonnet 4.5 } ] } }如果你的 OpenClaw 版本用的是models顶层字段对应改成models: { default: taotoken/claude-sonnet-4-5, providers: { taotoken: { baseUrl: https://taotoken.net/api, apiKey: sk-xxxx } } }Model ID 具体写什么去https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite查当前支持的模型列表别照抄我这里的示例 ID以文档为准。改完同样校验 JSONcat ~/.openclaw/openclaw.json | python3 -m json.tool /dev/null 21 echo JSON OK || echo JSON Error然后重启openclaw gateway restart验证通道是否可用最直接的办法是发一条最小 chat 请求。OpenClaw 自带 CLI 的话openclaw chat --model taotoken/claude-sonnet-4-5 --message 只回复两个字通了如果返回「通了」说明 Key、Base URL、Model ID 三件套都对。如果 CLI 不支持--model参数用 curl 直接打 TaoToken 的接口验证通道本身curl -s https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-xxxx \ -H Content-Type: application/json \ -d { model: claude-sonnet-4-5, messages: [{role: user, content: 只回复两个字通了}], max_tokens: 16 }返回 JSON 里choices[0].message.content是「通了」就说明通道没问题。这一步很关键它把「OpenClaw 配置问题」和「通道问题」分开了curl 通但 OpenClaw 不通就是 OpenClaw 配置的事curl 也不通就是 Key 或模型 ID 的事。通道验证通过后浏览器打开http://192.168.100.6:18789用 dashboard 登录。如果提示要 token执行openclaw dashboard它会打印一个带 token 的 URL类似http://192.168.100.6:18789/#tokenc288aa2a...直接复制到浏览器打开就能进。进去后在 Control UI 设置里把 token 填进网关令牌点连接。概览页能看到模型状态随便发一句话测试聊天。5. 常见报错排查401、local proxy failed、token missing报错一unauthorized: gateway token missing完整报错是unauthorized: gateway token missing (open the dashboard URL and paste the token in Control UI settings)。原因是 Web UI 和 gateway 通信时没带身份令牌。解决openclaw dashboard拿到带 token 的 URL 登录或者从配置里查cat ~/.openclaw/openclaw.json | grep -A2 -B2 auth把查到的 token 填进 Control UI 的网关令牌框点连接。报错二401 Unauthorized或invalid api key这是模型通道的 Key 问题不是 gateway 的。检查三处baseUrl是不是https://taotoken.net/api别多写或少写/v1以文档为准apiKey有没有多余空格或换行Key 是不是在控制台被删了。用第 4 节的 curl 命令单独测通道能快速定位。报错三local proxy failed或ECONNREFUSED 127.0.0.1:18789说明 dashboard 还在连 127.0.0.1但服务已经 bind 到局域网了。检查openclaw.json里gateway.bind是不是lanremote.url是不是写的虚拟机局域网 IP。改完必须openclaw gateway restart不重启不生效。报错四reading choices或Cannot read properties of undefined一般是模型返回体格式和 OpenClaw 预期不一致常见于 Model ID 写错、通道返回了错误 JSON。先用 curl 看原始返回确认choices字段存在。如果 curl 返回的是{error: ...}那就是 Key 或模型 ID 的问题不是 OpenClaw 的锅。报错五浏览器打开 dashboard 白屏或跨域报错检查allowedOrigins里有没有把你本机 IP 加进去。你从 192.168.100.10 访问 192.168.100.6白名单里就得有http://192.168.100.10:18789。另外OPENCLAW_ALLOW_INSECURE_PRIVATE_WS1这个环境变量要确认生效echo $OPENCLAW_ALLOW_INSECURE_PRIVATE_WS看是不是 1。报错六安装脚本卡住或 443 超时回到第 3 节换 Gitee 镜像脚本或者先npm config set registry https://registry.npmmirror.com再重跑。这个和 PVE、Ubuntu 都没关系纯粹是下载源的问题。排查顺序建议先ss -tulnp | grep 18789确认监听地址再 curl 测通道最后看 dashboard。三步能把问题范围缩到最小。6. 长期跑 OpenClaw 的通道与 Key 管理建议虚拟机装好只是开始真正长期用起来Key 管理比安装更容易出问题。我自己的做法是OpenClaw 里只配一个 TaoToken 的 Key所有模型请求都走这个通道。这样换模型时只改 Model ID不用动 KeyKey 要轮换时也只改一个地方。如果你有多台设备比如 PVE 里跑一个、笔记本上再跑一个共用同一个 Key 通道比每台单独配省事得多。需要长期编码或跑 Agent 场景的话可以看下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding_planutm_campaignrewrite它针对高频调用做了额度规划比按量单次调更可控。日常验证模型通不通用模型对话页面最快https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite不用每次都开 OpenClaw。接入文档在https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite字段名和模型 ID 以文档为准别照抄博客里的示例。控制台在https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewriteKey 的创建、禁用、额度查看都在那里。最后提醒一句dangerouslyDisableDeviceAuth这个开关内网用可以开但只要这台虚拟机有任何形式的外网映射必须改回false。PVE 里做端口转发之前先把这个开关关掉不然等于把 dashboard 裸奔在公网上。