15 KiB
生产整改验收清单
范围与结论
最新复核: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] 已完成待复审,[✓] 指定范围复审通过,[!] 暂缓或存在阻塞。
晚间候选进展
- 修正发行工具链版本来源,补充双程序大小和 SHA-256 回执;代码已推送至
2263779,新增断言待远程执行。 - 完整构建并单独封存
review-2263779Linux/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 顺序;禁止明文降级。各运营商的端口策略及可达性需要独立验证。
下一轮验收顺序
- 验证替代 SSH 登录,完成泄露凭据轮换和访问审计,再另行协调历史清理。
- 部署覆盖实际域名的受信任证书,使用有效测试账号恢复桌面浏览器验收;移动端遵循指定插件流程。
- 从正常网页提交邮件,核对持久任务、部分成功、最终状态和实际收件结果;对重启、暂时拒绝、DATA 断连及数据库故障使用受控远程故障环境,不影响其他服务。
- 用受保护的本地管理命令完成恢复交互,核对新密码登录、旧密码拒绝、旧会话及客户端凭据撤销。不得增加普通 HTTP 或公网/LAN TCP 恢复入口。
- 在隔离远程目标完成备份恢复、全量与竞态测试、目标数据库兼容性和容量验证。最新版本重新清库安装前,先备份所有项目数据库并核实范围,不清理其他项目数据。
上述阻塞项解决后再做最终生产评审,不以构建成功、首页 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 内存,无交换空间,另有 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;测试通过不代表已测得生产可承载并发量。