|
1 | 1 | # 通知能力基线 |
2 | 2 |
|
3 | | -本文档记录通知能力 P0-P6-D 基线:渠道、配置 key、GitHub Actions 映射、Web 设置元数据、CLI 诊断口径、Web 一键测试、自定义 Webhook Body 模板语义、通知路由策略、降噪机制、聚合报告失败隔离、ntfy / Gotify 一等渠道,以及 WebPush / Apprise 评估。P0 只做基线与只读诊断;P1 增加 Web 单渠道真实测试;P2 产品化现有 Body 模板;P3 增加 report / alert / system_error 路由;P4 增加进程内降噪;P5 强化测试诊断和聚合报告逐渠道失败隔离;P6-A 新增 ntfy;P6-C 新增 Gotify;P6-D 只评估 WebPush / Apprise,不新增运行时依赖、配置入口、per-URL 模板、跨进程持久化、真实每日摘要或重试循环。 |
| 3 | +本文档记录通知能力 P0-P7 终态:渠道、配置 key、GitHub Actions 映射、Web 设置元数据、CLI 诊断口径、Web 一键测试、自定义 Webhook Body 模板语义、通知路由策略、降噪机制、聚合报告失败隔离、ntfy / Gotify 一等渠道、WebPush / Apprise 评估,以及本地 / Docker / GitHub Actions / Desktop 场景化配置说明。P0 只做基线与只读诊断;P1 增加 Web 单渠道真实测试;P2 产品化现有 Body 模板;P3 增加 report / alert / system_error 路由;P4 增加进程内降噪;P5 强化测试诊断和聚合报告逐渠道失败隔离;P6-A 新增 ntfy;P6-C 新增 Gotify;P6-D 只评估 WebPush / Apprise;P7 收口文档与 Actions env 对照表自动化,不新增运行时依赖、配置入口、per-URL 模板、跨进程持久化、真实每日摘要或重试循环。 |
4 | 4 |
|
5 | 5 | ## 渠道基线 |
6 | 6 |
|
|
35 | 35 |
|
36 | 36 | ## GitHub Actions 映射 |
37 | 37 |
|
38 | | -仓库自带 `.github/workflows/daily_analysis.yml` 只显式导入固定变量名。P0 补齐以下已存在发送链路所需的映射: |
| 38 | +仓库自带 `.github/workflows/daily_analysis.yml` 只显式导入固定变量名。P0/P3/P4/P6 已把 Body 模板、安全项、PushPlus topic、路由、降噪、ntfy 和 Gotify 等通知 key 纳入默认 workflow。下面的表格由 `scripts/generate_notification_actions_env_table.py` 从 workflow `env:` 和通知诊断元数据生成,避免手写对照表和真实 Actions 映射继续漂移。 |
39 | 39 |
|
40 | | -- `CUSTOM_WEBHOOK_BODY_TEMPLATE` |
41 | | -- `WEBHOOK_VERIFY_SSL` |
42 | | -- `FEISHU_WEBHOOK_SECRET` |
43 | | -- `FEISHU_WEBHOOK_KEYWORD` |
44 | | -- `PUSHPLUS_TOPIC` |
| 40 | +<!-- notification-actions-env-table:start --> |
45 | 41 |
|
46 | | -P3 补齐以下通知路由映射: |
47 | | - |
48 | | -- `NOTIFICATION_REPORT_CHANNELS` |
49 | | -- `NOTIFICATION_ALERT_CHANNELS` |
50 | | -- `NOTIFICATION_SYSTEM_ERROR_CHANNELS` |
51 | | - |
52 | | -P4 补齐以下通知降噪映射: |
53 | | - |
54 | | -- `NOTIFICATION_DEDUP_TTL_SECONDS` |
55 | | -- `NOTIFICATION_COOLDOWN_SECONDS` |
56 | | -- `NOTIFICATION_QUIET_HOURS` |
57 | | -- `NOTIFICATION_TIMEZONE` |
58 | | -- `NOTIFICATION_MIN_SEVERITY` |
59 | | -- `NOTIFICATION_DAILY_DIGEST_ENABLED` |
60 | | - |
61 | | -P6-A / P6-C 补齐以下 ntfy / Gotify 渠道映射: |
62 | | - |
63 | | -- `NTFY_URL` |
64 | | -- `NTFY_TOKEN` |
65 | | -- `GOTIFY_URL` |
66 | | -- `GOTIFY_TOKEN` |
| 42 | +| Key | Tier | Channel / feature | Actions source | Default | |
| 43 | +| --- | --- | --- | --- | --- | |
| 44 | +| `WECHAT_WEBHOOK_URL` | minimal | wechat | Secret | - | |
| 45 | +| `WECHAT_MSG_TYPE` | advanced | wechat | Variable or Secret | `markdown` | |
| 46 | +| `FEISHU_WEBHOOK_URL` | minimal | feishu | Secret | - | |
| 47 | +| `FEISHU_WEBHOOK_SECRET` | advanced | feishu | Secret | - | |
| 48 | +| `FEISHU_WEBHOOK_KEYWORD` | advanced | feishu | Variable or Secret | - | |
| 49 | +| `TELEGRAM_BOT_TOKEN` | minimal | telegram | Secret | - | |
| 50 | +| `TELEGRAM_CHAT_ID` | minimal | telegram | Secret | - | |
| 51 | +| `TELEGRAM_MESSAGE_THREAD_ID` | advanced | telegram | Secret | - | |
| 52 | +| `EMAIL_SENDER` | minimal | email | Variable or Secret | - | |
| 53 | +| `EMAIL_PASSWORD` | minimal | email | Secret | - | |
| 54 | +| `EMAIL_RECEIVERS` | advanced | email | Variable or Secret | - | |
| 55 | +| `EMAIL_SENDER_NAME` | advanced | email | Variable or Secret | `daily_stock_analysis股票分析助手` | |
| 56 | +| `PUSHOVER_USER_KEY` | minimal | pushover | Secret | - | |
| 57 | +| `PUSHOVER_API_TOKEN` | minimal | pushover | Secret | - | |
| 58 | +| `NTFY_URL` | minimal | ntfy | Secret | - | |
| 59 | +| `NTFY_TOKEN` | advanced | ntfy | Secret | - | |
| 60 | +| `GOTIFY_URL` | minimal | gotify | Secret | - | |
| 61 | +| `GOTIFY_TOKEN` | minimal | gotify | Secret | - | |
| 62 | +| `PUSHPLUS_TOKEN` | minimal | pushplus | Secret | - | |
| 63 | +| `PUSHPLUS_TOPIC` | advanced | pushplus | Variable or Secret | - | |
| 64 | +| `CUSTOM_WEBHOOK_URLS` | minimal | custom | Secret | - | |
| 65 | +| `CUSTOM_WEBHOOK_BEARER_TOKEN` | advanced | custom | Secret | - | |
| 66 | +| `CUSTOM_WEBHOOK_BODY_TEMPLATE` | advanced | custom | Variable or Secret | - | |
| 67 | +| `WEBHOOK_VERIFY_SSL` | advanced | ntfy, gotify, custom, astrbot | Variable or Secret | `true` | |
| 68 | +| `DISCORD_WEBHOOK_URL` | minimal | discord | Secret | - | |
| 69 | +| `DISCORD_BOT_TOKEN` | minimal | discord | Secret | - | |
| 70 | +| `DISCORD_MAIN_CHANNEL_ID` | minimal | discord | Secret | - | |
| 71 | +| `ASTRBOT_URL` | minimal | astrbot | Secret | - | |
| 72 | +| `ASTRBOT_TOKEN` | advanced | astrbot | Secret | - | |
| 73 | +| `SERVERCHAN3_SENDKEY` | minimal | serverchan3 | Secret | - | |
| 74 | +| `SLACK_WEBHOOK_URL` | minimal | slack | Secret | - | |
| 75 | +| `SLACK_BOT_TOKEN` | minimal | slack | Secret | - | |
| 76 | +| `SLACK_CHANNEL_ID` | minimal | slack | Secret | - | |
| 77 | +| `NOTIFICATION_REPORT_CHANNELS` | advanced | routing | Variable or Secret | - | |
| 78 | +| `NOTIFICATION_ALERT_CHANNELS` | advanced | routing | Variable or Secret | - | |
| 79 | +| `NOTIFICATION_SYSTEM_ERROR_CHANNELS` | advanced | routing | Variable or Secret | - | |
| 80 | +| `NOTIFICATION_DEDUP_TTL_SECONDS` | advanced | noise | Variable or Secret | `0` | |
| 81 | +| `NOTIFICATION_COOLDOWN_SECONDS` | advanced | noise | Variable or Secret | `0` | |
| 82 | +| `NOTIFICATION_QUIET_HOURS` | advanced | noise | Variable or Secret | - | |
| 83 | +| `NOTIFICATION_TIMEZONE` | advanced | noise | Variable or Secret | - | |
| 84 | +| `NOTIFICATION_MIN_SEVERITY` | advanced | noise | Variable or Secret | - | |
| 85 | +| `NOTIFICATION_DAILY_DIGEST_ENABLED` | advanced | noise | Variable or Secret | `false` | |
| 86 | + |
| 87 | +<!-- notification-actions-env-table:end --> |
67 | 88 |
|
68 | 89 | 默认 workflow 仍不映射 `MARKDOWN_TO_IMAGE_CHANNELS` 与 `MERGE_EMAIL_NOTIFICATION`。它们是发送形态或聚合行为开关,不是渠道凭证;在 Actions 中自动开始读取同名 Secret/Variable 会引入额外行为变化。 |
69 | 90 |
|
@@ -230,9 +251,37 @@ Apprise 后续如要引入,应先作为可选依赖评估,而不是默认依 |
230 | 251 | - 发送失败应隔离在 Apprise 渠道内,不能影响已有渠道的失败隔离语义。 |
231 | 252 | - 如果采用 Apprise,建议先新增单独 experimental channel 或 CLI-only spike,再决定是否纳入 Web 设置页和 Actions env。 |
232 | 253 |
|
233 | | -## 场景占位 |
| 254 | +## 本地配置 |
| 255 | + |
| 256 | +本地运行优先使用项目根目录 `.env`。复制 `.env.example` 后填写至少一个 minimal key 即可启用对应静态通知渠道;advanced key 只改变认证、安全、格式、路由或降噪行为,不会单独启用渠道。 |
| 257 | + |
| 258 | +```bash |
| 259 | +python main.py --check-notify |
| 260 | +``` |
| 261 | + |
| 262 | +`--check-notify` 是只读诊断:不发送通知、不写 `.env`、不进入分析流程。配置好 WebUI 后,也可以在系统设置页用单渠道测试发送真实测试消息;该测试只使用页面草稿临时配置,不保存 `.env`。 |
| 263 | + |
| 264 | +## Docker |
| 265 | + |
| 266 | +Docker 场景可通过 `--env-file .env` / Compose `env_file` 注入运行时环境变量,也可以挂载 `.env` 让 Web 设置页和后端读写同一份配置文件。只注入环境变量但不挂载 `.env` 时,Web 设置页保存后的值在容器重启后可能被部署环境再次覆盖。 |
| 267 | + |
| 268 | +降噪静默时段建议显式配置 `NOTIFICATION_TIMEZONE`,避免容器默认时区与预期不一致。自签名内网 webhook 可临时使用 `WEBHOOK_VERIFY_SSL=false`,但不要在公网链路关闭证书校验。 |
| 269 | + |
| 270 | +## GitHub Actions |
| 271 | + |
| 272 | +默认 `daily_analysis.yml` 只读取表格中显式映射的 Secret / Variable。新增 repository Secret 或 Variable 后,只有变量名已经出现在 workflow `env:` 中才会进入运行进程;`STOCK_GROUP_N` / `EMAIL_GROUP_N` 这类任意编号变量不会自动导入。 |
| 273 | + |
| 274 | +Secret 适合 token、password、webhook URL 等敏感项;Variable 适合 `WECHAT_MSG_TYPE`、`EMAIL_SENDER_NAME`、路由、降噪窗口和时区这类非敏感行为配置。`MARKDOWN_TO_IMAGE_CHANNELS` 与 `MERGE_EMAIL_NOTIFICATION` 默认不映射,如需在自己的 fork 中使用,应显式修改 workflow 并补充对应测试。 |
| 275 | + |
| 276 | +## Desktop |
| 277 | + |
| 278 | +桌面端复用 Web 设置页的通知配置和单渠道测试入口。通知测试会发送真实测试消息,但只使用当前页面草稿值,不会自动保存;需要持久化时仍需点击保存配置。 |
| 279 | + |
| 280 | +桌面端可通过配置导出 / 导入恢复 `.env`。回滚某个通知渠道时,清空该渠道 minimal key 并保存即可;advanced key 留存不会单独启用渠道,但建议同步清理以减少后续排障噪音。 |
| 281 | + |
| 282 | +## 回滚方式 |
234 | 283 |
|
235 | | -- Local:优先使用 `.env`,可用 `python main.py --check-notify` 做本地诊断。 |
236 | | -- Docker:配置来源与本地一致,需确保容器环境变量已注入。 |
237 | | -- GitHub Actions:只会读取 workflow `env:` 中显式映射的 Secret/Variable。 |
238 | | -- Desktop:桌面端内嵌 Web 设置页可复用同一通知测试入口;测试仍只使用临时配置,不写入 `.env`。 |
| 284 | +- 本地 / Docker:恢复旧 `.env`,或删除对应渠道 minimal key 后重启进程。 |
| 285 | +- GitHub Actions:清空或删除对应 Secret / Variable;未映射的 key 不会进入 workflow 运行进程。 |
| 286 | +- Desktop:使用配置备份导入旧 `.env`,或在设置页清空对应渠道配置并保存。 |
| 287 | +- 版本回退:P6/P7 新增的 `NTFY_*`、`GOTIFY_*`、路由和降噪 key 在旧版本中会被忽略;若要避免误导,应同时从 `.env` 或 Actions 配置中移除。 |
0 commit comments