Smail/docs/生产整改验收清单.md
smail a725aac6a7
Some checks are pending
Security Checks / security (push) Waiting to run
补齐管理员恢复验收证据并严格校验反代跳转
2026-09-18 03:03:46 +08:00

200 lines
23 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 生产整改验收清单
## 范围与结论
### 当前进展:管理员恢复事务通过,线上跳转严格验收失败
- [✓] 2026 年 9 月 18 日恢复服务 24 项、协议凭据 8 项远程隔离回归通过,零失败、零跳过;真实 SQLite 和 Unix Socket 覆盖重置提交、四阶段撤销回滚及目标歧义拒绝。
- [✓] 02:48:57 测试单元正常退出,峰值 78.1 MiB、交换空间为零;终态、二进制摘要、双库完整性和线上服务收尾核对完成。
- [✓] 修复传输检查只记录而不拒绝 8001 内部端口跳转的验收缺口,六项远程隔离回归通过;严格检查保留失败明细并以非零退出码拒绝放行。
- [!] 03:00 严格线上验证明确失败:8001 仍跳向内部 8002。七个 TLS/STARTTLS 入口通过不等于公网配置通过,完整候选尚未正式部署。
- [!] 正式管理员恢复命令、浏览器会话退出、真实协议连接撤销、无停机续期和其他原发布门槛仍未完成,整体生产放行继续不通过。
详见《管理员恢复事务验收记录》和《反代跳转验收整改记录》。下方阶段记录保留历史结论,不得将旧检查器的 `passed` 当作严格跳转验收通过。
### 当前进展:无停机 HTTP 备用方案真实挑战受阻
- [✓] 候选支持显式 HTTP Webroot,不抢占端口、不停止 Nginx;41 项远程隔离回归通过,保留默认 DNS 及校验、回退机制。
- [✓] 02:25 全新测试账号挑战失败期间,两站点 138 次 HTTPS 探测通过,四个线上服务进程、正式文件和旧续期任务均未变化。
- [!] CA 对五域名 HTTP 挑战均报告 403,但对应 Nginx 日志为 200,公网差异仍待定位,不能启用 HTTP 模式。DNS 专用授权仍缺失,线上无停机自动续期尚未落地,整体生产放行仍不通过。
详见《HTTP无停机续期验收记录》。以下各阶段结论仅覆盖各自验证范围。
### 当前进展:完整候选反代隔离运行通过
- [✓] 2026 年 9 月 18 日,`review-c1dd533` 完整 Linux 候选六文件上传至 47 服务器,长度、摘要、ELF 格式核对通过;主前端和 Telegram 界面均使用新生产构建。
- [✓] 02:07:19 开始的新空实例通过真实独立 Nginx 反代验收,应用 8001/8002、公网 443、可信代理配置均通过正式 API 生效;HTTP 跳转和恢复页登录地址不再继承内部 8002。
- [✓] 两个真实来源的登录限流相互隔离,伪造转发头不能绕过已触发的限制;首次安装、三协议认证、内部 25 中文附件收信、过载恢复、双库完整性通过。
- [✓] 线上四个服务进程及 InvocationID 不变,线上无测试邮件,未停止业务服务,未发生新增 OOM;6 项测试收尾异常模拟回归通过。
- [✓] 最新工具默认直连回归通过;02:15 两站点可信 HTTPS、MySQL 就绪和服务状态收尾通过,02:16 六项收尾回归补齐持久日志,四个工具的本机及远程摘要一致。
- [!] 候选尚未替换线上版本,浏览器业务闭环、真实恢复邮件、管理员恢复撤销、DNS 自动续期、容量与灾难恢复等门槛继续未完成。隔离通过不等于线上配置已经整改生效。
详见《完整候选反代隔离验收记录》。下方较早章节保留历史阶段状态,当前增量结论以上方为准。
### 当前进展:远程生产前端构建完成
- [✓] 2026 年 9 月 18 日 01:30,完整锁定依赖下远程前端回归 24 个文件、185 项通过,零失败、零跳过。
- [✓] 修复维护窗口停止构建超时会跳过服务恢复的问题,11 项隔离回归通过;保留 128 MiB 系统预算,受限前端生产构建成功。
- [✓] 01:31:26 至 01:32:07 授权窗口内仅暂停 MySQL、Scert,构建峰值 758.5 MiB,交换空间为零。两服务已恢复,数据库就绪、两站点可信 HTTPS 页面均通过;Smail、Nginx 主进程未变。
- [x] 新前端产物与源码及嵌入目录核对完成,待完整 Linux 候选构建、隔离首次安装及正式部署复审。
- [!] 尚未替换线上应用或续期任务。公网端口、可信代理的线上验收及其他生产门槛继续未完成,不能以构建成功代替放行。详情见《远程前端构建验收记录》。
### 当前候选:可信代理客户端地址整改
- [✓] 可信代理地址解析候选及真实隔离 Nginx 双来源验证通过,默认不信任任何代理;登录限流和安全验证共用解析,原始连接地址不变。
- [✓] 控制器 85 项、HTTP 层 65 项完整远程回归通过,另有 1 项浏览器夹具跳过;详情见《可信代理地址整改记录》。候选尚未构建为正式应用或部署,不能将线上代理 IP 问题标为验收完成。
- [!] 公网恢复地址仍继承内部 8002,浏览器业务流程、管理员恢复撤销及其他生产门槛保持未完成。
### 当前状态:远程主机 2026 年 9 月 18 日凌晨无停机续期整改
- [✓] Nginx 已迁移到已发布证书目录,不再直接读取 ACME 签发产物;Smail 8001/8002 和其他站点配置未修改。
- [✓] 28 项远程隔离回归通过,含真实独立 Nginx 换证、重载、回退后的 TLS 指纹检查和原子配置权限回归;候选文件与远程测试文件摘要一致。
- [✓] 线上平滑重载期间两个站点 58 次 HTTPS 探测成功,已有连接完整下载 312,377 字节,Nginx 与 Smail 主进程未重启;七个 TLS/STARTTLS 入口复测通过。
- [✓] DNS 候选脚本在真实未到期状态校验通过,但没有签发新证书或替换自动任务。
- [✓] 00:34 恢复迁移中被 umask 收紧的 Smail 配置权限为原 0644,内容摘要不变;远程语法检查、八个保护文件及七个 TLS/STARTTLS 入口收尾复核通过,未重启服务。
- [!] Smail 专用 DNS 授权、全新 DNS 挑战、正式新证书发布、外部告警尚未验收;线上续期脚本和定时任务仍为旧版本,不能宣称无停机自动续期已启用。
- [!] 实时配置显示 Scert 已按域名共享 443,旧记录中的 8003/8004 不再是当前入口。其他生产门槛继续有效,整体结论仍为“不满足生产放行”。
本轮无业务数据写入,不清库、不重编译应用、不替代首次安装和浏览器业务验收。详情及失败记录见《无停机续期整改记录》。
### 历史状态:2026 年 9 月 17 日晚间复测
本节与《晚间验收复测记录》保留当时状态;当前以顶部较新章节为准,不应把早期 SSH 失败、自签名或单次资源失败当作当前结论。已部署程序仍为 `review-2263779`,本轮没有编译或替换应用。
- [✓] SSH 可用;8001/8002 与 Nginx 反代、正式可信证书、七个 TLS/STARTTLS 入口复测通过。
- [✓] 六项远程隔离续期回归通过;备份摘要、证书有效期与关键文件权限复核通过。
- [✓] 原 128 MiB 保留预算的资源预检五分钟共 11 次采样通过,同一进程、无 OOM;不代表持续负载或生产容量验收,PROD-013 整体仍待完成。
- [✓] 用户授权测试维护窗口后,128 MiB 限额内真实测试环境续期及 systemd 超时自动恢复通过,Smail 与 Scert 网页入口均恢复。详见《续期维护窗口演练记录》。
- [!] Nginx 仍同时承载 Scert 8003/8004;全新挑战、正式换证、外部告警及长期共用维护窗口尚未完成验收或确认,不能把单次测试停机授权扩大为长期运维批准。
- [!] 代理客户端 IP、公网恢复端口、远程浏览器业务闭环、管理员恢复撤销、凭据轮换、故障恢复、续期告警、容量与异机恢复仍待验收。
结论:维持“不满足整体生产放行”。本轮为无业务写入的部署复测,不冒充清库、最新构建或浏览器首次安装验收。
### 历史复核:2026 年 9 月 17 日 22:02 主机清理
本节更新下方 21:51 的资源失败状态。经用户授权清理 47 主机,发现 `/tmp` 为 tmpfs,旧发布及验收文件实际占用物理内存。6 项无进程引用的 Smail、Scert 临时发布文件已完整归档到磁盘,并保留原路径链接;业务数据、证书、已有备份和服务配置未改动。
- [✓] 释放约 355.5 MiB 文件内容占用,逐文件 SHA-256、属主、权限和修改时间一致;四项业务服务 PID、重启计数未变。
- [✓] 原参数资源预检连续 5 次通过,间隔 15 秒;保留 128 MiB 系统预算,未降低 512 MiB 硬上限或 384 MiB 高水位。可用内存约 625 至 643 MiB,未出现 OOM。
- [~] PROD-013 从“即时预算失败”转为“短时预检通过,持续运行、同机增长与容量待验收”。采样中最小剩余增长预算约 159 MiB,仅比 128 MiB 门槛多约 31 MiB,不构成宽裕容量证明。
- [!] 自签名证书、完整远程浏览器流程、恢复撤销、异机恢复等其他阻塞保持不变,仍不能签署生产放行。
归档及完整清单:`/var/backups/host-tmp-archive-20260917T215952/manifest.json`;五次原始预检:同目录 `resource-samples.json`。未来构建或测试产物应放在磁盘上的项目专用 `/var/tmp` 目录,避免大包再次占用 tmpfs;未改全局临时目录或删除失败测试证据。
### 历史复核:2026 年 9 月 17 日 21:51
本节优先于下方早期状态。已使用本次提供的访问凭据恢复受信任主机密钥校验的 SSH 连接,不再将 SSH 认证列为当前阻塞。凭据轮换、历史清理和访问审计仍未完成。
- [✓] 线上双程序摘要与 `review-2263779` 封存候选一致。
- [✓] 新增资源策略 15 项 Python 回归和 Node 测试入口在远程受限单元通过,无跳过。
- [✓] 最新程序在全新隔离副本通过正式初始化 API、HTTPS 登录会话、三协议授权码、内部 25 端口中文正文及附件入库、三轮混合认证过载恢复;双库完整性正常,无新增 OOM。
- [✓] 停服备份后新增 systemd drop-in,运行进程确认 `GOMEMLIMIT=256MiB`;未修改原环境文件,未改变 384/512 MiB 内存限额。
- [!] PROD-013:资源预检仍失败。21:51 可用内存约 312 MiB,服务增长至硬上限还需约 495 MiB,无法同时保留 128 MiB 系统预算。不能将小样本的约 84.1 MiB 峰值直接作为生产容量。
- [!] PROD-006:当前证书为自签名,系统信任校验失败。
- [ ] PROD-007、PROD-008、PROD-012:正式浏览器、网页持久投递闭环、完整本地 IPC 恢复撤销与浏览器首次安装未通过。服务器未检测到 Chromium/Chrome;没有改为本机测试或忽略证书错误。
- [ ] 异机恢复、持续监控、生产容量及故障注入验收仍待完成。
结论:候选可继续隔离验收,不满足生产放行。线上数据库未清空;空数据副本用于本轮协议测试,不冒充线上清库或浏览器六步安装验收。详细证据见《远程服务器测试记录》最新章节。
本清单对应 2026 年 9 月 17 日 `D:\Desktop\Smail` 生产审查整改,验收服务器为 `47.108.78.12`。应用和自动测试只在该服务器执行,SMTP 按用户要求使用远程 `127.0.0.1:25`,不将公网 25 端口连通列为本轮通过条件。
当前版本已经完成凭据配置、SMTP 判定、MX 路由和网页持久投递队列的代码整改及针对性远程测试,但仍不建议直接生产上线。测试范围、版本摘要和备份位置以《远程服务器测试记录》最新章节为准。
截至 11:32,47 服务器已部署 `review-421aa7303d3b`。本轮 60 包分批执行、958 个顶层用例通过;部署后内部 SMTP 五项真实入库、双库完整性及未认证接口边界通过。此结论不覆盖跳过项、容量、可信 TLS 或真实网页登录发信;部署和 SMTP 回归均保留数据,不满足 PROD-012 的清库安装要求。
12:39 已部署认证容量与前端重试版本 `review-d34ffdb7d1f6`。前端 23 个文件、182 项测试通过,旧版 958 项结果不得作为新版全量通过的依据。随后空数据副本通过正式初始化接口、HTTPS 登录、三协议授权码登录及中文附件收信,但真实 POP3 过载响应失败,不能将此前业务层测试等同于完整协议验收。
13:05,POP3 与 SMTP 错误分类修复的三包远程回归共 48 项通过,无跳过。13:10 同版候选程序通过空数据副本初始化、真实协议及三轮混合认证过载恢复;随后完成备份部署,线上为 `review-b47f36643547`。13:12 部署后内部 SMTP 五项真实收信、产物摘要、双库和安全边界复核通过。生产容量、资源规划和正式浏览器验收仍未通过。
15:21 起继续资源隔离整改。已补充 systemd 候选资源预算、OOM 整组收尾、启动限频、90 秒停止期限、只读资源预检及反例测试;本轮仅完成源码复审、语法检查和 Linux 测试程序交叉编译,未在本机执行应用或测试用例。当前会话无法通过 47 的 SSH 认证,没有上传或部署,也没有重新核实线上版本与资源。详见《生产资源部署说明》,不得把本轮源码变化计为 PROD-013 已通过。
## 任务状态
| 编号 | 优先级 | 任务 | 状态 | 验收边界 |
| --- | --- | --- | --- | --- |
| PROD-001 | P0 | 移除脚本中的已知明文凭据 | [x] | 工作区已清理,历史泄露处置未结束 |
| PROD-002 | P0 | 轮换泄露凭据、核查访问记录 | [!] | 前轮记录旧 SSH 密码仍有效;本轮不复用泄露密码,已有密钥无法登录,需要恢复受信任访问并确认轮换状态 |
| PROD-003 | P0 | 处置 Git 历史中的凭据 | [!] | 未授权重写历史或强推;轮换应先于历史清理 |
| PROD-004 | P0 | 持久化逐收件人投递、防不确定重投 | [x] | 相关自动测试通过,真实网页业务闭环待验收 |
| PROD-005 | P1 | MX、备用路由、DNS 错误分类 | [✓] | 针对性测试通过,不代表各外部邮件供应商兼容性 |
| PROD-006 | P0 | 可信 TLS 和正式域名验证 | [✓] | 2026-09-17 已签发并部署五域名可信证书,443/8002/465/993/995 与内部25/587系统信任链校验通过;续期告警和到期演练另列 |
| PROD-007 | P0 | 完整网页登录、发信和状态核对 | [!] | 可信证书已解决,仍需有效测试账号和远程真实浏览器;不得绕过登录 |
| PROD-008 | P0 | 超级管理员恢复完整交互 | [!] | IPC 权限已复核,正式密码代理交互及旧会话撤销未验收 |
| PROD-009 | P1 | 备份与恢复演练 | [x] | 同机独立网络和挂载空间恢复、HTTPS、内部 SMTP 入库通过;异机恢复未演练 |
| PROD-010 | P1 | 内部 SMTP 与部署后安全回归 | [✓] | 五项真实收信、双库、产物、未认证 API 均通过 |
| PROD-011 | P1 | 全量测试、竞态、数据库兼容性和压测 | [~] | 60 包分批执行、958 个顶层用例通过;8 处跳过单列,竞态、真实跨库和容量验收未完成 |
| PROD-012 | P1 | 最新版本清库首次安装验收 | [~] | 新部署产物的空数据副本正式初始化 API、协议收信和认证过载恢复通过;真实浏览器首次安装待验收 |
| PROD-013 | P0 | 共享主机资源隔离与容量 | [!] | 首轮全机 OOM 后补充候选服务限额和只读预检;SSH 认证阻塞,尚未部署或测试,实际预算与容量未验收 |
| PROD-014 | P1 | 投递结果写库恢复 | [✓] | 12 项远程测试及源码复审通过;持久故障后的进程退出仍需人工核对,不代表生产故障演练通过 |
| PROD-015 | P1 | 跨平台证书路径与插件测试 | [✓] | Linux 拒绝异平台路径误解析;保持证书校验、托管导入和插件目录权限要求 |
| PROD-016 | P0 | 密码计算全局并发和过载处理 | [✓] | 48 项远程回归及新部署产物三轮真实混合认证过载恢复通过;区分 SMTP 535/454、IMAP UNAVAILABLE、POP3 SYS/TEMP,不代表生产容量或浏览器验收通过 |
状态含义:`[ ]` 未开始,`[~]` 进行中,`[x]` 已完成待复审,`[✓]` 指定范围复审通过,`[!]` 暂缓或存在阻塞。
## 晚间候选进展
- [x] 修正发行工具链版本来源,补充双程序大小和 SHA-256 回执;代码已推送至 `2263779`,新增断言待远程执行。
- [x] 完整构建并单独封存 `review-2263779` Linux/amd64 候选包;目标平台、ELF 文件头、提交号、源码指纹和产物摘要已静态核对,尚未部署。
- [!] 20:14 再次连接 47 服务器仍认证失败,未执行清库、部署或应用测试;资源策略和其余生产门槛继续阻塞。
- [ ] 打包流程自动拒绝错误目标产物、隔离旧目录元数据;本轮以全新封存目录和明确文件清单规避混包,尚未形成自动回归保障。
候选压缩包与边界详见《远程服务器测试记录》晚间章节。既有远程通过项仅对应记录中的历史版本,不代表 `review-2263779` 已通过同样验收。
## 凭据与 SSH
SSH 脚本复用 `test/tools/remote_ssh.py`,强制核对已知主机密钥。不得为连接方便改回自动接受未知主机,也不要把真实值写入命令记录、仓库或文档。
| 环境变量 | 用途 |
| --- | --- |
| `SMAIL_SSH_HOST`、`SMAIL_SSH_PORT` | SSH 主机和端口 |
| `SMAIL_SSH_USER` | 登录账号 |
| `SMAIL_SSH_PASSWORD` | 临时注入的密码,优先协调迁移到密钥认证 |
| `SMAIL_SSH_KEY` | 私钥路径,不是私钥内容 |
| `SMAIL_SSH_KNOWN_HOSTS` | 额外的已核验主机密钥文件路径 |
| `SMAIL_TEST_ADMIN_PASSWORD` | 测试安装时使用的管理员密码 |
| `SMAIL_TEST_SMTP_PASSWORD` | SMTP 示例客户端凭据 |
轮换前必须验证新的独立登录路径,避免锁死服务器访问;还应撤销关联会话、令牌及重复使用该密码的账号凭据,并审查异常登录。历史清理需要单独授权、备份及协作安排,当前未删除文件、重写历史或强推。删除源码中的密码不会让旧密码失效。
## 投递语义与运维边界
- 网页返回提交成功表示邮件和任务已经持久化,不表示收件箱已收到。SMTP 250 仅表示对端接收了投递责任。
- 每收件人独立记录 `queued`、`running`、`accepted`、`failed` 或 `uncertain`。成功收件人不随其他收件人的失败重投。
- 临时失败最多五次,间隔 1、2、4、8 分钟;明确拒绝、证书问题、危险目标和结果不确定停止自动重试。
- DATA 结果不确定、重启时仍在途、旧版本没有可靠尝试记录的邮件必须先核对实际收件结果,再决定人工处理。当前没有已验收的人工重投界面,不要直接改库重排。
- 新版数据库读取失败不领取任务;结果写库失败时单工作器最多保留一份结果,暂停新领取,每秒仅重试写库,不再次调用 SMTP。数据库恢复后自动保存;进程中途退出仍将遗留在途记录转为待核对。相同尝试的相同结果允许重复保存,不覆盖后续尝试;线上部署状态以最新测试记录为准。
- 当前仅允许单实例、单工作器使用同一队列库。没有验收多实例调度、吞吐容量、队列告警和故障期间的服务等级。
- 现有邮件客户端 SMTP 提交、系统通知和其他调用方不自动等同于网页持久队列;分别验收其投递及失败处理。
- 备用 MX 保留既有 25 STARTTLS、587 STARTTLS、465 TLS 顺序;禁止明文降级。各运营商的端口策略及可达性需要独立验证。
## 下一轮验收顺序
1. 验证替代 SSH 登录,完成泄露凭据轮换和访问审计,再另行协调历史清理。
2. 部署覆盖实际域名的受信任证书,使用有效测试账号恢复桌面浏览器验收;移动端遵循指定插件流程。
3. 从正常网页提交邮件,核对持久任务、部分成功、最终状态和实际收件结果;对重启、暂时拒绝、DATA 断连及数据库故障使用受控远程故障环境,不影响其他服务。
4. 用受保护的本地管理命令完成恢复交互,核对新密码登录、旧密码拒绝、旧会话及客户端凭据撤销。不得增加普通 HTTP 或公网/LAN TCP 恢复入口。
5. 在隔离远程目标完成备份恢复、全量与竞态测试、目标数据库兼容性和容量验证。最新版本重新清库安装前,先备份所有项目数据库并核实范围,不清理其他项目数据。
上述阻塞项解决后再做最终生产评审,不以构建成功、首页 200、内部 SMTP 250 或单次提交代替整体验收。
## 2026-09-17 23:00 反代验收更新
- [✓] Smail HTTP 8001、HTTPS 8002 已生效,Nginx 接管公网 80/443,现有 UFW 拒绝外部直连上游端口。
- [✓] 五域名可信证书签发和七个 TLS/STARTTLS 入口检查通过;私钥仅在服务器受保护目录,未进入仓库。
- [✓] 续期未到期任务、六项远程隔离回归、可信 HTTPS 首页及入口资源检查通过。
- [!] 到期续期维护窗口、外部告警、代理后的客户端 IP 限流、恢复页面外部端口仍需整改或演练。
- [~] 安装 Nginx 后原 128 MiB 保留预算的只读预检再次通过,无新增 OOM;这不是生产容量批准。
- [!] 真实浏览器首次安装与发信、管理员恢复撤销、凭据轮换和异机恢复继续待验收。
详细配置、备份、证书与证据见《Nginx反代与证书部署说明》和《远程服务器测试记录》。本轮没有业务数据写入或清库,没有把传输层检查冒充首次安装测试。
## 资源与测试隔离
47 服务器约 1.6 GiB 内存,晚间复核已有约 4 GiB 主机交换空间,Smail 的 `MemorySwapMax` 仍为零;同机另有 MySQL、Scert 等服务。首轮测试仅设置 Go 软内存上限,不能防止全机内存耗尽。新工具通过 systemd 设置 CPU、内存、进程数和最长运行时间上限,使用独立网络、私有临时目录,并禁止访问线上 `/opt/smail`、`/run/smail`。可用内存不足时拒绝开始测试,不自动放宽限制、不停止其他项目。
`GOMEMLIMIT` 是 Go 回收目标,不是进程或主机硬限制。本轮协议测试以 128 MiB cgroup 上限、25% CPU 配额和 64 MiB Go 回收目标完成,不能据此推导生产容量。生产仍需确定同机服务预算、并发认证开销、邮件大小与吞吐上限、告警和故障恢复指标。
恢复服务整包执行曾在 128 MiB 上限触发测试 cgroup OOM,改为逐顶层用例独立进程后 14 项通过,峰值约 126.4 MiB。没有降低 Argon2id 的 64 MiB 内存参数;不能把拆分测试视为生产内存问题已解决。测试启动器默认 128 MiB,并对不存在的包、空清单和零匹配筛选返回失败;中断包保留运行中记录。
后续认证整改在整个进程内仅允许一个昂贵密码计算,满载立即返回可重试错误,不建立等待队列;HTTP 返回 503,SMTP 返回 454,IMAP 和 POP3 返回临时不可用。恢复服务不会把容量不足视为错误恢复码或消耗验证机会,前端不会因此清空输入或宣称链接失效。前端测试使用同样的独立网络和生产目录访问限制,128 MiB 硬上限下峰值约 73.7 MiB;测试通过不代表已测得生产可承载并发量。