Smail/docs/清库部署测试记录.md
smail 6da306557a
Some checks are pending
Security Checks / security (push) Waiting to run
记录公网证书验证与外域连接预算修复复测
2026-10-02 14:24:03 +08:00

15 KiB
Raw Blame History

清库部署测试记录

本文保留分日期的测试记录。不同环境、版本和日期的结果不可相互替代;最新云端续验见文末。

范围与状态

日期:2026 年 9 月 16 日。仅测试本机 D:\Desktop\Smail\yunx-test,使用正式构建包和嵌入前端,未启用开发模式或停用本机恢复通道。

  • [✓] 备份三份 SQLite 数据库和配置,校验备份后清空数据库对象,保留数据库文件。
  • [✓] 完整构建、部署及部署指纹校验通过。
  • 首轮通过浏览器完成数据库、超级管理员、域名、DNS 展示和手动证书初始化;正式业务服务未就绪。
  • [✓] 修复安装根地址认证探测失败,隔离浏览器直接访问根地址后自动进入中文安装向导。
  • [✓] 修复 HTTP、HTTPS 全局实例在停止期间被清空而导致的崩溃;启动任务发布前同步准备实例,关闭已准备但尚未监听的实例也能正常退出。
  • [✓] 全量自动回归与定向竞态检查通过。
  • [!] 正式登录、刷新会话、普通用户及管理员邮件恢复、旧密码与旧会话失效实机验收未完成。
  • [!] 超级管理员受保护本机恢复通道实机验收未完成。

实机证据

第一轮直接访问安装根地址出现“认证服务暂时不可用”。安装服务缺少 /api/v1/user/info 的初始化状态响应,前端未得到需要初始化的业务码。修复后,两个版本的认证探测路径均复用安装令牌和来源检查,只返回需要初始化状态,不执行账号或配置写入。

在全新隔离浏览器中访问 http://127.0.0.1:5201/,页面自动进入 /#/setup?redirect=/,显示中文六步安装向导,未再出现认证服务不可用。已查看页面快照和桌面截图;截图工具不允许写入当前工作区,因此截图仅保留在会话中,未声称落盘。

第一轮完成初始化后,Windows Named Pipe 在接受连接时返回 Access is denied,随后 HTTP 停止与启动并发导致空指针崩溃。最新构建重试相同权限环境后,保留明确权限错误并退出,未再发生空指针崩溃,监听端口已释放。

当前进程使用未提升的中等完整性令牌,管理员组仅用于拒绝检查。本机通道 ACL 仍限定 SYSTEM 与管理员,未放宽 ACL,未改成公开 HTTP 或 TCP 接口。

自动验证

  • go test ./listen/http_server ./res_init 通过。
  • node test/run.mjs all 通过:前端 166 项、部署 4 项以及全部后端包。部分未变更包使用 Go 测试缓存,不能据此认定受权限限制的 Windows IPC 用例已实机执行。
  • node test/run.mjs backend -race ./listen/http_server ./res_init 通过。
  • 新增覆盖:HTTP 和 HTTPS 停止先于监听、多个停止任务并发、HTTPS 准备失败清理 HTTP,以及安装状态接口的有效令牌、缺少令牌、来源限制、方法限制和初始化完成后拒绝访问。
  • git diff --check 通过,仅存在仓库已有换行策略提示。

首次误将构建与回归并行调度,触发工作区锁且导致竞态测试读取不到正在移动的嵌入资源。已改用串行调度重跑并通过,此次失败不作为产品回归结论。

备份与日志

