# Nexus Sprint 规划 — 2026-05-22 更新

> 本文档已更新反映实际代码状态，移除已完成项

---

## 已完成的架构升级（本轮）

| 升级 | 之前 | 之后 | 影响 |
|------|------|------|------|
| SSH 库 | paramiko (同步，阻塞事件循环) | asyncssh (异步，引用计数连接池) | 消除 47s health 响应延迟 |
| 认证 | PHP Session + API Key | JWT + TOTP | 统一认证体系 |
| 前端 | PHP AdminLTE | Tailwind CSS v4 + Alpine.js | 纯静态，零构建 |
| 定时调度 | APScheduler | 自定义 schedule_runner + retry_runner | 原生异步，更轻量 |
| WebSocket | 无 | 两层架构 (内存 + Redis Pub/Sub) | 实时告警推送 |
| 数据库 Session | 泄漏 (4 个 service factory 不关) | DbSessionMiddleware 自动管理 | 消除连接池耗尽 |

---

## 当前连接池配置

```
MySQL:   pool_size=160, max_overflow=120  → 最大 280 连接
         (基于 MySQL max_connections=400, install.php 自动计算:
          poolSize = max(20, maxConn * 0.4), overflow = max(20, maxConn * 0.3))

Redis:   BlockingConnectionPool (ADR-008)
         启动强校验，不可用直接退出 (ADR-009)

asyncssh: MAX_CONNECTIONS=100
          IDLE_TIMEOUT=300s (5min 空闲关闭)
          CLEANUP_INTERVAL=60s

推送并发: Semaphore(10) per batch
         batch_size=50, batch_interval=30s
```

---

## 后台任务

| 任务 | 间隔 | 文件 | 说明 |
|------|------|------|------|
| heartbeat_flush | 10min | `background/heartbeat_flush.py` | Redis → MySQL 批量刷新 |
| self_monitor | 30s | `background/self_monitor.py` | Redis/MySQL 检查 + 恢复通知 |
| schedule_runner | 60s | `background/schedule_runner.py` | Cron 定时推送 |
| retry_runner | 5min | `background/retry_runner.py` | 指数退避重试 |
| asyncssh_cleanup | 60s | `ssh/asyncssh_pool.py` | 空闲连接清理 |

---

## 待完成项

### P1 — 本周

| # | 项 | 工时 | 风险 |
|---|-----|------|------|
| 1 | WebSSH xterm.js 前端页面 | 2-3天 | 中 |
| 2 | 推送前预览 (rsync dry-run --stats) | 0.5天 | 低 |

### P2 — 迭代

| # | 项 | 工时 |
|---|-----|------|
| 3 | install.php → install.html 迁移 | 1天 |
| 4 | config.php → 纯 API（移除 PHP-FPM 依赖） | 2天 |
| 5 | paramiko pool.py + requirements.txt 清理 | 0.5天 |
| 6 | 命令日志查询页面 | 0.5天 |
| ~~7~~ | ~~文件编辑器集成 (Monaco)~~ | **已否决** |

---

## 已否决（永久）

| 项 | 原因 |
|----|------|
| RBAC 权限体系 | 保持"鉴权即信任" |
| 移动端适配 | 运维不会用手机管理 2000 台服务器 |
| MQTT 协议 | HTTP + Redis 已足够 |
| 会话录像 asciicast | 不需要 |
| APScheduler | 自定义 asyncio loop 更轻量 |
| **文件编辑器（Monaco/ACE）** | **运维场景无需嵌入编辑器；远程文件通过 WebSSH / SFTP 处理（2026-05-23 明确否决）** |
