Files
Nexus/docs/release/20260708/PR-MERGE-main与release合并清单-20260709.md
T
r 9b583ccc91
Nexus CI/CD / test (push) Waiting to run
Nexus CI/CD / e2e (push) Blocked by required conditions
Nexus CI/CD / deploy (push) Blocked by required conditions
Nexus Pre-commit Checks / quick-check (push) Waiting to run
docs(release): 主与 release 分支合并功能清单 + 导入 release 文档目录
便于 Gitea 上 main ↔ release/20260708-axs 合并评审与冲突对照。
2026-07-09 01:14:32 +08:00

11 KiB
Raw Blame History

Nexus 分支合并清单:mainrelease/20260708-axs

编写日期2026-07-09
用途:合并评审 / Gitea PR 描述 / 冲突解决对照表
Giteahttps://axs.kuma1xn.vip/admin/Nexus


1. 两分支现状

分支 提交 说明
main 5520434d 主项目全量历史(598 提交);含运维侧 6~7 月功能 + 一键登录 bootstrap→SSH 回退
release/20260708-axs 74149e0d 发布快照(孤儿 squash);含 宝塔 Session 12h 掉线修复 + /app-v2 + 发布制品链

两分支 无共同祖先,不能普通 fast-forward,需 --allow-unrelated-histories 或按模块 cherry-pick。

推荐合并方向release/20260708-axsmain(保留 main 历史,吸收 release 独有能力)。

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 bootstrapbest-effort
  • 非凭据类错误(ssh_command_failedbt_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.jsonmakedirs config
tests/test_btpanel_login_url.py test_create_login_url_falls_back_to_ssh_when_bootstrap_fails

Changelogdocs/changelog/2026-07-08-btpanel-bootstrap-bt-installed-check.md


2.2 宝塔一键登录:基础能力(main 历史,release 亦有部分重叠)

功能 文件
未配置时自动 bootstrap + 倒计时 useBtPanelLogin.tsbtpanel_service.py2026-06-21
临时 token 24h BT_TEMP_LOGIN_TTL_SECONDSbtpanel_service._login_url_via_api
登录 URL 短窗口 Redis 缓存 + 去重 login_url_lock.pycreate_login_url 双检锁
主列表/终端一键登录按钮 ServersPage.vueTerminalPage.vueServerTableRowActions.vue
批量获取 API useBtPanelBatchBootstrap.ts
API 端口漂移 SSH 修复 _try_login_url_via_api_repair_ip_whitelist

2.3 Agent 监测与告警

功能 文件 Changelog
告警连续超阈门控(默认 3 次才 Telegram) server/utils/alert_streak.pyalert_metrics.pywatch_alerts.py 2026-07-04-alert-streak-gate.md
Agent CPU 双模式采样 web/agent/cpu_metrics.pyserver/api/agent.py 2026-07-02-agent-cpu-sampling.md
监测槽双模式 / Pin watch_service.pyuseWatchPins.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.vueServerRemarkDialog.vueserverSiteUrl.ts
未设路径表与主表对齐 ServerUnsetPathPanel.vue
检测路径:搜 crmeb 目录 server_batch_common.py
IP/域名定时检测 ip_domain_detect_schedule.pyip_domain_detect_loop.py
nginx 域名探测 nginx_domain_detect.pysite_host.py
跨服务器文件传输增强 server_file_transfer_service.pyuseServerFileTransfer.ts
上传目录权限探测 files_upload_permissions.py

2.5 后台清理与配置

功能 文件
告警日志 / 审计日志定期清理 alert_log_purge.pyaudit_log_purge.pyalert_log_repo.py
订阅 IP 刷新主 IP 修复 ip_allowlist_refresh.py

2.6 部署与发布源

功能 文件
默认 Giteaaxs.kuma1xn.vipHTTPS deploy/nexus-1panel.shnexus-1panel.secrets.sh.example
全量分批推送(避 Cloudflare 524 scripts/git-push-axs-full.sh
本机 rsync 生产部署 deploy/rsync-local-to-server.shdeploy-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_oksession_cleanup_task_state
  • 登录 API 响应带 diagnosticsTTL 修补状态)
  • bootstrap_lockwait_timeout_seconds,避免并发 bootstrap 互踢

关键文件

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 发布制品化工具链

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

发布包 SHA256release 记录):46299832fb78e8cc196f85cf1928f34eea4deee82dbc83b67883394f0359036b


3.4 文档与 Skillrelease 独有目录)

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_ERRORSbootstrap 失败 → SSH 回退(非凭据类不 raise)
release _ensure_session_cleanup_ttl_for_login_session_cleanup_ttl_*diagnosticsBootstrapLockTimeout

合并后 _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_jsonflocksession_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. 合并后验证清单

# 单元测试(合并冲突解决后)
.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 修复)
  • 同一子机连点一键登录不互踢 tokenlogin_url_lock
  • GET /api/btpanel/servers/{id}/login-urldiagnosticsrelease

6. 合并后部署

# 生产(中心机)
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 摘要(可直接粘贴)

## 合并摘要
`release/20260708-axs` 合并入 `main`,统一 SSOT。

### release 带入

- 宝塔 task.py hardcoded 3600 → session_timeout 自动修复(解决 12h 掉线)
- `/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