4.7 KiB
4.7 KiB
Nexus 6.0 — Project Memory
项目概述
Nexus 是一个 2000+ 服务器运维管理平台,从旧的 MultiSync (PHP + AdminLTE + pymysql) 完全重构为 Clean Architecture (FastAPI + Async SQLAlchemy + Redis + WebSocket + Telegram)。
仓库结构
- 唯一仓库: Nexus (Gitea
http://admin:uzumaki77@66.154.115.8:3000/admin/Nexus.git) - 不再使用 multi-server-sync 仓库(旧项目,仅保留历史)
- 部署路径:
/www/wwwroot/api.synaglobal.vip/(宝塔面板) - 域名:
api.synaglobal.vip(强制HTTPS)
目录结构 (仓库根目录)
Nexus/
├── server/ ← Python FastAPI后端 (Clean Architecture 4层)
├── web/ ← PHP前端 (install.php, config.php, login.php...)
├── deploy/ ← Supervisor配置 + Shell健康检查脚本
├── docs/ ← 部署文档
├── tests/ ← 测试
├── .env ← NOT IN GIT (install.php生成)
├── .gitignore ← 排除 .env, SECRETS.md, web/data/config.php
└── requirements.txt ← Python依赖
已确认的关键决策
| 决策 | 选择 | 原因 |
|---|---|---|
| API_KEY | ❌ 禁改,UI不显示 | 加密一致性 + 子服务器认证 |
| SECRET_KEY | ❌ 禁改 | 加密回退密钥 |
| DATABASE_URL | ❌ 禁改 | 启动必需 |
| system_name/title | ✅ 可改 | 前端显示 |
| pool_size/overflow | ✅ 可改 | install自动推荐 |
| redis_url | ✅ 可改 | Redis连接 |
| 告警阈值 (CPU/mem/disk) | ✅ 可改 | 监控参数 (默认80%) |
| Telegram配置 | ✅ 可改 | 告警推送 |
| Agent心跳间隔 | 60s | 不太频繁 |
| Redis→MySQL刷新 | 10min | 降低MySQL负载 |
| 心跳数据流 | Agent→Redis→前端直读→10min→MySQL | 前端实时, MySQL只存历史 |
| 告警推送 | WebSocket→前端 + Telegram | 即时感知 |
| Python守护 | 3层: Supervisor + Python自检(30s) + Shell(cron 1min) | 全覆盖 |
| install.php安装后 | rename→install.php.locked + .env锁定 | 防重装 |
| 配置源 | install→config.php(PHP)+settings表(MySQL)+.env(Python) | 三方一致 |
| Agent告警心跳 | CPU/内存>80% 或变化>10% 时主动上报 | 智能监控 |
| 仓库统一 | 所有代码统一在Nexus仓库 | 不再用两个仓库 |
实现状态 (Phase A+B+C)
✅ 已完成
| 模块 | 文件 | 说明 |
|---|---|---|
| E1 WebSocket推送 | server/api/websocket.py | alert/recovery/system broadcast |
| E2 心跳→Redis+告警 | server/api/agent.py | Redis write + threshold detection |
| E3 Redis→MySQL刷新 | server/background/heartbeat_flush.py | 10min batch |
| E4 load_settings_from_db | server/config.py | MySQL overrides mutable settings |
| E5 Python自检 | server/background/self_monitor.py | 30s loop |
| E6 Telegram推送 | server/infrastructure/telegram/__init__.py | alert/recovery/system |
| E7 Redis实时状态 | server/api/servers.py | frontend reads Redis directly |
| E8 /health端点 | server/api/health.py | Shell health_monitor.sh checks this |
| E9 lifespan+后台任务 | server/main.py | startup: init_db + load_settings + background tasks |
| D1 Supervisor | deploy/nexus.conf | autorestart nexus process |
| D2 Shell健康检查 | deploy/health_monitor.sh | cron 1min, 3 failures→restart+Telegram |
| P1 install.php | web/install.php | 5步向导 (欢迎→环境→DB+Redis+API→管理员+品牌→完成清单) |
| P2 config.php | web/config.php | data/config.php + MySQL settings override |
🔄 待测试 (Phase D)
- T1: 心跳Redis写入验证
- T2: WebSocket连接测试
- T3: 3层守护测试 (kill Python→Supervisor重启)
- T4: Telegram推送测试
- T5: install.php 5步流程测试
测试流程 (用户确认)
- WSL本地基础测试 → 2. 推到仓库 → 3. 外网服务器正式测试
配置三写机制
install.php Step 3 POST处理同时写入:
web/data/config.php— PHP前端配置 (API_BASE_URL, DB_*, API_KEY).env— Python后端启动必需 (NEXUS_前缀)settingsMySQL表 — 共享动态配置 (api_key, thresholds, Telegram等)
不可改项 (SECRET_KEY/API_KEY/ENCRYPTION_KEY/DATABASE_URL) 不在MySQL覆盖映射中。
3层守护机制
- Layer 1: Supervisor — Python崩溃自动重启
- Layer 2: Python self_monitor — 每30s检查Redis/MySQL/WebSocket
- Layer 3: Shell health_monitor.sh — 每分钟HTTP GET /health, 连续3次失败→supervisorctl restart + Telegram
数据流
Agent心跳(60s) → Redis(实时) → 前端直读 → 10min批量 → MySQL(历史)
告警: CPU/mem/disk > threshold → WebSocket推送浏览器 + Telegram推送手机
恢复: 之前告警的指标恢复正常 → 自动推送恢复通知
Redis心跳key: heartbeat:{server_id} (HSET, TTL=600s)
Redis告警key: alerts:{server_id} (SET, TTL=3600s)