7.9 KiB
生产整改验收清单
范围与结论
本清单对应 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 的清库安装要求。
任务状态
| 编号 | 优先级 | 任务 | 状态 | 验收边界 |
|---|---|---|---|---|
| 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 和正式域名验证 | [!] | 仍使用自签名测试证书,不关闭证书校验 |
| 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 | 最新版本清库首次安装验收 | [ ] | 当前为保留数据升级,不能沿用旧版本清库结果 |
| PROD-013 | P0 | 共享主机资源隔离与容量 | [!] | 首轮测试期间发生全机 OOM,MySQL 被终止后自动重启;必须补齐资源规划 |
| PROD-014 | P1 | 投递结果写库恢复 | [✓] | 12 项远程测试及源码复审通过;持久故障后的进程退出仍需人工核对,不代表生产故障演练通过 |
| PROD-015 | P1 | 跨平台证书路径与插件测试 | [✓] | Linux 拒绝异平台路径误解析;保持证书校验、托管导入和插件目录权限要求 |
状态含义:[ ] 未开始,[~] 进行中,[x] 已完成待复审,[✓] 指定范围复审通过,[!] 暂缓或存在阻塞。
凭据与 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 顺序;禁止明文降级。各运营商的端口策略及可达性需要独立验证。
下一轮验收顺序
- 验证替代 SSH 登录,完成泄露凭据轮换和访问审计,再另行协调历史清理。
- 部署覆盖实际域名的受信任证书,使用有效测试账号恢复桌面浏览器验收;移动端遵循指定插件流程。
- 从正常网页提交邮件,核对持久任务、部分成功、最终状态和实际收件结果;对重启、暂时拒绝、DATA 断连及数据库故障使用受控远程故障环境,不影响其他服务。
- 用受保护的本地管理命令完成恢复交互,核对新密码登录、旧密码拒绝、旧会话及客户端凭据撤销。不得增加普通 HTTP 或公网/LAN TCP 恢复入口。
- 在隔离远程目标完成备份恢复、全量与竞态测试、目标数据库兼容性和容量验证。最新版本重新清库安装前,先备份所有项目数据库并核实范围,不清理其他项目数据。
上述阻塞项解决后再做最终生产评审,不以构建成功、首页 200、内部 SMTP 250 或单次提交代替整体验收。
资源与测试隔离
47 服务器约 1.6 GiB 内存,无交换空间,另有 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,并对不存在的包、空清单和零匹配筛选返回失败;中断包保留运行中记录。