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 客户端。

基于 Core 的独立应用,发送方通过标准接口接入 · 小屏可在图内横向滚动单独查看架构图

业务模块

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 和首次显示的密钥。

模板变量 · JSON Schema
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",
  "type": "object",
  "properties": { "message": { "type": "string" } },
  "required": ["message"],
  "additionalProperties": false
}

发送第一条通知

替换 Hook ID 与密钥后执行。requestId 使用本次投递的 UUID;网络结果不确定时保留同一 ID 和正文重试。

Terminal · HTTP 投递示例
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 使用四种独立凭证,各自授权,不能混用。

Aynur Hook 接入接口
用途接口凭证 / 行为
固定模板投递POST /api/hook/receive/{hookId}Hook secret,项目、模板版本与分类由 Hook 绑定。
主动发送POST /api/hook/notifyNotify 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 改成随机密钥,再执行迁移和启动。

Terminal · 本地 API
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 端口;可注册普通账号。

Terminal · 本地控制台
pnpm --dir admin install --frozen-lockfile
pnpm --dir admin dev

05 / SOURCE & DOCS

查看应用与接入契约。

HTTP 请求以项目 README 和 http.rs 为准,控制台 GraphQL 契约位于 api/schema.graphql。

每个工具各有职责,按你的项目需要组合。

浏览全部相关工具