83 lines
6.8 KiB
Markdown
83 lines
6.8 KiB
Markdown
# 单数据库云端测试报告
|
||
|
||
## 范围与结论
|
||
|
||
测试日期: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 保留及单数据库目标完成;这里不将测试参数或上述结果扩大为整个项目所有业务的最终验收。
|