avatar

范伟彬个人网

https://fanweibin.cn

  • 首页
  • 归档
  • 链接
  • 关于
  • AI 导航
  • 健康指南
主页 宝塔面板环境配置 + OpenClaw 安装与进阶实战指南
文章

宝塔面板环境配置 + OpenClaw 安装与进阶实战指南

发表于 5天前 更新于 最近
作者 Administrator
103~132 分钟 阅读

本文记录在 Ubuntu 24.04 + 宝塔面板环境下,从零完成 JDK、Node.js、Python、Maven 环境变量配置,到安装 OpenClaw 并进阶实战完整过程。


环境说明

项目

版本/信息

操作系统

Ubuntu Server 24.04 LTS

面板

宝塔面板

JDK

17.0.8(宝塔安装)

Node.js

v24.14.0(宝塔安装)

Python

3.12.3(系统自带)

Maven

3.9.14(wget 下载)

OpenClaw

2026.3.13


一、宝塔环境变量配置

宝塔面板通过自身的软件商店安装的 JDK、Node.js 等工具,默认不会自动写入系统环境变量,需要手动配置。Maven 通过 wget 手动下载,同样需要配置路径。

为什么用 /etc/profile.d/ 而不是直接改 /etc/profile

/etc/profile 内部有这样一段逻辑:

