Notifo 介绍与选型指南
Notifo 多渠道通知服务器介绍与选型:架构与六大核心概念、多渠道订阅/偏好/摘要回执等实测特性,以及与 Gotify、ntfy 的量化对比,基于 1.3.0 实测取证。
Notifo 介绍与选型指南
目标:讲清 Notifo 是什么、为谁设计、核心能力与边界,并与 Gotify、ntfy 等同类自托管通知组件做量化对比,帮助读者在 5 分钟内完成「是否选它」的判断。本文为认知篇,信息来自官方仓库与官方文档的联网溯源,结合本地 Notifo 1.3.0 的容器化实测取证(查询/实验日期 2026-10-30),未混入无法复现的主观结论。
一、环境信息
| 项目 | 内容 |
|---|---|
| 软件名称 | Notifo |
| 一句话定位 | 开源自托管的多渠道通知服务器(Multi channel notification service) |
| 官方仓库 | https://github.com/notifo-io/notifo(2026-10-30 实查) |
| 当前最新稳定版 | 1.3.0(GitHub Releases 发布于 2022-11-30,截至 2026-10-30 仍为最新正式版) |
| 开源许可 | MIT License(仓库 LICENSE 文件) |
| 社区热度 | GitHub Stars 883(2026-10-30 实查) |
| 官方文档 | https://notifo.io 与 docs.notifo.io(self-hosting / configuration / architecture) |
| 技术栈 | 后端 C# / ASP.NET Core 7(容器内运行时 DOTNET_VERSION=7.0.0,实测 docker inspect 确认),存储 MongoDB |
| 官方镜像 | squidex/notifo:1.3.0(Docker Hub,镜像内健康检查 curl -f http://localhost:5000/healthz,实测确认) |
| 在线演示 | 官方文档提供 demo 站入口(https://demo.notifo.io) |
💡 说明:Notifo 与 Squidex(同作者的内容管理系统)同源,镜像命名空间为
squidex/notifo,代码仓库在notifo-io组织下,选型与部署时以官方 Docker Hub 镜像为准。
二、软件概述
Notifo 是一个自托管(self-hosted)的多渠道通知服务器:你的业务后端把「事件」发布给 Notifo,Notifo 按照每个用户的订阅关系与个人偏好,把这条通知分发到合适的一个或多个渠道——Email、Web Push(浏览器推送)、Mobile Push(FCM/APNs)、SMS、Webhook、站内消息(Messaging)等。仓库 README 对它的定位是「Multi channel notification service for collaboration tools, e-commerce, news service and more」。
它的核心概念只有六个,理解了这六个词就理解了 Notifo:
| 概念 | 含义 | 实测要点(1.3.0) |
|---|---|---|
| App(应用) | 通知的隔离单元,一个业务系统一个 App,自带若干 API Key | 创建 App 后返回 4 把按角色(Admin/WebManager)预设的 API Key |
| User(用户) | 收通知的人,带邮箱、手机号、语言、时区,每人生成一把用户级 API Key | 通过 API 批量 upsert,实测创建后立即可用 |
| Topic(主题) | 层级化发布主题,如 books/novels、releases/v130 | 实测单级(solo)与多级主题均可订阅与发布 |
| Subscription(订阅) | 用户对某个主题前缀的订阅关系,可按渠道覆写发送设置 | 订阅接口返回 204 空体,落库后按前缀匹配 |
| Channel(渠道) | 通知的出口:email / web / mobilepush / sms / webhook / messaging | 实测一条通知在 channels 字段里逐渠道给出 Handled/Skipped 状态 |
| Integration(集成) | 每个渠道的发送配置(如 SMTP 服务器、Twilio 凭据),按 App 启用 | 实测 SMTP 集成配置后状态即时变为 Verified |
与「把消息发到群机器人」的 Webhook 通知类工具不同,Notifo 管理的是面向最终用户的通知体系:谁订了什么、用什么渠道收、要不要延迟/合并成摘要、看没看过、送没送达,都有完整的模型与回执。如果你的场景是「给我自己发运维告警」,Notifo 偏重;如果是「给我的产品用户发通知」,Notifo 正中靶心。
三、核心架构
Notifo 1.3.0 的架构在同类组件中属于「单体但分层清晰」的一类,以下为官方架构文档与本地实测(容器内 MongoDB 集合清单、健康检查输出)交叉归纳:
| 层 | 技术 | 说明 |
|---|---|---|
| Web 服务 | ASP.NET Core 7(Kestrel) | 容器内监听 5000 端口(ASPNETCORE_URLS=http://+:5000),宿主映射自定义(本系列实验用 8151) |
| 管理界面 | 内置 SPA Dashboard | 与 API 同端口,登录后可视化配置 App/用户/订阅/模板/集成/日志 |
| 存储 | MongoDB(必选) | 官方唯一支持的存储后端;默认库名 Notifications(appsettings 定义,实测库表 Apps/Users/Subscriptions/Notifications/Topics 均在该库) |
| 队列与调度 | 内置 Scheduler(默认) | appsettings messaging:type 支持 Scheduler / RabbitMQ / Kafka / Google PubSub;内置模式下 Mongo 中可见 Queue_events、Scheduler_email 等集合,实测发布到分发约 1~4 秒 |
| 实时通道 | SignalR | Web 端实时通知由 SignalR 承载(web:signalR:enabled 默认开启),多实例部署需配 sticky session 或降级为轮询 |
| 渠道集成 | 插件式 Integration | Email(SMTP/Mailjet/Amazon SES)、SMS(Twilio/MessageBird)、Mobile Push(FCM/APNs)、Webhook 等按 App 启用 |
| 健康检查 | /healthz、/ping | /healthz 返回含 GC 堆内存的 JSON(超过 diagnostics:gc:threshold 默认 8192MB 判定不健康,实测输出原文保留该描述) |
| API 规范 | OpenAPI | 运行实例直接暴露 /api/openapi.json 与 /swagger/v1/swagger.json(实测可拉取),接口即文档 |
💡 技术拓展:Notifo 把「事件 → 通知」的 fanout 做在服务内部:
POST /api/apps/{appId}/events接收发布请求后先落Queue_events队列,由调度器计算订阅者并写入Notifications集合,再按渠道入Scheduler_email、Scheduler_webpush等调度集合逐渠道投递。实测日志接口会把「Event has no subscriber.」这类投递结果记到 App 级系统日志里,排障时先看这里。
四、功能特性
以下特性清单逐项经过官方文档核对或本地 1.3.0 实测验证(标注「实测」的条目均有 API 回显留存):
- 多渠道分发:Email、Web Push、Mobile Push(FCM/APNs)、SMS、Webhook、Messaging(应用内消息),一条通知可同时走多渠道并分别记录状态(实测:同一通知 email 与 web 双渠道均为 Handled)。
- 层级主题 + 前缀订阅:主题按
/分层,用户按前缀订阅(实测订阅releases/v130后收到该主题通知;单级solo亦可)。 - 每用户渠道偏好:用户级与订阅级均可按渠道设置 send(Send/NotSending)、condition、delay、专属模板(实测 user settings 与 subscription topicSettings 字段结构一致)。
- 模板系统:Email(HTML/文本双格式)、Messaging、SMS 模板,按 code 组织、按语言存放(LocalizedText),支持渲染预览接口(实测
/email-templates/render与 preview 端点存在于 OpenAPI)。 - 邮件摘要(Email Digest):一段时间内多条通知合并为一封摘要邮件(实测 Mailhog 收到主题为「Your notifications from demo」的合并邮件,正文逐条列出通知标题与内容)。
- 发送调度与控制:Publish 请求支持 scheduling(延迟/每日定时)、silent(静默)、test(走测试集成)、timeToLiveInSeconds(实测 PublishDto 字段表来自运行实例 OpenAPI)。
- 送达回执与已读跟踪:每条通知返回
trackDeliveredUrl/trackSeenUrl(实测原文返回),通知列表实时呈现每渠道 Handled/Skipped 状态与首达/首读时间。 - 多语言与时区:用户带 preferredLanguage / preferredTimezone,通知文本按语言键(如
en)选取(实测/api/me返回服务端支持的 400+ 时区与语言清单)。 - 白名单主题:用户可开启
requiresWhitelistedTopics,仅允许订阅管理员预设的 AllowedTopics(实测字段存在于用户对象)。 - 完整 API 与 SDK:全部能力 API 化(apps/users/subscriptions/topics/notifications/integrations/templates/logs/media/system-users/me),官方提供 JS SDK 并内嵌「通知中心」组件;API Key 与 OAuth client_credentials 双认证体系(实测均可用)。
五、快速开始
最小可用部署只需要三个容器:Notifo 主服务 + MongoDB + 一个本地 SMTP 模拟器(Mailhog,用于验证邮件渠道)。核心步骤:
# 1. 准备 docker-compose.yml(完整文件见部署篇),拉起服务
docker compose up -d
# 2. 等待健康检查通过(start_period 60 秒)
curl http://localhost:8151/healthz
# 3. 浏览器打开 http://<服务器IP>:8151
# 用初始管理员 admin@notifo.io / Q1w2e3r4! 登录(由环境变量 IDENTITY__USERS__0__* 定义)
登录后在 Dashboard 创建第一个 App,配置 SMTP 集成指向 Mailhog(主机名 notifo-mailhog、端口 1025),即可通过 API 发布第一条通知并看到邮件落袋。完整的命令级全流程(含 API 创建 App/用户/订阅/发布/收信验证)见《Notifo v1.3.0 Docker Compose 部署指南》与《Notifo v1.3.0 API 使用详解》。
六、适用场景与限制
适合用 Notifo 的场景:
- 电商、协作工具、内容平台的站内/邮件/推送统一通知中心:用户订阅关系、偏好开关、免打扰、摘要合并都是原生能力;
- 需要用户自选通知渠道的产品:每用户每渠道的 send/condition/delay 模型开箱即用;
- 需要多语言通知的国际化产品:LocalizedText 按语言键存储与渲染;
- 需要通知回执闭环的系统:送达/已读跟踪 URL 与渠道级状态开箱即得。
选型前要想清楚的限制:
- 必须 MongoDB:不支持 SQLite/Postgres 等轻量存储,小内存 VPS 上要额外承担 MongoDB 的资源开销(实测 Notifo 单容器常驻内存约 450MB);
- 版本节奏慢:1.3.0(2022-11-30)截至 2026-10-30 仍是最新正式版,安全更新与新渠道集成基本停滞,选型时应评估自行维护的能力;
- 邮件渠道需自备发信服务:内置 SMTP/Mailjet/Amazon SES 三种集成,不含 Gmail/腾讯企业邮等开箱配置(SMTP 通用配置即可覆盖);
- 无原生 IM 渠道:Telegram/Slack/钉钉等需经 Webhook 桥接;
- 横向扩展门槛:多实例需 Redis clustering + sticky session(或关闭 SignalR 降级轮询)+ 外部消息队列(Kafka/RabbitMQ)。
七、同类选型对比
自托管通知类组件按「给谁发、发到哪、谁说了算」三个维度可以分成两代:第一代是「给我自己发」的消息推送(Gotify、ntfy),第二代是「给我的用户发」的通知中心(Notifo、Novu)。2026-10-30 实查三方官方文档与仓库,量化对比如下:
| 维度 | Notifo 1.3.0 | Gotify v2.x | ntfy v2.x |
|---|---|---|---|
| 定位 | 面向最终用户的多渠道通知中心 | 面向个人/小团队的消息推送 | HTTP pub/sub 消息推送 |
| 开发语言 | C# / ASP.NET Core 7 | Go | Go |
| 必备存储 | MongoDB(唯一支持) | SQLite(默认)/ MySQL / Postgres | 文件/内存/SQLite/MySQL/Postgres/TiDB |
| 投递渠道 | Email、Web Push、Mobile Push(FCM/APNs)、SMS、Webhook、Messaging | 应用内 WebSocket + Android/iOS 客户端 | HTTP/WebSocket/SSE + Android/iOS/桌面客户端 |
| 邮件能力 | 原生 Email 渠道 + 摘要合并(digest)+ HTML/文本模板 | 无 | 无 |
| 用户体系 | 多用户、订阅关系、每用户每渠道偏好、白名单主题 | 单一账号 + client token,无按用户偏好模型 | 匿名 topic + ACL 访问控制,无用户偏好体系 |
| 模板系统 | 三类模板(Email/Messaging/SMS)按语言组织,支持预览 | 无 | 无(正文即消息,格式自定义) |
| 回执跟踪 | 送达/已读 URL、渠道级 Handled/Skipped 状态 | 客户端标记已读(应用内) | 无回执 |
| 实时通道 | SignalR | WebSocket | WebSocket / SSE / 流式 HTTP |
| 资源占用 | 较高(实测单容器约 450MB + MongoDB) | 极低(数十 MB) | 低 |
| 认证 | API Key(应用/用户两级)+ OAuth client_credentials | Token | Token / ACL / TLS |
| 典型用途 | 给产品的最终用户发通知 | 给自己或团队发运维/监控消息 | 给脚本、CI、IoT 设备发消息 |
选型结论:
- 要给产品的最终用户建通知体系(订阅、偏好、邮件、推送、回执),或者需要邮件摘要这类「通知管理」能力 → Notifo,代价是必须接受 MongoDB 与较高的资源占用,且需评估项目维护节奏;
- 只想给自己/小团队发服务器与监控告警,追求一键部署与极低开销 → Gotify;
- 消息发送方五花八门(脚本/CI/IoT),希望「一个 HTTP PUT 就能把消息送到手机」 → ntfy;
- 如果服务愿意托管在云端、需要更现代的多渠道编排(工作流、A/B 测试),可以再评估 Novu(SaaS 优先、可自托管,但自托管形态重,依赖组件多),本文不展开。
💡 以上三款均可用 Docker Compose 单机部署,建议按「通知的接收方是谁」做第一刀切分:接收方是「用户的人」选 Notifo,是「自己的手机」选 Gotify/ntfy。
八、参考链接
- 官方仓库:https://github.com/notifo-io/notifo
- 官方文档(Self-hosting):https://docs.notifo.io/self-hosting
- 官方文档(Configuration):https://docs.notifo.io/configuration
- 官方文档(Architecture):https://docs.notifo.io/architecture
- Docker Hub 镜像:https://hub.docker.com/r/squidex/notifo
- Releases:https://github.com/notifo-io/notifo/releases(1.3.0,2022-11-30)
- 本系列实战文档:《Notifo v1.3.0 Docker Compose 部署指南》、《Notifo v1.3.0 配置参数详解》、《Notifo v1.3.0 API 使用详解》