AYNUR / NOTIFICATION INBOX
Aynur Hook
把业务提醒,变成可以接收与处理的通知。
基于 Aynur Core 的独立通知收件箱。项目、分类与模板定义消息,HTTP 接口负责投递,收件箱、SSE 与 MCP 将消息交给用户、客户端或 AI 工具。
- 项目类型
- 独立通知应用
- 技术组成
- Rust API · React 控制台
- 接入入口
- HTTP · GraphQL · SSE · MCP
01 / ARCHITECTURE
以通知为中心,连接发送方与接收方。
React 控制台与外部接入方进入 Axum 网关。Core 提供装配、认证与权限,hook 处理通知业务,hook_mcp 将业务能力提供给 MCP 客户端。
业务模块
api/modules/hook 管理项目、分类、模板版本、Hook、凭证和通知。模板变量通过 JSON Schema 2020-12 校验,持久化通知与事件以支持断线补拉。
应用装配
api/apps/gateway 装配 Core 与业务模块;api/apps/migrator 显式迁移。admin/ 是 React / TypeScript 控制台;数据库可选择 SQLite 或 PostgreSQL。
02 / QUICKSTART
从一条有类型的通知开始。
投递方只需发 HTTP 请求,无需引入 Aynur Core。示例使用 Header 传递密钥。
准备模板与 Hook
在控制台创建项目、分类与模板。示例模板使用 {{ message }},JSON Schema 中将 message 定义为必填 string。创建绑定该模板版本与分类的 Hook,保存其 ID 和首次显示的密钥。
{
"$schema": "https://json-schema.org/draft/2020-12/schema",
"type": "object",
"properties": { "message": { "type": "string" } },
"required": ["message"],
"additionalProperties": false
}发送第一条通知
替换 Hook ID 与密钥后执行。requestId 使用本次投递的 UUID;网络结果不确定时保留同一 ID 和正文重试。
curl --fail-with-body \
https://hook.aynur.cn/api/hook/receive/YOUR_HOOK_ID \
-H "Authorization: Bearer YOUR_HOOK_SECRET" \
-H "Content-Type: application/json" \
--data '{
"requestId": "f01a19f0-6c47-4c61-950e-78e449670226",
"variables": { "message": "服务器即将到期,请及时续费" }
}'在收件箱接收与处理
通知生成后,可在控制台查看、标为已读或记录处理备注。相同项目内,同一 requestId 和相同内容返回同一通知;正文不同会返回 409。
已读与已处理是独立状态。处理动作保存状态和备注,退款、续费等实际业务操作由你的业务系统执行。
Hook 固定绑定模板版本;发布新模板版本不会改写已绑定版本,也不会改变历史通知。
03 / INTERFACES
选择与你的接入场景匹配的凭证。
Hook、Notify、接收与 MCP 使用四种独立凭证,各自授权,不能混用。
| 用途 | 接口 | 凭证 / 行为 |
|---|---|---|
| 固定模板投递 | POST /api/hook/receive/{hookId} | Hook secret,项目、模板版本与分类由 Hook 绑定。 |
| 主动发送 | POST /api/hook/notify | Notify Token,在获授权项目内显式指定模板版本与分类。 |
| 收件箱快照 | GET /api/hook/notifications | 接收 Token,返回通知与 streamCursor。 |
| 实时订阅 | GET /api/hook/events?cursor=... | 接收 Token,SSE 实时接收与断线补拉。 |
| AI 工具 | POST /api/hook-mcp | 专用 MCP Token,Streamable HTTP,按权限执行操作。 |
| 控制台 | POST /graphql | 登录 JWT,强类型 Schema 定义查询和配置操作。 |
自建接收客户端时,先获取快照,再用 streamCursor 连接 SSE。应用事件后保存游标,断线时继续补拉;按通知 ID 幂等更新本地数据。订阅范围变更导致旧游标返回 409 时,重新获取快照。
SSE 提供在线接收和离线补拉。App 关闭后的系统推送需要另外接入推送服务。
04 / SELF HOST
也可以在自己的环境运行。
默认本地运行使用 SQLite。切换 PostgreSQL 需要同时选择相应编译 feature、Profile 与数据库 URL,精确配置见项目 README。
初始化 API
需要 Rust stable、Node.js 22.12+ 或 24+、pnpm 11。克隆项目后复制环境示例,并将 api/.env 中的 JWT_SECRET 改成随机密钥,再执行迁移和启动。
git clone https://gitee.com/aynurcn/hook.git
cd hook
cp api/.env.example api/.env
# 编辑 api/.env,设置 JWT_SECRET
# 生成密钥可使用:openssl rand -hex 32
mkdir -p api/data
cargo run --manifest-path api/Cargo.toml \
-p hook-migrator -- migration apply
cargo run --manifest-path api/Cargo.toml -p hook-gateway启动控制台
在项目根目录的另一个终端执行。控制台为 http://127.0.0.1:5175,API 为 4200 端口;可注册普通账号。
pnpm --dir admin install --frozen-lockfile
pnpm --dir admin dev05 / SOURCE & DOCS
查看应用与接入契约。
HTTP 请求以项目 README 和 http.rs 为准,控制台 GraphQL 契约位于 api/schema.graphql。
每个工具各有职责,按你的项目需要组合。
浏览全部相关工具