Smail/docs/单数据库云端测试报告.md
smail 2cb8241c9d
Some checks are pending
Security Checks / security (push) Waiting to run
补充云端单数据库部署最终核验记录
2026-09-20 22:19:27 +08:00

83 lines
6.8 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# 单数据库云端测试报告
## 范围与结论
测试日期:2026 年 9 月 20 日。
本次要求是每套部署在 SQLite、MySQL、PostgreSQL 中三选一,业务数据与配置历史共用同一个数据库,不再附带独立 SQLite 状态库。域名和账户仅作为本次测试参数,不作为产品默认值或验收条件。
- [✓] 首次启动不提前创建数据库,远程数据库不可用时不回退 SQLite。
- [✓] 配置历史使用所选数据库中的 `config_records`,配置提交恢复使用文件事务日志。
- [✓] 旧双库历史导入、故障阶段恢复、冲突校验与重复启动回归。
- [✓] 云端三种真实数据库的第 1~24 版迁移、历史读写、保留策略与重新打开检查。
- [✓] 最新程序编译部署、清理后首次初始化、配置保存、服务重启与浏览器会话恢复。
- [✓] 专用测试数据库、账号和远程测试目录清理;其他项目保持运行。
## 本地自动化验证
最终执行 `node test/run.mjs all -p 1 ./...`,退出码为 0。该入口同时执行前端、部署和带测试覆盖层的后端测试;单独执行普通 Go 测试不能替代此入口。
证据位于本地忽略目录 `test-log/cloud-clean-20260920`:
- `single-database-release-final.log`:最终全量测试。
- `single-database-final-targeted.log`:配置、迁移及路径保护定向测试。
- `live-three-database.log`:SQLite、MySQL、PostgreSQL 实机测试均为通过。
- `build-latest.log`:前后端与部署工具构建。
通用测试中未提供外部环境的用例仍按自身条件跳过,不能把跳过当成实机通过。三种数据库的实机结论仅来自独立的云端测试日志。
## 清理与真实初始化
按本次授权只清理 Smail 测试环境,没有额外备份,没有停止共享数据库或其他项目。保留原有证书材料,清空并复用 `/opt/smail/data/smail.db`,文件 inode 清理前后均为 `1185535`。旧 `smail-state.db` 已移除。
部署构建版本为 `single-db-20260920`。真实桌面浏览器通过独立 Chrome MCP 完成数据库、管理员、域名、DNS 与证书初始化。首次配置入口通过 SSH 隧道访问;正式登录与刷新访问真实域名,不使用浏览器强制域名解析。
初始化完成后使用正常配置接口将本次 Nginx 反向代理的公网 HTTPS 端口设置为 443,内部 HTTPS 端口保持 8002。第一次初始化自动跳转曾指向内部端口;设置公网端口后,正式入口不再依赖该端口。
配置保存后 `config_records` 出现一条历史记录。服务重启后检查结果:
- `PRAGMA integrity_check` 返回 `ok`。
- 业务表、用户、会话、邮件和配置历史位于同一个 `smail.db`。
- 运行目录中只有一个数据库文件,没有再次生成 `smail-state.db`。
- 历史记录保留,浏览器刷新后仍显示已登录的超级管理员。
证据:`clean-deploy.log`、`live-final-runtime.log`、`live-restart-mail.log`。
## 域名、证书与邮件边界
本次主域和后台域配置正确。公共 DNS 查询确认根域、后台及随机子域均指向测试服务器;现有 MX、SPF、DKIM、DMARC 保留,没有为了匹配向导示例覆盖既有邮件路由。DKIM 公钥与初始化页面展示值一致。
证书 SAN 包含根域和泛域,TLS 主机名与信任链校验通过。Nginx 上游证书校验保持启用,项目证书同步服务执行成功,监视单元已恢复。
本机系统 DNS 曾返回代理使用的地址,命令行 HTTPS 握手失败;独立浏览器通过正常域名成功打开并登录。二者属于不同访问路径,不能据此宣称所有本机网络客户端均已通过。
邮件冒烟测试验证了本机 SMTP 接收、邮件与用户关联落库、后台列表展示,以及 SMTP TLS、IMAP TLS、POP3 TLS 的证书验证和协议欢迎响应。测试邮件最终状态为“已删除”,不在收件箱;本次未单独审计该分类策略原因,也没有放宽安全策略来制造成功结果。
本次没有验证外部收件服务的最终到达,也没有执行三种数据库各自完整的浏览器初始化、完整真实跨库切换链或 IMAP/POP3 身份认证收信,不将上述内容列为已通过。
## 清理与其他项目
本轮专用 MySQL、PostgreSQL 测试数据库和账号已删除,查询确认均不存在;远程 `/opt/smail-single-db-test` 已移除。没有清理正式测试部署的唯一业务数据库。
核对后 Scert、FDM、MySQL、PostgreSQL、Nginx 主进程 PID 与清理前一致,均处于运行状态。Smail 服务及证书同步监视单元正常。
证据:`test-resource-cleanup.log`。原有 `云端全项目测试报告.md` 的未提交修改未覆盖,本报告单独记录本轮范围。
## 旧部署升级说明
旧双库部署必须停服升级。导入并验证成功后,旧状态文件保留为不再打开的迁移原件 `data/migration-history/smail-state.retired`,不是第二个运行数据库。全新部署不生成该原件。本次未针对旧进程并发运行进行升级测试,不能跳过停服要求。
## 最终核验补充
同一轮测试接续核验,没有重复清库,也没有新建备份。
- RAM 控制面确认启用的 `*` 类型 A 记录指向测试服务器;两台权威 DNS 均返回一致结果,邮件所需记录仍在。记录已经满足要求,本轮核验没有重复修改 DNS。
- 从运行 DKIM 私钥导出的公钥与权威 DNS 中 `default._domainkey` 公钥逐字节一致。
- 根域 HTTPS、后台 HTTPS、SMTP TLS 465、SMTP STARTTLS 587、IMAP TLS 993、POP3 TLS 995、POP3 STLS 110 均完成信任链与主机名验证,七个入口的叶证书 SHA256 完全相同,SAN 同时包含根域和泛域。
- 云端三个二进制的 SHA256 与本轮 `out/backend/*_linux_amd64` 构建一致;当前源码指纹与构建时封存值一致。旧 `out/package` 不是本轮上传来源,不能混用其旧包作核验。
- Smail 仍仅打开 `data/smail.db`,完整性检查通过,历史记录保留,其他项目主进程未改变。
前述测试邮件分类原因已查明:数据库记录为 SPF 未通过、DKIM 未通过、状态 3。测试从回环地址未经认证投递,却使用本地域名作为发件人;`backend/listen/smtp_server/read_content.go` 的收件防伪造分支对“本地域名且 SPF 未通过”设置状态 3,与实测一致。无需为让该测试进入收件箱而关闭防伪造保护;这不是数据库迁移丢失邮件,仍不构成正常外部投递验收。
补充证据位于同一本地忽略目录:`dns-control-plane-final.log`、`authoritative-dns-final.log`、`dkim-final-match.log`、`completion-audit.log` 和 `final-database-check.log`。本轮指定的云端测试部署、统一证书、DNS 保留及单数据库目标完成;这里不将测试参数或上述结果扩大为整个项目所有业务的最终验收。