# 远程服务器测试记录 ## 范围 2026 年 9 月 16 日,用户指定在 `47.108.78.12` 测试,并授权清理测试数据库。远程部署目录为 `/opt/smail`,服务为 `smail.service`,网页为 `https://mail.example.com/`。 本轮应用运行、自动测试二进制执行和业务验收均针对远程服务器。本机只进行源码操作、编译、SSH 连接和远程网页浏览;没有启动本机 Smail 或本机开发服务器。此前《清库部署测试记录》的本机结果属于历史记录,不作为本轮远程通过依据。 ## 任务状态 - [✓] 批量已读事务原子性修复已编译为 Linux amd64,并部署到 47 服务器;服务版本指纹和二进制摘要核对通过。 - [✓] 批量已读部署前完成主程序及两份 SQLite 备份,备份数据库完整性校验通过;部署过程中未清理账号、配置或历史邮件。 - [!] 批量已读网页实机登录受测试账号密码已失效阻塞;未通过数据库改密或其他方式绕过登录边界。代码自动测试已覆盖混合归属拒绝、更新失败回滚、重复 ID 和非法 ID。 - [✓] 新部署版本在远程 `127.0.0.1:25` 完成内部 SMTP 回归,五项用例均完成真实 SQLite 归属核对。 - [✓] 核实仅使用两份 SQLite,备份校验后清空数据库对象,保留数据库文件及 inode。 - [✓] 清库后通过独立浏览器上下文完成首次安装、超级管理员登录与安全引导确认。 - [✓] 修复首次安装完成后未生成分区配置,实际生成五份配置文件,配置管理页面可正常读取。 - [✓] 重启远程服务后,无缓存刷新仍保持登录,已确认的安全引导不重复出现。 - [✓] 浏览器创建普通用户,普通用户可登录;密码长度不符时返回中文错误。 - [✓] 修复收件人、抄送、密送输入后直接回车未选中候选的问题,远程浏览器逐项复测通过。 - [✓] 主界面使用中文组件语言,空列表、关闭对话框、关闭标签、数值按钮均有实际页面证据。 - [✓] 配置、安装及管理员恢复相关 Linux 测试包在远程执行通过。 - [✓] 恢复 socket 为 `smail:smail 0600`;非授权服务账号直接运行恢复工具被拒绝。 - [✓] 内部 25 端口真实收信、中文正文、多收件人、中文附件及下载内容通过。 - [✓] 普通用户不能读取管理员专属邮件或下载其真实附件。 - [!] 网页按 MX 路由的实际投递未通过:网络连接与证书信任阻塞,未绕过校验;按最新要求不再要求公网 25 端口连通。 - [✓] 修复异步发信提前显示成功:网页提交显示正在投递,列表先显示待投递,手动刷新后显示实际失败。 - [✓] 修复 587 端口误用隐式 TLS,远程 STARTTLS 已进入证书校验阶段。 - [!] 当前仍使用原有定时与手动刷新机制;快速状态轮询、进程中断后的待投递恢复未验收。 - [!] 正式 `systemctl start smail-admin` 密码代理交互、新密码登录及旧会话失效闭环未完成。 - [!] 外部邮箱验证码恢复未完成,需要确定实际可接收验证码的测试邮箱。 - [!] 受信任 TLS、移动端及全部业务模块验收未完成。 ## 已部署修复 `3ae8ecb` 修复批量已读事务原子性:批量 ID 去重并校验,事务内先确认全部邮件属于当前用户,任一邮件不属于当前用户或任一更新失败时整批拒绝并回滚;新增混合归属、更新失败回滚、重复 ID 和非法 ID 自动测试。 2026 年 9 月 17 日 00:34,47 服务器部署该提交对应的 Linux amd64 主程序。源码指纹为 `fd6737820921cb382743ab2537fe7de72a1c47084e974368a47fde966fff0447`,版本日志为 `remote-fd6737820921`,远程 `/opt/smail/smail` SHA-256 为 `5422129011db2fa9faaef5fd65bb022628e084dd6c0e0f1f5cbed4fea35f3696`。部署后 `smail.service` 为 `active`,主进程退出状态为 0,25、80、443 正常监听;两份 SQLite 的 `PRAGMA integrity_check` 均为 `ok`。 部署前备份保留于 `/var/backups/smail-before-batch-read-20260917-003225`,包含原主程序、`smail.db` 和 `smail-state.db`。首次错误格式产物曾短暂触发 systemd `Exec format error`,已立即用备份恢复并确认服务 active,随后使用明确 `GOOS=linux GOARCH=amd64 CGO_ENABLED=0` 的 ELF 产物重新部署;错误格式文件未继续运行,数据库和配置未受影响。 `3d5c94e` 修复首次安装完成后未启用分区配置管理。首次完成安装时通过现有迁移校验发布分区配置,失败不直接标记初始化完成;不强制迁移已经正常运行的旧版实例。 `b93ea9d` 修复收件人回车选择并统一主界面组件中文。地址选择器启用默认候选,主应用通过组件配置提供中文语言。 `49ab24b` 修复异步邮件投递状态与 587 端口加密协议。邮件与用户关联先以既有待投递状态入库;列表接口返回真实状态,页面不再将错误文本为空当作成功;587 使用 STARTTLS,保留证书校验及禁止明文回退的边界。 `416b849` 修复标准 MIME 中文附件名称解析。原正则无法识别 RFC 2231 的 `filename*=`,导致真实收信附件名变成 `no_name_file`;改为使用现有 `go-message` 参数解析器,保留 `Content-Type name` 优先级,新增普通名称、带分号名称、UTF-8 扩展参数、分段参数、编码词、旧式名称、优先级、缺省及非法参数共九个用例。 两次清库安装后,前端修复及邮件状态修复均采用备份后保留数据库的升级部署,用于同轮故障回归和验证会话、配置保持,不宣称这些版本又进行了一轮全新清库安装。 最终 Smail 二进制 SHA-256: ```text e0455f8156f4bc0ff25136ffb39e42566b0b154165eb3ce8eb4fb937ba6fe1f6 ``` 远程服务在部署后保持 active,HTTP 80、HTTPS 443 正常监听。`config.json`、`email.json`、`plugins.json`、`smtp.json`、`ssl.json` 均为 `smail:smail 0600`。 ## 邮件与证书证据 从超级管理员网页向新建普通用户发送中文测试邮件。发件页面提交后返回列表,最初显示发送成功,但收件账号的收件箱和广告箱均未见该邮件。服务器 20:44 日志记录: 1. 连接 `47.108.78.12:25` 超时。 2. 587 回退使用隐式 TLS,返回 `first record does not look like a TLS handshake`;代码与当前 STARTTLS 端口语义不一致,需要单独整改。 3. 465 投递被 `x509: certificate signed by unknown authority` 拒绝。 发件箱手动刷新后显示发送失败,说明最终错误已落库;最初成功提示来自异步投递前的状态,不能作为投递成功依据。 21:05 对 `49ab24b` 进行真实网页回归:向同一测试用户提交“投递状态远程回归 2104”,页面提示“邮件已提交,正在投递”,发件箱立即显示“待投递”。21:05:32 日志记录 25 端口超时后,587 STARTTLS 因证书不受信任终止,不再出现原来的 TLS 协议错误。21:06 手动刷新后,列表仅显示“发送失败”,无横向溢出。没有宣称自动刷新时效已经通过验证。 从 47 服务器执行 `openssl s_client -starttls smtp -connect mail.example.com:587 -servername mail.example.com -verify_return_error -brief`,已进入证书验证并返回 `self-signed certificate`,未关闭证书校验、未发送邮件内容。 原证书仅覆盖 `*.example.com`,安装校验因不覆盖主域名 `example.com` 而拒绝。测试改用服务器已有的 `custom.crt`、`custom.key`,覆盖主域名和通配域名,但属于自签名证书。当前公网服务仍使用该测试证书,浏览器提示证书不受信任。需要提供覆盖所需域名的受信任证书,不能将本轮功能检查当作生产 TLS 验收。 安装向导公网 IP 检测未成功;远程访问 `api.ipify.org:443` 失败,未修改外部 DNS,也未使用网页 DNS 解析结果冒充探测结果。 ## 自动验证与限制 - `setup.test`、`config.test` 在远程以 `smail` 身份执行通过。 - `adminreset.test` 在远程以 `smail` 身份执行全部通过,覆盖调用身份、一次性挑战、防重放、过期、socket 权限、重置事务与凭据撤销。 - `email.test`、`send.test`、`smtp.test` 在远程以 `smail` 身份执行全部通过,新增实际持久化函数待投递状态、关联写入失败回滚、列表接口三种状态回归。测试使用隔离内存数据库,不写部署业务库。 - `parsemail.test` 在远程以 `smail` 身份执行全部通过,包含九个新增附件名称用例以及既有正文、隐私和 XSS 用例。 - 配置测试曾因从 `/root` 继承工作目录而失败,改在服务账号可访问的测试目录执行后通过,没有放宽权限。 - 前端生产构建与 Linux Go 编译通过;构建有编辑器块超过 500 kB 的提示。 - 本次没有重新执行全部后端包、竞态测试或前端自动测试,不能沿用此前本机全量测试作为远程全量结论。 - 桌面浏览器已检查页面快照、截图和发件页控制台,所查控制台没有错误;未进行移动端检查。 - 键盘选择回归仅检查表单行为,未向不存在的选择测试地址发送邮件。 ## 内部 25 端口验收 ### 2026 年 9 月 17 日部署后回归 在最新 `3ae8ecb` 部署版本上,从 47 服务器本机连接 `127.0.0.1:25`,没有使用公网 25 端口。运行号为 `20260917-003640`,结果和本轮双库备份保留于 `/var/backups/smail-internal-smtp-20260917-003640/result.json`。五项测试均使用 TLS 1.3,SMTP DATA 返回 250,并以真实 SQLite 记录核对结果: | 用例 | 邮件 ID | 实际结果 | | --- | --- | --- | | 中文纯文本 | 20 | 仅普通用户 `remotecheck` 关联,正文核对一致 | | HTML 与中文附件、多收件人 | 21 | 管理员和普通用户均关联,附件及字节核对通过 | | 管理员专属附件 | 22 | 仅管理员关联 | | 未知本域收件人 | 23 | 当前过滤级别 0,转管理员收件箱 | | 未认证外域收件人 | 24 | 当前策略转管理员收件箱,无发信记录 | 本轮内部 SMTP 结果只证明远程本机接收链路和实际持久化正常,不代表公网 SMTP 投递、受信任 TLS 或网页发信闭环已通过。 根据用户最新要求,仅从 47 服务器连接 `127.0.0.1:25`,不要求公网 25 端口连通。测试脚本为 `test/tools/internal_smtp_check.py`,本机没有执行该脚本。测试客户端显式信任服务器现有测试证书,仍校验 `mail.example.com` 主机名、证书有效期和证书链;没有修改应用证书校验、系统 CA、DNS 或中继配置。 21:26:17 最终一轮五项测试全部完成,全部使用 TLS 1.3,SMTP DATA 返回 250,随后核对真实 SQLite 数据与用户关联,并非仅以协议返回码判定成功: | 用例 | 邮件 ID | 实际结果 | | --- | --- | --- | | 中文纯文本 | 15 | 仅普通用户收件,正文一致 | | HTML 与中文附件、多收件人 | 16 | 管理员和普通用户均关联,正文、附件名及附件字节一致 | | 管理员专属附件 | 17 | 仅管理员关联,用于附件越权对照 | | 未知本域收件人 | 18 | 当前过滤级别 0,转管理员收件箱 | | 未认证外域收件人 | 19 | 当前策略转管理员收件箱,仅有收信记录,没有发信记录 | TLS 前未公布 AUTH,主动尝试明文 AUTH 返回 523。未认证外域邮件走收信分支,不调用发信路径;本轮没有公网抓包,不将该检查描述为所有中继场景的完整安全验收。当前未知地址和外域地址均不是在 RCPT 阶段拒绝,管理员兜底行为保持原样。 早期脚本误以为未知收件人必定丢弃,实际只读诊断确认当前过滤级别为 0、SPF 状态为通过、DKIM 状态为未通过,且邮件仅属于管理员。修订脚本显式要求当前过滤级别为 0,再验证准确归属,没有为让测试通过而修改业务策略。 桌面浏览器无缓存刷新后保持普通用户登录,列表可见中文邮件,详情显示中文 HTML 和“中文验收附件.txt”。附件 12 的下载内容与发送字节一致。管理员专属附件 17 在管理员会话中返回正确内容,在普通用户会话中返回业务错误“附件不可用”,没有附件数据。普通用户访问管理员邮件详情 13 返回“读取邮件失败”,自己的详情 12 正常返回。权限对照使用正常 CSRF 请求头;首次缺少该头的来源校验拒绝不作为用户隔离证据。 以上拒绝接口当前 HTTP 状态仍为 200,应依据业务错误码和无数据结果判断,不能仅看 HTTP 状态。详情页面未发现横向溢出。本轮未进行移动端验收,也未重新执行完整清库安装:保留同轮故障邮件和会话,完成备份后升级回归。 本轮内部 SMTP 结果及双库备份保留于 `/var/backups/smail-internal-smtp-20260916-212617`,目录内 `result.json` 可复核。本轮通过的是内部接收链路,不代表网页按 MX 路由发信闭环或公网受信任 TLS 已通过。 ## 备份与保留 以下目录均位于远程服务器,包含敏感运行数据,不提交仓库: - `/var/backups/smail-before-reset-20260916-201834`:第一轮清库前备份。 - `/var/backups/smail-before-reset-20260916-202943`:第二轮清库前备份。 - `/var/backups/smail-before-reset-20260916-205033`:前端修复升级前备份,本次未执行清库。 - `/var/backups/smail-before-reset-20260916-210318`:邮件状态及 STARTTLS 修复升级前备份,本次未执行清库。 - `/var/backups/smail-before-reset-20260916-212132`:中文附件解析修复升级前完整备份,本次未执行清库。 备份均对完整归档进行比较与 SHA 校验。两份数据库 inode 保持为 `smail.db=915735`、`smail-state.db=915727`。旧配置及迁移源已归档,没有删除其他项目文件,没有操作同机 Scert、MySQL 或 PostgreSQL 数据。 最新备份归档 SHA-256: ```text 9f712cb881db6acdcdefb1c20c5244524107529409196be810f8bb4d4c832c58 ``` 测试用户与失败邮件保留用于后续复核,密码、密钥及会话凭据不写入记录。 ## 2026 年 9 月 17 日后续批量已读验收审查 本轮继续只在 `47.108.78.12` 执行远程验收,没有启动本机 Smail 服务,也没有修改远程账号密码、伪造会话或清理数据库。远程环境复核结果如下: - `smail.service` 为 `active`,主进程退出状态为 0;远程 `/opt/smail/smail` SHA-256 仍为 `5422129011db2fa9faaef5fd65bb022628e084dd6c0e0f1f5cbed4fea35f3696`。 - 远程运行文件确认为 Linux x86-64 ELF;25、80、443 及邮件协议端口均保持监听。 - `smail.db` 与 `smail-state.db` 的 `PRAGMA integrity_check` 均返回 `ok`,已有批量已读部署前备份及内部 SMTP 测试备份仍保留。 - 从 47 服务器本机通过 HTTPS 回环访问登录页返回 200;未认证访问 `/api/v1/user/info` 和 `/api/v1/email/list` 均返回业务错误码 403“登录已过期”。 - 未认证调用 `POST /api/v1/email/read`,请求 ID 为 `[20,21]`,返回业务错误码 403;调用前后相关 `user_email.is_read` 值均为 `2:20:0,1:21:0,2:21:0`,没有越权修改。 - 继续尝试了当前数据库中的 `admin`、`remotecheck` 账号和已有候选密码,均返回“账号或密码错误”;没有可用的授权网页测试会话。 - Chrome DevTools 访问远程站点时被现有自签名证书拦截,停留在证书错误页;这与此前记录的受信任 TLS 阻塞一致,不能据此宣称网页渲染或真实点击验收通过。 因此,本轮审查确认服务、部署产物、数据库完整性及未认证接口边界正常;批量已读的真实网页登录、选择邮件、点击“标记为已读”、刷新页面和混合归属网页请求仍保持阻塞,待提供有效测试账号及受信任测试证书后继续。数据库没有执行清理,历史测试邮件和备份继续保留。 ## 2026 年 9 月 17 日生产整改升级回归 本节记录后续生产整改版本,不覆盖前文历史证据。本轮应用及测试二进制仍只在 `47.108.78.12` 运行;本机仅进行源码检查、前端构建、Linux 交叉编译和 SSH 操作。本轮采用备份后保留双库升级,没有清库,不作为重新安装验收。 ### 整改内容 - 测试及部署脚本统一读取环境变量中的 SSH 凭据,校验已知主机密钥,不再自动信任未知主机。网页安装及 SMTP 示例密码也改为环境变量输入。 - 网页发信在同一事务内保存邮件、用户关联及每收件人的持久投递任务。进程重启后,尚未尝试的任务可以继续;已在途任务及旧版无队列的待投递邮件标记为“投递结果待核对”,不盲目重投。 - 临时网络、DNS 或 SMTP 4xx 失败最多尝试五次,间隔为 1、2、4、8 分钟。明确拒绝、证书错误、私网目标和 DATA 结果不确定均不自动重试。 - MX 按优先级排序并去重,支持备用 MX、无 MX 时使用域名自身及 Null MX 拒绝;保留既有安全端口回退。邮件头保留完整收件信息,队列任务只投递当前收件人的 SMTP 信封。 - SMTP DATA 最终 250 后的 QUIT 异常不再误判失败;发送 DATA 后失去明确结果的任务暂停核对。结果写库失败只重试数据库写入,不重复调用 SMTP。 - 后台投递接入在线数据库迁移排空边界;停机等待投递结束,不提前关闭仍在使用的数据库。投递状态更新不恢复已放入回收站的用户关联。 ### 自动测试 七个相关 Linux 测试包在远程以 `smail` 账号执行,使用隔离内存或临时数据库,不改部署业务库。共 132 个顶层测试用例通过,日志保留在 `/var/tmp/smail-review-20260917/*.result.log`。 | 测试包 | 顶层用例数 | 结果 | | --- | --- | --- | | `outbox` | 10 | 通过 | | `utils-send` | 11 | 通过 | | `utils-smtp` | 8 | 通过 | | `controllers-email` | 12 | 通过 | | `db-migration` | 26 | 通过 | | `res_init` | 14 | 通过 | | `services-dbmigration` | 51 | 通过 | 新增覆盖包括部分投递成功、防重复领取、退避及重试上限、DATA 不确定结果、结果写库故障、读取失败、旧待投递记录、重启恢复、停机超时、回收站状态、队列插入失败整事务回滚和迁移等待后台投递。这里的测试通过不等于真实网页登录发信闭环已通过。 前端生产构建和 Linux amd64 编译通过,仍有编辑器分块超过 500 kB 的构建提示。没有重新执行全部后端包、竞态检测、移动端、真实 MySQL 或 PostgreSQL 验证。 后续工具静态编译发现本轮涉及的 `debug_ssh.py`、`test_echo.py` 原有引号缺失,已修正;没有执行会打印邮件或日志内容的诊断脚本。全工具目录静态编译仍受未改动的 `check_page.py` 语法错误及 `test_login_dashboard_backup.py` 编码错误影响,不宣称所有历史工具均可运行。静态编译只检查 Python 源码,不在本机执行应用或测试业务。 ### 部署证据 2026 年 9 月 17 日 10:06 完成双程序升级,版本为 `remote-13bcad90e832`,源码指纹为 `13bcad90e832a9be78604854a1c91f72cfaf2a21770481c627e50ac361ce3b70`。 | 项目 | 结果 | | --- | --- | | `/opt/smail/smail` SHA-256 | `a3b4a0b0e75213bb7997fa55f789d98bca027e879c9dbfe986f7b1ee8c8230d9` | | `/opt/smail/smail-admin` SHA-256 | `16e48a16d3f47ab78b42fb1aa854dfc32ec2ccd3a95694c6ccb93fc1da075e34` | | 数据库迁移版本 | 23 | | 两份 SQLite 完整性 | 均为 `ok` | | 服务状态 | `active/running`,`NRestarts=0`,`ExecMainStatus=0` | | 本地恢复 socket | `/run/smail/admin-control.sock`,`smail:smail 0600` | | HTTPS 首页 | 显式测试 CA、主机名校验下返回 200 | | 未认证用户信息、邮件列表接口 | 均返回业务码 403,无业务数据 | | 本次检查时段日志 | 25 条 journal 记录,未发现 error、fatal 或 panic 标记 | 完整停服备份为 `/var/backups/smail-before-outbox-20260917-100608`,归档 SHA-256 为 `a2ed56666e9e691a63dfc6734ebe2a1e9c7bf2fe4ceb81cb55028e66ea52d016`;包含原主程序、管理员工具、双库及完整部署归档。归档比对和数据库备份完整性检查通过,没有删除历史文件。此次部署成功,未实际演练失败回滚或异机恢复。 ### 内部 SMTP 回归 运行号 `20260917-100912`,仅从远程连接 `127.0.0.1:25`。五项均使用 TLS 1.3,DATA 返回 250,并核对真实数据库归属、正文和附件字节: | 用例 | 邮件 ID | 结果 | | --- | --- | --- | | 中文纯文本 | 27 | 仅普通用户关联,正文一致 | | HTML、中文附件及多收件人 | 28 | 管理员和普通用户关联,附件一致 | | 管理员专属附件 | 29 | 仅管理员关联 | | 未知本域收件人 | 30 | 过滤级别 0 下转管理员收件箱 | | 未认证外域收件人 | 31 | 转管理员收件箱,无发信记录 | 结果及测试前双库备份位于 `/var/backups/smail-internal-smtp-20260917-100912`。没有修改过滤策略、系统 CA、证书验证或 DNS;客户端仅显式信任已有测试证书。内部接收链路通过,不代表网页发信、外部投递或生产 TLS 验收通过。 ### 结论与限制 - [✓] 本轮指定的七包测试、部署产物核对、双库完整性、内部 SMTP 和未认证接口边界复审通过。 - [x] 凭据硬编码清理完成;工作区已知旧 SSH 密码扫描零命中,但旧密码仍有效,Git 历史仍含旧凭据,不能视为泄露处置完成。 - [!] 新队列尚未完成真实网页登录发信闭环;部署后的队列表为空,不能用入站 SMTP 回归代替出站队列业务验收。 - [!] 当前队列按单实例、单工作器运行,未压测。结果落库持续失败时保留在途任务,需要告警和受控重启后转为待核对;不得人工直接改回排队状态。 - [!] 受信任 TLS、凭据轮换、正式管理员恢复交互、新密码登录与旧会话撤销、灾备恢复及全量兼容性验证仍未完成。 当前结论仍为:适合继续受控远程验收,不建议直接用于正式生产。后续门槛见《生产整改验收清单》。 ## 2026 年 9 月 17 日投递结果恢复与扩展验收 本轮从 10:30 开始。继续只在 47 服务器执行业务和自动测试,本机仅源码检查、交叉编译与 SSH 操作。没有清理线上双库,没有删除历史日志和备份,没有修改其他项目配置。修改前检查点 `d3d4f5d`、`7f719ab` 已推送。 ### 本轮整改 - 单工作器保留一个未落库投递结果;数据库故障期间停止新领取,恢复后只保存结果,不重复发送 SMTP。首次结果与退避时间固定;相同尝试的相同结果支持幂等保存,旧尝试不得覆盖新状态。 - Linux 识别 Windows 盘符路径并明确拒绝非本机绝对路径,避免错误地拼接至项目目录。有效本机任意路径、证书及密钥校验和托管导入继续保留。 - 插件测试分别验证普通用户创建目录被拒绝,以及 root 所有目录的原子写入,不放宽生产目录所有者校验。 - IMAP 原始协议测试增加 15 秒读写期限,避免无限等待。 - 新增逐包交叉编译、远程测试执行、systemd 资源隔离及备份恢复工具。逐轮日志单独保存,不覆盖上一轮结果。 ### 首轮异常与处置 60 个测试包完成首轮执行,其中插件权限、异平台证书路径断言失败,IMAP 和 SMTP 包超时。现场负载曾达 74,内核记录 11:00:20 发生全机 OOM,MySQL 进程被系统终止后自动重启。首轮没有硬资源或网络隔离,不将此轮描述为无影响验收,也不能仅凭现有证据将全部压力归因于单个测试。 收敛后确认原测试执行器和测试二进制均已结束,Smail、MySQL、Scert 均为运行状态;Smail 主 PID `548293` 未变。没有停止其他项目进程。首轮日志保留在 `/var/tmp/smail-review-full-20260917/results.json` 及各包 `result.log`。 受限启动器第一次因私有临时目录遮住包目录而在测试前失败,补充项目目录映射后正常。IMAP 在 128 MiB cgroup 下首次被局部 OOM 终止,调整测试专属 Go 回收参数后通过,未削弱生产密码算法。192 MiB 尝试因可用内存不足被预检拒绝,没有执行。 ### 定向复测 | 范围 | 顶层通过数 | 证据 | | --- | --- | --- | | 插件普通用户权限分支 | 17 | `results-20260917-110801/backend-hooks.log`;跳过 Windows 专属策略 | | 投递队列 | 12 | `results-20260917-110801/backend-services-outbox.log` | | 证书路径和导入 | 19 | `results-20260917-110801/backend-services-setup-ssl.log` | | 插件 root 原子写入 | 1 | `smail-plugin-root-review-20260917-1110.service` journal | | IMAP 全包 | 31 | `results-20260917-111234/backend-listen-imap_server.log` | | SMTP 全包 | 35 | `results-20260917-111234/backend-listen-smtp_server.log` | 上述相对日志均位于 `/var/tmp/smail-review-full-20260917/`。协议复测使用 128 MiB 硬上限、25% CPU、独立网络及禁止访问生产目录,峰值约 121.1 MiB,用时约 19 秒。SMTP 定向样本两项也在 64 MiB 上限下通过。协议超时在隔离环境中未重现,不据此宣称已定位原超时的唯一原因。 ### 备份恢复演练 使用 `/var/backups/smail-before-outbox-20260917-100608/smail.tar.gz`,核对归档 SHA-256 `a2ed56666e9e691a63dfc6734ebe2a1e9c7bf2fe4ceb81cb55028e66ea52d016` 后,在 `/var/tmp/smail-review-restore-20260917-111022/` 恢复。 - 恢复前后双库完整性通过,逐表数量记录在受保护的 `result.json`。 - 副本在独立挂载和网络命名空间启动,128 MiB 硬上限、25% CPU,HTTPS 就绪检查通过。 - 仅连接副本网络空间内部 `127.0.0.1:25`,STARTTLS 后投递一封邮件,确认副本库新增一条,线上库没有该消息。 - 线上服务主 PID 保持不变;演练结束后副本服务已停止,恢复数据和证据保留。 这是同机隔离恢复,不代表异机灾备、恢复时限承诺或最新版本清库安装验收。 ### 分批全包复测结果 11:18 恢复服务整包测试达到 128 MiB 硬上限,systemd 返回 `oom-kill`。内核明确记录 `CONSTRAINT_MEMCG`,终止范围为 `smail-tests-20260917-111329.service`;该次没有重启线上 Smail、MySQL 或 Scert。不能称整轮一次性通过。 保留原失败证据后,将其余 22 包和恢复服务分别补跑,仍使用同一份 Linux 测试二进制。恢复服务采用逐顶层用例独立进程,14 项通过,用时约 75 秒,峰值约 126.4 MiB,未降低生产密码哈希强度。三批已完成记录按包去重并与 60 包清单核对,总计 958 个顶层用例通过: | 批次 | 完成包数 | 日志目录 | | --- | --- | --- | | 前段已完成包 | 37 | `results-20260917-111329` | | 后段补跑 | 22 | `results-20260917-112034` | | 恢复服务逐用例补跑 | 1 | `results-20260917-112305` | 目录均位于 `/var/tmp/smail-review-full-20260917/`。以下 8 处跳过没有计为通过: - `TestMaster`:完整主服务集成测试未启用。 - `TestMySQLIntegration`、`TestPostgresIntegration`:未提供真实专用测试数据库。 - `TestPortableSQLIntegration/mysql`、`postgresql`、`mysql_postgresql`:真实跨数据库分支未启用。 - `TestProductionPluginIsolationPolicy`:Windows 专属策略不能由 Linux 执行证明。 - `TestSecuritySetupBrowserFixture`:浏览器夹具未启用,不能代替实际网页验收。 11:26 只读复核:Smail、MySQL、Scert 均运行,主 PID 分别为 `548293`、`549584`、`530794`;MySQL 重启计数仍为首轮事故后的 1。双库完整性通过、迁移版本 23、队列表为空、恢复 socket 为 `0600`,未认证用户信息及邮件列表均返回业务码 403。11:18:08 后未发现新增 OOM。此时线上版本尚为 `remote-13bcad90e832`,新代码未部署。 ### 新版部署与复审 整改提交 `1b2ba5a`、测试工具及记录提交 `421aa73` 已推送。11:29 从干净工作区交叉编译,主程序与管理员工具使用相同版本 `review-421aa7303d3b`、相同 Git 标识和 Go `1.26.6`。编译前后源码指纹一致: ```text 834910cbd25517450d3010366c974d77c22929b55c6d69a36cc988f6971c968a ``` 11:30 先停服完整归档并核对归档内容和双库备份,再升级双程序。备份目录为 `/var/backups/smail-before-outbox-20260917-113007`,归档 SHA-256 为 `f8501848469039c168bfb64c426aff28f289d31694441ced0c5361344a9450fd`。没有清理双库或删除文件,没有实际触发失败回滚。 | 项目 | 结果 | | --- | --- | | 主程序 SHA-256 | `9dee9305d1faeb55552ac90d8f002352ff47ebf8f4eefc303f7092e95f7f1a9b` | | 管理员工具 SHA-256 | `b041fc44246a30634b41ba3a73125f2d63b713ead659c56d41e8dd3d2a5cd0e6` | | Smail 服务 | `active/running`,PID `552932`,重启计数 0,主进程退出状态 0 | | 双库及迁移 | 完整性均 `ok`,迁移版本 23 | | 恢复 socket | `0600`,所有者与业务库一致 | | 未认证用户信息、邮件列表 | 业务码均为 403,无业务数据 | | 同机服务 | MySQL PID `549584`、Scert PID `530794` 未因本次部署变化 | | 部署后 OOM | 截至本次检查新增 0 次 | 11:31 在 `127.0.0.1:25` 完成五项 TLS 1.3 真实收信检查: | 用例 | 邮件 ID | 数据核对 | | --- | --- | --- | | 中文纯文本 | 33 | 仅普通用户关联、正文一致 | | HTML、中文附件、多收件人 | 34 | 两位指定用户关联、附件名称和字节一致 | | 管理员专属附件 | 35 | 仅管理员关联 | | 未知本域地址 | 36 | 当前过滤级别 0,转管理员收件箱 | | 未认证外域地址 | 37 | 管理员兜底,无对应发信记录 | 结果与本次 SMTP 前双库备份位于 `/var/backups/smail-internal-smtp-20260917-113121`。客户端仍显式信任测试 CA 并校验主机名,没有关闭 TLS 验证。队列表仍为空,不能以此证明网页出站队列闭环通过。没有进行浏览器测试。 补查首轮自动测试影响:上述 SMTP 前备份中邮件总数及最大 ID 均为 32,最后一封 `send_date` 为 `2026-09-17 02:12:47` UTC,即北京时间 10:12:47,早于本轮 10:30 开始。现有只读数据未发现首轮自动测试新增线上邮件的证据;这不撤销已确认的全机 OOM 影响,也不等同于完成全部审计。 新增测试工具在远程实际验证逐用例模式以及零匹配、错误包名两个拒绝分支。零匹配包结果记录码为 2,聚合进程返回 1;错误包名在启动用例前返回 2。此前外层检查误以为聚合进程也应返回 2,已按真实接口修正检查;没有修改程序掩盖失败。 本轮已完成投递结果恢复、跨平台路径修复、全包分批测试、旧备份隔离恢复和新版本升级回归。正式上线仍受凭据轮换、可信 TLS、真实网页及管理员恢复交互、共享主机容量和最新清库安装等门槛限制,不能签署生产放行。 ## 2026 年 9 月 17 日认证容量与前端重试整改 ### 代码与边界 修改前检查点及后端整改 `0177de8`、`b4f5f51`、`ce8285f` 已推送,前端整改提交为 `461d8b2`。本轮仍仅在 47 服务器执行测试,本机没有运行应用或测试。测试使用临时隔离数据库,不访问或清理线上业务双库,不能替代清库首次安装验收。 - Argon2id 保持 64 MiB、三轮、单并行度,不降低密码安全参数。整个进程只允许一个昂贵密码计算,满载立即拒绝而不排队。 - HTTP 503、SMTP 454、IMAP UNAVAILABLE、POP3 SYS/TEMP 区分容量不足和真实凭据错误;恢复服务在容量不足时保留可重试凭证,不消耗验证机会。 - 登录界面显示中文繁忙提示。管理员附加恢复面对临时服务错误或网络故障时保留输入和后续凭证,真实恢复码错误仍受五次前端上限约束。 - 匿名恢复不再把临时服务故障误报为链接失效;网络异常明确提示结果尚未确认。成功完成后清空密码及恢复码。 - 新前端执行器逐文件记录结果、保存失败日志、拒绝空测试,并在超时后终止对应进程组。 ### 后端远程回归 测试使用 systemd 独立网络、私有临时目录、128 MiB 硬内存上限及 25% CPU 配额,禁止访问线上 `/opt/smail` 和 `/run/smail`。启动前检查可用内存,不自动扩大资源预算。最新五包回归耗时约 4 分 6 秒,峰值达到 128 MiB,但服务正常结束,没有新增 OOM。 | 测试包 | 顶层通过数 | 日志目录 | | --- | --- | --- | | password | 7 | `auth-20260917/results-20260917-115913` | | auth | 17 | `auth-20260917/results-20260917-120012` | | POP3 | 7 | `auth-fix-20260917/results-20260917-120628` | | SMTP | 36 | `auth-fix-20260917/results-20260917-120628` | | credentials | 8 | `auth-fix-20260917/results-20260917-120628` | | IMAP | 32 | `auth-fix-20260917/results-20260917-121012` | | controllers | 84 | `auth-final-20260917/results-20260917-121339` | | http_server | 65 | `auth-final-20260917/results-20260917-121339` | | adminreset | 21 | `auth-final-20260917/results-20260917-121339` | | recovery | 19 | `auth-final-20260917/results-20260917-121339` | | setup | 31 | `auth-final-20260917/results-20260917-121339` | 上述目录均以 `/var/tmp/smail-review-` 为前缀。最新 HTTP 包另有一项 `TestSecuritySetupBrowserFixture` 跳过,没有计入通过数。恢复服务初轮并发错误语义断言失败,修复后先后通过 18 项及扩展后的 19 项;保留初轮失败日志,不描述为一次性全通过。 最新后端测试归档 `auth-capacity-final-20260917.tar.gz` SHA-256: ```text 5515943674f7ebd32e2b66cc020efb121634371c7ff2c1ab8f5212e9464630b9 ``` ### 前端远程回归 使用官方便携 Node.js `v22.23.2` Linux x64,没有安装或替换服务器系统软件。23 个文件、182 项测试全部通过,无跳过;最终日志目录为 `/var/tmp/smail-review-frontend-auth-20260917/results-20260917-122844`。systemd 单元 `smail-frontend-tests-20260917-122843` 成功退出,用时约 36.8 秒,峰值约 73.7 MiB。 首轮 `122548` 因漏传既有 `test/review/protocol-frontend.test.mjs` 失败;补齐同版上下文文件后 `122657` 和最终 `122844` 均通过。旧日志保留,不把上传遗漏描述为产品缺陷,也不掩盖失败重跑。 | 归档 | SHA-256 | | --- | --- | | `node-v22.23.2-linux-x64.tar.xz` | `d60acfe00a2932254bb0ad20e01b0d74397a0875595de719654b214f4b03f307` | | `frontend-capacity-20260917.tar.gz` | `dae74c9c85689bb6cc24ef46e6c2460bf6a98e2caeb6e833383f753df2ba0b69` | | `frontend-capacity-context-20260917.tar.gz` | `8b420930b2a4cffeb88bdfab7317cca4c57553b17d63724b05b6a4f8d016424e` | 另一次便携 Node.js 下载超时产生的残缺文件未使用,也未删除。 ### 部署前复核 12:34 再次只读复核,线上仍为 `review-421aa7303d3b`。Smail PID `552932`、MySQL PID `549584`、Scert PID `530794` 均运行,重启计数分别为 0、1、0;MySQL 的一次重启仍为此前事故记录。双库完整性正常、迁移版本 23、队列表为空、恢复 socket 为 `0600`,未认证用户信息和邮件列表均返回 403。11:18:09 后新增 OOM 为 0。 本节完成指定范围的认证及前端回归,尚未构建部署新版本,未进行浏览器、容量、真实跨库或竞态验收。部署及首次安装仍需后续独立记录。 ## 2026 年 9 月 17 日部署与协议完整响应整改 ### 12:39 认证版本部署 前述 12:34 结论为部署前状态。随后从提交 `d34ffdb7d1f6` 构建并部署 `review-d34ffdb7d1f6`,双程序均使用 Go 1.26.6,构建时间为 `2026-09-17T04:38:27Z`,源码指纹为 `ad3d40bb626342e656fc7764181c038b2008adcfd512bf30347afc32f753ed37`。 | 项目 | 值 | | --- | --- | | 主程序 SHA-256 | `7086dfc4f7dccd9189ddb5a40af2b5ab215183db826aac8b6e1a44a5f58d5608` | | 管理工具 SHA-256 | `13b78ae80b2bb18dc9f507a9c7ca6788f20913236f35064182cb83e26e320932` | | 停服备份 | `/var/backups/smail-before-outbox-20260917-123901` | | 备份归档 SHA-256 | `b6d999da52391a8dc3a20144fc8fc5b3555ccc5b66c1171f0c1f5addaf18bcee` | 13:02 重新只读核验,线上产物摘要与上表相同,Smail PID `558992`、MySQL PID `549584`、Scert PID `530794`,重启计数分别为 0、1、0。双库完整性正常、迁移 23、队列为空、恢复 socket 为 `0600`,未认证用户信息及邮件列表业务码均为 403;12:39 以来新增 OOM 为 0。 ### 空数据副本与失败发现 新增 `runtime_review.py` 和 `runtime_probe.py`,仅在指定远程服务器创建全新数据目录,不复制线上配置、密码、会话或邮件。副本使用独立网络与挂载空间、128 MiB 硬内存上限和 25% CPU;探测器限制为 48 MiB 和 25% CPU,禁止访问线上目录,启动前要求至少 272 MiB 可用内存。测试结束只停止本轮临时服务,保留数据和日志,不删除文件。 初始化通过正式接口完成,管理员密码仅保存在测试进程内存。协议登录使用完整邮箱和正式接口签发的授权码。两天有效的测试证书由客户端显式信任并校验主机名,不代表可信生产证书。 | 副本目录时间后缀 | 结果与边界 | | --- | --- | | `125343` | 启动器在子进程切换网络前检查导致失败,未执行业务测试;改为 `Type=exec` | | `125413` | 空库初始化、HTTPS 登录和会话通过;探测器误用短账号,SMTP 登录失败,改为完整邮箱 | | `125542` | 首次初始化、三协议授权码登录、内部 25 端口中文正文和附件入库通过;POP3 过载返回错误,整轮不通过 | 目录前缀均为 `/var/tmp/smail-review-runtime-20260917-`。`125542` 副本峰值为 84,414,464 字节,双库完整性正常,没有新增 OOM,线上服务 PID 未改变。此前 SMTP、IMAP 过载步骤已执行,但旧探测器只在整轮末尾写入汇总,不能用缺少逐轮证据的结果签署完整通过。 真实协议发现两个产品问题:POP3 的 `PASS` 处理将业务层繁忙错误统一改写为密码错误;SMTP 的普通错误被依赖库默认包装为 454,不能区分错误凭据和容量不足。提交 `b47f366` 已修复并推送:POP3 只对安全哨兵错误输出固定 `SYS/TEMP`,不回显任意内部错误;SMTP 错误凭据明确返回 `535 5.7.8`,繁忙保持 `454 4.7.0`。 ### 修复后远程三包回归 测试二进制仅在本机交叉编译,执行位置为 47 服务器的受限 systemd 单元 `smail-tests-20260917-130448`。逐顶层用例运行,总计 48 项通过、无跳过,用时约 30.5 秒,峰值约 124.4 MiB。 | 包 | 顶层通过数 | | --- | --- | | `internal/gopop` | 4 | | `listen/pop3_server` | 7 | | `listen/smtp_server` | 37 | 日志目录为 `/var/tmp/smail-review-wire-20260917/results-20260917-130448`。新增用例覆盖真实 POP3 输出、包装错误、内部信息和换行注入隐藏、失败后认证恢复,以及校验证书的真实 SMTP STARTTLS 下 535、454、235 的区分。 启动前另有三次工具或环境失败:SSH 命令引号传递错误、可用内存低于 256 MiB 门槛被拒绝、Windows 归档解压后的三份测试程序缺少执行权限。均保留记录,前两次未启动用例,权限修正仅涉及明确的三份测试产物。没有降低内存门槛或停止其他服务。 候选程序已支持从受保护的暂存路径验收,校验 Linux ELF、SHA-256 和目录权限,测试后同时核对线上程序摘要及服务状态未改变。探测器逐轮保存过载证据,并新增真实 SMTP 错误凭据 535 断言。候选版本的隔离验收及部署结果待追加,不以三包回归代替全量或生产容量验收。 ### 候选程序完整复测与部署 候选双程序从提交 `b47f366435475e4521ff6722f178fbee19fecdc6` 构建。首份本地产物的工具链元数据误读了根目录 Go 1.26.2,未上传或部署;改为从后端模块读取真实 Go 1.26.6 后,在独立 `out/release-review-b47f36643547-verified` 目录重建双程序,核对实际 Go 构建信息、Linux amd64 平台和构建前后源码指纹。 | 项目 | 值 | | --- | --- | | 版本 | `review-b47f36643547` | | 构建时间 | `2026-09-17T05:07:01Z` | | 源码指纹 | `5e932ea9ab882c591eeccffb1e16fc4e9c5607066f78808d25a52a1ed5de8565` | | 主程序 SHA-256 | `956f7aeb64f8ad8b1672b58890dd64834a5fd088262e7942c1b9a07567c1fcb5` | | 管理工具 SHA-256 | `9d80fe5d8ed901e1ddfca88fcb7aba4da4440fe3f51f480bc6aba2249f6b5f35` | `/var/tmp/smail-review-runtime-20260917-130738` 的所有业务探测通过,随后汇总器将 SQLite `fetchall()` 元组与列表比较导致收尾失败。修正工具断言后,没有改动候选双程序,重新建立全新副本 `/var/tmp/smail-review-runtime-20260917-131021` 完整复测,探测器与汇总器均退出 0。 | 验收内容 | 最终结果 | | --- | --- | | 首次安装 | 空业务库、初始化令牌要求、正式配置接口、HTTPS 登录及会话通过 | | 客户端认证 | SMTP、IMAP、POP3 完整邮箱与授权码登录通过,明文 SMTP AUTH 被拒绝 | | 错误凭据 | 真实 SMTP 返回 `535 5.7.8`,不误报繁忙 | | 内部收信 | `127.0.0.1:25` 中文正文和附件真实入库,唯一指定用户关联 | | 三轮混合认证 | 每轮 4 个协议认证加 4 个 HTTP 登录;均观察到成功与繁忙,后续协议和网页 API 登录恢复 | | 繁忙语义 | SMTP 454、IMAP UNAVAILABLE、POP3 SYS/TEMP;HTTP 503、AUTH_BUSY 和 Retry-After | | 隔离证据 | 测试邮件不在线上库;线上主程序摘要和三服务 PID、重启计数均未变 | | 资源和收尾 | 约 25.71 秒,副本峰值 79,089,664 字节,双库完整性均正常,新增 OOM 为 0;临时服务已停止 | 三轮均为一个认证成功、七个请求收到繁忙响应,成功认证约 1.15 至 1.41 秒,繁忙请求约 0.016 至 0.324 秒。该数据只说明给定限额下的过载拒绝与恢复,不是生产吞吐、延迟承诺或最大并发容量。 13:11 开始停服备份并部署上述已验收双程序。备份目录 `/var/backups/smail-before-outbox-20260917-131139`,归档 SHA-256 为 `cc7e712506e1eed26b92587147d9b7da4768653c3df16dc6bb7c2b811edf37d9`。保留线上双库,未清库或删除文件,未触发失败回滚;后续工具与文档提交不改变已部署产品源码。 13:12 在已部署实例内部 25 端口完成五项 TLS 1.3 收信检查:中文纯文本 ID 38、HTML/中文附件/双收件人 ID 39、管理员专属附件 ID 40、未知本域管理员兜底 ID 41、未认证外域管理员兜底 ID 42。正文、附件名称和字节、收件人归属均一致;外域用例没有出站记录。SMTP 前双库备份和结果保存在 `/var/backups/smail-internal-smtp-20260917-131256`。此项是保留数据部署回归,不冒充清库首次安装。 部署后 Smail `active/running`,PID `563364`、重启计数 0;MySQL PID `549584`、Scert PID `530794` 均未改变,重启计数仍为 1 和 0。双库完整性正常,迁移 23,队列为空,恢复 socket `0600`,未认证用户信息与邮件列表业务码均为 403。双程序摘要与上表一致,13:11 以后没有新增 OOM。 本轮完成协议错误分类、完整响应回归、空数据 API 安装与混合认证过载恢复、备份升级及内部 SMTP 回归。可信 TLS、真实浏览器安装和发信闭环、正式超管恢复交互及撤销、泄露凭据处置、生产资源预算、竞态及跨库、异机恢复等门槛仍未验收,不能签署生产放行。 ## 2026 年 9 月 17 日下午:资源防护候选,远程认证阻塞 15:21 起恢复工作。本轮先提交上一轮遗留的两份验收记录和 `runtime_review.py` 元组断言修正,检查点为 `e14c53832241aac4a9d052de82c1b450c5e30566`;推送首轮出现认证失败,重试成功,并以 `git ls-remote` 确认远程分支摘要一致。 当前会话、用户级和机器级环境均没有 `SMAIL_SSH_KEY` 或 `SMAIL_SSH_PASSWORD`。使用强制已知主机校验的连接工具、现有默认密钥、Smail 专用密钥及 OpenSSH 默认认证均未通过 47 的认证。没有关闭主机校验,没有从 Git 历史或旧日志提取泄露密码。本轮未登录服务器,未上传、重启、部署或清库;不能据此断言旧密码已撤销,也不能把 13:12 的运行状态当作本轮实时状态。 资源整改候选包括: - 主服务内存高水位 384 MiB、硬上限 512 MiB、禁用交换配额、单 CPU 时间配额与 256 个任务上限。这些是待核算、待验收的模板值,不是 47 的已确认容量。 - OOM 后整组停止、故障后 10 秒退避、五分钟最多三次启动;停止期限 90 秒,覆盖现有队列 25 秒与数据库 35 秒等待以及其他收尾。 - 新安装环境文件增加 `GOMEMLIMIT=256MiB`,已有环境文件不改写;权限和备份逻辑保留。 - 只读检查实际 cgroup v2、主进程环境中的 Go 内存数值、上级控制组、剩余增长预算、OOM 记录和服务取证稳定性;不记录其他环境变量。 - 新增部署策略、缺失限额、预算不足、重启竞态、错误控制组和敏感信息隐藏的反例测试,并接入统一部署测试入口。测试尚未执行,不能登记通过数。 本机仅执行 Python 字节码语法编译、Node 语法检查、Bash `-n`、Git 差异检查和 `go test -c` 交叉编译;没有执行应用、测试用例或浏览器测试。交叉编译产物为 `out/resource-review-20260917/backend/cmd/smail-admin/review.test`,Go 构建信息确认 `go1.26.6`、`linux/amd64`、`CGO_ENABLED=0`。这些证据不替代远程 `systemd-analyze verify`、反例执行、真实资源预检或清库部署验收。 下一步需要通过受保护环境恢复受信任 SSH 访问,再在 47 的受限环境验收新增策略、核算同机预算、编译部署最新产物并按内部 `127.0.0.1:25` 继续业务验收。当前仍不具备生产放行证据。 ## 2026 年 9 月 17 日晚:发行来源整改与候选封存 本节是本机构建与静态核验记录,不是远程业务测试。17:44 和 20:14 通过现有 SSH 工具连接 47 均返回认证失败,没有上传、清库、重启或部署。远程实际版本仍需恢复访问后核对,不能沿用下午的运行状态作为实时证据。 提交 `3fd8fac` 修正 Makefile 的 Go 版本来源:根目录实际选择 Go 1.26.2,后端模块选择 Go 1.26.6,现改为进入后端模块后取值。提交 `22637798dc2452d240e19ed25a5a16ba1d5f1b56` 增加发行回执的文件大小和 SHA-256;两个提交均已推送。新增静态断言尚未远程执行,本机只完成语法、差异检查及构建产物核验。 19:41 起重新构建前端、Telegram 界面、三个 Linux 插件及双程序。首次手工构建漏传目标环境,被 `go version -m` 检出为 Windows 产物,未部署;随后显式设置 `GOOS=linux`、`GOARCH=amd64`、`CGO_ENABLED=0`,并在最终提交后完整重建。最终双程序均为 Go 1.26.6、Linux/amd64,内置提交号为 `22637798dc2452d240e19ed25a5a16ba1d5f1b56`,`vcs.modified=false`;ELF 文件头确认小端 ELF64 x86-64。没有在本机执行应用或测试用例。 构建前后源码指纹一致:`284b3bca9dd23e3864c54a24620fcdadba8e8288aafcece2c75303443b25f2c1`。该指纹是现有构建脚本定义的目录集合,不是整个 Git 仓库的摘要。前端资源已同步嵌入目录,Vite 仍有编辑器单块超过 500 kB 的体积警告,尚无浏览器性能验收。 | 产物 | 字节数或 SHA-256 | | --- | --- | | `smail` | 61,440,162 字节;`f713bf71e1f21fae0d3cf31ca2d25771be6d207aea6e0ca3b791fd89ab46e5b9` | | `smail-admin` | 9,547,938 字节;`390bdce2678dcbb6483a9b4f21db9297e207c4ea6244f429645e7c191e064656` | | `out/release-review-2263779-verified.tar.gz` | `461c0c03cb579b7fe7b64c8ef4c68bbc0559a584e905c085eac113029ed9da7b` | 通用目录 `out/package/linux_amd64` 仍保留 9 月 6 日的旧 `release.json`,不得直接将该目录整体部署。没有删除旧文件;本轮以明确文件清单封存到新目录 `out/release-review-2263779-verified`,只包含双程序、当前回执和空 `config/ssl/data/log` 目录。封存名称中的 `verified` 仅表示静态核验,不代表生产验收。服务模板、安装脚本与资源预检仍应取自对应源码版本,不包含在该应用压缩包中。 待完成:恢复授权 SSH 访问;在远程执行新增测试和 systemd 策略核验;确认同机资源预算后备份、清理指定测试数据并部署;继续真实浏览器、内部 25 端口、恢复撤销、容量和备份恢复验收。发行打包脚本尚未自动拒绝错误目标架构或清除旧目录元数据,当前回执摘要不能替代部署前的平台和目录核验。 ## 2026 年 9 月 17 日 21:28 至 21:54:远程续验与资源配置整改 ### 范围和操作记录 本轮所有应用和测试均在 `47.108.78.12` 执行,本机只进行文件读取、Git 操作及配置和文档编辑。复核线上双程序摘要分别为 `f713bf71e1f21fae0d3cf31ca2d25771be6d207aea6e0ca3b791fd89ab46e5b9`、`390bdce2678dcbb6483a9b4f21db9297e207c4ea6244f429645e7c191e064656`,与封存候选一致,本轮没有重新构建或替换程序。 初始连接错误采用自动接受未知主机策略,后续改回仓库工具的已知主机校验并成功;该初始步骤不作为主机身份验收依据。21:31 错误使用主程序 `--version`,由于主程序未处理此选项而进入初始化,随后因本地控制目录属主不匹配退出。服务主 PID、重启计数及数据库属主未变,后续完整性检查不能证明此次初始化绝无逻辑数据影响;后续仅使用静态摘要取证。 ### 远程测试结果 | 项目 | 结果 | | --- | --- | | 资源策略测试 | 15 项 Python 用例及 1 项 Node 入口通过,无跳过;远程单元硬限额 64 MiB | | 首次测试启动 | 私有临时目录遮蔽 Node 路径,203/EXEC,未运行用例;通过只读绑定明确测试目录后重试通过 | | 最新候选空库副本 | `/var/tmp/smail-review-runtime-20260917-214657`,正式初始化 API、令牌要求、HTTPS 登录与会话通过 | | 三协议 | SMTP、IMAP、POP3 授权码登录通过;错误 SMTP 凭据返回 535;明文 AUTH 被拒绝 | | 内部 SMTP | 隔离网络 `127.0.0.1:25` 收信,中文正文、中文文件名及附件内容一致,仅关联指定用户 | | 认证过载 | 三轮各 8 请求,每轮 1 成功、7 繁忙,恢复成功;这是保护语义检查,不是容量承诺 | | 资源 | 业务探测约 25.71 秒,副本峰值 88,178,688 字节,无新增 OOM | | 隔离及收尾 | 线上不存在测试邮件;Smail、MySQL、Scert 的 PID 和重启计数在副本测试前后一致;临时服务已停止 | | 副本双库 | `smail.db`、`smail-state.db` 完整性均为 `ok` | 使用的新副本无原有业务库,测试没有清空线上数据库,也没有删除文件。证书由探测器显式信任且验证主机名,不能视为公开可信证书验收。没有执行真实浏览器、网页持久队列闭环、管理员 IPC 完整交互和异机恢复。 ### 资源整改及备份 原备份 `/var/backups/smail-acceptance-20260917T130047Z/smail-state.tar.gz` 权限 0600,归档可读,SHA-256 与交接记录一致。新增停服备份 `/var/backups/smail-memory-20260917-2155/state.tar.gz` 可读、权限 0600,SHA-256 为 `84286aa0aacb0d3a9f9cab8e38cf9bc8093f2afbb2f50ca44b24348650334189`;同时保留原环境和 unit 文件。 新增 `/etc/systemd/system/smail.service.d/20-go-memory.conf`,仅配置 `GOMEMLIMIT=256MiB`。未编辑原环境文件,未减少高水位、硬上限或检查保留预算。重启后 PID 为 571735,Smail、MySQL、PostgreSQL、Scert 均 active。运行进程预检确认 Go 目标 268,435,456 字节、控制组 OOM 计数为零,unit 解析仅报告系统已忽略 CPUAccounting 的警告。 证据目录 `/var/tmp/smail-review-acceptance-20260917-2140` 保留整改前后资源报告及测试日志。整改后预检退出 1,仍有“服务增长到硬上限后,主机剩余预算不足”。当前约 312 MiB 可用内存,无法支持约 495 MiB 的剩余增长加 128 MiB 系统预算。未停止其他项目、创建交换空间或降低保留预算。 线上 `custom.crt` 的主题和颁发者均为 `example.com`,有效期为 2026 年 9 月 11 日至 2027 年 9 月 11 日,系统校验返回自签名错误 18。远程未检测到 Chromium/Chrome,未启动本地浏览器代替远程测试。生产仍受资源、可信 TLS、浏览器业务闭环、恢复撤销和持续运行证据缺失阻塞。 ## 2026 年 9 月 17 日 21:57 至 22:02:授权主机环境清理 用户授权清理当前主机环境,本轮目标仍为 `47.108.78.12`,未清理本机。实际诊断发现 `/tmp` 为 tmpfs,约 356 MiB 被历史发布文件占用;没有残留 Smail 测试进程需要终止。既有失败测试 unit 和日志保留,未通过清空计数掩盖失败证据。 ### 清理范围与保护 以下 6 项在迁移前检查了全部进程的 exe、cwd、root、文件描述符、内存映射、挂载引用及命令行,均无引用;只含普通文件和目录,无特殊文件、符号链接或跨设备子目录。未扫描或输出凭据内容。 - `/tmp/smail-release-04de1cb-20260915T233708` - `/tmp/smail-release-04de1cb-20260915T233708.tar.gz` - `/tmp/scert-candidate-554a884-20260915-222559` - `/tmp/scert-release-verify-20260916-1032` - `/tmp/scert-release-9f8a5fe-verify` - `/tmp/Scert-20260916-V0.1.0-linux-amd64-9f8a5fe.tar.gz` 归档根目录为 `/var/backups/host-tmp-archive-20260917T215952`,权限 0700。逐项先复制到 ext4 磁盘,比较所有文件 SHA-256、大小、属主、权限、修改时间及目录清单,再释放原 tmpfs 内容并建立指向归档的原路径链接。归档内容合计 372,732,070 字节,约 355.5 MiB;文件内容未丢弃。`manifest.json` 为 0600,记录逐项清单、阶段及清理前后服务和内存状态。 未触碰 `/opt/smail`、`/scert`、MySQL、PostgreSQL 业务数据、证书、已有备份和服务配置。没有停止服务、释放内核缓存、添加交换空间、调整资源限额或减少系统保留预算。 ### 清理后资源复核 按原 `python3 deploy/check_resources.py --reserve-mib 128` 执行 5 次,间隔 15 秒;每次资源规则均通过、退出码均为 0,生产批准字段仍为 false。原始报告为归档内 `resource-samples.json`。 | 样本 | 主机可用字节 | Smail 剩余增长字节 | 结果 | | --- | --- | --- | --- | | 1 | 674,250,752 | 497,610,752 | 通过 | | 2 | 674,144,256 | 488,685,568 | 通过 | | 3 | 655,441,920 | 488,669,184 | 通过 | | 4 | 668,352,512 | 488,501,248 | 通过 | | 5 | 668,372,992 | 488,501,248 | 通过 | `/tmp` 占用从 373,534,720 字节降至 610,304 字节。Smail PID 571735、Scert PID 570938、MySQL PID 549584、PostgreSQL PID 313101 均未改变,重启计数保持原值;全部服务 active。5 次 Smail 控制组 OOM 和 OOM kill 计数均为零。 本轮不进行写入型业务测试,因此未清库或重复安装。只解除即时资源预检失败,不覆盖持续负载或生产容量;最小剩余预算约 159 MiB,比 128 MiB 门槛仅多约 31 MiB。可信 TLS、远程浏览器、恢复撤销、持续监控与异机恢复验收仍待完成。 ## 2026-09-17 22:35 起:8001/8002、Nginx 与可信证书 用户指定 HTTP 8001、HTTPS 8002、Nginx 反代管理。部署前中文基线提交 `6006236` 已推送。全部应用及传输层测试在 47 上执行,本机仅编辑、下载和上传工具。 1. 停服一致性备份 config/data/ssl,归档至 `/var/backups/smail-nginx-20260917T144222Z`;无清库、无账户变更,其他项目未执行停止操作。 2. 应用配置代次 1 更新至 2,分区代次与摘要一致,端口改为 8001/8002,WebAuthn 公网来源显式保留 443。Smail 重启后 PID 574584,NRestarts 0。 3. 安装 Nginx 1.28.3、Certbot 4.0.0;Nginx 占用 80/443,443 上游为 HTTPS 8002。UFW 增加 IPv4/IPv6 上游拒绝规则。 4. HTTP-01 测试环境失败,CA 返回部分 403/连接重置;本机日志有部分挑战 200,没有对应 403。未冒称找到外部阻断原因。 5. 校验官方 lego v4.34.0 发布包 SHA256 后运行 TLS-ALPN-01。测试签发成功,Nginx 停止约 55.86 秒;正式签发成功,停止约 47.82 秒。两次均安排独立延时恢复并在 finally 中恢复 Web,邮件监听持续运行。 6. 部署 Let's Encrypt YR1 五域名证书,有效期至 2026-12-16 13:54:39 UTC;系统信任链、SAN、密钥匹配和权限检查通过,Nginx 上游校验开启。 7. 每日续期 timer 已启用,旧 Certbot timer 已停用。首次未到期任务结果 success,退出码 0,峰值 16,044,032 字节。到期续期及失败告警未作真实演练。 ### 测试结果 | 项目 | 结果 | | --- | --- | | 443、8002、465、993、995 | 系统根链和主机名验证通过,同一证书,TLSv1.3 | | 内部 127.0.0.1:25、587 | STARTTLS 通过,明文阶段不公布 AUTH,新链一致 | | 公网 HTTP 跳转 | 308 至标准 HTTPS,不泄露 8002 | | 未知 Host/SNI | HTTP 404、TLS 握手拒绝 | | 公网域名 HTTPS | 远程请求首页及 logo、入口 JS 均 200;不代表浏览器完成渲染 | | 续期异常回归 | 6 项通过,包含失败及超时恢复、未到期不停止、证书/密钥拒绝、非 root 拒绝 | | 回归隔离 | PrivateNetwork、ProtectSystem=strict,禁止访问生产目录;64 MiB 上限,峰值约14.7 MiB,505ms | | 部署后资源快照 | 原 reserve 128 MiB 检查通过,available 724,357,120 字节,剩余增长501,669,888字节,无 OOM | 证据目录 `/var/tmp/smail-review-nginx-20260917`,包含 `transport-result.json`、`resource-result.json`、`assets-result.json`、两次 TLS 申请日志和回归脚本。证书摘要 `608fb55e3b8add3426a63f672debd86a58389a1a78d0961b9603b2e1abecae43`。 线上双程序摘要未变,仍为已部署 `review-2263779`。本轮修改仅为部署配置、测试和文档,没有把旧程序冒称为新构建。数据库未变更,后续写入型首次安装仍须按备份、双库清理、最新构建、生产流程重新验收。 剩余风险:代理后的登录限流共享回环 IP;恢复页面外部地址可能继承上游端口;无真实浏览器业务闭环、到期续期外部告警、生产容量或异机恢复证据。可信 TLS 门槛解除,整体生产批准仍为否。