Files
Nexus/docs/project/status.md
T
Your Name cdd0be328a fix: 六轮深度扫描 — 47项Bug修复、安全加固、死代码清理
Critical runtime bugs:
- terminal.html WebSSH完全不可用(URL前缀/JSON解析/Content-Type三处错误)
- servers.py路由遮蔽:/logs被/{id}拦截,3个前端页面同步日志查询失败
- scripts.html startExecPoll()→startExecPolling(),长任务快速执行崩溃
- agent.py {value!r!s:.50}格式串非法,agent发非数值时ValueError
- alerts.html d.daily.reduce()无null检查,API返回空数据时TypeError

Resource leak / stability:
- websocket.py僵尸连接未关闭TCP,文件描述符泄漏
- websocket.py _last_alert_time字典无限增长(加1小时过期清理)
- asyncssh_pool.py全忙时超过MAX_CONNECTIONS无限增长
- self_monitor.py Telegram告警无冷却,宕机时每30秒刷屏
- schedule_runner.py一次性调度执行超60秒会重复触发
- 限速脚本EXPIRE每次重置窗口可绕过(改用Lua原子脚本)

Security:
- JWT access token加token_version声明,改密码后旧token立失效(零宽限)
- INSTALL_MODE导入时常量→动态函数,安装后JWT认证不再残留禁用
- install.py /lock端点加管理员存在性验证,防止阻断安装
- ServerUpdate schema移除connectivity只读字段,防止伪造连接状态

Frontend fixes:
- doExec()缺r.ok检查、commands.html null检查
- _server_to_dict()补last_checked_at+ssh_key_public
- _field_match()逗号cron表达式修复
- alerts类型显示、SSH会话名称、搜索高亮定位
- 一次性/循环定时任务(run_mode+fire_at+自动禁用)

Dead code removed (400+ lines):
- SyncService batch_push/_push_single等5个方法(零调用者)
- 5个未使用schema(SyncCommands/SyncConfig/SyncSftp/FileDeploy/PaginatedResponse)
- 6个零调用service方法、3个无前端API端点
- 4个未使用import

Schema migrations:
- push_schedules: run_mode + fire_at列,cron_expr改NULL
- servers: 7个新列 + ssh_key_private/public VARCHAR(500)→TEXT

Co-Authored-By: Claude Haiku 4.5 <noreply@anthropic.com>
2026-05-24 16:26:40 +08:00

5.4 KiB
Raw Blame History

Nexus 项目进度总览

最后更新: 2026-05-23
AI 接续: AI-HANDOFF-2026-05-23.md · 标准转接: standards-transfer-package.md · 验收: development-acceptance-standard.md


技术栈

维度 技术
后端 Python 3.12 / FastAPI 0.115.6 / SQLAlchemy 2.0 Async
数据库 MySQL 8.4 (14 表) + Redis 7 (心跳/告警/Pub/Sub)
SSH asyncssh 2.17.0 (引用计数连接池, ADR-004)
认证 JWT + TOTP (PyJWT 2.10.1, ADR-005)
前端 Tailwind CSS v4 + Alpine.js 3.14.8vendor 自托管 /app/vendor/
部署 Nginx (模板化) + Supervisor (3层守护)
通信 WebSocket (两层架构, ADR-010) + Telegram

数据库结构(14 张表)

核心表:
  platforms            资产类型模板: name, category, type, default_protocols(JSON)
  nodes                树形分组: name, parent_id, sort_order
  servers (扩展)       id, name, domain, port, username, auth_method,
                       password(加密), ssh_key_*(3), agent_port, agent_api_key,
                       category, is_online, system_info, last_heartbeat,
                       platform_id, node_id, protocols(JSON), extra_attrs(JSON),
                       connectivity, last_checked_at
  admins               username, password_hash, totp_secret, totp_enabled,
                       jwt_refresh_token, jwt_token_expires
  settings             key → value

