宝塔面板环境配置 + OpenClaw 安装与进阶实战指南
本文记录在 Ubuntu 24.04 + 宝塔面板环境下,从零完成 JDK、Node.js、Python、Maven 环境变量配置,到安装 OpenClaw 并进阶实战完整过程。
环境说明
一、宝塔环境变量配置
宝塔面板通过自身的软件商店安装的 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
关键配置项说明
启动服务
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。
各工具代理生效范围汇总
局域网其他设备使用代理
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 订阅更新
脚本内容:
#!/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 更新
脚本内容:
#!/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 更新
脚本内容:
#!/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
第一步:企业微信后台创建智能机器人
登录企业微信管理后台
左侧导航:安全与管理 → 管理工具 → 智能机器人
点击「创建机器人」→ 选择「API 模式」→「长连接」
填写机器人名称、可见范围,保存后记录生成的 Bot ID 和 Secret
第二步:安装插件并完成绑定
npx -y @wecom/wecom-openclaw-cli install
按提示填入 Bot ID 和 Secret(或扫码自动绑定),安装完成后会自动重启 Gateway,无需额外操作。
验证插件已加载:
openclaw plugins list
常见问题
Q:机器人不回复消息?
openclaw gateway status --deep确认服务运行正常openclaw plugins list确认 wecom 插件已加载检查 Bot ID / Secret 是否填写有误
确认企业微信账号在机器人可见范围内
八、企业微信多人独立工作目录(Multi-Agent)
本节介绍如何在一台服务器上为团队多名成员分别配置独立的 OpenClaw Agent,每人拥有独立的工作目录和会话历史,互不干扰。
架构原理
企业微信
张三发消息 (userid: zhangsan)
↓
OpenClaw Gateway
↓ peer 路由匹配
agent: zhangsan
↓
workspace: ~/.openclaw/workspace-zhangsan/
企业微信每条消息自带 userid(员工账号),可直接用于路由,无需额外收集身份信息。
第一步:企业微信后台创建长连接机器人
登录企业微信管理后台
管理工具 → 智能机器人 → 创建机器人 → 手动创建
右下角选择 API 模式 → 连接方式选 「使用长连接」
创建完成后记录 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 插件接入,原理与企业微信相同,但有两点关键差异:
第一步:安装个人微信插件
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会导致路由失败落到mainagent。
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 个人微信方案对比
内部团队优先选企业微信,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。
十一、总结
环境:Ubuntu 24.04 + 宝塔面板 + OpenClaw 2026.3.13