Files
Nexus/docs/design/tech-stack-evaluation.md
T
2026-07-08 22:31:31 +08:00

10 KiB
Raw Blame History

设计部审查报告 — Nexus 技术栈全面评估

审查人: 设计部负责人 审查日期: 2026-05-22v2 更新) 审查范围: 全部设计规格、实施计划、竞品分析、roadmap/ADR、config.py、requirements.txt、.env.example 变更说明: v2 全面更新,修正 v1 中7处"未落地"致命错误,反映代码实际进度


一、当前技术栈完整清单

1.1 后端运行时

技术 版本 用途 选型合理性 风险评估
Python 3.12 后端运行时 合理。FastAPI 生态成熟,异步支持完善,社区活跃
FastAPI 0.115.6 Web 框架 合理。原生 async/await、自动 OpenAPI 文档、Pydantic 集成、WebSocket 原生支持
Uvicorn 0.34.0 ASGI 服务器 合理。FastAPI 标配,uvloop 性能优异

1.2 数据层

技术 版本 用途 选型合理性 风险评估
SQLAlchemy 2.0.36 (asyncio) ORM 合理。2.0 异步支持成熟,比 Tortoise-ORM 灵活,比 Django ORM 更适合 FastAPI
aiomysql 0.2.0 MySQL 异步驱动 可接受。社区较小,更新频率低。长期可评估迁移到 asyncmy 低-中
Pydantic 2.10.3 数据验证/序列化 合理。FastAPI 核心依赖,v2 性能大幅提升
pydantic-settings 2.7.0 配置管理 合理。环境变量 + .env 加载,NEXUS_ 前缀
Redis (hiredis) 5.2.1 缓存/心跳/队列/Pub-Sub 合理。5.x async 支持成熟,hiredis C 加速解析器。ADR-007/008/009 已落地

1.3 SSH 与远程执行

技术 版本 用途 选型合理性 风险评估
asyncssh 2.17.0 SSH 连接 (异步) 已落地。ADR-002/004 已实现:引用计数连接池 (asyncssh_pool.py)、WebSSH (webssh.py)、SyncService 已迁移
paramiko 3.5.0 SSH 连接 (同步) 已移除。pool.py 已删除,requirements.txt 已移除。asyncssh 为唯一 SSH 库

v1 勘误: v1 标注"asyncssh — 前瞻性选型,当前未实际使用"是错误的。asyncssh 已全面替代 paramiko 成为唯一活跃 SSH 库。

1.4 HTTP 与通信

技术 版本 用途 选型合理性 风险评估
httpx 0.28.1 HTTP 客户端 合理。async/await 支持,Agent 通信 + Telegram 共享客户端
websockets 14.1 WebSocket 合理。告警推送 (ADR-010 两层架构) + WebSSH 终端
python-multipart 0.0.19 表单解析 合理。文件上传必需

1.5 安全加密

技术 版本 用途 选型合理性 风险评估
PyJWT 2.10.1 JWT 令牌 已落地。JWT 认证完整实现:登录/刷新/验证/WebSocket 认证 (ADR-005/011)
bcrypt 4.2.1 密码哈希 合理。密码存储标准
cryptography 44.0.0 Fernet + AES 加密 合理。Fernet (Python) + AES-CBC (PHP 兼容),凭据加密存储

1.6 后台任务

技术 用途 选型合理性 风险评估
asyncio.create_task 后台协程 合理。4 个后台任务:heartbeat_flush(10min)、self_monitor(30s)、schedule_runner(60s)、retry_runner(5min)
asyncio.Semaphore 并发控制 合理。批量推送、同步引擎并发限制 (MAX_CONCURRENT=10)

v1 勘误: v1 评估了 apscheduler==3.11.0 — 已移除。自定义 schedule_runner_loop + retry_runner_loop 替代,更轻量且原生异步。

1.7 前端技术

技术 版本 用途 选型合理性 风险评估
Tailwind CSS v4 (CDN) CSS 框架 合理。零运行时、纯静态、@theme 设计系统
Alpine.js 3.14.8 (CDN) 前端交互 合理。轻量级,与静态 HTML 完美配合
Monaco Editor 0.45.0 (CDN) 代码编辑器 规划中。文件管理器编辑功能 低(未落地)
xterm.js 终端模拟器 规划中。Web SSH 终端前端(后端已实现) 低(前端未落地)

v1 勘误: v1 评估了 PHP + AdminLTE — 已全面弃用 (ADR-006)。所有页面已迁移到 Tailwind CSS v4 + Alpine.js。

1.8 部署与运维

技术 用途 选型合理性 风险评估
Nginx 反向代理 合理。模板化配置 ({{PLACEHOLDER}}),支持 HTTP/HTTPS
Supervisor 进程管理 合理。3 层守护 Layer 1
MySQL 持久化存储 合理。宝塔标配,14 张表
Redis 缓存/实时数据 合理。心跳热数据、告警冷却、Pub/Sub

二、v1 标注"未落地"但实际已落地的功能

以下功能在 v1 报告中标注为"未落地",但代码审查确认已完整实现

