Smail/docs/生产整改验收清单.md
smail ead4cf53d6
Some checks are pending
Security Checks / security (push) Waiting to run
记录整改版本部署回归及生产放行限制
2026-09-17 11:36:02 +08:00

7.9 KiB
Raw Blame History

生产整改验收清单

范围与结论

本清单对应 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 顺序;禁止明文降级。各运营商的端口策略及可达性需要独立验证。

下一轮验收顺序

  1. 验证替代 SSH 登录,完成泄露凭据轮换和访问审计,再另行协调历史清理。
  2. 部署覆盖实际域名的受信任证书,使用有效测试账号恢复桌面浏览器验收;移动端遵循指定插件流程。
  3. 从正常网页提交邮件,核对持久任务、部分成功、最终状态和实际收件结果;对重启、暂时拒绝、DATA 断连及数据库故障使用受控远程故障环境,不影响其他服务。
  4. 用受保护的本地管理命令完成恢复交互,核对新密码登录、旧密码拒绝、旧会话及客户端凭据撤销。不得增加普通 HTTP 或公网/LAN TCP 恢复入口。
  5. 在隔离远程目标完成备份恢复、全量与竞态测试、目标数据库兼容性和容量验证。最新版本重新清库安装前,先备份所有项目数据库并核实范围,不清理其他项目数据。

上述阻塞项解决后再做最终生产评审,不以构建成功、首页 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,并对不存在的包、空清单和零匹配筛选返回失败;中断包保留运行中记录。