73 lines
8.5 KiB
Markdown
73 lines
8.5 KiB
Markdown
# 完整候选反代隔离验收记录
|
||
|
||
## 范围与结论
|
||
|
||
远程主机为 `47.108.78.12`,主机名 `ikun2`。本轮从远程时间 2026 年 9 月 18 日 01:51 开始,仅在远程执行应用和自动测试;本机用于编辑、Git 和文件传输。所有业务流程使用新建隔离实例及空数据库,不清理或复用线上业务数据,不删除历史证据,不暂停线上服务。
|
||
|
||
- [✓] 完整候选六个 Linux 可执行文件上传后逐一校验长度、SHA-256、ELF64 和 x86_64 标识。
|
||
- [✓] 真实独立 Nginx 反代到 HTTPS 8002,HTTP 8001 初始化和运行端口通过;通过正式配置 API 设置公网 HTTPS 443 和可信代理范围。
|
||
- [✓] 公网 80 及应用 8001 跳转均保留路径和查询参数,不携带内部 8002;匿名恢复入口、页面登录地址和实际生产入口脚本可用。
|
||
- [✓] 两个真实连接来源分别验证登录限流;被限制来源伪造转发头仍被拒绝,另一来源能够正常登录。
|
||
- [✓] 空库首次安装、登录会话、SMTP/IMAP/POP3 认证、内部 25 STARTTLS 中文正文及附件收信、混合认证过载后的恢复通过;双库完整性正常,线上不存在测试邮件。
|
||
- [✓] 测试进程与线上独立网络、挂载隔离;最终反代测试四个线上服务 PID、InvocationID 和重启计数前后一致,没有新增内核 OOM。
|
||
- [✓] 6 项测试收尾模拟回归通过,覆盖资源查询超时、停止及强制终止失败后继续处理其余测试单元、拒绝业务服务名。
|
||
- [!] 最新应用尚未替换线上版本。这是隔离候选验收,不是正式部署、真实浏览器闭环、可信 CA 正式换证或整体生产放行。
|
||
|
||
## 候选组成
|
||
|
||
应用源码为 `c1dd533c805cbfda7a366a1170d2e710f04f86a1`,版本 `review-c1dd533`。本轮验收工具修改前提交并推送中文基线 `1d4b9c4`,该基线不改变应用源码。
|
||
|
||
主前端采用上一轮远程生产构建,详见《远程前端构建验收记录》。Telegram 界面也由同一版本归档源码远程构建,其 16 个输入文件已在前序构建阶段核对。依赖安装日志位于 `/var/tmp/smail-review-telegram-build-20260918/deps-0140.txt`,最终构建日志为 `build-0143.txt`;实际 Node 路径修正后 `vue-tsc --build`、Vite 均通过,构建峰值约 395 MiB、交换空间为零。首次私有临时目录造成的启动失败日志保留。
|
||
|
||
Linux 候选由干净源码归档、上述新界面产物及重新编译的三个插件组成,主程序使用 `bundled` 标签;前序交叉编译使用 Go 1.26.6、`CGO_ENABLED=0`、`GOOS=linux`、`GOARCH=amd64`、`-mod=readonly -trimpath`。本轮未再次编译或更改应用源码。
|
||
|
||
本机产物位于 `out/release-review-c1dd533-linux-amd64`,远程位于 root 所有的 `0700` 目录 `/var/tmp/smail-review-candidate-c1dd533`。`receipt.json` 记录六个文件的长度和摘要。
|
||
|
||
| 项目 | SHA-256 |
|
||
| --- | --- |
|
||
| 主程序 | `b2ceda68f26e3753be7124d11ce5bc06e309a119dd13ef7254bf403c3e0a4792` |
|
||
| 管理工具 | `2a99f6bef10092b72d550e195141a572ec02fae541fb3615d3b529bd15a193eb` |
|
||
| 配置迁移工具 | `b2016a293798c82190f7334b623237b3f460816e67ae9bdb2d592ea6a4ef8c55` |
|
||
| 主前端归档 | `91f775c666e01a24e47b7ac35132ac171a087aac9641c5bffb3456113d311f01` |
|
||
| Telegram 界面归档 | `07f05f902dbe58c7e49d757b53c3f47c4a6c1442ffd4cc7c83db56af03d061de` |
|
||
|
||
首次管理工具版本断言将额外的根目录输出误判为版本不匹配,在运行业务测试前退出;随后按实际版本输出行核对为 `review-c1dd533`。主程序没有被当作支持 `--version` 的命令直接在宿主环境启动。
|
||
|
||
## 反代验收方式
|
||
|
||
`test/tools/runtime_review.py` 新增可选 `--nginx-template`,保持原有直连默认路径。`runtime_proxy.py` 仅替换部署模板中的测试域名和证书、临时文件路径;保留 `proxy_pass https://127.0.0.1:8002`、上游证书校验、SNI 和覆盖客户端转发头的配置。模板摘要为 `bf6816c38f9c639ab17fd7344fff4b06afc5a2388f74318e18c60b8b3311ebd8`。
|
||
|
||
证书由隔离测试创建,仅供当前客户端及测试 Nginx 信任,不写入宿主信任库,不复制正式私钥。公网端口指隔离网络中的 80/443,不对实际互联网开放。应用、探针、Nginx 的内存硬上限分别为 128/48/32 MiB,交换空间均禁止;反代预检至少要求 320 MiB 可用内存,不通过时拒绝执行。
|
||
|
||
先在 8001 完成正常初始化,再通过真实反代登录、读取配置代次、验证及保存候选、显式应用配置。`publicHttpsPort` 设置为 443,`trustedProxyCidrs` 仅为 `127.0.0.1/32`,没有直接改写测试数据库或配置文件来绕过正式流程。
|
||
|
||
来源测试从 `127.0.0.2` 连续发送十次错误密码,使账号与 IP 组合限流生效;该来源改用正确密码并伪造 `X-Forwarded-For`、`X-Real-IP` 仍被拒绝。随后从 `127.0.0.3` 使用正确密码登录成功。该验证覆盖当前单代理拓扑,不等同于任意多层代理、防火墙或公网攻击容量验收。
|
||
|
||
恢复页以匿名连接访问,验证 `/public-password-recovery` 跳转至 `/rest/`、页面 `no-store`、注入登录地址为 `https://mail.runtime.invalid/#/login`,并解析 HTML 后实际读取生产脚本入口。没有执行浏览器 JavaScript、恢复邮件送达或密码重置,不能据此宣称恢复业务闭环完成。
|
||
|
||
## 运行证据与失败记录
|
||
|
||
- `/var/tmp/smail-review-runtime-20260918-015323`:修改工具前的完整候选直连基线通过,探针 24.91 秒,应用峰值 77,230,080 字节。
|
||
- `/var/tmp/smail-review-runtime-20260918-020045`:首次反代失败。生成配置为 root 组且权限 0640,受限 Nginx 无法读取;记录保留,线上不变,测试进程已停止。
|
||
- `/var/tmp/smail-review-runtime-20260918-020252`:修复为 root 所有、smail 组的 0640 后反代通过,探针 39.28 秒。
|
||
- `/var/tmp/smail-review-runtime-20260918-020719`:补齐恢复页和收尾逻辑后的反代验收通过,探针 40.32 秒,应用峰值 77,225,984 字节,Nginx 峰值 3,612,672 字节,两者交换空间为零。
|
||
- `/var/tmp/smail-review-runtime-20260918-020823`:最新工具的默认直连回归通过,探针 25.59 秒,应用峰值 77,254,656 字节,交换空间为零;证明可选反代模式未破坏原直连流程。
|
||
|
||
每个运行目录保留 `result.json`、`probe-result.json`、`probe.log`、`service.log`,失败目录也保留。最终结果中的 `resource_errors`、`cleanup_errors` 均为空,`live_message_absent`、`live_unchanged` 为真,两库 `integrity_check` 均为 `ok`。停止操作只接受工具生成的单元名,查询异常仍执行收尾;这些措施不代替未来宿主掉电等完整故障演练。
|
||
|
||
收尾模拟单元 `smail-runtime-cleanup-tests-20260918-0206b` 六项通过,峰值 14.9 MiB、交换空间为零。首次 `0206` 因 `PrivateTmp` 隐藏工具目录而没有执行测试;第二次仅增加指定工具目录的只读挂载,继续保留生产目录不可访问和独立网络限制。模拟用例不调用真实停止命令。
|
||
|
||
02:16 在相同限制下补跑六项模拟回归,全部通过,单元 `smail-runtime-cleanup-tests-20260918-021606` 运行 406 毫秒、峰值 15.1 MiB、交换空间为零。持久日志为 `/var/tmp/smail-review-proxy-c1dd533/cleanup-tests-20260918-021606.txt`。模拟单元以 root 执行,不宣称其为非特权用户回归。
|
||
|
||
02:15 远程收尾复核:四个线上服务仍 active,主进程及 InvocationID 与测试前一致;Nginx 配置检查、MySQL 就绪探测通过,Smail 与 Scert 的系统信任 HTTPS 页面均返回 200。本轮测试无运行中单元,历史失败单元记录继续保留。四个远程验收工具与本机 SHA-256 逐一一致。此时专用 DNS 配置仍不存在,旧续期 timer 为 active,未把候选脚本当作已经上线。
|
||
|
||
## 后续门槛
|
||
|
||
- [ ] 对线上部署建立可回退备份,部署候选并复核真实公网配置和传输入口。
|
||
- [ ] 真实桌面浏览器首次安装、登录、网页提交邮件、最终队列状态和实际收件结果。
|
||
- [ ] 受保护本地 IPC 管理员恢复及旧会话、协议凭据撤销,凭据轮换与访问审计。
|
||
- [ ] 队列与数据库故障、目标数据库兼容性、竞态、容量和异机恢复。
|
||
- [!] 01:51 只读复核时专用 DNS 配置仍缺失、旧续期 timer 仍启用;全新 DNS 挑战、正式新证书发布及外部告警仍未验收。不得将本轮隔离证书当作可信证书自动续期完成。
|
||
|
||
维持整体结论:不满足生产放行。以上通过项是完整目标中的增量证据,不缩减原发布验收范围。
|