Smail/docs/远程前端构建验收记录.md
smail 9c450f1734
Some checks are pending
Security Checks / security (push) Waiting to run
运行时配置清理阶段检查点
2026-10-05 01:31:34 +08:00

6.7 KiB
Raw Blame History

远程前端构建验收记录

范围与结论

本轮时间为 47 服务器上的 2026 年 9 月 18 日 01:24 至 01:36,时区为 Asia/Shanghai。应用回归、维护窗口及前端生产构建均在 47.108.78.12 执行,本机仅编辑、Git、证据下载与静态摘要检查。

  • [✓] 复查上一轮维护窗口恢复:MySQL 返回 mysqld is alive,Smail 与 Scert 的可信 HTTPS 页面均返回 200,四项服务正常。
  • [✓] 修复停止构建单元超时会跳过服务恢复的问题;远程隔离回归 11 项通过。
  • [✓] 使用新安装的锁定依赖重跑前端回归:24 个文件、185 项通过,零失败、零跳过。
  • [✓] 在用户授权的维护窗口内完成生产前端构建,生成新产物并核对嵌入目录内容完全一致。
  • [✓] 恢复 MySQL 和 Scert 后验证数据库就绪与两个站点真实 HTTPS 页面;Smail、Nginx 主进程未变。
  • 新前端产物已归档并下载,等待构建完整 Linux 候选与后续业务验收。
  • [!] 尚未替换线上应用,不构成首次安装、浏览器业务或整体验收通过。

本轮没有清理数据库、删除文件、修改正式证书、替换自动续期任务或停止 Nginx。没有进行业务数据测试,因此不将本轮描述为空库首次安装验收。

恢复工具整改

修改 test/tools/build_frontend_review.py 与 test/deployment/test_frontend_build.py。基线提交为 4f5b05e,已推送项目的 smail 远程;仓库没有 origin 远程,最初对此名称的推送失败后改用实际远程成功。

停止构建失败时先区分预检拒绝导致的单元不存在;其他异常记录为失败,并尝试终止该构建单元的残留进程。无论停止和终止操作是否超时,仍依次尝试恢复 MySQL、Scert,不再提前跳过恢复。单元名称限定为本工具生成的构建单元,不能传入业务服务名。父单元停止预算增加到 480 秒,以覆盖恢复路径的命令超时;保留 finally 与 systemd ExecStopPost 两层恢复。

构建硬上限从 960 MiB 调整为 896 MiB,Node 堆上限从 768 MiB 调整为 640 MiB;系统保留预算仍为 128 MiB。预检要求暂停服务后至少 1024 MiB 可用内存,失败则拒绝构建并恢复服务。此调整针对构建工作进程,不降低业务服务预算或密码计算参数。

远程控制目录为 /var/tmp/smail-review-build-control-20260918-v2,目录为 root 所有、0750,工具为 0640,smail 用户不可修改控制脚本。测试单元 smail-build-control-tests-20260918-v2 在非 root、独立网络及生产目录不可访问的环境中运行,真实服务调用均被模拟。11 项回归覆盖预算边界、停止超时、强制终止失败、数据库恢复失败、站点恢复超时、不存在的构建单元和非法服务名称,均通过;峰值 14.9 MiB,交换空间为零。证据为该目录的 tests.txt。

这些模拟回归不等同于真实故障期间服务恢复的完整演练,本轮真实窗口验证的是正常构建成功后的自动恢复。

前端回归与构建

工作目录为 /var/tmp/smail-review-public-port-20260918。完整依赖此前已使用 Yarn 1.22.22、项目 yarn.lock、冻结锁文件及禁用安装脚本方式安装;本次不再借用旧的测试专用依赖。

前端测试单元为 smail-frontend-tests-20260918-013007,结果目录为 results-20260918-013008。24 个文件、185 项通过,零失败、零跳过;运行 37.775 秒,峰值内存 99.3 MiB,交换空间为零。

维护窗口为 smail-build-window-20260918-013126,子构建为 smail-frontend-build-20260918-013126。窗口记录从 01:31:26 到 01:32:07,约 41 秒;Scert 和 MySQL 在窗口内临时停止,Smail 和 Nginx 未停止。暂停后可用内存为 1,091,984 KiB,通过原 128 MiB 保留预算检查。

Vite 生产构建成功,前端产物与 Go 嵌入目录各约 3.5 MiB,递归比较无差异。Vite 用时 37.20 秒,子单元用时 38.410 秒,峰值内存 758.5 MiB,交换空间为零。成功的临时单元已被 systemd 回收,因此 JSON 中后续查询的 MemoryPeak 为未设置;峰值取自同一构建日志中 systemd 的结束统计,不能把未设置当作零用量。

保留日志中的大于 500 kB 分块警告,未通过提高警告阈值隐藏它。该警告不阻止构建,但浏览器加载性能仍需验收。此前失败的 384 MiB Node 堆构建日志、被资源预检拒绝的窗口记录及旧工具均保留,没有删除或冒充成功结果。

恢复与证据

恢复后 MySQL PID 为 589785,Scert PID 为 589832;Smail PID 574584、Nginx PID 578671 前后一致,四项服务均正常,重启计数为零。01:33 收尾检查中 mail.example.com 和 web.apmmk.cn 的 HTTPS 页面均为 200,MySQL 就绪。该窗口之后的内核日志未发现 OOM 记录;没有连续请求采样,不能扩大为全窗口零请求失败或生产容量保证。

主工作目录内证据如下:

  • build-window-20260918-013126.json:前后服务状态、构建退出码、预算与恢复结果。
  • frontend-build-20260918-013126.txt:完整构建输出及资源统计。
  • build-closeout-0133.txt:真实页面、数据库就绪、服务状态和产物比较。
  • frontend-source-0134.sha256:154 个前端源码文件、3 个构建配置文件和同步工具摘要。
  • frontend-production-013126.tar.gz:本轮新前端产物,权限 0600。

本机下载目录为 out/public-port-build-20260918,已确认由 Git 忽略规则排除。157 个源码及配置文件的原始 SHA-256 与本地一致;同步工具 deploy/prepare-frontend.mjs 因 CRLF/LF 差异原始摘要不同,下载远端原文后经 Git 比较及 16 行逐行比较均无内容差异。没有修改中文字符或替换源文件。

产物归档 SHA-256 为 91f775c666e01a24e47b7ac35132ac171a087aac9641c5bffb3456113d311f01,远程与下载文件一致;首页摘要为 15703150ff67244c045bc5e83128412782f5ffcb1fa243ec9c046f8bbda97e58。

后续门槛

  • 使用本轮前端产物及新编译的 Linux 插件、应用、管理工具组成完整候选;不得直接使用偏 Windows 的开发构建脚本生成 Linux 发布包。
  • 在远程隔离空库完成最新候选首次安装、内部 25 收信与附件验证,并扩展到实际 8001/8002 和 Nginx 反代结构。
  • 进行可信 HTTPS 桌面浏览器业务、管理员恢复撤销、凭据轮换、队列故障及异机恢复验收。
  • [!] Smail 专用 DNS 配置仍不存在;01:24 复核旧续期定时器 active,尚不能声称无停机自动续期已启用。
  • [!] 公网端口和可信代理候选虽已有回归,仍未部署到线上应用。整体生产放行维持未通过。