功能 v1 判定 实际状态 实现位置
asyncssh 连接池 "未落地" 已落地 server/infrastructure/ssh/asyncssh_pool.py — 引用计数模式,acquire/release/cleanup
JWT + TOTP 登录 "未落地" 已落地 server/api/auth_jwt.py + web/app/login.html + web/app/api.js
SFTP 文件传输 "未落地" 已落地 server/application/services/sync_engine_v2.pysftp_transfer()
命令日志 "未落地" 已落地 server/domain/models.py CommandLog + server/infrastructure/database/ssh_session_repo.py
SSH 会话管理 "未落地" 已落地 server/api/webssh.py + SshSession/CommandLog 模型
定时推送调度 "未深度集成" 已落地 server/background/schedule_runner.py + server/background/retry_runner.py
WebSocket 告警推送 "未落地" 已落地 server/api/websocket.py — 两层架构 (ADR-010) + Dashboard 实时更新

三、已移除的依赖(v1 仍在评估)

依赖 v1 评估 实际操作 原因
APScheduler "存疑" 已移除 自定义 asyncio loop 更轻量、原生异步
Jinja2 "合理" 已移除 纯 API 后端,无模板渲染需求
aiofiles "合理" 已移除 asyncssh SFTP 替代异步文件操作
Rich "低优先级" 已移除 后端非 CLI 工具,无使用场景
Alembic "必要组件" 已移除 使用 init_db() 自动建表,无迁移需求
PyYAML "遗留依赖" ⚠️ 保留 Agent 配置已迁移到 JSON,但可能有其他 YAML 场景

四、配置与部署

4.1 环境变量(已统一)

项目 状态
前缀统一 NEXUS_ 前缀(config.py env_prefix="NEXUS_"
.env.example 已从 MULTISYNC_ 更新为 NEXUS_
部署路径 NEXUS_DEPLOY_PATH 可配置
CORS NEXUS_CORS_ORIGINS 可配置

4.2 连接池配置

组件 配置 说明
MySQL pool_size=160, max_overflow=120 最大 280 连接 (基于 MySQL max_connections=400, install.php 自动计算)
Redis BlockingConnectionPool (ADR-008) 达上限等待而非抛异常
asyncssh MAX_CONNECTIONS=100, IDLE_TIMEOUT=300s 引用计数模式 (ADR-004)

4.3 Redis Key 设计规范

Key 格式 类型 TTL 用途
heartbeat:{server_id} HSET 600s Agent 心跳数据 (is_online, system_info, agent_version)
alerts:{server_id} SET 3600s 告警状态标记
nexus:alerts Pub/Sub channel WebSocket 告警广播 (ADR-010)
sync:progress:{op}:{ts} STRING 推送进度追踪

五、架构决策落地状态

编号 决策 选择 落地状态
ADR-001 资产模型 Platform 模板 + 单表 Asset + JSONB 已落地 — Platform/Node/Server 扩展字段
ADR-002 Web SSH 架构 BFF 模式,asyncssh 内嵌 已落地 — webssh.py + asyncssh_pool.py
ADR-003 前端终端 xterm.js + Koko 协议 ⚠️ 后端已落地,前端未实现
ADR-004 SSH 连接池 引用计数模式 已落地 — asyncssh_pool.py
ADR-005 登录认证 JWT + TOTP 全新替换 已落地 — auth_jwt.py + login.html
ADR-006 前端框架 全面弃用 AdminLTE 已落地 — 12+ Tailwind 页面
ADR-007 Redis 定位 核心数据层 已落地
ADR-008 Redis 连接池 BlockingConnectionPool 已落地
ADR-009 Redis 可用性 启动强校验 已落地
ADR-010 WebSocket 架构 内存 + Redis Pub/Sub 两层 已落地
ADR-011 WebSocket 认证 JWT 查询参数 已落地

六、竞品对比结论(更新)

维度 Nexus (当前) JumpServer 评价
SSH 代理 asyncssh 内嵌 (异步原生) 独立 Koko (Go 二进制) Nexus 部署更简单,2000 台规模足够
连接池 引用计数 asyncssh Koko 引用计数 设计思路一致,Nexus 用 Python 实现
认证 JWT + TOTP TOTP/LDAP/OIDC/SAML2 Nexus 简化方案适合内部运维
前端 Tailwind + Alpine.js (纯静态) Vue 3 + Element Plus Nexus 零构建步骤,部署更简单

七、待落地功能

功能 优先级 预估工时 说明
xterm.js 前端页面 2-3 天 WebSSH 后端已就绪,需前端页面
推送前预览 (rsync dry-run) 0.5 天 推送对话框加"预览"按钮
首次使用引导 1 天 install.php 后3步向导
命令日志查询页面 0.5 天 后端 API 已就绪
paramiko 完全移除 0.5 天 已完成 pool.py 已删除 + requirements.txt 已移除

八、风险评估矩阵(更新)

风险 严重度 发生概率 当前状态
aiomysql 连接池稳定性 pool=160/120 合理 (基于 MySQL max_connections=400, install.php 自动计算)
PHP 残留页面 install.php/login.php 保留,其余已迁移
文档与代码不同步 本报告已修正,需持续维护