以下路径包含本地测试数据或配置,均为忽略的运行产物,不提交仓库:

  • test-log/live-20260916-1938/backup/:清库前配置和数据库。
  • test-log/live-20260916-1938/reset-partition-config/:归档的旧分区配置。
  • test-log/live-20260916-1938/before-retest/:首轮初始化后、第二次清库前的配置和数据库。
  • test-log/live-20260916-1938/fresh.stderr.log:原始崩溃证据。
  • test-log/live-20260916-1938/fixed.stdout.log 与 fixed.stderr.log:修复后正式启动权限失败与退出证据。
  • test-log/live-20260916-1938/setup-retest.stdout.log:最新安装向导进程日志。
  • test-log/run-2026-09-16T11-49-49-921Z-5240/:成功的全量回归。
  • test-log/run-2026-09-16T11-51-52-136Z-29980/:成功的竞态检查。

第二次清库后保留安装向导运行于 127.0.0.1:5201,数据库为空、配置未初始化,证书与业务密钥未删除。没有将旧账号备份恢复到当前运行库。

后续条件

后续正式流程需要符合项目部署要求的 Windows 权限环境或受支持的 Linux 部署环境。当前会话无法提供已提升的 Windows 令牌,不通过绕过权限限制推进验收。

在具备权限的环境中重新完成初始化并确认服务稳定后,再验证登录、会话刷新和邮箱恢复。邮件恢复还需要确定实际可接收验证码的外部测试邮箱;验证码收到、恢复页面打开或接口返回成功均不单独构成完整验收。

2026 年 10 月 2 日云端续验

范围

本段时间为 13:17 至 13:30,继续当天已经完成的全新部署验收,不重复清库或恢复历史数据。业务操作使用浏览器页面;交互式 SSH 仅检查运行状态、修改 Smail 专用 Nginx 日志配置和权限。未调用业务接口代替页面测试,未新建测试脚本,未修改 Go 或前端业务代码。

本段结果

  • [✓] 普通用户使用恢复后的临时密码登录成功,原邮件可读;随后通过安全设置恢复指定测试密码并再次登录,收件箱邮件仍在。本文不记录密码或安全码。
  • [✓] 密码恢复后的安全设置显示不存在有效安全码,公共恢复入口不再提供安全码验证;源码确认恢复事务会撤销整批凭据。因页面已经撤销整批安全码,本段未单独提交第二枚旧码,不能称为逐码重放实测。
  • [✓] 修改密码后页面退出登录,明确提示原安全凭据已失效。
  • [✓] 超级管理员在公共找回页面被明确拒绝重置,提示使用安全中心或部署端本机通道;未执行超级管理员本机重置。
  • [✓] 基础配置页面显示单一 MySQL 数据库和数据库用户均为 smail;页面域名与本次部署确认值一致。
  • [✓] SSL 页面显示手动配置、不自动续期,直接引用 Nginx 使用的同组证书文件路径。
  • [✓] Smail 专用 Nginx 配置改为不含查询参数、来源页及认证头的访问日志格式;配置语法检查通过并平滑加载。通过浏览器打开带无敏感信息测试参数的登录页后,新访问日志仅包含路径,测试参数匹配数为零。
  • [✓] Smail 专用访问日志及错误日志权限均已设为 0640;现有日志轮转配置也使用 0640,未改动其他项目日志。
  • [✓] 调整后 Smail、Nginx 均运行正常;Smail 启动时间仍为当天 11:58:26,自动重启次数为零,本段未重启 Smail。
  • 部署模板同步专用访问日志格式,反代部署说明校正证书路径引用与热加载行为;本地差异检查通过。完整占位符模板尚未在另一套全新实例重新部署。

尚未关闭的验收项

  • [!] 自动证书续期、证书更新后网页及各邮件协议加载闭环尚未实测通过,手动配置和热加载不能替代自动续期验收。
  • [!] 外域双向收发、真实 SMTP/IMAP/POP3 客户端、反中继及通知凭据协议隔离仍待完成。
  • [!] 外部邮箱恢复、超级管理员本机恢复、附件上传及其他安全功能尚未全部覆盖。
  • [!] 本次全新环境的微信、Telegram 配置与真人绑定尚未完成,不继承历史成功结果。
  • [!] 历史日志未删除;应用日志、错误日志及其他日志的敏感信息检查仍待完成,不能以访问日志格式修改代替全部日志审计。
  • [!] 本轮临时账号、分组和其他验收数据保留用于后续测试,发布前仍需按确认范围完成清理。