业务表:
  sync_logs            server_id, source/target_path, status, sync_mode
  push_schedules       name, source_path, server_ids(JSON), cron_expr
  push_retry_jobs      server_id, retry_count, max_retries, next_retry_at
  password_presets      name, encrypted_pw
  db_credentials       db_type, host, port, username, encrypted_password
  scripts              name, category, content
  script_executions    script_id, command, server_ids(JSON), results(JSON)

辅助表:
  audit_logs           admin_username, action, target_type, detail
  login_attempts       username, ip_address, success

Web SSH 表:
  ssh_sessions         UUID id, server_id, admin_id, status, started_at, closed_at
  command_logs         session_id, server_id, admin_id, command

实施进度

第零步:基础设施 — 已完成

  • Redis BlockingConnectionPool + 启动强校验 (ADR-008/009)
  • WebSocket 两层架构 (ADR-010) + JWT 认证 (ADR-011)
  • Dashboard WebSocket 实时告警

第一步:数据层 — 已完成

  • Platform + Node 模型
  • Server 扩展字段 (platform_id, node_id, protocols, extra_attrs, connectivity)
  • CommandLog + SshSession 模型
  • Admin JWT 字段
  • 数据迁移: category → Node

第二步:认证层 — 已完成

  • JWT 登录/刷新/验证
  • TOTP 双因素
  • Tailwind 登录页 + api.js 共享模块

第三步:Web SSH — 已完成

  • asyncssh 引用计数连接池
  • WebSocket 端点 + Koko 协议
  • 会话追踪 + 命令日志
  • xterm.js 前端页面 (terminal.html)

第四步:Sync 引擎 — 已完成

  • 文件/命令/配置/SFTP 四种同步模式
  • Semaphore 并发控制

第五步:前端迁移 — 已完成

  • 12 个 Tailwind+Alpine.js 页面 (含 install.html)
  • api.js JWT 共享模块
  • WebSocket 实时更新
  • install.php → install.html + FastAPI API 迁移
  • 条件启动模式 (install mode vs normal mode)
  • 脚本执行历史页 script-executions.html(侧栏「执行历史」)

脚本批量执行平台 — 已实现, 待 E2E

  • 内置分批(50/批,并发 10)+ 页顶批量状态条
  • 长任务 nohup + 子机 curl 回调(NEXUS_API_BASE_URL
  • Redis 热数据 2h + MySQL 60s 分批刷盘
  • 短任务 stopAgent exec/wait/kill,需子机升级)
  • 执行历史 / 停止 / 重试 / 标记卡住 / 自动卡住检测
  • T-SE1T-SE8 联调(见 docs/project/script-execution.md §11

文档: docs/project/script-execution.md · Changelog: docs/changelog/2026-05-22-script-execution-platform.md

Phase 2 安全走读 — 代码已闭环, 外网 E2E

  • 63 条 FINDING 逐行走读(2a2j
  • P0/P1/P2 代码修复(WebSSH、JWT 中间件、注入、告警策略、vendor 自托管等)
  • 单元回归 tests/test_security_unit.py17 项)
  • 首次部署 E2E(见 production-verification-checklist.md

SSOT: docs/project/phase-2-audit-remediation.md · 矩阵: docs/reports/audit-phase-2-findings-matrix.md

未部署:无 API Key 轮换;F2f-04 代码侧已闭环。


架构决策

编号 决策 选择 状态
ADR-001 资产模型 Platform + Node + Server 扩展
ADR-002 Web SSH BFF + asyncssh 内嵌 (后端)
ADR-003 前端终端 xterm.js + Koko 协议
ADR-004 SSH 连接池 引用计数模式
ADR-005 认证 JWT + TOTP
ADR-006 前端框架 弃用 AdminLTE → Tailwind
ADR-007 Redis 定位 核心数据层
ADR-008 Redis 池 BlockingConnectionPool
ADR-009 Redis 可用性 启动强校验
ADR-010 WebSocket 内存 + Pub/Sub 两层
ADR-011 WS 认证 JWT 查询参数 + webssh-token

总完成度: ~98%(Phase 2 代码闭环;首次部署时再跑 E2E)