# 晚间验收复测记录 ## 范围与基线 - 日期:2026-09-17,远程检查开始于北京时间 23:30。 - 目标:47.108.78.12,主机名 `ikun2`。所有应用与回归测试仅在该服务器执行。 - 本轮基线提交:`a0e373d`,已推送。仅复测现有部署,不修改应用源码,不重新编译或替换线上程序。 - 测试对象仍为 `review-2263779`,主程序和管理程序摘要与上一轮相同。 - 本轮只读检查线上状态,续期回归使用模拟依赖和独立网络,不登录、不发信、不写业务数据库。因此未清库、未进行首次安装,不计入最新构建清洁部署验收。 - 证据目录:`/var/tmp/smail-review-night-20260917-233135`,权限 0700。保留失败日志与重试结果,不删除历史证据。 ## 任务清单 - [✓] 核实当前工作树、程序摘要及服务状态。 - [✓] 可信 TLS、内部 25/587 STARTTLS、HTTP 跳转及未知 Host/SNI 拒绝复测。 - [✓] 六项隔离续期回归及线上脚本摘要核对。 - [✓] 备份摘要、证书有效期、私钥权限与本地恢复 socket 权限检查。 - [✓] 非特权用户实际连接本地恢复 socket 被拒绝。 - [✓] 五分钟资源采样与结束时服务复核,共 11 次采样通过;仅覆盖本轮短时观察。 - [!] 真实远程浏览器业务验收、首次安装及发信闭环未执行。 - [!] Nginx 共用后的续期维护影响待处理,未触发真实续期。 ## 已取得证据 | 检查 | 结果与边界 | | --- | --- | | 443、8002、465、993、995 | 系统信任链与主机名校验通过,使用同一叶证书 | | 内部 25、587 | STARTTLS 通过,明文阶段不公布 AUTH,未执行邮件投递 | | 80、8001 | HTTP 跳转通过,公网 80 不泄露内部 8002 | | 未知 Host/SNI | HTTP 拒绝、TLS 握手拒绝通过 | | Nginx 配置 | `nginx -t` 通过,未重载服务 | | 续期脚本回归 | 六项通过;验证未到期、到期失败及超时恢复、成功路径、权限、证书信任和密钥匹配相关行为 | | 线上脚本一致性 | 两个续期部署脚本分别与本轮上传副本 SHA256 一致 | | 已有一致性备份 | `smail-state.tar.gz` 摘要仍为 `29bd3deb4b498ee873d83cd5986cfd37b2c2c3cf08347a6b913e0c9ea8b41965`,未执行恢复 | | 证书 | 五域名 SAN 完整,有效期至 2026-12-16 13:54:39 UTC,超过 30 天 | | 私钥与恢复入口 | 应用私钥 0600、ACME 目录 0700、ACME 私钥 0600、恢复 socket 0600;不代表完整恢复撤销通过 | | 本地 IPC 访问边界 | 以 `nobody` 用户、UID 65534 连接恢复 socket,得到预期 `EACCES`;没有发送业务请求或修改账户,证据为 `ipc-access-boundary.json` | | UFW | IPv4/IPv6 的 8001:8002 优先拒绝规则存在,未执行独立外网扫描 | 续期回归使用 systemd 独立网络、私有临时目录、只读系统和脚本挂载;禁止访问生产应用、恢复 socket、ACME 目录及备份。限制为 64 MiB 内存、零交换、25% CPU、32 个任务和 90 秒运行时间。 首次启动时,`PrivateTmp` 隐藏了 `/var/tmp` 中的脚本,Python 以退出码 2 结束,尚未运行任何用例。随后将本轮脚本目录只读挂载至 `/opt/smail-night-code` 后重试成功;没有关闭隔离或扩大资源上限。失败日志为 `renewal-regression.log`,成功日志为 `renewal-regression-retry.log`。 成功回归的 systemd 输出记录运行时间 485 ms、峰值内存约 15 MiB;结束后再次查询 `MemoryPeak` 为未设置,因此不能将后一次空值解释为零内存。 ## 资源与结束复核 资源采样时间为北京时间 23:32:30 至 23:37:31,共 11 次,跨度约 301.49 秒,每次均按原 128 MiB 保留预算通过。 | 指标 | 实测结果 | | --- | --- | | 主机可用内存 | 772,050,944 至 813,060,096 字节 | | Smail 当前内存采样峰值 | 35,913,728 字节,约 34.3 MiB | | Smail 增长至硬上限后的最小主机余量 | 270,471,168 字节,约 258 MiB,大于 128 MiB 保留预算 | | 进程与 OOM | 同一 InvocationID,OOM 和 OOM kill 均为零 | | 结束时 Smail | active,PID 574584,NRestarts 0 | | 结束时 Nginx | active,PID 575746,NRestarts 0 | | 同机服务 | Scert、MySQL、PostgreSQL 的进程与监听在结束复核时仍存在,PID 与本轮开始一致 | | 结束时传输层 | `transport-final.json` 再次通过 | 逐次证据为 `resource-00.json` 至 `resource-10.json`,汇总为 `resource-summary-retry.json`,服务状态为 `service-final.txt`。首次汇总将 `resource-summary.json` 自身匹配为样本,误报缺少样本并退出;重试改为显式读取 11 个编号文件后通过,空的首次汇总文件保留,原始采样没有被覆盖。 此观察期间没有持续业务负载,不能据此推导并发用户数、邮件吞吐量或长期稳定性,汇总中的 `productionApproved` 保持 `false`。 ## 新发现与剩余阻塞 当前 `/etc/nginx/conf.d/scert-apmmk.conf` 为 Scert 提供 8003/8004 入口,与 Smail 共用同一个 Nginx。现有续期脚本会停止整个 Nginx 服务,因而存在跨项目中断风险。此结论来自现场配置与续期源码核对,没有通过停止服务制造故障。需要明确共用服务维护窗口或调整挑战部署方式,并完成对应远程演练。 服务器未检测到 Chromium、Chrome 或 Node/npm 可执行文件,本轮没有启动本机浏览器代替远程浏览器验收。代理客户端 IP、恢复公网端口、管理员恢复与撤销、凭据轮换、持久投递故障恢复、真实续期告警、容量和异机恢复仍未通过。本轮结果不能用于签署整体生产放行。