以上不构成全项目验收通过或上线签收。

13:46 至 14:00:公网收件边界修复与外域投递诊断

本段继续同一轮验收,不重新清库。业务操作及公网检测均经浏览器键鼠完成;交互式 SSH 用于只读日志检查及 Smail 二进制更新,文件传输使用密码认证并严格校验已知主机密钥。未调用 Smail 业务接口、未执行辅助测试脚本、未恢复历史密钥、未改动同机其他项目。

公网收件边界

  • [✓] 修复前公网检测连接到本机 25 端口,收到 220 cdis.cn ESMTP Service Ready,但未认证的外域收件人得到 250 接受响应,检测报告提示可能开放中继。
  • 源码追踪发现匿名邮件进入本地收信流程;本段没有证明匿名邮件能实际转发到外域,不能将上述响应直接表述为已成功利用开放中继。
  • [✓] 在收件人阶段增加地址格式检查、受管域名匹配和匿名外域拒绝;已认证连接仍先检查凭据是否被撤销,不改变通知发信地址及收件人数限制。
  • [✓] 新版云端复测明确返回 550 5.7.1 Relay access denied,公网检测结果为非开放中继;检测目标为 smtp.cdis.cn,连接地址仍为本机。
  • [✓] 普通用户通过网页发送站内自收邮件,收件箱出现新邮件,打开邮件编号 11 可读完整正文;服务更新后原会话及已有邮件仍可访问。
  • 已补充受管域名、别名、大小写、外域、伪装后缀、非受管子域名及无效地址的 Go 回归用例。本段遵守浏览器业务验收约束,没有执行 Go 单元测试,不能将新增用例记为已通过。

外域投递与 DNS

  • [!] 普通用户此前通过页面发送的 mail-tester 邮件仍未收到,检测页面明确显示暂未收到邮件。本段不是外域收发验收通过。
  • [✓] 增加按 MX 主机及端口记录失败类别的诊断,不改变原有端口尝试顺序、安全停止条件和重试策略,不记录邮件正文、凭据或远端 SMTP 响应原文。
  • 新版持久队列继续尝试原邮件,13:54:47 至 13:54:49 的运行日志明确显示:到检测收件主机的 25 端口连接超时、465 端口连接超时、587 端口返回无路由。旧日志只有最后一次错误,不能反推此前 25 端口的具体错误。
  • [!] 上述为一个外部目的地的失败证据,尚未证实云厂商限制或所有外域均不可达;主机防火墙允许出站也不能替代云网络验证。
  • [✓] 公网 DNS 页面查询到邮件主域名的 MX 指向 smtp.cdis.cn,地址为本机,DMARC 记录存在且启用隔离或拒绝策略。此结果不能替代真实邮件的 SPF、DKIM、DMARC 校验。
  • [!] 公网检测未查到本机 IP 的 PTR 记录,仍需核实并完成反向解析配置;本段没有修改 DNS。

构建与部署证据

  • 修改前检查点 7612e10、修复提交 9e78499 均已推送到 smail 远程。
  • 从当前源码编译 Linux amd64 内置插件版本成功;本段未修改前端及插件源码,使用现有内嵌资源,未声称重新构建前端。
  • 本地及云端二进制 SHA-256 均为 379af177b0f999ddf48ed735bf081f6afe1b7b5e7df110211de646ab2bb01634。
  • 校验传输文件后仅更新 /opt/smail/smail;Smail 于 13:54:29 启动,更新后 Smail、Nginx 均为运行状态。未清库、未修改证书、未保留旧二进制备份、未重启其他项目。

本段关闭了公网匿名外域收件响应问题,但外域双向投递、真实客户端协议、通知凭据协议隔离及证书续期等未完成项仍然有效,整体验收继续进行。

