通知
Libre WebUI 为每位用户维护持久通知收件箱,使团队活动(提及、私信、共享、自动化 失败和日历提醒)在相关页面关闭时也能送达。
状态弹窗
简短的状态消息(例如更改已保存或 Git 操作已完成)会显示在页面顶部附近。你可以用鼠标等指针设备或键盘操作 关闭 按钮来清除弹窗。鼠标悬停在弹窗上时,消息会保持显示,方便你阅读;关闭弹窗只会移除这条消息,相关操作仍保持其当前状态。
收件箱
通知首先是数据库行:标题和正文静态加密,每用户最多 500 条(清理最旧条目), 并可通过可选来源键去重,使重复发布合并为一条而不是反复响铃。REST 接口支持列出、 统计未读、标记一条或全部已读以及删除。
实时交付通过每用户持久事件流 notify:<userId>,使用
GET /api/notifications/events(SSE)。流身份来自已认证会话,绝不取自客户端
输入;SQL 收件箱仍是真实来源:错过事件时读取列表恢复,而不是重放流。
通知来源
| 类型 | 触发条件 |
|---|---|
channel-dm | 有人向你发送私信 |
channel-mention | 有人在频道中 @mentions 你或回复你的消息 |
channel-invite | 你被加入频道 |
share | 有人与你共享资源 |
automation-failed | 你的自动化失败(除非选择不通知) |
calendar-reminder | 带提醒偏移的事件到达提醒时间 |
work-run-finished | 你雇用的某个 Work 代理完成一次运行 |
work-run-attention | 已雇用代理停下来等待输入或遇到错误 |
work-takeover | Work 代理请求你接管其屏幕 |
work-approval | 某次 Work 运行正在等待你批准一项有副作用的操作 |
system | 实例级公告 |
通知始终只发给受影响用户;提及不属于频道的用户名不会产生任何内容。
通知还可以触发自动化:一项带 event 触发器的自动化会在一条所选
类型的通知到达其所有者时运行,并受每个自动化每分钟一次的冷却限制。
出站 webhook
管理员可注册接收团队事件的 webhook 目标。
- 出站防护。目标遵循与工具服务器相同的目的地政策:必须是精确 URL,不跟随重定向,
不允许私有或链路本地地址,除非管理员通过
TOOLS_PRIVATE_NETWORK_ALLOWLIST明确 放行主机。每次交付都会重新解析并检查主机名。 - 签名。配置密钥后,每次交付都带
X-Libre-Signature: sha256=<hmac>,按准确正文计算。 - 脱敏。信封包含事件种类、通知类型、标题、标识符和时间戳。通知正文、消息内容、 提示词和文档绝不会离开实例。
- 持久。交付作为持久任务运行,重试次数受限;接收方 5xx 会重试,4xx 被视为 接收方结论并结束。
- 限定范围。每个目标订阅指定通知类型(或
*)。
浏览器推送
设置 → 通知会为 Web Push 注册当前浏览器,让提及、共享、提醒和已完成工作在标签页 关闭时也能送达。实现标准且自包含:
- VAPID (RFC 8292)。服务器使用 ES256 密钥对签名每次交付;密钥对只生成一次并
加密存储,或用
VAPID_PUBLIC_KEY/VAPID_PRIVATE_KEY固定 (VAPID_SUBJECT设置联系声明)。除浏览器提供商的推送端点外,不使用第三方 推送库或服务账户。 - 加密负载 (RFC 8291)。每条消息离开实例前都用 aes128gcm 加密到设备自己的 密钥;推送服务只能转发无法读取的密文。
- 按设备并绑定会话。订阅属于创建它的浏览器和该浏览器的认证会话;退出会话 (或“退出其他会话”)也会移除推送注册。端点加密存储并带有键控查找令牌,且必须 是公共 HTTPS 目的地。
- 持久。推送交付作为持久任务运行并有限重试;服务报告订阅已消失(404/410) 时将其删除。
- 负载包含通知标题、可选正文、类型和目标链接,脱敏边界与收件箱一致。
推送要求生产应用(service worker 仅在那里注册)和安全来源。同一 service worker 也提供离线外壳和可安装性:应用清单使 Libre WebUI 可安装,离线导航回退到缓存外壳, 带哈希的构建资源不可变缓存。API 流量绝不缓存。
邮件
邮件是第三条送达通道,也是唯一需要管理员配置的一条。设置 → 用户管理 →
访问与策略 → 邮件通知保存一台外发 SMTP 服务器:主机、端口、连接安全性
(STARTTLS、隐式 TLS,或用于受信任网络的“无”)、可选凭据、发件地址,以及
用于消息内链接的公开 URL。环境变量中的
SMTP_* 环境变量为容器部署提供同样字段的初始值;在界面中保存的值优先生效。
密码以加密方式存储,绝不会返回给浏览器。发送测试会向管理员自己的地址
(或任意手动填写的地址)发送一条消息,从而在用户依赖它之前验证整条链路是通的。
管理员还可以选择浅色或深色邮件模板,并在保存前预览。默认是浅色。保存的预设适用于此实例上的每条通知和测试邮件,包括 Markdown 结果;它与每位用户的界面主题无关。预览会渲染示例内容,不会连接 SMTP、发送邮件或将作业加入队列。只有管理员可以读取或更改预设,或请求预览。内置预设会让文本、链接、代码块和按钮保持易读;不接受自定义 HTML 模板。邮件客户端仍可能根据其自身的显示设置调整颜色。
开关打开后,每位用户在设置 → 通知 → 邮件通知下选择哪些内容会送到自己的 收件箱:
- 频道提及:有人在频道中提及你的一条消息,带预览和指向该频道的链接。
- 自动化结果:你每次自动化运行的结果,无论成功还是失败。聊天运行会带上 助手回复本身(最多几千字符);Work 运行会带上任务的状态行;失败则带上 错误信息。链接会打开对应的聊天或任务。
两个开关默认都是关闭的,需要用户自己打开;并且只对已设置邮箱地址的账户生效——
邮箱地址由账户持有者本人在注册时设置,或由管理员在“用户”中添加。邮件消息
通过与 Web 推送相同的持久任务运行时发出,对瞬时的中继故障有限重试,SMTP 客户端
是一个小型内置实现(EHLO、STARTTLS、AUTH PLAIN 或 LOGIN),除非模式明确设为
none,否则绝不会在未加密连接上发送凭据。每条消息都带有纯文本部分和一个采用
官网风格的 HTML 版本:Libre WebUI 字标、一张承载内容的卡片、一个珊瑚色按钮指向
目标,以及一段指回设置 → 通知的页脚。自动化结果会从 Markdown 渲染(标题、列表、
强调、代码、仅指向 http(s) 目标的链接);其余内容一律转义,唯一的外部图片是从
librewebui.org 提供的徽标。没有任何追踪。
边界
- 尚未实现按类型的用户偏好;自动化遵循自己的通知设置,离开频道会停止该频道通知。