跳转至

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 从创建到可用的标准流程:

  1. 在 Mattermost 创建 bot 账号
  2. 生成 bot token
  3. 配置到 openclaw.json
  4. 用户 DM bot 获取 pairing code
  5. 执行 openclaw pairing approve mattermost <code> 完成授权
  6. 重启 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 配置项,回滚修正

根因突破

blocked URL fetch ... reason=Blocked: resolves to private/internal/special-use IP address

附件 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。调整后成功加载:

[generic] relay backend connected

运维命令速查

# 配对审批
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 长连接机制