Smail/docs/运行文件目录迁移说明.md
smail e8e14236db
Some checks are pending
Security Checks / security (push) Waiting to run
完成运行配置目录迁移并在设置菜单样式优化前建立检查点
2026-09-05 20:58:18 +08:00

90 lines
7.0 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.

# 运行文件目录迁移说明
## 需求确认
运行配置统一放在 `D:\Desktop\Smail\config`;`backend/config` 是 Go 配置管理源码包,不整体重命名或删除。运行日志继续放在 `test-log/runtime`,编译输出继续放在 `out`。
## 文件归属
```text
Smail/
├── config/ # 忽略 Git 的本机运行文件
│ ├── config.json # 当前启动使用的分区根配置
│ ├── smtp.json # SMTP 分区
│ ├── email.json # 邮箱策略分区
│ ├── ssl.json # 证书引用分区
│ ├── plugins.json # 插件配置分区
│ ├── config.dev.json # 历史 dev 模式配置,不是当前启动配置
│ ├── config_mysql.json # 保留的另一份配置,不自动启用
│ ├── config.json.legacy # 历史配置原始备份
│ ├── smail_temp.db # 当前账号及邮件数据库
│ ├── smail.db # 另一份已有 SQLite 数据库,保留
│ ├── credential.key # 凭据加密主密钥
│ ├── external-email-*.key # 外部邮箱加密和指纹密钥
│ ├── dkim/ # DKIM 密钥及备份
│ ├── ssl/ # TLS 证书、私钥及 ACME 资料
│ ├── migration-backups/ # 配置格式迁移备份
│ ├── backups-v2/ # 分区配置备份
│ └── transaction/ # 配置事务工作目录
└── backend/config/ # Go 源码、同包测试和原有说明文档
```
## 启动约定
- `deploy/start-dev.ps1` 设置 `SMAIL_ROOT=D:\Desktop\Smail`。程序使用 `SMAIL_ROOT/config` 读取和生成运行文件,不能把环境变量设置成 `config` 自身。
- 当前启动继续使用 `--dev-disable-admin-reset`,读取 `config/config.json`,不切换到 `config.dev.json` 或另一份数据库。
- 为保持已有插件安装路径,子进程工作目录仍是 `backend/`。初始化目录已改为基于 `SMAIL_ROOT`,不再向工作目录写入 `./config`。
- 直接运行编译程序或 `go run` 时也需要显式设置 `SMAIL_ROOT`。独立正式部署保留原有环境变量优先、可执行文件目录回退规则。
- 如果 `backend/config` 仍存在旧配置、主密钥或 SQLite 文件,开发启动脚本停止并提示先迁移,防止误初始化第二份账号库。
## 迁移和保护边界
1. 修改前提交中文检查点并推送,真实运行文件不进入 Git。
2. 停止并核实当前项目后端进程,前端保持运行。
3. 迁移前记录源码及运行文件清单和 SHA-256;运行文件另存一份本地回退副本到 `test-log/archive`。
4. 只迁移明确的运行文件,目标存在同名文件时拒绝覆盖;保留 Go 源码及说明文档,不删除旧空目录。
5. JSON、数据库、密钥及证书保持原始字节;分区配置的摘要和相对路径无需更改。
6. 迁移后逐一校验哈希,再启动后端并核对运行根目录、数据库及探活结果。
7. 根目录 `ssl/` 的人工输入证书、`backend/smail.db` 的原有空文件、历史测试配置不属于当前活动配置,不删除,也不冒充当前数据源。
本次是保留数据的目录迁移,不进行清库初始化。自动测试使用 `test-log` 下独立临时数据库;业务数据库仅做只读完整性和账号摘要校验。进程启动后的正常任务可能更新业务数据库,迁移字节校验应在重启前完成。
## 任务清单
- [✓] 核实运行文件、活动数据库与源码边界。
- [✓] 修改前检查点已提交并推送。
- [✓] 开发启动指向项目根目录,并拒绝旧目录残留运行文件;脚本语法、编码及路径约束测试通过。
- [✓] 初始化目录与工作目录解耦;异工作目录、重复初始化、文件保留和目录冲突回归通过。
- [✓] 停服备份并迁移 24 个运行文件,重启前逐一哈希一致;55 个源码及说明文件保持不变。
- [✓] 三个后端程序重新编译,前端 19 项自动测试、Go 全量测试及静态检查通过。
- [✓] 从新目录恢复后端,两份 SQLite 完整性及迁移前表记录数一致,账号记录在重启前后均未改变;前后端探活正常。
- [!] 符号链接拒绝测试在当前 Windows 普通账户下因缺少创建符号链接权限而跳过,未提升权限,也未据此宣称该分支实测通过。
## 本次验收记录
2026-09-05 本地迁移结果:
- 修改前检查点:`3c455186b70289238167a19432431ace74ee79e4`,已核对与远端 `smail/main` 一致;后续本轮代码改动保留在工作区。
- 停止的旧后端进程编号为 `23136`;新进程编号为 `45920`,可执行文件位于 `out/backend/smail-dev.exe`。进程编号仅代表验收当时状态。
- 新启动日志显示 `Env Root Path: D:\Desktop\Smail/`,当前配置仍是 `config/config.json`,数据库仍由 `localRef=smail_temp.db` 指定,分区代次保持 `1`。
- 两个 SQLite 文件各有 20 张表;保留库 `smail.db` 有 0 个账号,活动库 `smail_temp.db` 有 1 个账号。校验不输出账号、密码哈希或密钥内容。
- 重启后 23 个非活动数据库运行文件及 55 个源码说明文件哈希仍一致;活动数据库仅允许正常运行写入,账号完整记录与备份比较一致。
- `https://127.0.0.1/api/ping` 和 `http://127.0.0.1:15173/api/ping` 均返回 HTTP 200、`errorNo=0`、`pong`;前端页面返回 200。
- `https://127.0.0.1/config/credential.key` 返回 404,没有把新运行目录当作静态资源公开。自签名证书探活使用跳过本机证书信任验证参数,不代表公开 CA 信任验收。
- `node test/run.mjs all -- -count=1 -p 2 ./...` 通过;随后单独复跑 `TestDirInit`,三个用例通过、符号链接用例跳过。
- `go -C backend vet -p 2 ./...`、PowerShell 语法检查、`git diff --check` 和 Go 格式检查通过;启动脚本仍保留 Windows PowerShell 5 需要的 UTF-8 BOM。
- Git 忽略规则确认根目录配置、密钥、数据库、回退副本、日志和编译产物不会进入提交。
本地回退副本:`test-log/archive/runtime-config-20260905-202201/`。目录包含密钥和数据库,仅留在本机,不上传。
检查证据:
- `test-log/reports/runtime-config-migration-20260905-202201.json`:完整移动、哈希和源码保留清单。
- `test-log/reports/runtime-config-sqlite-before-start.json`:重启前数据库完整性、记录数及账号一致性。
- `test-log/reports/runtime-config-after-start.json`:重启后路径、运行文件与账号一致性。
- `test-log/reports/runtime-config-build-20260905.log`:本次后端及管理工具构建记录。
- `test-log/run-2026-09-05T12-20-49-905Z-23176/`:完整自动测试记录。
- `test-log/run-2026-09-05T12-24-16-351Z-24952/`:初始化目录专项回归记录。
真实邮件收发、浏览器全部流程和 Linux/Windows 正式安装不在本次迁移验收范围内,不能以探活成功代替这些验收。