14:01 至 14:23:公网证书验证与多地址连接预算修复

继续当天同一轮验收,不重复清库、不恢复历史配置。业务邮件均通过浏览器页面操作,交互式 SSH 仅用于运行状态、日志和部署;没有直接调用 Smail 业务接口,没有新增辅助脚本。

公网 SMTP TLS 与证书

  • [✓] 14:03:07 的 CheckTLS 接收端检测通过公网 MX 解析连接 smtp.cdis.cn,实际地址为 47.108.78.12:25;连接、EHLO、STARTTLS、加密及证书检查通过。
  • [✓] 协商 TLS 1.3,套件为 TLS_AES_128_GCM_SHA256,密钥交换为 X25519;证书主机名校验通过,包含 *.cdis.cn 与根域 cdis.cn,页面显示 OCSP 未撤销。
  • [✓] 页面证书有效期为 2026 年 9 月 30 日 16:41:53 UTC 至 2026 年 12 月 29 日 16:41:52 UTC。本段没有更换证书。
  • [!] 检测在 MAIL FROM 后退出,没有执行 RCPT、DATA 或最终收件;MTA-STS、DANE、FCRDNS 未测。该页面分数不是全项目验收结果,也不证明自动续期。

第二外部目的地与连接预算

  • MailGenius 页面停留在请求验证,未绕过;改用 CheckTLS 的发信检测页面取得收件说明。
  • 14:10 首次操作未在离开收件框前按回车确认目标,随后误选站内历史联系人,形成一封站内自收邮件;此邮件的发送成功不计入外域证据。14:12 重新输入并确认目标标签后,才向 test@TestSender.CheckTLS.com 正式提交检测邮件。
  • 旧版日志中该目的地出现 IPv6 超时及网络不可达。源码确认 DNS 与所有目标地址共用两秒时限,且仅保留最后一个地址的错误,后续地址可能没有有效尝试时间。
  • 修复后单个地址连接预算为十秒、DNS 预算为十秒,并受三十秒连接总时限及父级取消约束;汇总各地址失败原因。仍先检查全部解析地址是否允许访问,不改变 TLS 校验、SMTP 路由端口顺序和不确定投递停止规则。
  • 新增首地址超时后回退、父级取消、全部失败原因保留的 Go 用例;本段未运行单元测试,不标记用例通过。
  • [!] 新版队列于 14:19:27 至 14:19:29 重试原邮件,日志明确显示 ts11-do.checktls.com 的 IPv4 地址 165.227.190.238:25 端口超时,465 和 587 返回无路由。连接预算修复没有消除公网出站失败。
  • [!] 两个独立外部收件目的地均已有失败证据,仍不能直接认定云厂商封禁或所有外域不可达。下一步需核实云平台出站限制、安全组及网络路径;不可通过关闭 TLS 校验掩盖问题。
  • [!] 本段收件箱没有外部检测回信,也未出现用户协助发送的“外域入站验收”邮件;外域双向投递仍未验收通过。

修复部署与站内复测

  • 修改前检查点 3389f18、修复提交 eba1b9d 均已推送至 smail 远程。
  • Linux amd64 内置插件版本编译成功,沿用未改动的现有前端、插件内嵌资源;本段未重新构建前端。
  • 本地及云端 SHA-256 均为 7ddba6353e082d8281639a3db9b2fe81aa0d26dd7a3a4e7a5f3fc1994a5204c0。
  • 仅更新 Smail 二进制,服务于 14:16:58 启动,自动重启次数为零;Smail、Nginx 均正常,未重启其他项目。
  • [✓] 浏览器刷新后普通用户会话与已有邮件保留;14:21 经页面回复站内邮件,新邮件编号 16 到达收件箱,正文可读。

本段完成连接预算代码修复和站内回归,但没有关闭外域投递问题。自动续期、真实邮件客户端、通知凭据协议隔离以及此前列明的剩余验收项继续保留,不据此签收上线。