for i in /etc/profile.d/*.sh; do
    if [ -r "$i" ]; then
        . "$i"
    fi
done

也就是说,放在 /etc/profile.d/ 下的 .sh 文件会被 /etc/profile 自动加载,效果完全等价,但更模块化——每个软件一个文件,互不干扰,出问题时直接删对应文件即可。

安装 pip3(Python 自带但未附带 pip)

apt update && apt install python3-pip -y
pip3 --version

安装 Maven(wget 下载)

# 下载并解压到 /www/server/
wget https://mirrors.aliyun.com/apache/maven/maven-3/3.9.14/binaries/apache-maven-3.9.14-bin.tar.gz -P /www/server/
tar -xzf /www/server/apache-maven-3.9.14-bin.tar.gz -C /www/server/
mv /www/server/apache-maven-3.9.14 /www/server/maven

配置 Maven 阿里云镜像

编辑 /www/server/maven/conf/settings.xml,在 <mirrors> 标签内添加:

<mirror>
  <id>aliyun</id>
  <mirrorOf>*</mirrorOf>
  <name>阿里云镜像</name>
  <url>https://maven.aliyun.com/repository/public</url>
</mirror>

创建宝塔环境变量配置文件

cat > /etc/profile.d/baota-env.sh << 'EOF'
# JDK 17
export JAVA_HOME=/www/server/java/jdk-17.0.8
export PATH=$JAVA_HOME/bin:$PATH

# Node.js v24
export NODE_HOME=/www/server/nodejs/v24.14.0
export PATH=$NODE_HOME/bin:$PATH

# Maven
export MAVEN_HOME=/www/server/maven
export PATH=$MAVEN_HOME/bin:$PATH
EOF

source /etc/profile.d/baota-env.sh

验证环境变量

java -version
node -v
npm -v
mvn -version
python3 --version

二、配置代理(可选)

如果服务器在虚拟机内,宿主机开启了 Clash/mihomo 代理,需配置代理才能访问 npm、GitHub 等。

创建目录结构

mkdir -p /www/dk_project/dk_app/dk_mihomo/config
cd /www/dk_project/dk_app/dk_mihomo

目录规划:

/www/dk_project/dk_app/dk_mihomo/
├── docker-compose.yml          # 服务编排文件
└── config/
    ├── config.yaml             # Mihomo 主配置(由订阅转换生成)
    └── metacubexd/             # Web UI Caddy 配置(自动生成)

获取订阅配置

机场提供的订阅链接通常返回 Base64 编码的节点列表,Mihomo 无法直接使用,需要通过订阅转换器转为 Clash/Mihomo 格式的 YAML。

方法:使用公共订阅转换器

SUBSCRIBE_URL="你的机场订阅链接"
ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$SUBSCRIBE_URL'))")

curl -L "https://api.v1.mk/sub?target=clash&url=${ENCODED}&insert=false" \
  -o /www/dk_project/dk_app/dk_mihomo/config/config.yaml

验证转换结果:

head -5 /www/dk_project/dk_app/dk_mihomo/config/config.yaml

正确的配置文件开头应该是标准 YAML 格式:

port: 7890
socks-port: 7891
allow-lan: true
mode: Rule
log-level: info
...

常用公共转换器:

  • https://api.v1.mk/sub?target=clash&url=<订阅链接>

  • https://sub.xeton.dev/sub?target=clash&url=<订阅链接>

如果某个转换器返回 520 等错误,换另一个即可。


编写 docker-compose.yml

# /www/dk_project/dk_app/dk_mihomo/docker-compose.yml

services:
  mihomo:
    container_name: mihomo
    image: metacubex/mihomo:latest
    restart: always
    pid: host                        # 共享宿主机 PID,TUN 模式感知进程
    ipc: host                        # 共享宿主机 IPC
    network_mode: host               # 使用宿主机网络栈,TUN 模式必须
    cap_add:
      - ALL                          # 赋予完整权限(含 NET_ADMIN、NET_RAW)
    security_opt:
      - apparmor=unconfined          # 关闭 Ubuntu AppArmor 限制
    volumes:
      - ./config:/root/.config/mihomo
      - /dev/net/tun:/dev/net/tun    # 挂载 TUN 虚拟网卡设备
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

  metacubexd:
    container_name: metacubexd
    image: ghcr.io/metacubex/metacubexd
    restart: always
    network_mode: bridge
    ports:
      - '9097:80'                    # 浏览器访问 http://服务器IP:9097
    volumes:
      - ./config/metacubexd:/config/caddy
      - /etc/timezone:/etc/timezone:ro
      - /etc/localtime:/etc/localtime:ro

关键配置项说明

配置项

说明

pid: host

容器与宿主机共享 PID 命名空间,TUN 透明代理感知进程必需

ipc: host

共享进程间通信命名空间,配合 pid: host 使用

network_mode: host

直接使用宿主机网络栈,TUN 模式接管流量必需

cap_add: ALL

赋予所有 Linux capabilities,避免 TUN 权限不足报错

apparmor=unconfined

Ubuntu 默认启用 AppArmor 会拦截 TUN 操作,必须关闭

/dev/net/tun

TUN 虚拟网卡设备,Mihomo 通过它创建虚拟接口接管流量

metacubexd: bridge

Web UI 无需接管网络,用桥接模式更安全


启动服务

cd /www/dk_project/dk_app/dk_mihomo

# 拉取镜像并启动
docker compose up -d

# 查看启动日志
docker compose logs -f mihomo

查看服务状态:

docker compose ps

验证代理可用性

# 测试 HTTP 代理
curl -x http://127.0.0.1:7890 https://www.google.com -I

成功响应示例:

HTTP/1.1 200 Connection established
HTTP/2 200
...
server: gws

看到 Connection established 和 HTTP/2 200 即表示代理正常工作。


访问 Web 控制面板

浏览器打开:

http://服务器IP:9097

在面板中填写:

  • API 地址:http://服务器IP:9090

  • 密码:config.yaml 中 secret 字段的值

面板功能包括:节点切换、延迟测试、实时流量、规则查看等。



[2026-03-23 03:00:05] ✓ 完成

宿主机代理环境全局配置

Mihomo 启动后,宿主机本身的各个工具需要分别配置才能走代理,原因是不同工具读取代理的方式不同,没有统一的全局入口。

Shell 环境变量(终端 curl / wget / git 等)

写入 /etc/profile.d/ 使所有用户登录终端自动生效:

cat > /etc/profile.d/proxy.sh << 'EOF'
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export HTTP_PROXY=http://127.0.0.1:7890
export HTTPS_PROXY=http://127.0.0.1:7890
export no_proxy=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8
EOF

# 当前终端立即生效
source /etc/profile.d/proxy.sh

# 验证
curl https://www.google.com -I --max-time 5

注意:/etc/profile.d/ 只对交互式登录 Shell 生效,cron 计划任务、systemd 服务均不会自动读取。

若宝塔计划任务脚本需要走代理,在脚本头部手动加上:

#!/bin/bash
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
# ... 后续命令

Docker Daemon 代理(docker pull 拉取镜像)

Docker 守护进程有独立的代理配置,Shell 环境变量对其无效:

mkdir -p /etc/systemd/system/docker.service.d

cat > /etc/systemd/system/docker.service.d/proxy.conf << 'EOF'
[Service]
Environment="HTTP_PROXY=http://127.0.0.1:7890"
Environment="HTTPS_PROXY=http://127.0.0.1:7890"
Environment="NO_PROXY=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8"
EOF

# 重载配置并重启 Docker
systemctl daemon-reload
systemctl restart docker

# 验证
docker info | grep -i proxy

成功后 docker info 应显示:

HTTP Proxy: http://127.0.0.1:7890
HTTPS Proxy: http://127.0.0.1:7890
No Proxy: localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8

npm 代理

npm 有独立的代理配置,与系统环境变量无关:

# 设置代理
npm config set proxy http://127.0.0.1:7890
npm config set https-proxy http://127.0.0.1:7890

# 验证
npm config get proxy
npm config get https-proxy

如需取消 npm 代理(切换回直连或镜像源):

npm config delete proxy
npm config delete https-proxy

# 国内可改用淘宝镜像替代代理
npm config set registry https://registry.npmmirror.com

npm 代理与 registry 镜像源可以独立配置,互不影响。代理优先级高于 registry。


各工具代理生效范围汇总

工具

配置方式

说明

curl / wget / git

/etc/profile.d/proxy.sh 环境变量

仅交互式 Shell

宝塔计划任务脚本

脚本头部手动 export

cron 不读 profile

docker pull

/etc/systemd/system/docker.service.d/proxy.conf

需重启 Docker

容器内部

docker run -e http_proxy=... 或 compose env

独立设置

npm

npm config set proxy

独立配置

pip

pip install --proxy http://127.0.0.1:7890

或设置环境变量


局域网其他设备使用代理

Mihomo 配置中 allow-lan: true 开启后,局域网内其他设备可直接接入:

# 其他 Linux / macOS / WSL 机器
export http_proxy=http://服务器IP:7890
export https_proxy=http://服务器IP:7890
export no_proxy=localhost,127.0.0.1,192.168.0.0/16,10.0.0.0/8

Windows 在「设置 → 网络和 Internet → 代理」中填写服务器 IP 和端口 7890 即可。


三、安装 OpenClaw

执行安装

curl -fsSL https://openclaw.ai/install.sh | bash

验证安装

openclaw --version

四、安装 Claude Code

执行安装

curl -fsSL https://claude.ai/install.sh | bash

⚠️ 安装后 PATH 配置

安装完成后会提示 ~/.local/bin 不在 PATH 中。~/.local/bin 属于用户级路径,放 ~/.bashrc 而不是 /etc/profile.d/:

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc && source ~/.bashrc

验证安装

claude --version

注意: Linux 需要开启 systemd lingering,让 Gateway 在无人登录时保持运行:

loginctl enable-linger $USER

背景

OpenClaw Gateway 默认只监听 127.0.0.1:18789(loopback),外部设备无法直接访问。

步骤一:设置 gateway.mode

openclaw config set gateway.mode local

步骤二:设置 bind 为 lan 模式

openclaw config set gateway.bind lan

lan 模式会监听 0.0.0.0,即所有网卡。

步骤三:添加 allowedOrigins

openclaw config set gateway.controlUi.allowedOrigins \
  '["http://localhost:18789","http://127.0.0.1:18789","http://192.168.153.101:18789"]'

步骤四:dangerouslyDisableDeviceAuth(内网自用推荐)

openclaw config set gateway.controlUi.dangerouslyDisableDeviceAuth true

步骤五:重启 Gateway

openclaw gateway restart

验证监听状态:

ss -tlnp | grep 18789
# 应显示 *:18789 或 0.0.0.0:18789

五、宝塔面板计划任务配置

三个自动更新任务均采用直接在宝塔计划任务脚本框中填写脚本内容的方式,无需创建外部 sh 文件,管理更集中。所有脚本输出到 stdout,宝塔日志界面可直接查看。

注意:宝塔计划任务(cron)不会自动加载 /etc/profile.d/,所以脚本中凡是依赖特定命令路径的地方,均使用绝对路径,避免 command not found。

进入 宝塔面板 → 计划任务 → 添加任务,依次添加以下三个任务。


任务一:Mihomo 订阅更新

字段

填写内容

任务类型

Shell脚本

任务名称

mihomo订阅更新

执行周期

每天 03:00

脚本内容:

#!/bin/bash
SUBSCRIBE_URL="你的机场订阅链接"
CONFIG_PATH="/www/dk_project/dk_app/dk_mihomo/config/config.yaml"
WEBHOOK_URL="你的webhook链接"
HOSTNAME=$(hostname)

notify() {
    local title="$1"
    local content="$2"
    curl -s -X POST "$WEBHOOK_URL" \
        -H "Content-Type: application/json" \
        -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"### ${title}\n${content}\n> 主机:${HOSTNAME}\n> 时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}" > /dev/null
}

ENCODED=$(python3 -c "import urllib.parse; print(urllib.parse.quote('$SUBSCRIBE_URL'))")

echo "========================================"
echo "  Mihomo 订阅更新"
echo "  $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始拉取订阅..."

curl -sL "https://api.v1.mk/sub?target=clash&url=${ENCODED}&insert=false" \
  -o $CONFIG_PATH

if [ $? -eq 0 ] && [ -s $CONFIG_PATH ]; then
    NODE_COUNT=$(grep -c "^  - name:" $CONFIG_PATH 2>/dev/null || echo "未知")
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 订阅拉取成功,节点数:${NODE_COUNT}"
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] 正在重启 mihomo..."
    docker restart mihomo
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ 完成"
    notify "✅ Mihomo 订阅更新完成" "节点数:**${NODE_COUNT}**\nmihomo 已重启"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 订阅拉取失败,保留原配置"
    notify "❌ Mihomo 订阅更新失败" "订阅拉取失败,原配置未变更"
    exit 1
fi

日志输出示例:

========================================
  Mihomo 订阅更新
  2026-03-23 03:00:00
========================================
[2026-03-23 03:00:01] 开始拉取订阅...
[2026-03-23 03:00:03] 订阅拉取成功,节点数:32
[2026-03-23 03:00:03] 正在重启 mihomo...

任务二:Claude Code 更新

字段

填写内容

任务类型

Shell脚本

任务名称

Claude Code 更新

执行周期

每天 03:10

脚本内容:

#!/bin/bash
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890

CLAUDE_BIN=/root/.local/bin/claude
WEBHOOK_URL="你的webhook链接"
HOSTNAME=$(hostname)

notify() {
    local title="$1"
    local content="$2"
    curl -s -X POST "$WEBHOOK_URL" \
        -H "Content-Type: application/json" \
        -d "{\"msgtype\":\"markdown\",\"markdown\":{\"content\":\"### ${title}\n${content}\n> 主机:${HOSTNAME}\n> 时间:$(date '+%Y-%m-%d %H:%M:%S')\"}}" > /dev/null
}

echo "========================================"
echo "  Claude Code 更新"
echo "  $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

if [ ! -f "$CLAUDE_BIN" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 找不到 claude 命令:${CLAUDE_BIN}"
    notify "❌ Claude Code 更新失败" "找不到 claude 命令:\`${CLAUDE_BIN}\`"
    exit 1
fi

OLD_VER=$($CLAUDE_BIN --version 2>/dev/null || echo "未知")
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 当前版本:${OLD_VER}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始更新..."

notify "🔄 Claude Code 开始更新" "当前版本:\`${OLD_VER}\`"

$CLAUDE_BIN update
EXIT_CODE=$?

NEW_VER=$($CLAUDE_BIN --version 2>/dev/null || echo "未知")

if [ $EXIT_CODE -eq 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ 更新完成,当前版本:${NEW_VER}"
    if [ "$OLD_VER" = "$NEW_VER" ]; then
        VERSION_MSG="版本无变化:\`${NEW_VER}\`"
    else
        VERSION_MSG="**${OLD_VER}** → **${NEW_VER}**"
    fi
    notify "✅ Claude Code 更新完成" "${VERSION_MSG}"
else
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 更新失败(exit code: ${EXIT_CODE}),当前版本:${OLD_VER}"
    notify "❌ Claude Code 更新失败" "exit code: \`${EXIT_CODE}\`\n当前版本:\`${OLD_VER}\`"
    exit 1
fi

日志输出示例:

========================================
  Claude Code 更新
  2026-03-23 03:10:00
========================================

任务三:OpenClaw 更新

字段

填写内容

任务类型

Shell脚本

任务名称

OpenClaw 更新

执行周期

每天 03:20

脚本内容:

#!/bin/bash
export XDG_RUNTIME_DIR=/run/user/$(id -u)
export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/$(id -u)/bus
export http_proxy=http://127.0.0.1:7890
export https_proxy=http://127.0.0.1:7890
export NODE_HOME=/www/server/nodejs/v24.14.0
export PATH=$NODE_HOME/bin:$PATH

OPENCLAW_BIN=/www/server/nodejs/v24.14.0/bin/openclaw
WEBHOOK_URL="你的webhook链接"
HOSTNAME=$(hostname)

notify() {
    local title="$1"
    local content="$2"
    curl -s -X POST "$WEBHOOK_URL" \
        -H "Content-Type: application/json" \
        -d "{
            \"msgtype\": \"markdown\",
            \"markdown\": {
                \"content\": \"### ${title}\n${content}\n> 主机:${HOSTNAME}\n> 时间:$(date '+%Y-%m-%d %H:%M:%S')\"
            }
        }" > /dev/null
}

echo "========================================"
echo "  OpenClaw 更新"
echo "  $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

if [ ! -f "$OPENCLAW_BIN" ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 找不到 openclaw 命令:${OPENCLAW_BIN}"
    notify "❌ OpenClaw 更新失败" "找不到 openclaw 命令:\`${OPENCLAW_BIN}\`"
    exit 1
fi

OLD_VER=$($OPENCLAW_BIN --version 2>/dev/null | head -1 || echo "未知")
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 当前版本:${OLD_VER}"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 开始更新..."

notify "🔄 OpenClaw 开始更新" "当前版本:\`${OLD_VER}\`"

$OPENCLAW_BIN update
EXIT_CODE=$?

NEW_VER=$($OPENCLAW_BIN --version 2>/dev/null | head -1 || echo "未知")

if [ $EXIT_CODE -ne 0 ]; then
    echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✗ 更新失败(exit code: ${EXIT_CODE}),当前版本:${OLD_VER}"
    notify "❌ OpenClaw 更新失败" "exit code: \`${EXIT_CODE}\`\n当前版本:\`${OLD_VER}\`"
    exit 1
fi

echo "[$(date '+%Y-%m-%d %H:%M:%S')] ✓ 更新完成,当前版本:${NEW_VER}"

if [ "$OLD_VER" = "$NEW_VER" ]; then
    VERSION_MSG="版本无变化:\`${NEW_VER}\`"
else
    VERSION_MSG="**${OLD_VER}** → **${NEW_VER}**"
fi

echo "----------------------------------------"
echo "[$(date '+%Y-%m-%d %H:%M:%S')] 验证渠道状态..."
CHANNEL_STATUS=$($OPENCLAW_BIN channels status --probe 2>&1 | grep -E "企业微信|weixin|running|error|disabled" | tr '\n' ' ')

echo "========================================"
echo "  更新流程完成"
echo "  $(date '+%Y-%m-%d %H:%M:%S')"
echo "========================================"

notify "✅ OpenClaw 更新完成" "${VERSION_MSG}
渠道状态:\`${CHANNEL_STATUS}\`"

日志输出示例:

========================================
  OpenClaw订阅更新
  2026-03-23 03:20:00
========================================

六、OpenClaw 备注

性能调优

安装完成后,直接在企业微信中发送以下提示词,让 OpenClaw 自己完成配置优化:

首先我需要解决在你处理复杂任务时容易中断停止的问题。例如:
1. 命令执行超时 — 比如跑个编译、部署,时间太长被掐了
2. 回复太长被截断 — 输出内容太多,消息发一半就没了
3. 多步骤任务中间断了 — 复杂任务做到一半,后面的步骤没继续
4. token 用完了 — 对话太长,上下文塞满了

再优化一下配置:
1. 智能体运行超时
2. 分块流式传输
3. exec 命令超时

OpenClaw 会自行分析当前配置并执行相应调整,无需手动操作。


常用运维命令速查

# 查看 gateway 完整状态
openclaw gateway status --deep

# 查看当前配置
openclaw config get gateway

# 重启 gateway
openclaw gateway restart

# 停止 gateway
openclaw gateway stop

# 查看日志
openclaw logs --follow

# 健康检查
openclaw doctor

七、接入企业微信智能机器人

官方文档:https://open.work.weixin.qq.com/help2/pc/cat?doc_id=21657

第一步:企业微信后台创建智能机器人

  1. 登录企业微信管理后台

  2. 左侧导航:安全与管理 → 管理工具 → 智能机器人

  3. 点击「创建机器人」→ 选择「API 模式」→「长连接」

  4. 填写机器人名称、可见范围,保存后记录生成的 Bot ID 和 Secret

第二步:安装插件并完成绑定

npx -y @wecom/wecom-openclaw-cli install

按提示填入 Bot ID 和 Secret(或扫码自动绑定),安装完成后会自动重启 Gateway,无需额外操作。

验证插件已加载:

openclaw plugins list

常见问题

Q:机器人不回复消息?

  1. openclaw gateway status --deep 确认服务运行正常

  2. openclaw plugins list 确认 wecom 插件已加载

  3. 检查 Bot ID / Secret 是否填写有误

  4. 确认企业微信账号在机器人可见范围内



八、企业微信多人独立工作目录(Multi-Agent)

本节介绍如何在一台服务器上为团队多名成员分别配置独立的 OpenClaw Agent,每人拥有独立的工作目录和会话历史,互不干扰。

架构原理

企业微信
  张三发消息 (userid: zhangsan)
       ↓
  OpenClaw Gateway
       ↓  peer 路由匹配
  agent: zhangsan
       ↓
  workspace: ~/.openclaw/workspace-zhangsan/

企业微信每条消息自带 userid(员工账号),可直接用于路由,无需额外收集身份信息。

第一步:企业微信后台创建长连接机器人

  1. 登录企业微信管理后台

  2. 管理工具 → 智能机器人 → 创建机器人 → 手动创建

  3. 右下角选择 API 模式 → 连接方式选 「使用长连接」

  4. 创建完成后记录 Bot ID 和 Secret

长连接的优势: 不需要公网域名,OpenClaw 主动向企业微信保持 WebSocket 连接,适合内网部署。

第二步:安装企业微信插件

npx -y @wecom/wecom-openclaw-cli install

按提示选择「手动输入 Bot ID 和 Secret」,填入上一步获得的凭据。

验证:

npx -y @wecom/wecom-openclaw-cli doctor
# 预期:所有检查均已通过

第三步:查询员工 userid

登录企业微信管理后台 → 通讯录 → 点击成员 → 「账号」字段(不是姓名,是英文/拼音账号)。

第四步:为每位员工创建独立 Agent

openclaw agents add zhangsan
openclaw agents add lisi
openclaw agents add wangwu

Agent ID 会自动规范化为小写。每个 agent 自动在 ~/.openclaw/workspace-<agentId>/ 目录下创建独立 workspace。

第五步:配置消息路由

通过 bindings 把指定 userid 的消息精确路由到对应 agent:

openclaw config set bindings '[
  {"agentId":"zhangsan","match":{"channel":"wecom","peer":{"kind":"direct","id":"zhangsan"}}},
  {"agentId":"lisi",    "match":{"channel":"wecom","peer":{"kind":"direct","id":"lisi"}}},
  {"agentId":"wangwu",  "match":{"channel":"wecom","peer":{"kind":"direct","id":"wangwu"}}}
]' --strict-json

openclaw gateway restart

验证路由配置:

openclaw agents list --bindings

预期输出:

- zhangsan
  Workspace: ~/.openclaw/workspace-zhangsan
  Routing rules:
    - wecom peer=direct:zhangsan

- lisi
  Workspace: ~/.openclaw/workspace-lisi
  Routing rules:
    - wecom peer=direct:lisi

新员工入职流程

每次新增员工只需三步:

# 1. 创建 agent
openclaw agents add <新员工userid>

# 2. 在 bindings 数组里追加新员工
openclaw config set bindings '[...原有配置...,
  {"agentId":"<agentid>","match":{"channel":"wecom","peer":{"kind":"direct","id":"<userid>"}}}
]' --strict-json

# 3. 重启
openclaw gateway restart

常见问题

Q:企业微信渠道显示 disabled 或 not configured

npx -y @wecom/wecom-openclaw-cli doctor --fix
openclaw gateway restart

Q:openclaw update 后插件加载失败

rm -rf ~/.openclaw/extensions/wecom-openclaw-plugin
openclaw plugins install @wecom/wecom-openclaw-plugin
openclaw gateway restart

九、个人微信多人独立工作目录(Multi-Agent)

个人微信通过官方 ClawBot 插件接入,原理与企业微信相同,但有两点关键差异:

企业微信

个人微信

身份标识

userid(预先知道)

openid(乱码,须扫码后获取)

每人 accountId

所有人共用一个 Bot

每人扫码产生独立 accountId

binding 格式

只需 peer

需要 accountId + peer

第一步:安装个人微信插件

npx -y @tencent-weixin/openclaw-weixin-cli@latest install

安装过程会自动弹出二维码,用你自己的微信扫码完成第一个账号绑定。

锁定插件信任并重启:

openclaw config set plugins.allow '["openclaw-weixin"]'
openclaw gateway restart
sleep 3
openclaw plugins list | grep weixin
# 预期:loaded  2.0.x

第二步:查看当前账号的 accountId

openclaw channels status --probe
# 预期:openclaw-weixin xxxxxxxxxxxx-im-bot: enabled, configured, running

记录 xxxxxxxxxxxx-im-bot 这个值,这是你的 accountId。

第三步:创建自己的 Agent

openclaw agents add zhangsan

第四步:收集自己的 openid

发一条微信消息,然后:

openclaw logs --follow | grep "inbound:"
# 记录 from=o9cq80xxx@im.wechat 这个值

第五步:配置路由

注意: 个人微信的 binding 必须同时指定 accountId 和 peer,缺少 accountId 会导致路由失败落到 main agent。

openclaw config set bindings '[
  {"agentId":"zhangsan","match":{"channel":"openclaw-weixin","accountId":"xxxxxxxxxxxx-im-bot","peer":{"kind":"direct","id":"o9cq80xxx@im.wechat"}}}
]' --strict-json

openclaw gateway restart

第六步:新增其他成员

在服务器上为对方生成二维码:

openclaw channels login --channel openclaw-weixin --account <成员名>

终端弹出二维码,截图发给对方扫码,或让对方用浏览器打开终端显示的链接扫码。

收集对方的 accountId 和 openid:

# 扫码后查看新 accountId
openclaw channels status --probe

# 对方发一条消息后查看 openid
openclaw logs --follow | grep "inbound:"

创建 agent 并追加路由:

# 创建 agent
openclaw agents add lisi --non-interactive

# 追加路由(保留已有的,追加新的)
openclaw config set bindings '[
  {"agentId":"zhangsan","match":{"channel":"openclaw-weixin","accountId":"xxxxxxxxxxxx-im-bot","peer":{"kind":"direct","id":"o9cq80xxx@im.wechat"}}},
  {"agentId":"lisi",  "match":{"channel":"openclaw-weixin","accountId":"xxxxxxxxxxxx-im-bot","peer":{"kind":"direct","id":"o9cq80yyy@im.wechat"}}}
]' --strict-json

openclaw gateway restart

验证:

openclaw agents list --bindings

预期输出:

- zhangsan
  Routing rules:
    - openclaw-weixin accountId=7c9bed0c019d-im-bot peer=direct:o9cq80xxx@im.wechat

- lisi
  Routing rules:
    - openclaw-weixin accountId=92c6ad814be0-im-bot peer=direct:o9cq80yyy@im.wechat

关于 session 列表中的 main

每个 agent 都会显示两条 session:

  • dafang / o9cq80xxx@im.wechat — 实际对话 session,消息路由到这里

  • dafang / main — agent 系统 session(心跳、定时任务用),不是真实对话

这是正常现象,不影响使用。

openclaw update 后插件修复

个人微信插件升级后若出现 plugin-sdk 函数缺失报错,使用 2.0.x 版本后已内置 symlink,一般只需重新安装即可:

rm -rf ~/.openclaw/extensions/openclaw-weixin
openclaw plugins install @tencent-weixin/openclaw-weixin
openclaw gateway restart

企业微信 vs 个人微信方案对比

对比维度

企业微信(长连接)

个人微信(ClawBot)

身份获取

管理后台查 userid,预先知道

扫码后从日志收集 openid

操作顺序

先配置后扫码

先扫码后配置

binding 格式

只需 peer

需要 accountId + peer

每人 accountId

共用一个 Bot

每人独立

稳定性

官方 API,稳定

官方插件,灰度中

24小时保活

不需要

超过24小时未发消息需保活

适合场景

企业内部团队

个人或外部用户

推荐程度

⭐⭐⭐⭐⭐

⭐⭐⭐⭐

内部团队优先选企业微信,userid 预先可知、配置流程更简单、稳定性更高。个人微信适合对外服务或成员没有企业微信的场景。

十、配置 Gitee 访问

让 OpenClaw 能直接操作 Gitee 仓库(clone/pull/push),只需配置 Git 凭证:

# 开启凭证持久化
git config --global credential.helper store

# 配置用户信息
git config --global user.name "你的姓名"
git config --global user.email "你的邮箱"

# 第一次 clone 时 URL 中带入 token,git 会自动记录到 ~/.git-credentials
git clone https://your_username:your_token_here@gitee.com/your_username/your_repo.git

之后所有对 gitee.com 的 pull/push 操作自动使用已记录的凭证,无需再带 token。


十一、总结

步骤

关键点

环境变量

用 /etc/profile.d/ 模块化管理,工具路径与凭证分开

OpenClaw 安装

安装前切换 Clash Verge 为全局模式,装完立即改回规则模式

远程访问

gateway.bind=lan + gateway.auth.token 缺一不可

device identity 报错

根本原因是非 HTTPS 上下文,内网用 dangerouslyDisableDeviceAuth,生产用 HTTPS

性能调优

智能体超时 1800s、开启 blockStreaming、exec 超时写入 AGENTS.md

企业微信接入

优先选长连接模式,无需公网 IP;装插件 → 创建机器人 → 填入 Bot ID + Secret

Gitee 接入

credential.helper store,首次 clone 带 token 后自动记录,无需其他配置

agent-to-agent

默认关闭,需 tools.agentToAgent.enabled=true 后重启 Gateway


环境:Ubuntu 24.04 + 宝塔面板 + OpenClaw 2026.3.13

许可协议: 
分享

相关文章

下一篇

Ubuntu Server 24.04 使用 Docker Compose 部署 Mihomo 完整指南

上一篇

FastTunnel v2 内网穿透 Docker 部署完整指南(服务端 + 客户端)

最近更新

  • Ubuntu Server 24.04 使用 Docker Compose 部署 Mihomo 完整指南
  • 宝塔面板环境配置 + OpenClaw 安装与进阶实战指南
  • FastTunnel v2 内网穿透 Docker 部署完整指南(服务端 + 客户端)
  • Windows 10 LTSC 上用 WSL + mihomo 实现 Claude Code Agent Teams 分屏模式完整指南
  • OpenClaw 完整安装与使用指南:零成本打造全能 AI 助理

热门标签

MCP 并发编程 通义千问 代码审查 版本对比 数字人 开发效率 DevOps 结构化并发 永久投资组合

目录

©2026 范伟彬个人网. 保留部分权利。

使用 Halo 主题 Chirpy