Mattermost 运维与集成¶
OpenClaw 与 Mattermost 的全链路集成 — 从 Bot 创建、频道运维、附件问题到群消息触发控制。
架构概述¶
OpenClaw 通过 Mattermost 插件以 WebSocket 长连接 接收消息事件,使用 bot token 认证。每个 Agent 对应一个独立 bot 账号,支持 DM 私聊和群聊 @ 触发两种交互模式。
关键配置项:
| 配置项 | 用途 | 说明 |
|---|---|---|
dmPolicy: "pairing" |
DM 权限控制 | 只有已配对用户的 DM 才会响应 |
groupAllowFrom |
群聊触发源控制 | 限制哪些用户可以在群里触发 bot |
bindings |
多 Agent 路由 | 缺少则多 Agent 无法正确工作 |
⚠️
ignoreBots不存在,是之前编造的配置项。正确做法是groupAllowFrom。
Bot 生命周期管理¶
创建与配对¶
新 Bot 从创建到可用的标准流程:
- 在 Mattermost 创建 bot 账号
- 生成 bot token
- 配置到
openclaw.json - 用户 DM bot 获取 pairing code
- 执行
openclaw pairing approve mattermost <code>完成授权 - 重启 gateway(如修改了配置文件)
已完成配对的 Bot: - Prism 系列(pm/arch/data/ui/docs) - Otter - BNEF - Clawline 开发角色
Bot 加入 Team/Channel¶
Bot 必须先加入 team,才能加入 channel。操作方式:
- mmctl 命令行工具
- REST API(需 admin token 权限)
- Docker 容器内执行 mmctl
关键问题与修复¶
1. 附件接收问题(03-04 ~ 03-05)¶
现象:Dad 发送附件后 bot 只收到文本,看不到任何附件信息。
排查过程:
1. 确认不是 Mattermost 平台问题(其他模型能看到附件)
2. 核对插件版本和配置 — 一致,排除版本差异
3. 清理冗余 plugins.load 配置
4. 发现引入了不兼容的 security 配置项,回滚修正
根因突破:
附件 URL 对应的域名 mm.dora.restry.cn 解析到内网 IP,触发 OpenClaw 的 URL 安全策略。
修复:Dad 关闭本地域名解析,让域名不再指向内网地址。验证后附件内容可正常读取。
双层问题总结: - 消息链路层:附件元数据未稳定进入 agent 上下文 - 下载安全层:域名解析到 private IP 导致 fetch 被拦截
2. Bot 互相 @ 死循环(03-13 ~ 03-15)¶
事故:Prism 群聊中 bot 互相 @ 形成无限循环,Dad 紧急要求停机。
修复演进:
| 阶段 | 方案 | 效果 |
|---|---|---|
| 第一层 | SOUL.md 写入"谨慎 @ bot"行为约束 | 减少主动触发,但无法彻底阻断 |
| 错误尝试 | 使用 ignoreBots 配置项 |
无效(配置项不存在) |
| 最终方案 | 查源码确认用 groupAllowFrom |
从消息入口层彻底解决 |
配置策略:对 arch/data/docs/ui 设置 groupAllowFrom,只允许人类用户触发,PM 保留协调能力。
关键经验: - 仅靠 prompt 约束不够,必须在消息触发层做限制 - 查文档还不够,最好结合源码确认配置项是否真实存在
3. DM 处理堵塞(03-18)¶
现象:消息接收正常但处理 lane 堵塞。 原因:memory plugin 反复失败导致处理队列阻塞。 结果:清理后私聊恢复正常。
频道运维记录¶
Standup 通知群组¶
为 Prism Hackathon 创建的专用通知群组:
- 创建于新 Mattermost 服务器
- 所有 prism- bot 已加入
- 描述标注"专门用于 hackathon 活动通知"
日报投递调整¶
Dad 决定将 DevOps 每日任务从固定 channel 改投递到 DM。
服务器迁移¶
从本地 Mattermost 迁移到远程服务器的完整流程:
1. 在新服务器创建 5 个 prism- bot 账号
2. 更新远程 openclaw.json 中的 baseUrl 和 token
3. 重启 OpenClaw gateway
4. 清理本地旧 bot/用户/群组
渠道扩展¶
除 Mattermost 外,OpenClaw 还接入了其他渠道:
| 渠道 | 方式 | 状态 |
|---|---|---|
| generic-channel | GitHub 插件安装 | ✅ relay 已连接 |
| 微信 | @tencent-weixin/openclaw-weixin-cli |
✅ 扫码完成 |
generic-channel 插件¶
安装过程中发现 tsconfig 设置了 "noEmit": true,推断插件由 OpenClaw 直接运行 TypeScript。调整后成功加载:
运维命令速查¶
# 配对审批
openclaw pairing approve mattermost <PAIRING_CODE>
# 远程运维
ssh -p 18822 restry@eagle-sg.southeastasia.cloudapp.azure.com
# Mattermost 扩展包检查
cat ~/.npm-global/lib/node_modules/openclaw/extensions/mattermost/package.json
# Slash Command 注册确认日志
[plugins] mattermost: registered slash command callback at /api/channels/mattermost/command
关键决策汇总¶
Dad 的决策: - 将日报改投递到 DM - 要求创建 Standup 群组并补充描述 - 要求修复"真人可触发、bot 不可触发"的群聊策略 - 关闭本地域名解析修复附件问题 - 清理旧环境、迁移到新服务器
排查经验:
- 附件问题涉及消息链路 + URL 安全策略双层
- ignoreBots 不存在,用 groupAllowFrom
- security 配置项在当前版本不兼容
- 多 Agent 路由依赖 bindings 配置
- workspace 文件修改不需重启,配置文件修改需要重启
里程碑时间线¶
| 日期 | 事件 |
|---|---|
| 03-04 | 发现并定位附件接收问题 |
| 03-05 | 修复域名解析后附件可读 |
| 03-13 | 配对审批机制确认、bot 死循环事故 |
| 03-15 | 迁移到新 Mattermost、落地 groupAllowFrom |
| 03-16 | generic-channel 插件接入 relay |
| 03-18 | DM 处理堵塞修复、Slash Command 注册确认 |
| 03-19 | Otter/BNEF bot 创建与配对 |
| 03-23 | Clawline 新角色 bot 配对 |
| 03-24 | 微信渠道插件接入 |
| 03-26 | 明确 WebSocket 长连接机制 |