# Nexus 分支合并清单:`main` ↔ `release/20260708-axs` > **编写日期**:2026-07-09 > **用途**:合并评审 / Gitea PR 描述 / 冲突解决对照表 > **Gitea**:https://axs.kuma1xn.vip/admin/Nexus --- ## 1. 两分支现状 | 分支 | 提交 | 说明 | |------|------|------| | **`main`** | `5520434d` | 主项目全量历史(598 提交);含运维侧 6~7 月功能 + **一键登录 bootstrap→SSH 回退** | | **`release/20260708-axs`** | `74149e0d` | 发布快照(孤儿 squash);含 **宝塔 Session 1~2h 掉线修复** + **`/app-v2`** + 发布制品链 | 两分支 **无共同祖先**,不能普通 fast-forward,需 `--allow-unrelated-histories` 或按模块 cherry-pick。 **推荐合并方向**:`release/20260708-axs` → `main`(保留 main 历史,吸收 release 独有能力)。 ```bash cd /path/to/Nexus git fetch https://axs.kuma1xn.vip/admin/Nexus.git main release/20260708-axs git checkout main git merge FETCH_HEAD:release/20260708-axs -m "merge: release/20260708-axs 宝塔 Session + app-v2" --allow-unrelated-histories ``` --- ## 2. `main` 已有、合并时需保留的功能 ### 2.1 宝塔一键登录:bootstrap 失败恢复 SSH 回退(2026-07-08 · 运维侧) **问题**:2026-06-21「自动 bootstrap」后,新机 API 未就绪时 bootstrap 失败直接 `raise`,不再走 SSH `tools.py`,一键登录整链中断。 **行为**: - 未配置 API 时仍先 `source=immediate` bootstrap(best-effort) - 非凭据类错误(`ssh_command_failed`、`bt_not_installed` 等)→ **继续 SSH 临时登录** - 仅 `ssh_auth_failed` / `ssh_no_credentials` / `ssh_sudo_required` / `missing_center_ip` 硬中断 **关键代码**: | 文件 | 要点 | |------|------| | `server/application/services/btpanel_service.py` | `BOOTSTRAP_LOGIN_HARD_FAIL_ERRORS`、`_create_login_url_fresh` | | `server/infrastructure/btpanel/ssh_bootstrap.py` | 检测 `class/common.py`(非空 panel 目录);写 `api.json` 前 `makedirs` config | | `tests/test_btpanel_login_url.py` | `test_create_login_url_falls_back_to_ssh_when_bootstrap_fails` | **Changelog**:`docs/changelog/2026-07-08-btpanel-bootstrap-bt-installed-check.md` --- ### 2.2 宝塔一键登录:基础能力(main 历史,release 亦有部分重叠) | 功能 | 文件 | |------|------| | 未配置时自动 bootstrap + 倒计时 | `useBtPanelLogin.ts`、`btpanel_service.py`(2026-06-21) | | 临时 token 24h | `BT_TEMP_LOGIN_TTL_SECONDS`、`btpanel_service._login_url_via_api` | | 登录 URL 短窗口 Redis 缓存 + 去重 | `login_url_lock.py`、`create_login_url` 双检锁 | | 主列表/终端一键登录按钮 | `ServersPage.vue`、`TerminalPage.vue`、`ServerTableRowActions.vue` | | 批量获取 API | `useBtPanelBatchBootstrap.ts` | | API 端口漂移 SSH 修复 | `_try_login_url_via_api`、`_repair_ip_whitelist` | --- ### 2.3 Agent 监测与告警 | 功能 | 文件 | Changelog | |------|------|-----------| | 告警连续超阈门控(默认 3 次才 Telegram) | `server/utils/alert_streak.py`、`alert_metrics.py`、`watch_alerts.py` | `2026-07-04-alert-streak-gate.md` | | Agent CPU 双模式采样 | `web/agent/cpu_metrics.py`、`server/api/agent.py` | `2026-07-02-agent-cpu-sampling.md` | | 监测槽双模式 / Pin | `watch_service.py`、`useWatchPins.ts` | `2026-07-01-agent-watch-dual-mode.md` | | 离线巡检发报前 SSH 复检心跳 | `offline_daily_report_schedule.py` | `d50120d1` | | 统计卡:未设路径 / 离线 | `useServerStatsCards.ts` | `2026-07-02-stats-unset-path-offline-card.md` | --- ### 2.4 服务器列表与批量 | 功能 | 文件 | |------|------| | 分类筛选栏 / 备注弹窗 / 站点链接 | `ServerCategoryFilterBar.vue`、`ServerRemarkDialog.vue`、`serverSiteUrl.ts` | | 未设路径表与主表对齐 | `ServerUnsetPathPanel.vue` | | 检测路径:搜 `crmeb` 目录 | `server_batch_common.py` | `2026-07-05-detect-path-crmeb.md` | | IP/域名定时检测 | `ip_domain_detect_schedule.py`、`ip_domain_detect_loop.py` | `2026-06-24-ip-domain-detect-schedule.md` | | nginx 域名探测 | `nginx_domain_detect.py`、`site_host.py` | | 跨服务器文件传输增强 | `server_file_transfer_service.py`、`useServerFileTransfer.ts` | | 上传目录权限探测 | `files_upload_permissions.py` | --- ### 2.5 后台清理与配置 | 功能 | 文件 | |------|------| | 告警日志 / 审计日志定期清理 | `alert_log_purge.py`、`audit_log_purge.py`、`alert_log_repo.py` | | 订阅 IP 刷新主 IP 修复 | `ip_allowlist_refresh.py` | `2026-06-23-subscription-ip-refresh-primary-fix.md` | --- ### 2.6 部署与发布源 | 功能 | 文件 | |------|------| | 默认 Gitea:`axs.kuma1xn.vip`(HTTPS) | `deploy/nexus-1panel.sh`、`nexus-1panel.secrets.sh.example` | | 全量分批推送(避 Cloudflare 524) | `scripts/git-push-axs-full.sh` | | 本机 rsync 生产部署 | `deploy/rsync-local-to-server.sh`、`deploy-production.sh` | --- ## 3. `release/20260708-axs` 独有、合并时必须带入 `main` 的功能 > 详见 release 内 `docs/release/20260708/PR-MERGE-说明-20260709.md` ### 3.1 宝塔 Session 1~2 小时掉线修复(核心) **现象**:多窗口一键登录宝塔,约 1~2h 刷新后陆续掉线。 **根因**:部分宝塔 `task.py` 硬编码 `3600` 秒清理 `tmp_login` session,与 Nexus 24h tmp_token 不一致。 **行为**: - SSH bootstrap / 一键登录前检测并 patch `task.py` → 读 `public.get_session_timeout()`,默认 `86400` - 远端 `flock` + `mktemp` + atomic replace - `extra_attrs.bt_panel` 记录 `session_cleanup_ttl_ok`、`session_cleanup_task_state` 等 - 登录 API 响应带 `diagnostics`(TTL 修补状态) - `bootstrap_lock` 带 `wait_timeout_seconds`,避免并发 bootstrap 互踢 **关键文件**: ```text server/application/services/btpanel_service.py # _ensure_session_cleanup_ttl_for_login 等 server/infrastructure/btpanel/ssh_bootstrap.py # ensure_session_cleanup_ttl() 远端脚本 server/infrastructure/btpanel/bootstrap_lock.py server/api/btpanel.py # diagnostics 字段 tests/test_btpanel_temp_login_ttl.py tests/test_btpanel_bootstrap_lock.py tests/test_btpanel_get_config.py ``` --- ### 3.2 `/app-v2` 第二后台 | 项 | 说明 | |----|------| | 路径 | `/app-v2/`(旧 `/app/` 保留) | | 技术栈 | React + TS + Vite + shadcn/ui + TanStack Query/Table + Zustand | | 目录 | `frontend-v2/`、`web/app-v2/` | | 构建 | `Dockerfile.prod` 多阶段、`frontend-v2/scripts/scan-app-v2-sensitive.mjs` | | 路由 | `server/main.py` 挂载静态 | --- ### 3.3 发布制品化工具链 ```text scripts/prepare_release_artifact.py scripts/generate_release_bundle.py scripts/scan_release_bundle.py scripts/write_release_metadata.py scripts/publish_release_bundle.py scripts/run_local_release_gate.py deploy/preflight-release-host.sh deploy/apply-release-bundle.sh ``` 发布包 SHA256(release 记录):`46299832fb78e8cc196f85cf1928f34eea4deee82dbc83b67883394f0359036b` --- ### 3.4 文档与 Skill(release 独有目录) ```text docs/release/20260708/ # 宝塔 Session、app-v2、安全巡检、发布记录 .skills/nexus-btpanel-review/ .skills/nexus-security-review/ .skills/nexus-ssh-safety/ ``` --- ## 4. 合并冲突热点(必须手工合) ### 4.1 `server/application/services/btpanel_service.py` **两边都要保留**: | 来源 | 保留内容 | |------|----------| | **main** | `BOOTSTRAP_LOGIN_HARD_FAIL_ERRORS`;bootstrap 失败 → SSH 回退(非凭据类不 raise) | | **release** | `_ensure_session_cleanup_ttl_for_login`;`_session_cleanup_ttl_*`;`diagnostics`;`BootstrapLockTimeout` | 合并后 `_create_login_url_fresh` 推荐顺序: 1. 未配置 → immediate bootstrap(失败按 main 规则决定是否继续) 2. 已配置 → `_ensure_session_cleanup_ttl_for_login` 3. API 临时登录 → SSH 回退 ### 4.2 `server/infrastructure/btpanel/ssh_bootstrap.py` | 来源 | 保留 | |------|------| | **main** | `common.py` 真安装检测;`makedirs` config | | **release** | `ensure_session_cleanup_ttl()`;`atomic_write_json`;`flock`;`session_cleanup_*` 字段 | ### 4.3 `server/main.py` / `Dockerfile.prod` - 从 **release** 带入 `/app-v2` 静态挂载与构建阶段 - 保留 **main** 现有中间件与安装向导逻辑 ### 4.4 `tests/test_btpanel_login_url.py` - 合并 release 的 session TTL / lock 测试 - 保留 main 的 `test_create_login_url_falls_back_to_ssh_when_bootstrap_fails` --- ## 5. 合并后验证清单 ```bash # 单元测试(合并冲突解决后) .venv/bin/pytest tests/test_btpanel_login_url.py tests/test_btpanel_ssh_bootstrap.py \ tests/test_btpanel_temp_login_ttl.py tests/test_btpanel_bootstrap_lock.py -q # 发布门禁(若合并了 release 脚本) bash scripts/run_local_release_gate.sh ``` **人工验收**: - [ ] `/app/` 旧后台 200 - [ ] `/app-v2/` 新后台 200(若合并 app-v2) - [ ] 新机一键登录:bootstrap 失败仍能 SSH 打开(main 修复) - [ ] 已装宝塔一键登录后 **2h 刷新仍在线**(release Session 修复) - [ ] 同一子机连点一键登录不互踢 token(login_url_lock) - [ ] `GET /api/btpanel/servers/{id}/login-url` 含 `diagnostics`(release) --- ## 6. 合并后部署 ```bash # 生产(中心机) cd /opt/nexus git remote set-url origin https://axs.kuma1xn.vip/admin/Nexus.git git fetch origin main && git checkout main && git reset --hard origin/main sudo env NEXUS_ROOT=/opt/nexus bash deploy/nexus-1panel.sh upgrade --skip-git # 或 release 包路径 bash deploy/preflight-release-host.sh bash deploy/apply-release-bundle.sh ``` --- ## 7. Gitea PR 摘要(可直接粘贴) ```markdown ## 合并摘要 将 `release/20260708-axs` 合并入 `main`,统一 SSOT。 ### release 带入 - 宝塔 task.py hardcoded 3600 → session_timeout 自动修复(解决 1~2h 掉线) - `/app-v2` 第二后台 - 发布制品化 / preflight / apply-release-bundle - bootstrap_lock、login diagnostics ### main 保留 - 一键登录 bootstrap 失败 → SSH 临时登录回退(新机 API 未就绪) - ssh_bootstrap 真安装检测(common.py)+ config makedirs - 6~7 月运维功能:告警连续门控、crmeb 路径检测、文件传输、日志清理等 - axs Gitea 默认发布源 + 分批推送脚本 ### 冲突重点 `btpanel_service.py`、`ssh_bootstrap.py` — 两套宝塔逻辑必须同时保留,见本文 §4。 ### 验证 pytest 宝塔专项 + `/app` + `/app-v2` + 2h 刷新不掉线 ``` --- ## 8. 相关文档索引 | 文档 | 路径 | |------|------| | release 原 PR 说明 | `docs/release/20260708/PR-MERGE-说明-20260709.md`(在 release 分支) | | 宝塔掉线方案 | `docs/release/20260708/Nexus-宝塔一键登录长期掉线修复方案与代码改进.md` | | app-v2 说明 | `docs/release/20260708/Nexus-app-v2-双后台实施说明-20260707.md` | | main bootstrap 回退 | `docs/changelog/2026-07-08-btpanel-bootstrap-bt-installed-check.md` | | Gitea 发布说明 | `docs/release/20260708/README-Gitea发布说明-20260708.md` |