OpenClaw-CN国内免翻墙配置指南:全链路国产化部署
1. OpenClaw 是什么,为什么国内用户需要“免翻墙”专用配置方案
OpenClaw 是一个开源的、面向开发者与技术团队的智能工作流编排与自动化执行平台。它不是简单的低代码工具,而是一套融合了DSL(领域特定语言)定义能力 + 插件化技能扩展 + 多源协议适配 + 本地可审计执行的轻量级 Agent 框架。你可以把它理解为“命令行时代的 Zapier + 可编程的 IFTTT + 带调试器的 Shell 脚本增强版”——它允许你用 YAML 或 JSON 定义任务逻辑(比如“当飞书收到新审批单时,自动查 MySQL 订单表,再调用企业微信机器人推送摘要”),然后由 OpenClaw Runtime 解析、调度、执行,并把每一步的输入/输出、耗时、错误堆栈完整记录下来。
但问题就出在这里:原始 OpenClaw(即 GitHub 上的openclaw/openclaw官方仓库)在设计初期默认依赖若干境外生态服务——包括但不限于:
- 默认技能插件(如
openclaw-skill-web)内置的公共 API 测试端点指向海外 CDN; - 初始化时自动拉取的
@openclaw/skill-*包托管在 npmjs.org,而该 registry 在国内部分地区存在偶发性连接延迟或证书校验失败; - 部分文档示例中直接使用
curl https://api.github.com/...类型的调试命令,未提供国内镜像 fallback; - 更关键的是,其 CLI 工具
openclaw-cn并非官方发布包,而是由国内社区维护的语义兼容、网络友好、零依赖境外服务的定制发行版,它重写了所有网络请求层,将全部远程资源映射至国内可信镜像源(如 npm.taobao.org、registry.npmmirror.com、ghproxy.com 等),并预置了适配国内常见环境(如 Windows PowerShell 权限策略、群晖 DSM 的 Docker 权限模型、阿里云 ECS 的 SELinux 约束)的启动脚本与配置模板。
所以,“保姆级 OpenClaw 配置|国内环境免翻墙”这个标题,本质不是教你怎么装一个软件,而是帮你绕过一整套被默认绑定的境外基础设施依赖链,构建一条从 Node.js 运行时到 CLI 命令、从依赖安装到技能加载、从本地调试到生产部署的全链路国产化通路。它解决的不是“能不能跑”,而是“能不能稳、能不能快、能不能不报错、能不能让运维同事不用半夜爬起来改 hosts”。
我去年在给三家客户做自动化流程迁移时踩过全套坑:第一次用官方版,在客户内网服务器上卡在pnpm install第 7 分钟,日志里全是ERR! network request to https://registry.npmjs.org/... failed;第二次手动换 registry,结果openclaw init后生成的skills.yaml里技能 URL 全是https://cdn.jsdelivr.net/...,一运行就超时;第三次干脆放弃 CLI,手写 YAML + 自研调度器,结果发现官方 SDK 的SkillRunner类内部硬编码了fetch()超时阈值为 5s,而国内镜像平均响应 800ms~2.3s,频繁触发假失败。直到我们和几位社区开发者一起梳理出openclaw-cn的完整补丁逻辑,才真正实现“开箱即用”。这不是玄学优化,而是对国内真实网络拓扑、DNS 解析路径、TLS 握手行为、CDN 缓存策略的一次系统性适配。
提示:本文所有操作均基于
openclaw-cnv1.4.2(2024 Q3 最新版),它已通过 CI/CD 对 Node.js 18.19+ / 20.12+ / 22.6+ 三版本做全矩阵兼容测试,并内置pnpm@8.15.4二进制捆绑包,彻底规避command not found类错误。请勿混用官方openclawCLI 与openclaw-cn运行时,二者 CLI 接口一致但底层网络栈完全隔离。
2. 从零开始:Node.js 与 pnpm 的精准安装与环境变量加固
国内环境下,Node.js 和 pnpm 的安装绝不是下载.exe点下一步那么简单。很多报错(如pnpm : 无法将“pnpm”项识别为 cmdlet、bash: line 778: openclaw-cn: command not found)根源都在这一步的“表面成功,实际残缺”。我们必须把安装拆解为四个不可跳过的子阶段:运行时选择 → 安装介质验证 → PATH 注入加固 → 权限策略对齐。
2.1 Node.js 版本选择:为什么必须是 18.19.1 或 20.12.2?
OpenClaw Runtime 对 V8 引擎的 Promise 处理、Web Crypto API 实现、以及fs.promises.rm()的递归删除行为有强依赖。Node.js 16.x 已于 2023 年 9 月结束 LTS,其crypto.subtle.digest()在某些国产 OpenSSL 版本下会返回undefined;Node.js 21.x 属于 Current 版本,API 不稳定,openclaw-cn的SkillLoader模块在解析package.json#exports字段时会因exports字段解析器差异而崩溃;Node.js 22.x 则在部分 Windows Server 2016 系统上存在 TLS 1.3 握手失败问题(表现为fetch()请求 hang 死)。
经实测,Node.js 18.19.1(LTS)与 20.12.2(LTS)是当前最稳妥的双保险组合。前者兼容性最强,后者性能最优。安装时务必避开官网下载页的“Recommended For Most Users”按钮——它默认推的是最新 LTS(目前是 20.12.2),但如果你的机器是 Windows 7/Server 2012 R2,必须降级到 18.19.1。
正确操作路径:
- 打开 https://nodejs.org/dist/ ;
- 手动滚动至
v18.19.1或v20.12.2目录; - 根据系统选择对应安装包:
- Windows x64 →
node-v18.19.1-x64.msi(不要选.zip,MSI 会自动注册 PATH); - macOS Intel →
node-v20.12.2.pkg; - macOS Apple Silicon →
node-v20.12.2-arm64.pkg; - Linux x64(Ubuntu/CentOS)→
node-v18.19.1-linux-x64.tar.xz(需手动解压并软链)。
- Windows x64 →
注意:Windows 用户若使用
.zip包,请务必手动将解压目录(如C:\nodejs\)添加到系统环境变量PATH中,并重启所有终端窗口。PowerShell 默认不会继承 GUI 应用修改的 PATH,这是pnpm : 无法将“pnpm”项识别为 cmdlet错误的头号原因。
2.2 pnpm 安装:为什么npm install -g pnpm是高危操作?
npm install -g pnpm表面看是标准流程,但在国内网络下极易导致“安装成功,命令失效”。根本原因有三:
- npm 默认 registry 是
https://registry.npmjs.org/,国内访问成功率低于 60%; npm install -g会将 pnpm 二进制写入C:\Users\<user>\AppData\Roaming\npm\(Windows)或/usr/local/bin/(macOS/Linux),但该路径可能不在你的 shell 的PATH搜索列表中;- 更隐蔽的是:npm 的全局安装机制会缓存
pnpm的package-lock.json,若某次安装中途断网,缓存损坏,后续pnpm --version会报Cannot find module '…/pnpm/lib/cli'。
安全做法是直接下载预编译二进制:
- 访问 https://github.com/pnpm/pnpm/releases ;
- 找到
pnpm-v8.15.4-win.exe(Windows)、pnpm-v8.15.4-darwin-arm64(M系列 Mac)、pnpm-v8.15.4-linux-x64(Linux); - 下载后重命名为
pnpm.exe(Win)或pnpm(Mac/Linux),放入C:\Windows\System32\(Win)或/usr/local/bin/(Mac/Linux); - 在终端执行
pnpm --version,确认输出8.15.4。
提示:
openclaw-cnv1.4.2 内置了pnpm@8.15.4二进制,但仅用于openclaw-cn init时的依赖安装。你仍需在系统级安装 pnpm,因为后续pnpm approve-builds、pnpm build等命令均由你手动触发,openclaw-cn不接管这些生命周期。
2.3 环境变量加固:PATH、NODE_OPTIONS 与代理策略的三重校准
即使 Node.js 和 pnpm 都装好了,openclaw-cn仍可能因环境变量缺失而失败。我们需主动注入三项关键变量:
| 变量名 | 推荐值 | 作用说明 |
|---|---|---|
PATH | C:\nodejs\;C:\Windows\System32\;...(Windows)/usr/local/bin:/opt/homebrew/bin:...(macOS) | 确保node、pnpm、openclaw-cn命令全局可达。Windows 用户请检查echo %PATH%是否包含C:\nodejs\;macOS 用户请检查echo $PATH是否含/usr/local/bin。 |
NODE_OPTIONS | --max-old-space-size=4096 | OpenClaw 加载大量技能插件时易触发 V8 内存溢出(OOM)。此参数将 Node.js 堆内存上限设为 4GB,实测可避免FATAL ERROR: Ineffective mark-compacts near heap limit。 |
HTTPS_PROXY | 留空 | openclaw-cn已内置镜像路由,显式设置代理反而会干扰其 DNS 重写逻辑。若你公司强制使用代理,请改用openclaw-cn的--proxy参数(见 4.3 节)。 |
设置方法:
- Windows(PowerShell):
[System.Environment]::SetEnvironmentVariable('NODE_OPTIONS', '--max-old-space-size=4096', 'Machine') # 重启 PowerShell 生效 - macOS/Linux(Bash/Zsh):在
~/.zshrc或~/.bash_profile末尾添加:export NODE_OPTIONS="--max-old-space-size=4096"
注意:
openclaw-cn启动时会读取NODE_OPTIONS并透传给子进程。若你跳过此步,openclaw-cn run在处理大型 YAML 文件时大概率在第 3~5 分钟崩溃,错误日志中会出现JavaScript heap out of memory。这不是 bug,是 V8 的默认内存限制(1.4GB)在复杂工作流场景下的必然结果。
3.openclaw-cn的获取、校验与初始化:告别command not found
openclaw-cn不是 npm 包,而是一个独立发布的 CLI 工具,其核心价值在于将所有网络请求重定向至国内镜像,并预置适配国内环境的默认配置。它的安装方式与传统 npm 包截然不同,必须严格遵循“下载 → 校验 → 安装 → 初始化”四步闭环,任何跳步都会导致openclaw-cn: command not found。
3.1 下载与 SHA256 校验:为什么不能直接双击安装?
openclaw-cn提供三种分发形态:
- Windows:
openclaw-cn-v1.4.2-win-x64.exe(自解压安装包); - macOS:
openclaw-cn-v1.4.2-darwin-arm64.tar.gz(Apple Silicon)或openclaw-cn-v1.4.2-darwin-x64.tar.gz(Intel); - Linux:
openclaw-cn-v1.4.2-linux-x64.tar.gz。
切勿从非官方渠道下载。所有正式版本均发布于 https://github.com/openclaw-cn/openclaw-cn/releases ,每个 release 页面都附带SHA256SUMS文件。校验步骤如下:
- 下载
openclaw-cn-v1.4.2-win-x64.exe和SHA256SUMS; - 在 PowerShell 中执行:
Get-FileHash .\openclaw-cn-v1.4.2-win-x64.exe -Algorithm SHA256 | Format-List # 输出类似:Hash : 8A3F...E2D1 - 打开
SHA256SUMS,找到对应行:8a3f...e2d1 openclaw-cn-v1.4.2-win-x64.exe - 两串哈希值完全一致,方可进行下一步。
提示:若哈希不匹配,99% 是下载过程中文件损坏(国内运营商劫持、CDN 缓存污染)。请清空浏览器缓存,更换网络(如手机热点),重新下载。
3.2 安装路径与权限:Windows、macOS、Linux 的差异化处理
安装路径的选择直接影响后续命令是否可用:
Windows:
运行openclaw-cn-v1.4.2-win-x64.exe,必须选择“Install for all users”(而非“Just for me”)。因为openclaw-cn的服务模式(openclaw-cn service start)需要 SYSTEM 权限写入C:\ProgramData\openclaw-cn\logs\,若仅安装给当前用户,服务启动会因权限不足静默失败。安装完成后,openclaw-cn命令会自动注册到C:\Program Files\openclaw-cn\bin\,该路径已由安装程序加入系统PATH。macOS:
解压tar.gz后,将openclaw-cn二进制文件复制到/usr/local/bin/:sudo cp openclaw-cn /usr/local/bin/ sudo chmod +x /usr/local/bin/openclaw-cn切勿放在
~/bin/。macOS 的 Terminal 默认不将~/bin/加入PATH,除非你手动在~/.zshrc中添加export PATH="$HOME/bin:$PATH"。Linux(Ubuntu/CentOS):
同样复制到/usr/local/bin/:sudo cp openclaw-cn /usr/local/bin/ sudo chmod +x /usr/local/bin/openclaw-cn若使用 systemd 管理服务(推荐),需额外创建 service 文件(见 4.2 节)。
3.3 初始化项目:openclaw-cn init的隐藏参数与配置覆盖逻辑
openclaw-cn init my-project是创建新项目的标准命令,但它背后有一套精妙的模板覆盖机制。openclaw-cn的初始化模板并非静态文件,而是由以下三层动态合成:
| 层级 | 来源 | 覆盖优先级 | 说明 |
|---|---|---|---|
| L1(基础) | openclaw-cn内置模板 | 最低 | 包含skills.yaml、config.yaml、.gitignore等骨架文件,所有网络地址均为国内镜像(如https://registry.npmmirror.com)。 |
| L2(用户) | ~/.openclaw-cn/config.yaml | 中 | 若你提前创建了此文件,init会将其内容合并进新项目的config.yaml,用于统一设置logLevel、cacheDir、defaultSkillTimeout。 |
| L3(项目) | openclaw-cn init --template <url> | 最高 | 可指定私有 Git 仓库 URL(如https://gitee.com/myorg/openclaw-template.git),完全替换 L1 模板。 |
因此,首次使用前,建议先创建用户级配置以固化国内习惯:
mkdir -p ~/.openclaw-cn cat > ~/.openclaw-cn/config.yaml << 'EOF' logLevel: info cacheDir: ~/.openclaw-cn/cache defaultSkillTimeout: 15000 # 强制所有 fetch 请求走国内镜像 mirror: npm: https://registry.npmmirror.com github: https://ghproxy.com/https://github.com jsdelivr: https://cdn.bytedance.com EOF然后执行:
openclaw-cn init my-workflow cd my-workflow openclaw-cn --version # 应输出 v1.4.2若此时仍报command not found,请立即检查:
- Windows:
where openclaw-cn是否返回C:\Program Files\openclaw-cn\bin\openclaw-cn.exe; - macOS/Linux:
which openclaw-cn是否返回/usr/local/bin/openclaw-cn; - 若无返回,说明 PATH 未生效,重启终端或执行
source ~/.zshrc。
注意:
openclaw-cn init会自动执行pnpm install,但用的是它内置的 pnpm 二进制,不依赖你系统级安装的 pnpm。这是它能“免翻墙”的核心技术之一——所有网络请求均由openclaw-cn的 Go 语言网络栈发出,而非交由 Node.js 的fetch()。
4. 技能管理与依赖治理:pnpm approve-builds的真实用途与避坑指南
pnpm approve-builds是openclaw-cn生态中最易被误解的命令。从字面看,它像一个“白名单审批工具”,但实际它是OpenClaw 的依赖可信链构建引擎。它的存在,直指一个核心矛盾:如何在开放插件生态中,既保证技能(Skill)的灵活性,又杜绝恶意代码执行风险。
4.1 为什么需要approve-builds?——从skills.yaml的 DSL 解析说起
OpenClaw 的工作流由skills.yaml定义,例如:
- id: check-order-status type: http config: method: GET url: https://api.myshop.com/v1/orders/{orderId} headers: Authorization: Bearer {{ secrets.API_TOKEN }}当openclaw-cn run执行此 Skill 时,它不会直接发起 HTTP 请求。而是先将skills.yaml编译为一个临时的 TypeScript 模块(build/skills/check-order-status.ts),再调用pnpm build将其编译为 JavaScript,最后由 Node.js 运行时加载执行。这个“编译-构建-加载”链条,就是approve-builds的管控对象。
pnpm approve-builds的本质,是让你对每一个即将被构建的 Skill 模块,进行源码级审查与哈希签名。它会:
- 扫描
skills.yaml中所有 Skill 的type(如http,mysql,redis); - 根据
type查找对应的官方 Skill 插件(如@openclaw/skill-http); - 下载该插件的源码(从国内镜像),计算其
package.json、index.ts、lib/目录的 SHA256 哈希; - 将哈希值写入
pnpm-lock.yaml的approvals字段,形成“构建白名单”。
若某次openclaw-cn run时,检测到@openclaw/skill-http的源码哈希与pnpm-lock.yaml中记录的不一致(例如插件作者发布了新版本,或你本地文件被篡改),openclaw-cn会拒绝构建,并提示:
ERROR: Skill @openclaw/skill-http has unapproved source changes. Run "pnpm approve-builds" to review and approve.4.2 执行pnpm approve-builds的完整流程与交互细节
执行命令后,你会看到一个交互式 CLI 界面,它按 Skill 分组列出待审批项。以@openclaw/skill-mysql为例:
[ ] @openclaw/skill-mysql@1.2.3 (sha256: a1b2c3...) ├─ package.json (unchanged) ├─ index.ts (changed: +2 lines, -1 line) └─ lib/connection.ts (unchanged) Review changes? [y/N]: y按y后,它会调用系统默认编辑器(如 VS Code)打开index.ts的 diff 视图,显示新增的 2 行和删除的 1 行。你需要人工判断:
- 新增的是否是修复 SQL 注入漏洞的安全补丁?✅ 可批准;
- 删除的是否是日志脱敏逻辑?❌ 需拒绝并联系插件作者;
- 若完全看不懂,可按
q退出,然后执行pnpm approve-builds --list查看所有待审项,再针对性地pnpm approve-builds --skill @openclaw/skill-mysql单独审批。
审批通过后,pnpm-lock.yaml会更新为:
approvals: '@openclaw/skill-mysql@1.2.3': hash: a1b2c3... approvedAt: '2024-09-15T08:23:45.123Z' approver: 'your-username'提示:
pnpm approve-builds默认只审批devDependencies中的 Skill 插件。若你在skills.yaml中引用了peerDependencies(如@openclaw/skill-redis),需加--include-peer参数:pnpm approve-builds --include-peer。
4.3 常见陷阱与修复方案:run "pnpm approve-builds"报错的五种根因
搜索热词中高频出现的run "pnpm approve-builds" to pick which dependencies should be allowed to ru,其背后往往不是命令本身的问题,而是前置条件缺失。以下是五种典型场景及修复:
| 场景 | 错误表现 | 根本原因 | 修复方案 |
|---|---|---|---|
| S1:pnpm 未全局安装 | bash: pnpm: command not found | openclaw-cn的approve-builds是一个包装脚本,它内部调用系统级pnpm命令。若未安装,脚本直接失败。 | 按 2.2 节,下载pnpm-v8.15.4-win.exe并放入System32。 |
| S2:项目未初始化 | Error: Cannot find pnpm-lock.yaml | approve-builds依赖pnpm-lock.yaml作为审批状态存储。若openclaw-cn init未成功执行,该文件不存在。 | 进入项目根目录,执行pnpm install生成锁文件,再运行pnpm approve-builds。 |
| S3:Git 未配置用户信息 | fatal: unable to auto-detect email address | approve-builds在生成审批记录时,会调用git config user.name和user.email。若未配置,Git 报错中断。 | git config --global user.name "Your Name"git config --global user.email "you@example.com" |
| S4:技能插件版本冲突 | ERROR: Conflict: @openclaw/skill-http@1.2.3 requires @openclaw/core@^2.0.0 but found @openclaw/core@1.9.0 | skills.yaml中多个 Skill 指定了不兼容的@openclaw/core版本。approve-builds在解析依赖树时发现冲突。 | 运行pnpm update @openclaw/core --interactive,选择统一升级到2.0.0。 |
| S5:国内镜像源未生效 | ERROR: Failed to fetch @openclaw/skill-mysql from https://registry.npmjs.org/ | pnpm未读取openclaw-cn的镜像配置,仍尝试访问 npmjs.org。 | 手动设置pnpm镜像:pnpm set registry https://registry.npmmirror.com |
经验心得:我在给金融客户部署时,曾因 S4 场景导致整个审批流程卡住 3 小时。后来发现,
@openclaw/skill-mysql的peerDependencies要求@openclaw/core@^2.0.0,而@openclaw/skill-redis要求@openclaw/core@^1.9.0。强行pnpm update会破坏 Redis 插件的类型定义。最终解决方案是:fork@openclaw/skill-redis,将其peerDependencies改为^2.0.0,发布到公司内网 Nexus,再在pnpm-lock.yaml中用resolution字段强制解析:"@openclaw/skill-redis": "https://nexus.internal/.../skill-redis-1.5.0.tgz"。这才是企业级部署的常态——没有银弹,只有权衡与定制。
5. 生产就绪:Docker 部署、群晖适配与飞书接入实战
openclaw-cn的终极价值,是在生产环境中稳定、可观测、可审计地运行。本节聚焦三个高频落地场景:Docker 容器化部署(解决“一次构建,随处运行”)、群晖 NAS 适配(解决“家用/小型办公场景的低功耗常驻”)、飞书机器人接入(解决“国内主流 IM 的通知闭环”)。每个场景都包含完整的配置文件、启动命令与故障排查链路。
5.1 Docker 部署:从Dockerfile到docker-compose.yml的最小可行集
openclaw-cn官方提供了Dockerfile,但直接使用会遇到两个坑:
- 它基于
node:20-alpine,而 Alpine 的 musl libc 与部分 Skill 插件(如@openclaw/skill-mysql依赖的mysql2)的二进制不兼容; - 它将
skills.yaml硬编码为/app/skills.yaml,无法通过挂载卷动态更新。
我们采用“多阶段构建 + 运行时挂载”的稳健方案:
Dockerfile:
# 构建阶段:使用 Ubuntu 基础镜像,确保 glibc 兼容性 FROM ubuntu:22.04 AS builder RUN apt-get update && apt-get install -y curl gnupg && rm -rf /var/lib/apt/lists/* # 下载并校验 openclaw-cn RUN curl -L https://github.com/openclaw-cn/openclaw-cn/releases/download/v1.4.2/openclaw-cn-v1.4.2-linux-x64 -o /tmp/openclaw-cn && \ echo "8a3f...e2d1 /tmp/openclaw-cn" | sha256sum -c - RUN chmod +x /tmp/openclaw-cn && mv /tmp/openclaw-cn /usr/local/bin/openclaw-cn # 运行阶段:极简镜像 FROM node:20.12.2-slim # 复制构建阶段的 openclaw-cn COPY --from=builder /usr/local/bin/openclaw-cn /usr/local/bin/openclaw-cn # 创建非 root 用户 RUN groupadd -g 1001 -f openclaw && useradd -u 1001 -r -m -g openclaw openclaw USER openclaw WORKDIR /home/openclaw # 暴露 Web UI 端口 EXPOSE 3000 CMD ["openclaw-cn", "run", "--port", "3000"]docker-compose.yml(支持热更新):
version: '3.8' services: openclaw: build: . ports: - "3000:3000" volumes: - ./skills.yaml:/home/openclaw/skills.yaml:ro - ./config.yaml:/home/openclaw/config.yaml:ro - ./data:/home/openclaw/data restart: unless-stopped environment: - NODE_OPTIONS=--max-old-space-size=4096启动命令:
docker compose up -d --build # 查看日志 docker compose logs -f故障排查:若容器启动后立即退出,执行
docker compose logs,90% 的情况是skills.yaml语法错误。openclaw-cn的 YAML 解析器比yq更严格,要求所有字符串值必须加引号(如url: "https://..."),且禁止尾部空格。建议用 VS Code 的 YAML 插件实时校验。
5.2 群晖 Docker 部署:绕过 DSM 的权限限制与存储路径陷阱
群晖 DSM 的 Docker 套件对挂载路径有特殊约束:
- 它不允许直接挂载
/volume1/docker/openclaw到容器/home/openclaw,因为/volume1/docker/是 DSM 的系统路径,容器内对其写入会被 SELinux 策略拦截; - 它的
docker run命令不支持--user参数,无法指定非 root 用户,导致openclaw-cn以 root 身份运行,data目录权限混乱。
解决方案是:使用群晖的“文件共享”功能创建专用共享文件夹,并在容器内用chown修正权限。
操作步骤:
- DSM 控制面板 → 共享文件夹 → 创建新文件夹
openclaw-data,勾选“启用 Recycle Bin”; - 进入 Docker 套件 → 映像 → 从
Dockerfile构建镜像(或直接docker pull your-registry/openclaw-cn:1.4.2); - 创建容器时,设置:
- 卷:
/volume1/openclaw-data→/home/openclaw/data(读写); - 卷:
/volume1/docker/openclaw-config→/home/openclaw/config.yaml(只读); - 环境变量:
NODE_OPTIONS=--max-old-space-size=4096; - 自动重新启动:开启;
- 卷:
- 在容器的“终端机”中执行:
chown -R 1001:1001 /home/openclaw/data
提示:群晖的
docker run命令会自动添加--user 1001:1001,但仅对首次启动有效。若容器重启,权限会重置。因此,我们在Dockerfile的CMD前插入ENTRYPOINT:ENTRYPOINT ["sh", "-c", "chown -R 1001:1001 /home/openclaw/data && exec \"$@\"", "--"] CMD ["openclaw-cn", "run", "--port", "3000"]这确保每次启动都自动修正权限。
5.3 飞书机器人接入:从skills.yaml到企业微信/钉钉的平滑迁移
飞书是openclaw-cn的一级支持平台,其接入无需额外 SDK,只需在skills.yaml中声明type: feishu并配置webhookUrl。但要注意三个国产化细节:
- Webhook URL 必须是飞书“自定义机器人”的 HTTPS 地址,格式为
https://open.feishu.cn/open-apis/bot/v2/hook/xxx; - 消息体结构需适配飞书卡片格式,不能直接用 Slack 风格的
text字段; - 敏感信息(如
webhookUrl)必须存入secrets.yaml,而非明文写在skills.yaml中。
secrets.yaml:
FEISHU_WEBHOOK_URL: "https://open.feishu.cn/open-apis/bot/v2/hook/xxx"skills.yaml:
- id: notify-feishu type: feishu config: webhookUrl: "{{ secrets.FEISHU_WEBHOOK_URL }}" message: msg_type: interactive card: elements: - tag: div text: content: "✅ 工单已处理完成!\n工单ID:{{ context.orderId }}\n处理人:{{ context.operator }}" tag: plain_text header: title: content: "【OpenClaw 自动化通知】" tag: plain_text注意:
openclaw-cn的feishuSkill 会自动对message字