# 2026-06-08 — 告警 Telegram 开关多 Worker 同步

## 摘要

修复 Settings 关闭「CPU/内存/磁盘等资源告警 Telegram 通知」后仍收到 Telegram 的问题。根因：多 uvicorn worker 下仅处理 PUT 的进程热更新了内存 `settings`，处理 Agent 心跳的其他 worker 仍认为开关为开启。

## 动机

用户关闭「CPU 超阈值告警」等 notify_* 开关后 Telegram 仍推送；设置页文案已说明「关闭后不发送 Telegram」，但生产 `--workers 4` 时行为不一致。

## 变更

1. **`server/config.py`** — 新增 `apply_db_override(db_key, value)`，统一单条设置热更新逻辑。
2. **`server/infrastructure/settings_broadcast.py`** — 新增 Redis 频道 `nexus:settings`；PUT 后 publish，各 worker 订阅并 `apply_db_override`。
3. **`server/main.py`** — lifespan 启动/停止 settings subscriber。
4. **`server/api/settings.py`** — `set_setting` 热更新后调用 `publish_setting_change`。
5. **`server/utils/notify_toggles.py`** — 集中 `notify_enabled` / `resource_alert_notify_enabled` 等 helper。
6. **`server/infrastructure/telegram/__init__.py`** — 全部 Telegram 发送入口复用 notify helper（行为不变，逻辑集中）。
7. **`tests/test_notify_toggle_sync.py`** — 开关解析、Telegram 跳过、广播 publish 测试。

## 涉及文件

- `server/config.py`
- `server/infrastructure/settings_broadcast.py`
- `server/main.py`
- `server/api/settings.py`
- `server/utils/notify_toggles.py`
- `server/infrastructure/telegram/__init__.py`
- `tests/test_notify_toggle_sync.py`

## 迁移 / 重启

- 无 DB 迁移。
- 需重启后端（或部署）以加载 settings subscriber。

## 验证

```bash
pytest tests/test_notify_toggle_sync.py tests/test_settings_telegram.py -q
```

- Settings 关闭 CPU 告警 → 任意 worker 处理心跳时 `send_telegram_alert` 返回 False，不调用 Telegram API。
- WebSocket 告警与 `alert_logs` 仍记录（与设置页说明一致）。
