Scert/doc/Scert整改任务执行清单.md

3523 lines
361 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.

# Scert 整改任务执行清单
## 2026年10月16日 前端同一行按钮对齐样式整改与初始化会话核验
- [✓] 完成前端所有按钮样式审查,针对同一行按钮排版(`App.css`、`.dns-row-actions`、`.settings-tabs`、`.modal-actions`)补齐 `display: inline-flex; align-items: center; justify-content: center; vertical-align: middle`,确保水平对齐与垂直居中。
- [✓] 前端 355 项测试全量通过(355 pass, 0 fail),生产构建 `vite build` 打包正常。
- [✓] 清理项目根目录历史无用 `.tmp/.bak/.log` 冗余临时文件(累计清理 162 个),避免空间膨胀。
- [✓] 远程第一台(`8.137.23.95`)Bootstrap 服务重启取得新令牌并成功换取初始化管理 Session,数据库权限测试通过。
- [~] 正在执行系统引导初始化:创建超管用户 `xuans`(密码 `12345678a`)、管理员账号、普通用户账号;待进入发信测试时停顿等待用户提供发信凭据。
- [ ] 待用户发信凭据配置完成后继续 Smail 发信验证、受保护重置闭环、第二台(`45.136.13.241`)SSL 推送演练与整体验收。
## 2026年10月6日10时47分 第一台 Web 发布与角色验收
- [✓] 候选包仅为 Linux amd64,source_commit=`39cbd833121f81687a744c15ce0dcb7864fc85e9`,source_dirty=false;归档 SHA-256=`3a82fff4ab7aeef62ad5d6d217b56a270e81b5678631ed43af9334df31cec029`。
- [✓] 仅将候选包中的 Web 四个文件上传第一台 staging 目录,上传前后摘要逐项一致;切换前保留旧 Web 目录,回退副本为 `/scert/backups/web-before-20261006-account-39cbd83`。
- [✓] 切换后第一台 `/scert/web` 摘要为 index `931824...3bbbb`、JS `a1f98...14ab9`、CSS `7bdcb...0f167`、Logo `81b7...83f55`;Scert、存储套接字、Nginx 均 active,未重启服务。
- [✓] 浏览器清缓存后实际加载新 JS;普通用户账号权限显示、跨用户中心板块显示、管理员账号权限显示均通过。
- [✓] 管理员页面不显示系统设置按钮;直接请求 `/api/v1/settings` 返回403,普通用户此前同样返回403。
- [✓] 第二台限定范围复核未发现 `/scert`、`/opt/scert` 或本次发布标识;未上传、未安装、未重载第二台既有服务。
- [~] 任务清单中的 Web 角色显示待办已完成,邮件、恢复锁及其他 Linux 生产门禁仍按独立证据链继续。
## 2026年10月6日 普通用户账号显示补齐
### 已确认需求
依据右侧显示当前登录账号及权限的既有要求,补齐普通用户独立用户中心;管理员与普通用户不得出现不可用的系统设置入口。不修改后端权限、不清库、不重置密码、不操作第二台恢复锁。
- [✓] 正式页面完成管理员、普通用户表单登录;管理员账号权限可见,普通用户中心缺少独立账号权限区域。两者系统设置接口均403。
- [x] 普通用户右上角显示实时会话账号与中文权限,切换业务页时保持可见;会话失效、重新验证期间清除旧身份,晚到请求不能覆盖新会话。
- [x] 非超管隐藏系统设置按钮,保留后端及前端函数权限校验。
- [✓] 新增身份显示、转义、会话清理及角色入口回归;专项31项、前端全量347项通过,生产前端构建通过。这是本机构建机验证,不代替线上可视验收。
- [~] 构建 Linux 发布候选;本次仅变更前端,第一台计划保留旧资源与回退副本后更新 Web,避免不必要的后端重启触发历史事务恢复。后端二进制和生产数据库保持不变,第二台不接收部署包。
- [ ] 第一台新资源摘要、三角色账号权限、普通用户跨板块显示及访问边界浏览器复核。
## 2026年10月4日 Linux 上线整改接手状态
### 本轮任务清单
- [✓] 检查 `main` 分支、工作区和最近提交;当前检查点为 `f5c425f 开始执行Linux上线整改`。
- [✓] 后端 `go test -p 1 -count=1 -timeout=12m ./...` 通过;前端 `npm.cmd test -- --run` 为 338 项通过、0 失败、0 跳过;前端生产构建通过。
- [✓] Linux `linux-amd64` 候选包已构建并完成第一台部署;包内 `SHA256SUMS`、`/scert/scert` 和 `/scert/scert-admin` 哈希核对通过。
- [✓] 第一台 `Scert.service`、`Scert-storage.socket` 恢复 active;`Scert-admin.service` 保持 inactive,符合本机受保护终端按需启动边界。
- [!] 第一台 `scert.json` 的 `smtp_enabled=false`,真实邮件验证码和本机密码重置闭环未完成;不得把 Smail 页面可访问写成邮件投递成功。
- [ ] 第二台 `45.136.13.241` 正式证书推送、配置检查、Nginx 重载、失败回滚及恢复测试待执行。
- [ ] 三数据库首次初始化、重新登录持久化、DNS/ACME 正负向矩阵和公共 HTTPS 最终验收待执行。
- [!] 历史恢复事务继续保留人工处置状态,不自动接管、不删除锁、不伪造成功。
- [!] 总体生产门禁未关闭,等待实机证据和复审。
### 发布与部署记录
- 发布目录:`release\production-candidate-20261004-f5c425f\Scert-20261004-V0.1.0`。
- 归档 SHA-256:`38fb6986548e3c95295d5ff37b0141e54b2e142798384566a4464018e582f4ef`。
- Manifest 源码提交:`f5c425f4b60fc3c1308ab86d859511868e08e4ff`;工作区干净,目标为 `linux-amd64`。
- 第一台:`8.137.23.95`;第二台:`45.136.13.241`。两台职责不混用,第二台尚未执行本轮正式推送。
## 2026年10月4日11:07 当前执行状态
- [✓] 第一台 `37765ff` 的 `0757` 单元已成功结束,11:05 复核 inactive/dead、success、退出零及干净源码;旧三库租约和迁移复审等待项关闭,历史失败记录保留。
- [✓] 邮件配置仅超管读写及前端防绕过本地复审通过:后端三包全量与 vet、前端 350 项与构建;新增测试首轮夹具错误已修正。
- [~] 继续 P1-03 旧账户幂等导入;遗留租约核对、安全回收、真实签发续期、最新 Linux 产物和浏览器仍待完成。
- [ ] 用户完成系统通知凭据配置后的真实发信及本机恢复验收。浏览器保留,不代填密码、不保存、不刷新。
## 2026年10月4日07:40 执行租约边界复核
07:55 实库结果:第一台 Linux 全量、vet、三库租约与原子创建竞态通过。MySQL 迁移故障夹具未注入真实排序规则差异导致整轮失败,修正并补列级冲突后待复跑;授权探测增量仍需独立复审。
07:51 补充:授权探测的临时 TXT 与 ACME 挑战一样受租约保护,每域名重新授权,探测失败保留未知外部状态引用。本地三包及 vet、专项十轮通过,第一台增量待验证。
- [x] 完成租约迁移二十九、真实任务授权、固定凭据引用、取消清理及活动引用保护;新建域名与首次绑定改为原子事务。
- [x] 完整签发配置比较避免同秒修改漏检,底层更新/删除加锁并拒绝活动租约;接口忙状态映射 409。
- [✓] 本地五包全量与 vet、租约十轮及接口五轮专项、前端 339 项和构建通过;首轮 SAN 测试夹具错误已修正并保留失败说明。
- [~] 第一台 Linux 与三库本轮实测待执行;真实签发、续期、重试、遗留租约核对、安全回收、旧账户导入和最终生产验收未完成。
## 2026年10月4日06:51 DNS 域名配置接入
- [✓] 第一台 `412c51f` 干净源码全量、vet 和三库目录及接口单轮竞态通过,`0630` 单元退出零;不是三轮结果。
- [x] 域名表单账户选择及显式绑定、解除完成,保留原不可用绑定;冲突和不确定结果要求重新读取,部分成功不重复创建或绑定。
- [✓] 前端 336 项与构建通过,新增 26 项逻辑及渲染回归;最新页面未发布,浏览器验收待完成。
- [~] 执行租约、签发续期重试、历史导入及安全回收继续开发;P1-03 和总体生产验收不关闭。
## 2026年10月4日06:28 DNS 页面生命周期
- [✓] 第一台 `0610` 修复版单轮三库竞态四包通过;原 `0555` 磁盘不足失败已记录,清理范围仅已停止的隔离 MySQL 数据,日志保留。
- [x] 页面新建、改名、启停、轮换、验证与权限提示接入;保留用户归属、分页和历史账户只读展示,不增加未实现的删除入口。
- [✓] 前端全量 310 项、生产构建、后端 HTTP/仓储全量及 vet 通过;新增 24 项前端专项覆盖权限、版本、敏感输入清空、竞态和异常。
- [~] 本批代码第一台 Linux 干净源码复审、域名表单、执行租约与签发续期、旧导入和回收继续推进,不升级未完成版本,不关闭 P1-03。
## 2026年10月4日05:54 域名 DNS 绑定接口
- [x] 绑定读取、写入、解除路由及严格参数、权限、缓存、同源、版本、状态和审计回滚测试已实现;本地两包全量和 vet 通过。
- [!] 第一台原 0538 任务已失败退出一,MySQL 外键排序规则冲突是实际缺陷;Linux 无外部库全量及 vet 通过不能替代三库验证。
- [x] 新外键列按父表实际字符定义生成,重入继续严格校验;补数据库默认值改变和错误排序规则用例,待第一台实测。
- [ ] 执行租约、旧账户导入、签发续期、删除回收及前端继续按完整 P1-03 推进;未部署过渡版。
## 2026年10月4日05:34 域名 DNS 账户绑定
- [x] 三库迁移二十八、同项目绑定、账户版本与状态检查、旧绑定令牌拒绝、在途任务保护及原子审计已实现;删除域名释放绑定但保留账户。
- [✓] 本地四包全量、二十轮仓储专项及 vet 通过;完整实库与 Linux 回归待修复版本终态。
- [!] 干净 `1dc72f2` Linux 全量发现 SQLite 锁错误被包装为凭据重复;已按驱动码修正,不隐藏失败。
- [ ] 绑定接口、旧账户导入、执行租约、安全回收、实际签发续期及前端仍需接通。当前独立绑定禁止回退系统凭据,不计为功能验收。
## 2026年10月4日05:04 DNS 账户管理接口
- [✓] 修改前检查点 `02e0399` 已提交推送,包含上一批数据层和失败夹具状态;未跟踪文件 `=` 不处理。
- [x] 独立账户管理与服务端验证路由、实时项目权限、版本竞争和用户归属列表已接入。
- [✓] 本地四包全量、静态检查,以及新增故障用例后的三轮专项通过;验证器注入测试不算真实 DNS 云端验收。
- [✓] 05:09 实查第一台三库及 HTTP 三轮竞态任务 `scert-dns-accounts-api-20261004-0458.service` 已 inactive、success、退出码零,含 vet;两批失败均保留。隔离覆盖树结果不代替最新干净源码全量。
- [ ] 旧账户导入、域名绑定、执行租约、安全回收、签发续期和前端仍待开发,完整 P1-03 不关闭。
## 2026年10月4日04:32 DNS 多账户数据层
- [✓] 基于 P1-03 已确认需求建立《DNS多账户整改任务清单》,修改前检查点 `26b8c3c` 已提交推送。
- [x] 独立账户模型、迁移二十七和基础权限仓储已实现,含归属、启停、轮换后验证失效、版本冲突与事务审计。
- [✓] 第一台首轮三库专项及 vet 结束成功;本地首轮 SQLite 外键关闭缺陷已补触发器修复,未掩盖失败。
- [~] 增量三轮竞态和更完整三库事务回归运行中,具体执行单元与日志见专项清单及测试记录。
- [ ] 旧配置迁移、域名绑定、运行租约、安全删除、签发续期和 Web 操作仍待接入;P1-03 和生产验收不关闭。
## 2026年10月4日03:55 系统设置隔离任务
- [✓] 需求确认:全局系统设置仅超级管理员读写;普通管理员仍可使用项目工作台,不能因设置接口被拒绝而整页失败。
- [✓] 后端读取与写入统一实时权限和无缓存边界;前端按会话加载、清除旧配置并隔离并发响应,普通角色不请求专属管理目录。
- [✓] 前端全量 286 项和生产构建通过;旧源码后端红测已确认漏洞,修复后设置专项通过。
- [✓] 第一台首批全量两项旧权限契约失败已修正;HTTP API 全量、vet、三轮专项竞态复跑成功,单元 `scert-settings-scope-fixed-20261004-0343.service` 已 inactive、success、退出码零。首批失败记录保留。
- [✓] 干净源码 Linux 全量及 vet 成功结束,最终包 `c5774f3` 已完成第一台正式安装、运行摘要及内部严格 TLS 复核。
- [ ] 公共浏览器真实角色矩阵待完成;不能把回环检查计为公网最终验收。
- [!] 正常公共域名、系统发信授权、三库首次 Web 与剩余 DNS/ACME 门禁仍待完成;第二台只做推送,不重复主程序测试。
本节沿用已确认需求,检查点 `8b26cbf` 已推送;详细失败和复跑证据见《Linux生产流程测试记录》。
## 2026年10月4日03:14 本批复审及后续任务
沿用已确认需求,检查点 `7b670a0` 已推送。本节覆盖下方“等待回归与部署”的历史状态,不改变总体目标。
- [✓] 复读第一台全量、vet、专项竞态、真实 Nginx 与三库迁移日志;三个执行单元均 success、退出码零。
- [✓] 实际签发快照授权回归通过,拒绝路径早于状态修改、租约和 DNS 凭据读取;覆盖 HTTP 转 DNS、默认 DNS、项目及域名变化、撤权和重试。
- [✓] 官方 Linux 包已含两个 Nginx 模板,前端 279 项通过,第一台升级至干净 `9c26db0`,运行摘要已复核。
- [✓] 第一台 80 挑战反代与严格 TLS 内部就绪通过;第二台未操作。
- [✓] 六份文档边界已核对并提交推送 `f327298`;第一次推送认证失败,后续重试成功。
- [✓] 真实 lego 客户端隔离 HTTP-01 协议四场景、五轮竞态、证书包全量与 vet 已在第一台通过;新增正式 Go 用例,无辅助脚本。
- [ ] 完整 DNS 多账户增删、禁用、轮换及归属生命周期。
- [ ] 完整 CNAME 委派生命周期及其余元数据接口权限复审。
- [!] 第一台公共域名、系统发信授权与三数据库首次 Web 门禁保持;公共域名实际签发不以内部请求替代。
### 系统设置读取隔离任务
沿用 P0-07 和本批元数据权限复审范围:系统全局设置只允许超级管理员读取,普通管理员和项目成员保留正常项目工作台;拒绝和成功响应均禁止共享缓存。先补旧代码失败用例,再修复,不缩减原有 DNS 账户可读范围。
- [~] 补后端正式路由回归:匿名、普通管理员、项目角色、超级管理员、原会话降权及缓存边界。
- [ ] 限制全局设置读取;前端按实时会话角色加载,降权时清除旧系统配置,失败不能沿用旧权限。
- [ ] 前后端回归、Linux 新包与第一台升级;完成前不把线上缺口标为关闭。
## 2026年10月4日02:46 HTTP 验证回归修复任务
沿用已确认需求,修改前检查点 `16224fa` 已推送;第一台只运行隔离回归,不修改线上数据,不操作第二台。
- [x] 首批原生 Linux 回归已发现接口测试结构体编译错误和 SQLite 历史快照新增列误报;已修复,等待重跑,不隐藏失败。
- [~] 同步及异步用户签发在实际配置快照上重新授权,覆盖 HTTP 切换 DNS、项目归属变化及重试权限;补充回归用例。
- [x] 核对正式发布脚本:完整复制 nginx 目录,因此新增挑战片段会被打包;实际产物仍待检查。
- [~] 新增正式 Go 集成用例,读取真实 Nginx 挑战片段,在独立回环进程验证挑战、错误 Host、普通跳转、共站业务、凭据剥离及错误上游证书拒绝;不是辅助验收脚本,结果待获取。
- [~] 完成 Linux 全量、静态检查、竞态和三数据库迁移,再更新主清单及正式部署记录。
- [!] 公共入口切换、系统通知授权和首次 Web 全矩阵仍未通过,不将单测当作生产验收。
## 2026年10月4日 HTTP-01 开发任务
沿用已确认的 P1-03 要求,仅处理 Linux 与 Web。开发前检查点 `e829d66` 已推送;不修改公共 DNS,不重复第二台推送测试。
- [x] 按订单隔离 HTTP 挑战:域名、令牌、归属校验,取消、失败、超时清理;接入正式应用路由。等待 Linux 回归。
- [x] 持久化验证方式,历史数据默认 DNS-01,三库新增迁移二十六;MySQL 中断恢复检查字段结构,待实库复审。
- [x] 接入正式签发、重试及前端选择;HTTP-01 不读取 DNS 凭据,保留项目权限;拒绝任意泛域名 SAN。前端正式测试 279/279 通过,后端待回归。
- [x] Nginx 80 挑战反代模板保留 Host 与严格上游 TLS,重定向移入普通路径,不新增外部端口、不接管其他站点;逐域名实际配置待验。
- [~] Linux 目标编译通过;第一台后端、隔离实库回归及正式部署待执行。真实域名签发单独验收,不以单测或内部路由代替。
- [!] 管理域名仍指第二台,切换尚待确认;Smail 系统通知授权、三数据库首次 Web 及整体生产门禁继续保留。
## 2026年10月4日02:03 DNS 隔离发布收尾任务
- [✓] 干净 `2513f93` 正式 Linux 包构建及两端摘要、包内文件摘要校验通过,仅上传第一台。
- [!] 首批全量因普通源码归档缺 Git 索引,发布源码边界两项测试失败,后续 vet 与竞态未执行;明确保留失败结果。
- [✓] 同提交完整 Git 仓库在第一台以 nobody 干净签出,全量、静态检查及专项竞态已全部结束通过;未削弱断言或创建辅助验收脚本。
- [✓] 官方安装器已升级第一台至 `2513f93`,实际运行主程序、管理程序及 Nginx 返回的前端资源摘要与发布清单一致;严格 TLS 就绪、回环监听和正式 DNS 匿名/超级管理员路由通过。没有用内部检查代替公网或全角色实机验收。
- [!] 公共域名仍指第二台,不在那里配置发信;HTTP-01、账户生命周期、委派管理及首次 Web 门禁继续保留,不缩减目标。
## 2026年10月4日 DNS 账户项目隔离补漏
沿用已确认的 P0-07、P1-03 要求:第一台进行主程序与隔离回归,第二台仅验证证书推送;不重复磁盘检查、签发和已通过的恢复测试。
- [x] 核对源码:DNS 账户列表目前只校验全局管理员身份,返回的项目归属没有用于读取授权;需修复跨项目元数据暴露。
- [x] 正式回归已在旧源码复现越权及撤权失效:无项目角色的管理员收到完整账户元数据;失败记录保留,不与修复后的通过混用。
- [x] 列表接入实时项目 DNS 读取权限;项目内授权角色可读取脱敏列表,撤权后原会话立即失效,依赖异常拒绝返回数据;导航开放项目角色入口,不放开系统设置写权限。
- [✓] 第一台隔离 Linux 专项通过,覆盖匿名缓存隔离、默认项目、跨项目、缺依赖及数据库失败,拒绝路径没有读取凭据;前端 276 项通过。后端全量、vet 与竞态已在完整 Git 签出中通过,首批归档输入失败保留在测试记录。
- [✓] `2513f93` 正式包已部署第一台并复核实际运行摘要、匿名及超级管理员路由;不据此将 P0-07 全部或第一台公网验收标记通过。
- [!] 源码仅接入 DNS-01,HTTP-01 尚未接入,属于开发缺项而非仅缺实机证据。账户独立增删、禁用轮换和委派管理的完整矩阵继续保留,不能由已有单系统账户或 Provider 适配器代替。
- [!] 管理域名仍指第二台,用户要求真实域名入口;不使用本地映射或隧道冒充公共验收,不在第二台配置发信。
## 2026年10月4日01:10 下一阶段前提
- [✓] 不同版本恢复、真实崩溃回滚及正式重试已通过并在 `4d82bd0` 提交,第二台本批推送测试收尾,不再重复。
- [!] 第一台内部前后端正常,但公共入口定向诊断仍 HTTP 403、HTTPS 握手失败;管理域名服务器侧 DNS 仍指第二台。等待可正常访问并指向第一台的管理域名,不以第二台代替。
- [!] Smail 网站严格 HTTPS 可达;Scert 系统 SMTP 尚未启用及授权,需要 Smail 系统通知专用身份和授权,不改用普通邮箱。
- [ ] 前提满足后,在第一台执行三数据库清库首次 Web、系统邮件与验证码重置;DNS/ACME 剩余矩阵和历史恢复证据继续保留。未清库、未启动重复实例,也不反复探测同一外部阻塞。
## 2026年10月4日00:55 不同版本证书实机任务
沿用已确认的 Linux 范围。第一台负责 Scert 与业务测试,第二台仅接收证书并验证部署生效;不重复主程序、数据库、初始化测试,不例行检查磁盘。
- [✓] 已核对正式恢复接口只更新本地托管版本,不隐式部署;目标域名现有两个不同指纹的有效证书可复用,无需额外签发。
- [✓] 01:04 收尾:第一台通过正式接口恢复历史版本并推送,两目标成功;第二台文件与正常 DNS 严格 HTTPS 实际指纹均切换。
- [✓] 不同指纹部署在第二目标重载阶段真实 SIGKILL,第一台自动重启,两目标恢复旧指纹,事务 rolled_back;第二台 HTTPS 200、TLS 校验零。
- [✓] 正式 retry 接口重试成功,托管当前版本和两目标均恢复原指纹;失败尝试、回滚事务与重试审计保留,无本次事务残留。
- [✓] 记录两次未实际生效的中断尝试,不计入故障通过;本批真实回滚指纹不同,区别于此前同证书测试。
- [ ] 三数据库首次 Web、Smail 系统发信与重置、DNS/ACME 剩余矩阵继续推进;第一台公网与历史无可信基线问题仍保留。
## 2026年10月4日00:40 最新执行状态
- [✓] 最新后端全量、静态检查、五包专项与竞态结束通过;前端 275 项通过。
- [✓] 三数据库重新核查、审计失败与连接池重开验证通过;首批实库时间精度夹具失败及修正复跑均记录,不将首批整体记为通过。
- [✓] 干净 `e00a757` Linux 包经官方安装器升级第一台,schema25、二进制摘要、回环严格 TLS 和监听边界核实通过。
- [✓] 正式菜单五收尾真实 uncertain,菜单四及数据库只读查询确认新审计成功、原历史保留、事务 committed、占用为零。
- [✓] 正式本机人工回滚成功;另一处置在 running 时主动断开 SSH,重新登录查询人工提交成功,审计与占用复核通过。
- [~] 同证书回滚不等于不同版本回滚;不同版本证书与 DNS/ACME 实机剩余矩阵继续待验。
- [ ] 三数据库清库首次 Web 仍未完成,本次保留数据升级不能替代。
- [!] 公网入口、系统通知授权与两条缺可信基线的历史事务仍未关闭;整体不标记通过。
## 2026年10月3日23:58 当前执行状态
- [x] 独立重新核查实现、本机菜单五及迁移二十五已完成编码,原 uncertain 永久保留,只核验原方向,不执行远端写操作。
- [✓] 五包专项及竞态通过;覆盖最新本机会话、协议和终端用例。
- [~] 后端全量、静态检查、隔离 MySQL/PostgreSQL 迁移与执行器回归正在运行,结果以测试记录后续更新为准。
- [ ] 正式包升级、实机重新核查释放占用、人工回滚与断连验证仍待执行。
- [!] 公网、系统通知授权及首次初始化等生产门禁未关闭;不将源码测试代替上线验收。
## 2026年10月3日23:14 当前整改任务
- [✓] 真实部署重载阶段 SIGKILL 后,systemd 自动重启及双机回滚通过;第二台 HTTPS 正常。
- [✓] 故障注入仅限制 Scert 用户到第二台 SSH,未改变 root 管理连接及网站端口;临时规则和撤销定时器已撤销。
- [!] 人工提交到达 commit_verified 并清理远端锁后,被连接关闭错误误判为 uncertain;原记录及持久化占用保留,不手动修正终态。
- [x] 健康 SSH/SFTP 关闭错误已通过真实协议测试复现并修复,整包竞态退出码零。
- [~] 后端全量、静态检查及正式包更新;完成后补实机验证。
- [ ] 独立授权的未确定处置重新核查收尾、人工回滚成功、执行中断连查询与其他生产门禁未完成。
## 2026年10月3日22:44 当前执行结论
- [✓] 多对多正常路径取得直接证据:两个有效域名、两台服务器、四目标成功,第二域名通过正式导入接口接入,未直接改数据库。
- [✓] 恢复负向:缺少可信旧站点指纹时正式恢复基线动作拒绝且审计可查,未执行远端变更。
- [!] 原 `.odacm.cn` 第二域名没有对应 Nginx 站点,恢复未确认事务和锁继续保留;正常 `.apmmk.cn` 导入成功不关闭这一阻塞。
- [!] 第一台公网实测为备案拦截:HTTP 403,HTTPS 重置。保持回环 Scert 与 Nginx 80/443 边界,不用高端口绕过。
- [!] SMTP 设置未启用且无系统凭据;`web.cdis.cn` 可达,通知 API 要求认证。仅系统账号授权发信可进入邮件验收。
- [~] 下一批优先处理实际人工恢复、首次 Web 与系统邮件接入;公共入口需解决实际部署环境阻塞后才能放行。
## 2026年10月3日22:32 最新执行结论
- [✓] `a5dfd42` 干净 Linux 候选包完成,第一台已正式安装并运行,迁移 24、回环严格 TLS 和管理员真实交互已核对。
- [✓] 正式任务 `ecfd31f0-ba6d-4cbb-a3e7-485568eabfaf` 两目标成功且事务 committed;第二台正常域名 HTTPS 200、证书校验零错误,重放返回原任务。
- [!] 第二域名真实推送失败,任务 `8efd495b-5511-4070-a7ab-2e02afac82bc` 及两条恢复未确认事务保留;没有删锁、伪造证据、直接改终态或关闭 TLS。
- [✓] 正式 Unix socket 管理终端仅记录核查成功,重开终端按处置编号可查;不扩大为提交、回滚或强制断连验收。
- [~] 核对第二域名实际 Nginx 配置;后续继续正式恢复与首次 Web、系统邮件等门禁。
第二台当前只完成新包发起的证书推送,不表示第二台已安装新管理包。完整生产验收仍未通过。
## 2026年10月3日22:03 最新执行结论
- [✓] `scert-external-disposition-20261003-2143.service` 已结束:MainPID=0、inactive、Result=success,五项退出码零。
- [~] 本轮只修正 Linux 发行运维说明并准备正式包;公网只用 Nginx 80/443,管理恢复只走受保护本机通道。
- [ ] Linux 候选包及双机实际部署验收尚未完成;测试回归不替代生产验收。
## 2026年10月3日21:48 最新执行结论
- [✓] 本机接入整组 Linux 回归正常结束,五项退出码零;检查点 `0f2e6bf` 已推送。
- [✓] PostgreSQL 14.24 迁移三场景、执行器十场景和 MySQL 5.7.44 执行器十场景通过;仅隔离实库,不是实际 SSH/HTTPS 验收。
- [✓] 前端 275 项测试通过;第二台磁盘剩余 26 GB,不再作为阻塞。
- [~] 最新 SQLite 执行器、静态检查和后端全量仍运行;之后构建正式 Linux 包。
- [ ] 三数据库首次 Web、系统邮件和双机生产门禁仍待完成。
## 2026年10月3日21:32 最新执行结论
- [x] R3-F/G/H 本机会话、协议隔离、终端风险确认及断连查询已接入。
- [✓] 修复版 Linux 三包竞态、HTTP 本机专项竞态、静态检查和后端全量退出码零。
- [~] HTTP 全包竞态仍运行,不能把运行中的整组标通过;首次夹具失败和 HTTP 五分钟超时不隐去。
- [~] 继续 R4 必要外部数据库处置原子性与重开查询;后续为 R5 正式 Linux 包与双机验收。
- [x] 第二台磁盘已实查剩余 26 GB,不再属于阻塞;系统邮件和完整生产门禁仍未通过。
## 2026年10月3日21:00 最新执行结论
- [✓] 最新执行器竞态、SQLite 五场景、后端静态检查及全量通过,任务正常结束;`bf4caeb` 已推送。
- [~] 本机协议、管理员终端和相关隔离测试正在接入。
- [ ] 外部实库、正式 Linux 包和双机生产门禁未完成,不能宣布上线验收通过。
## 2026年10月3日20:52 最新执行结论
- [x] R3 确认和三动作执行器已编码,并接入 R4 共同操作门、持久占用、原子开始/结束审计;查询结果不触发重放。
- [✓] 基础部署竞态、SQLite 原子三动作、开始/结束审计失败和数据库重开拦截通过;完整静态检查及后端全量通过一轮。
- [~] 最新追加的未知临时文件完整集合检查与安全查询正在重新回归;测试任务 `scert-executor-final-20261003-2052.service`,源码归档哈希已比对。
- [ ] 本机协议和终端尚未接入,因此 R3 整体仍未完成;R4 PostgreSQL 等必要实库与 R5 正式包生产门禁仍未完成。
- [~] 文档同步;本节覆盖下面历史状态,不将自动回归等同于生产验收。
## 2026年10月3日20:17 当前执行状态
- [x] 完整部署互斥和人工占用防护已编码;部署竞态、完整静态检查、补充竞态均通过。
- [x] SQLite 实际关库重开后由真实部署服务识别遗留占用,不连接远端、不改原事务;无占用仍正常恢复。
- [~] 最新后端全量运行中。
- [ ] 一次性本机确认、动作执行器及本机交互、PostgreSQL 实库、正式包与生产门禁仍未完成。
## 2026年10月3日20:04 当前执行状态
- [x] 隔离 MySQL 迁移十二场景通过,仓储三动作及三个审计失败回滚场景修复后通过。
- [x] 补充竞态通过;此前权限失败日志未覆盖,未放宽生产数据库权限。
- [~] 接入部署完整互斥及自动恢复占用检查,随后执行最新全量。
- [ ] R3/R4 整体与 R5 正式包、真实邮件、三数据库首次流程及双机验收仍未完成。
## 2026年10月3日19:43 当前执行状态
- [x] 修改前检查点 `ed0c97b` 已提交并推送,根目录 `=` 未暂存、未删除。
- [x] 最新准备绑定的三包竞态、完整静态检查及 HTTP 全包竞态通过;此前四分钟包累计超时已由十分钟有界回归获得真实通过结果,未跳过用例。
- [x] 持久化基础及第一轮仓储、数据库、部署三包竞态、完整静态检查通过;原子审计故障、幂等冲突、并发唯一占用及不确定保留占用有回归覆盖。
- [~] 补测数据库重开与 MySQL DDL 中断和实库处置审计;未把默认跳过的外部实库测试当作通过。
- [ ] 接入一次性确认、完整互斥与真实动作执行,再推进正式候选包和生产门禁。
- [~] 第二台已复核可用约 26 GB,未扩大清理;第一台仅运行受限隔离 Go 回归,未修改线上业务数据库或恢复终态。
## 2026年10月3日19:02 当前执行状态
本节优先于历史章节。第一台部署、第二台推送,Linux 范围不变。
- [x] 数据库截止时间修复后的原生后端全量通过,相关专项重复二十次通过。
- [x] R2 有界分片实现及异常传输回归通过;本机协议、管理员终端、部署三包竞态通过;完整 `go vet -p 1 ./...` 通过。
- [!] 原五包竞态任务因 HTTP 依赖编译限流超时,整体失败,四包成功不得替代整体结论。
- [~] 最新全量和 HTTP 竞态串行验证中;R3、R4 人工处置闭环继续开发。
- [ ] 新版正式候选包、三库首次 Web、真实邮件、DNS/ACME、严格 HTTPS 和回滚恢复仍待完成。
## 2026年10月3日18:28 当前执行入口
本节优先于下方历史状态。第一台 `8.137.23.95` 用于部署测试,第二台 `45.136.13.241` 仅用于证书推送测试;不增加双机主服务要求,不处理 Windows。
- [x] 修改前检查点 `978f023` 已推送;本机核查 Linux 三包和 HTTP 专项通过。
- [~] 补齐完整仓库验证环境,修复 SQLite 截止时间错误;随后重跑全量、竞态及静态检查。
- [ ] 完成人工处置、原子审计和互斥,再构建第一台正式候选包并验证第二台推送。
- [!] 总体生产验收未通过;保留全部尚未闭环的三库、邮件、DNS/ACME、HTTPS 和回滚门禁。
> 当前进度见文末「2026年10月3日17:22 当前执行进度补充」,历史章节保留供追溯。
## 2026年10月3日 当前任务清单:Linux 双服务器上线冲刺
### 当前需求与验收任务
- [x] 仅处理 Linux,保留密码 SSH、Nginx 反向代理 `80/443` 和严格 TLS 校验边界。
- [x] 验证一个域名部署到多个服务器,以及一个服务器承载多个域名。
- [x] 验证证书推送、远端 Nginx 配置校验、reload、部署后 HTTPS 校验和失败回滚。
- [~] 管理域名保护代码和 Nginx 配置兜底已完成,待两台服务器执行 `odacm.cn` 普通部署负向复测。
- [ ] 清缓存重新执行首次初始化及登录流程。
- [ ] 完成 SQLite、MySQL、PostgreSQL 首次初始化矩阵。
- [ ] 完成 Smail 系统账户真实发信、验证码和超级管理员重置密码闭环。
- [ ] 完成 DNS/ACME 正向与负向场景、历史证书恢复和升级失败回滚。
- [ ] 形成最终双机生产验收报告并仅在全部门禁通过后标记 `[✓]`。
### 2026年10月3日 实机证据
- [x] `scert-20260930.apmmk.cn`:任务 `38689124-e4bb-432c-8f9c-b6f75546107c`,两台服务器均显示“证书部署、配置校验并 reload 成功”,站点 HTTPS 校验通过。
- [x] `scert-multi-20260930.apmmk.cn`:任务 `68478d62-2b22-4320-a3e9-00018cb1bde0`,两台服务器均显示“证书部署、配置校验并 reload 成功”,站点 HTTPS 校验通过。
- [x] 浏览器页面仍显示两个域名分别关联“生产测试服务器、第一台生产测试服务器”。
- [x] 公网严格 HTTPS 请求返回 `200 OK`,未使用 `-k` 或关闭证书校验。
- [!] `odacm.cn` 第二台部署失败原因已定位为管理证书激活路径与普通业务证书路径不一致;两台服务器均已恢复旧文件,当前站点可用。
### 当前状态
- [x] 多服务器、多域名证书推送主链路实机通过。
- [~] 管理域名隔离和生产初始化门禁继续整改。
- [!] 尚未达到最终生产验收,不得把上述两个成功任务直接作为完整上线结论。
## 2026年10月2日 当前执行入口:自动回归完成,开始双机实机复审
本轮范围固定为 Linux;密码 SSH,不使用或部署 SSH 密钥;不清理线上业务数据库,不创建辅助验收脚本,不进行远端备份。
- [x] 工作区和远程分支状态核对完成,当前基线为 `71367b8`。
- [x] 后端 `go test -count=1 ./...` 全量通过。
- [x] 后端 `go vet ./...` 通过。
- [x] 前端 275 项测试全部通过,生产构建通过。
- [x] 部署事务恢复专项和证书历史恢复专项测试通过;尚不能替代真实文件、数据库和服务器验收。
- [~] 复核历史证书恢复的真实归档读取、历史标识歧义、完整证书链、提交失败回滚及恢复后状态一致性。
- [~] 使用最新提交补齐首次部署恢复事务测试依赖后,执行 Linux 原生全量回归。
- [ ] 构建正式候选包并部署两台真实服务器,记录运行二进制摘要、服务状态、端口边界和严格 TLS 结果。
- [ ] 完成三数据库清库后的首次 Web 流程、Smail 系统账户发信、验证码、超级管理员重置密码和改密后重新登录。
- [ ] 完成 DNS/ACME 正负向矩阵、第一台证书 SAN、重启早期 502、多域名多服务器业务复核。
- [!] 生产验收仍未通过;任何 HTTP 200、单元测试通过或候选包构建成功都不得单独标记为最终通过。
## 2026年10月2日21:40 历史证书与恢复开发批次
需求沿用已确认的 P1-02/P2-03,不缩减历史版本恢复范围。修改前基线 3c59ac5 已提交推送;本轮不处理 Windows,不部署生产,不增加远端备份。
- [~] 复用本地证书归档读取历史版本,校验真实证书元数据,拒绝路径逃逸及符号链接;正式目录仍只保留当前版本及受保护的管理入口引用。
- [ ] 解决 SAN 不同域名组合的同名版本歧义,提供稳定的历史标识;历史列表允许展示过期版本,但恢复拒绝过期、未生效、域名不匹配及密钥错误。
- [ ] 恢复保留完整证书链,产生新的当前版本;状态更新或恢复后校验失败时恢复原当前文件及元数据。
- [ ] 补齐真实文件存储与服务层测试,证明状态更新失败用例确实到达数据库更新,而不是提前拒绝恢复的假通过。
- [ ] 接入持久化后台任务、执行前权限、幂等与前端历史操作,更新接口说明。
- [ ] 执行 Linux 原生自动回归并记录证据,再安排统一正式部署验收。
## 2026年10月2日21:30 手动续期后台化回归完成,等待复审
需求沿用已确认的 P1-05/P2-03:保留管理证书和全部业务域名的原续期调度,不缩减行为;先开发、自动回归,再统一部署。修改前基线 4ab3f93 已提交推送。
- [x] 新增系统级手动续期检查任务,持久化后返回 202,支持同键找回和活动任务去重;不伪装业务域名或管理证书签发。
- [x] 提交、执行及取消均校验当前超级管理员权限;任务及审计查询隔离普通管理员和用户。保留管理证书与全部业务域名的原续期调度、锁、子任务、重试等待和取消传播。
- [x] 任务、尝试及审计同事务收尾,中文摘要保存真实计数;失败、部分成功、取消和超时分别表达,不保存底层敏感错误或伪造部署报告。异常中断不自动重放,不开放通用任务重试。
- [x] 独立 RenewalAction 管理防重复提交和幂等键,前端显示已提交并跟踪任务,重开详情可恢复结果;运行概览补齐导入、校验和续期取消入口。
- [x] 最新前端 272 项全部通过、零跳过,生产构建通过。此前 266 项未包含新增入口测试,不作为本批完整结果;已补入正式测试入口并执行。
- [x] 异步接口说明已更新,明确 202/200/409 语义、有效超级管理员范围及统计只保存在任务摘要;没有新增结构化续期报告接口。
- [x] 最新原生 Linux 全后端测试及 go vet 均通过;首次全量因隔离归档漏带安装器、发布脚本及仓库规则失败的日志保留,补齐同一基线完整源码和隔离 Git 索引后重跑,未跳过失败检查。
- [x] 续期生命周期、取消保留统计、真实管理与业务调度联动、范围隔离及审计事务回滚专项重复二十次通过;HTTP 包 45.438 秒、仓储包 2.480 秒。普通重复不替代竞争检测。
- [!] 本批不是完整生产验收,不关闭历史恢复、升级、通知重置、三库首次流程、备份恢复及 P3。
## 2026年10月2日20:34 证书校验后台任务回归完成,等待复审
本批需求沿用已确认的 P0-10、P1-04、P2-03 清单:先开发和自动回归,再统一生产部署;不处理 Windows。修改前已提交并推送 fce5a84。
- [x] 20:25 补充审查发现前端校验幂等键含路径分隔符。提交推送 24a9683 修复前基线后,新增契约断言先复现两个失败,再改用 certificate-validate 前缀;保留后端字符与长度限制。申请、部署、校验三种真实组合式提交均验证每次新操作使用独立合法键。
- [x] 校验入口接入持久化后台任务;提交和执行前均检查现有私钥读取权限,不误加部署、证书管理或 DNS 权限。队列、取消、关停和异常回收复用公共工作线程,不重复创建任务。
- [x] 校验元数据独立持久化,与任务、尝试和审计终态同事务提交;失败或取消不保存通过结果,不伪装部署报告,不保存文件路径或私钥。新增三库第 21 号迁移。
- [x] 前端跟踪校验任务,在任务详情展示校验域名、指纹、有效期、序列号和链长度;按任务及最近成功尝试精确匹配,切换、关闭及撤权清空缓存,明确本地校验不等于远端 HTTPS 验收。
- [x] 第二台原生 Linux 全后端测试及 go vet 通过;校验生命周期、排队授权和仓储事务专项重复二十次通过。首次全量测试因 SSH 断开收到 Hangup,确认进程退出后重新执行,未覆盖失败日志。
- [x] 第一台独立 MySQL 8.0.46 与 5.7.44 的第 21 号迁移各通过八个恢复/冲突场景;只监听回环,严格 TLS,测试后独立实例退出。此结果不替代 PostgreSQL 实库或三库首次 Web 流程。
- [x] 最新前端 266 项全部通过、零跳过,生产构建通过;真实模板编译与服务端渲染覆盖新结果组件。已同步本清单、整改清单、Linux 测试记录及异步接口说明。
- [!] 本批通过不关闭历史恢复、其他长操作、升级、通知重置、三库、备份恢复及最终生产门禁。
- [!] 本批未正式部署、未清理线上数据库、未创建辅助验收脚本;竞争检测仍无本批通过证据。第二台磁盘约剩 774MB,后续正式构建前必须重新评估容量,不据此擅自删除文件。
## 2026年10月2日19:34 证书导入异步化回归完成,等待复审
需求沿用已确认的 Linux 完整清单,先开发及自动回归,再统一部署,不处理 Windows。本批修改前已确认工作区干净并推送 09616e7 基线,无额外待提交文件。
- [x] 生产证书导入接入已有异步任务执行器,应用直接执行已有任务,不嵌套创建任务;返回 202 后继续导入和部署。
- [x] 上传副本转交工作线程,拒绝提交、排队取消、正常关停、执行异常及正常结束均回收文件;响应写出前完成所有权转交。JSON 源文件不在清理范围内。
- [x] 导入提交与执行前复核证书管理及部署权限;不要求 DNS 权限,导入任务的通用重试返回 409,不重放已回收上传文件。
- [x] 完整报告增加 certificate_imported 标志,与任务终态同事务持久化;保留已导入但部署失败或部分成功的真实状态,不存储源文件路径及私钥内容。
- [x] 前端展示任务编号并跟踪结果,不把 202 当作已导入;响应断开后沿用原幂等键找回任务,刷新可恢复保存标志,撤权清除缓存结果。
- [x] 原生 Linux 专项、全后端测试及 go vet 通过;新增导入专项重复二十次通过,耗时 29.448 秒。第一轮测试误用取消路由的失败记录保留,按真实 DELETE 和 202 契约修正后通过。
- [x] 最新前端 260 项全部通过、零跳过,生产构建通过;清单、Linux 测试记录和接口说明同步更新。本批不创建辅助验收脚本,不清线上数据库,不部署。
- [!] 进程强制终止后的上传残留清理、真实浏览器上传及生产流程尚未验收;普通重复回归不替代竞争检测。第二台磁盘剩余约 863MB,Scert、Nginx、MySQL 保持 active。
- [!] 历史版本恢复的真实实现目前明确拒绝恢复,与 P1-02 清单存在差异;该项继续保留,不能以模拟测试宣称完成。其余长操作、升级、通知重置、三库、备份恢复及完整生产门禁仍未关闭。
## 2026年10月2日19:01 排队任务执行前权限复核
需求沿用已确认的 Linux 全清单,先开发及自动回归,再统一部署;不缩减范围、不处理 Windows。本批修改前已推送基线 657a9c0,工作区干净。
- [x] P0-07/P2-03 子项:异步任务取得执行槽后,重新核查当前账户、域名归属及操作权限;不把提交时权限或历史项目快照作为执行授权。校验失败不调用签发或部署工作流,以事务保存失败任务、尝试及审计。
- [x] 旧代码负向回归复现排队期间撤权后仍执行外部操作;新增覆盖停用账户、撤销成员/操作权限、移动或删除域名、授权服务故障及缺失依赖。
- [x] 手动重试使用本次操作者和实时重试权限;正常申请/部署、首次操作者停用但有效新操作者重试均保留。修复后两组共二十八个子场景通过,AUTHORIZATION_AFTER_EXIT=0。
- [x] 原生 Linux 全后端回归与静态检查通过,AUTHORIZATION_FULL_EXIT=0、AUTHORIZATION_VET_EXIT=0;新增专项重复二十次通过,耗时 74.602 秒。普通重复测试不替代竞争检测。
- [x] 清单、Linux 测试记录及接口说明已同步;本批代码保存提交,不含运行产物。本批未部署,未取得竞争检测或生产验收通过结论。
- [ ] 后续继续导入、恢复、校验异步化及上传文件生命周期;升级、通知重置、三库、备份恢复及整体门禁仍保持未关闭。
## 2026年10月2日18:35 后台收尾一致性执行入口
需求沿用已确认的 Linux 全清单,不处理 Windows,不缩减原始范围。先开发及自动回归,再统一正式部署;本批不清线上数据、不创建辅助验收脚本。
- [x] 修改前基线 cf3bc7a 已提交并推送;第一次推送认证失败,重试后成功。
- [x] 已取回上一批后台取消修复的全后端测试与静态检查结果:BACKGROUND_FULL_EXIT=0、BACKGROUND_VET_EXIT=0;第二台 Scert、Nginx、MySQL 均 active,隔离 MySQL 已退出。
- [!] 4e8d509 的受限竞争检测达到十分钟限制,Result=timeout、REPORT_BOUNDED_RACE_EXIT=1,不计通过。第一台任务已停止,无残留编译测试进程,既有服务保持 active。
- [x] 新增后台完整报告与收尾故障回归;旧实现缺少重试报告,并在报告、结果、尝试或审计写入失败后出现部分保存,BACKGROUND_ATOMIC_BEFORE_EXIT=1。
- [x] 将后台任务终态、尝试、完整报告、逐服务器结果和完成审计统一到事务;失败重试保存报告但任务保持 retry_wait,等待取消不覆盖历史尝试,保存失败不继续外部操作。
- [x] 增加无活动尝试的失败/取消收尾;存在活动尝试时拒绝单独收尾。应用、仓储和 HTTP 原生 Linux 关联回归通过,BACKGROUND_ATOMIC_AFTER_EXIT=0。
- [x] 本批全后端回归、静态检查通过,BACKGROUND_ATOMIC_FULL_EXIT=0、BACKGROUND_ATOMIC_VET_EXIT=0。五处故障注入验证完整回滚,开始审计失败不执行外部操作,完成审计失败保留中断现场。
- [x] 新增收尾和取消专项重复二十次通过,BACKGROUND_ATOMIC_REPEAT_EXIT=0;应用 48.982 秒、仓储 49.985 秒。进度文档及接口说明同步更新,本批随代码提交保存。
- [!] 其他长操作、升级 502、恢复证据、系统通知重置、三库首次 Web、备份恢复与最终验收仍未关闭。本批尚未部署。
下方 18:11 的回归运行态已由本节取回的终态替代;历史记录保留,不作为当前阻塞重复计算。
## 2026年10月2日18:11 当前执行入口
本节为当前状态,下方时间段保留历史过程。需求沿用已确认的 Linux 全清单:先完成开发和自动回归,再统一正式部署;不清线上数据库,不以测试脚本替代产品验收。
- [x] 完整报告与完成审计原子化已保存并推送为 4e8d509;任务、尝试、完整报告、逐目标结果和完成审计在 HTTP 异步收尾路径共用事务,任何一项失败全部回滚。
- [x] 第二台隔离源码第三轮仓储、HTTP、数据库关联回归全部通过,REPORT_THIRD_EXIT=0。前两轮失败日志保留;不将修复前失败抹去。
- [x] 最新前端 256 项全部通过,零失败、零跳过;生产构建通过。覆盖页面刷新读取完整验证与恢复报告、重试报告隔离及旧响应兼容。
- [x] 完整报告批次 4e8d509 的全后端测试与 go vet 在第二台串行、低资源运行通过,REPORT_FULL_EXIT=0、REPORT_VET_EXIT=0;未部署本批代码。
- [x] 后台工作流四个取消场景在旧代码全部复现失败:部分成功、恢复未确认、恢复失败被取消状态掩盖,已恢复场景的逐服务器结果丢失。修复为保留真实结果并用有限时、独立于取消的上下文保存结果;四场景重复二十次通过,BACKGROUND_CANCEL_AFTER_EXIT=0。
- [~] 上述后台修复的最新全后端回归与静态检查运行中;后台报告、尝试和审计尚未全部统一到同一事务,不能按 HTTP 路径的结果标记整项关闭。
- [x] 新增第 20 号报告迁移实库回归:第二台独立 MySQL 8.0.46、回环监听、严格 TLS,建表前/建表后/已有大中文报告三条恢复路径,以及五类结构冲突全部通过,REPORT_MYSQL8_EXIT=0。
- [ ] 新报告迁移的 MySQL 5.7、PostgreSQL 当前版本实库复核;三库生产 Web 门禁仍未完成。
- [~] 第一台启动独立受限竞争检测:内存上限 512MB、CPU 上限 50%、最长十分钟,不使用此前无限制负载,尚无通过结论。
- [!] 竞争检测、其他长操作异步化、关停与重启 502、历史恢复证据、系统通知重置、三库首次 Web、备份恢复及最终验收仍未关闭。
校正:17:30 的“完成审计尚未与上述事务统一”属于当时状态,现已实现且关联回归通过;17:11 的推送超时和竞争测试运行态也不是当前状态,推送已成功,先前竞争检测中断退出 130。
## 2026年10月2日17:30 完整异步报告整改入口
需求已沿用既定清单确认:异步执行后必须保留完整部署、站点验证与恢复报告;不能仅由逐目标成功推断整个任务成功。本轮仍只处理 Linux 开发与自动回归,不清线上数据,不部署。
- [x] 上轮终态事务与取消一致性整改已提交为 `8a8b1a5`,本轮已成功推送,解除此前远程同步超时。
- [x] 接续记录确认上轮普通专项重复二十次通过;竞争检测已中断退出一百三十,不能记为通过。本轮已轮询原 SSH 会话,返回空闲提示符,不重新启动无限制负载。
- [~] 增加完整报告三库迁移;报告、逐服务器结果及任务与尝试终态共同提交,保存失败整体回滚。
- [~] 前端优先读取最新尝试的持久化报告,保留站点验证与恢复状态;旧历史不伪造验证结论。
- [ ] 新增报告写入故障、事务回滚、重试隔离、权限、脱敏、刷新恢复和迁移回归。
- [ ] 在第二台隔离源码运行最新全量后端回归与静态检查;本机运行前端测试和构建。自动回归不替代正式部署验收。
- [!] 完成审计尚未与上述事务统一;竞争检测、其他长操作、关停与重启边界、历史恢复证据、通知重置、三库首次 Web、备份恢复与最终验收仍未关闭。
## 2026年10月2日17:11 异步收尾一致性整改
本节接续 16:47 的任务,不缩减原始 Linux 上线范围;本批仍未部署。
- [x] 修复动态安装模板仍为三十秒的遗漏:动态模板和分发单元统一停止预算一百八十秒,原生 Linux 两种路径的断言通过。该预算不等于已证明所有关闭路径无中断。
- [x] 新增任务和执行尝试的同事务终态保存;第二条写入失败、尝试缺失、跨任务尝试、过期尝试和重复终态均拒绝部分提交。覆盖数据库触发器注入失败后的回滚。
- [x] 取消请求不覆盖已完成、部分成功、回滚失败或未确认的真实结果;收尾状态读取或逐服务器结果保存失败不发布成功;终态事务失败保留中断记录供启动恢复。
- [x] 第二台隔离 Linux 四个关联包首次回归通过;最新完整 go test -p 1 ./... -count=1 与 go vet -p 1 ./... 均通过。新增仓储用例使用隔离 SQLite,不冒充三数据库完整流程通过。
- [~] 异步、终态事务、动态和静态服务配置专项重复二十次运行中;普通重复回归不能替代竞争检测。
- [!] 第一台竞争检测尚无可靠结果;本机和第二台新增 SSH 连接都未完成握手,原会话无输出。已向原会话发送中断信号,但未确认远端停止,不重复启动负载、不推断原因、不记通过。
- [x] 已补充[异步接口接线说明](../.claude/docs/ai/async-tasks/api-handoff.md),记录 202、取消语义、查询结构、权限、错误及未完成边界;不修改 Smail API 参考文档。
- [!] 开发基线提交 9e666be 已保存在本地,推送两次均连接超时,尚无远程同步成功证据;不进行强制推送。
- [ ] 后续继续完整验证与恢复报告持久化、完成审计与结果跨记录一致性、其他长操作异步化及关停边界;原有恢复、通知重置、三库首次 Web、备份恢复及统一验收门禁不变。
## 2026年10月2日16:47 异步开发与自动回归进度
本节更新下方 15:43 的早期状态。范围仍为 Linux;先完成开发和自动回归,再统一正式部署验收。开发回归使用隔离源码与临时数据库,不清理线上业务数据。
- [x] 申请、首次部署、重试持久化任务与尝试后返回 202;后台上下文不依赖浏览器连接,保留项目授权、幂等键和任务历史。
- [x] 已实现任务取消收尾、关闭时拒绝新工作、有限执行槽、超时和异常终态;补充排队取消、队列满、异常脱敏和审计保存失败回归,等待竞争检测及复审。
- [x] 前端已接入任务查询、最近尝试的逐服务器结果、刷新后查看及撤权清缓存;查询失败不自动重新提交,提交成功不等于部署成功。
- [x] 本机前端 252 项测试全部通过,生产构建通过;第二台隔离 Linux 全后端测试与 go vet 通过。上述结果均非正式部署验收。
- [~] 第一台使用现有编译器运行异步专项竞争检测,重复二十次;第二台缺少编译器、第一台首次缺少离线依赖的记录保留,不将环境失败计作产品用例失败或通过。
- [~] 复核发现静态 systemd 单元已增加停止预算,但动态安装模板仍为三十秒;下一步同步模板并增加一致性测试。
- [ ] 补齐异步查询结果契约、持久化失败及取消提交竞态的复核;其他长操作仍需逐项整改。
- [!] 本批代码未部署,重启 502、两条缺证据历史事务、系统通知与密码重置、三数据库首次 Web 流程、备份恢复及最终生产门禁仍未关闭。
## 2026年10月2日15:43 长任务异步整改入口
需求确认:正式申请、部署与重试不能等待整个工作流结束才响应;沿用持久化任务与权限边界,不以增加代理超时替代异步执行。仅处理 Linux,开发回归不清理线上业务数据;首次初始化验收另行清库执行。
- [~] 拆分任务提交与后台执行,持久化后返回任务编号,浏览器断线不取消已接收任务。
- [ ] 服务关闭拒绝新任务并等待取消收尾;进程重启保留中断历史,不自动重复签发或部署。
- [ ] 保留任务权限、幂等键、并发互斥、取消及重试历史,覆盖竞态测试。
- [ ] 前端显示已提交状态并查询任务终态,刷新后可继续查看,不把提交成功当部署成功。
- [ ] 原生 Linux 自动回归、正式构建部署及超过反代超时窗口的实机验证。
- [!] 其他长操作、历史缺证据事务、系统通知、三数据库首次 Web 流程与最终生产门禁仍未完成。
## 2026年10月2日15:31 P0-10 实机负向恢复与重试
需求确认:复用既有证书和业务配置验证正式候选,不清库、不新签发、不创建辅助验收脚本、不伪造事务或手工释放锁。仅还原本次受控注入,历史缺证据事务继续保留。
- [x] 真实部署旧文件摘要不匹配:任务 e3a9e1c8-c930-4fa0-b2aa-2730da019503 首次失败,产品拒绝回滚并保留本次锁;整个第二台目标目录的路径、权限、内容摘要与注入后快照一致。
- [x] 真实启动恢复锁归属不匹配:对同一事务受控改变锁标识,产品明确拒绝接管;目录完整快照未变。恢复注入后由产品完成两台事务回滚,未手工删锁、改库或改终态。
- [x] 正式接口恢复标准配置后,同一任务第二次尝试双机成功;第一次失败记录保留,成功后再重试返回 409,无第三次尝试。双机文件摘要一致,本次锁及临时事务文件无残留。
- [x] 双机本地 SNI 严格 TLS 通过、内部端口仅回环,第一台 Scert、Nginx、xmail 均 active;第二台普通公网域名健康检查及首页恢复 200。
- [!] 15:21:56 长部署请求被 Nginx 超时返回 504,而任务在 15:22:37 才失败;需要整改长任务提交与状态查询,不能把延长超时当作完整异步任务实现。
- [!] 15:24 受控服务重启观测到一次 502;单实例中断事实保留。两条旧恢复事务仍缺可信证据,未关闭。以上局部证据等待复审,不代表 P0-10 或总体生产门禁通过。
## 2026年10月2日15:15 管理证书正常轮换复核
需求确认:仅 Linux;不开放 Scert 公网端口,不降低 TLS 校验,不以人工维护替代产品验收。本轮仍为保留数据的升级复核。
- [x] 14:58 按 root 维护边界修复代理与上游旧证书接线:使用现有有效正式材料,未改写旧事务;该步骤属于环境维护,不算自动协调成功。
- [x] 15:03 正式 Web 设置触发管理续期,任务 a1c7ffd8-5623-4740-9deb-b7cdef88c3f2 于 15:03:31 成功;应用协调与辅助事务均为 committed,关联标识一致。
- [x] 现场核验代理与上游新叶证书指纹一致,到期时间为 2026-12-31 06:04:52 UTC;普通域名首页及 readyz 严格 HTTPS 均返回 200,Nginx 配置检查通过。
- [x] 15:14 经正式系统设置恢复续期阈值六天、临近阈值十天,并只读确认持久化结果;没有重复触发任务。Scert 仍只监听回环 8443,辅助私钥 root:root 0600。
- [~] 本项为正常轮换局部证据,等待独立复审;故障恢复矩阵、多目标部分失败与重试幂等、历史事务、通知重置闭环、三数据库首次 Web 流程及备份恢复仍未全部通过。
## 2026年10月2日14:52 管理证书协调实机检查
需求确认:公网只走 Nginx 80/443;双层证书不一致时必须在签发前拒绝,不清库、删锁或改写历史事务制造通过。本轮为保留数据的升级复核,不替代首次初始化验收。
- [x] 第二台独立 Nginx 辅助程序已于 14:26 升级到 7ba4046 对应正式候选;程序摘要已复核,策略、历史事务及引用摘要保持不变。此项更新下方 14:20 的旧版本待办。
- [x] 通过正式系统设置将续期阈值临时调整为八十八天、临近阈值九十天,策略更新自动唤醒调度;未重复点击立即续期。真实管理任务在 preflight 阶段失败,辅助服务被 socket 实际启动,未进入签发阶段。
- [x] 通过相同页面恢复原阈值六天、十天,现场持久化配置已确认;业务域名仍关闭自动续期,旧辅助事务与引用摘要未变化。
- [!] 第二台代理实际证书到期时间为 2026-12-24,上游实际证书到期时间为 2026-12-28,叶证书指纹不同。首页及 readyz 的严格 HTTPS 成功不能替代双层身份一致性。
- [~] 下一步:按 root 维护边界核查历史终态与证书来源,安全修复现有接线基线,再走产品续期协调;不得关闭证书校验或篡改旧记录。
- [~] P0-10、三数据库首次 Web 流程、系统通知、备份恢复及整体生产验收继续未通过。
## 2026年10月2日14:20 候选构建与双机升级
- [x] T2-F 构建:7ba4046 干净检出正式构建 Linux amd64 包,source_dirty=false,发布路径与包内摘要检查通过,全量 Go 模块校验通过。
- [x] 前端原生 Linux 测试:二百四十项通过,一项 Windows 专用用例跳过,无失败;不把跳过记作通过。
- [x] 候选程序拒绝通配地址、非回环 IP 和 localhost,均在创建配置之前退出;双机升级后仍只监听 127.0.0.1:8443,公网 Web 仍由 Nginx 80/443 提供。
- [x] 双机核心三程序已通过正式归档安装,并与包内程序逐字节一致;第二台普通域名 HTTPS 首页、readyz 与第一台跨机 readyz 检查通过。
- [!] 第二台首次误用无执行权限的构建工作目录安装器,退出 126,安装未发生;已恢复旧服务,再从正式归档完成升级。原失败日志保留,额外停服不隐去。
- [ ] 独立 Nginx 辅助程序仍为 431fd043,需要按独立升级流程完成版本配套及实际协调验证;普通安装器不会安装它,不声称全组件已统一版本。
- [~] T2-F 业务实机负向恢复复审仍待完成;P0-10、升级可用性、系统通知闭环、三数据库首次流程及备份恢复门禁不放行。
## 2026年10月2日13:59 当前任务入口
需求确认:不允许额外公网端口、未知归属文件误删或绕过安全校验;测试失败必须保留证据,不能降低验收门槛。
- [x] T2-G:十个测试文件共二十一行调整,将重置状态、敏感配置与 SQLite 数据库隔离到临时目录;不修改产品行为,不写正式安装目录。
- [x] 完整 Git 检出叠加测试隔离修复后,原生 Linux 全后端测试退出零;源码归档缺 Git 元数据造成的发布边界失败已定位,未跳过检查。
- [x] T2-D:第一台竞争检测因依赖下载连接停留在 SYN-SENT,保留原日志并中断,退出 130;使用三端摘要一致的缓存归档复测,恢复及事务场景竞争检测重复二十次通过,退出零。
- [x] 完整 Git 检出上的全后端 go vet 通过,输出 CHECKOUT_VET_EXIT=0。
- [x] 双机现场监听核查:Scert 均为 127.0.0.1:8443,Nginx 提供 80/443;服务均运行中,未新增公网端口。
- [ ] T2-F:测试隔离修改提交后,从干净源码正式构建,再进行部署与业务实机恢复复审。
- [~] P0-10 及整体生产门禁仍未通过;本轮不是清库首次流程,也不等于三数据库生产验收。
## 2026年10月2日13:41 当前任务入口
- [x] T2-E:已复现上传碰撞误删;修复为独占创建确认、摘要落库与整组临时文件预检,碰撞、变更及旧日志缺归属证据均保留现场。
- [x] T2-E 回归:三包原生测试、恢复及事务用例重复二十次、全后端 go vet 通过;可信半份私钥清理及无残留临时文件的旧事务兼容路径保留。
- [~] T2-G:全后端原生测试暴露旧测试污染正式路径的问题;修复测试临时路径,并用包含构建文件的完整仓库重新执行。
- [ ] T2-F:新候选正式构建、双机部署及业务实机恢复复审仍待完成。
- [!] 总体生产门禁不放行,历史缺证据事务不得伪造记录或删锁。
## 2026年10月2日13:30 当前执行入口
需求确认:仅 Linux,沿用 P0-10 恢复安全和生产门禁;未知归属不得自动接管,公网只走 Nginx 80/443,不放宽校验,不使用辅助脚本作为验收依据。
- [x] T2-A:恢复前核验完整锁、备份及目标身份;SSH 认证前核验服务器证据,已验证阶段支持部分解锁重入。
- [x] T2-B:原实现负向复现;修复后部署、仓储、应用三包原生 Linux 测试及 go vet 通过,恢复新用例重复二十次通过。
- [x] T2-C:真实回环密码 SSH/SFTP 的五个场景通过;测试数据库使用临时目录,不提权写入正式安装路径。
- [!] T2-D:竞争检测因缺少 gcc 未执行成功;普通重复测试不是其替代验收。
- [~] T2-E:带事务日志上传碰撞的路径所有权核查。
- [ ] T2-F:本批修复的干净提交正式构建、部署及业务实机恢复复审。
- [~] P0-10 整项仍进行中;历史缺证据事务、升级 502、系统通知投递、三数据库清库首次 Web 流程、备份恢复和统一复审继续保留。
## 2026年10月2日12:54 双机安全升级当前入口
本节覆盖下方本轮执行态记录;历史失败和未通过门禁继续保留。
- [x] Linux 非回环监听防护、六包原生回归、监听用例重复 20 次和 go vet 已完成;源码提交 1150c39 已推送。
- [x] 正式构建使用专属 TMPDIR 后通过原有路径扫描;未更改扫描器或跳过检查。发布清单 source_dirty=false,四个二进制均为同一提交并带 trimpath。
- [x] 正式发行程序实测拒绝 0.0.0.0、::、非回环 IP 及 localhost,退出码均为 1,没有创建初始化配置文件。
- [x] 第二台 12:48、第一台 12:51 均通过正式安装器完成配套升级;Type=notify 和状态通知生效,Scert 均仅监听 127.0.0.1:8443。
- [x] 双机主程序摘要一致,包内校验全部通过;双向 IPv4 探测对方 8443、3306、33060 均未连接成功。不扩大为所有来源或 IPv6 外部探测结论。
- [x] 第二台严格域名 HTTPS 首页及 readyz 返回 200,HTTP 返回 301 跳转 HTTPS,后续连续 10 次 readyz 成功;Nginx 配置摘要及主进程未变。第一台未新增管理站点,其 Nginx、MySQL、Xmail 主进程未变。
- [!] 单实例停机升级窗口仍有 502:跨机 60 次采样出现 7 次 502、2 次连接超时。启动通知已验证,但不能当作零中断整改完成。
- [!] 本轮未清库、未执行首次 Web 全流程。P0-10、系统通知实发、三数据库首次流程及最终生产验收保持未通过。
## 2026年10月2日12:42 当前安全整改入口
- [x] Linux 默认及空值回退使用回环地址;CLI、初始化及正式应用入口拒绝实际非回环监听,保留旧配置经安全环境覆盖启动的兼容性。
- [x] Linux 非特权用户执行 config、bootstrap、cli、app、serviceready、servicehost 六包完整回归通过;新增监听用例重复 20 次通过;六包 go vet 通过。
- [x] 修正旧代理端口持久化测试写入正式配置目录的问题,明确写入测试临时目录;隔离源码补齐 deploy 目录后重跑,首轮失败不计通过。
- [~] 准备从干净提交重新正式构建;使用专属临时目录,避免通用 /tmp/ 路径与安装器禁止目录规则误匹配,仍检查真实构建路径。
- [ ] 新版配套部署、systemd 通知、严格 HTTPS 及跨机端口复核待进行;线上仍为此前候选。
- [!] 生产门禁未放行,P0-10、邮件实发与三数据库完整首次流程保持待办。
## 2026年10月2日12:35 公网监听风险收口
需求确认:Linux 管理服务不能直接暴露公网,仅允许回环监听并经 Nginx 的 80/443 访问;不能仅依赖防火墙阻挡错误监听。本节作为新增安全整改入口,不覆盖历史未完成门禁。
- [x] 双机只读检查:Scert 均监听 127.0.0.1:8443,MySQL 均为回环监听;第一台探测第二台 8443、3306、33060 未连接成功,仅作为该来源的 IPv4 证据。
- [x] 第二台 Nginx 上游为回环 HTTPS,保留证书及域名校验。
- [x] Linux 默认及空值回退改为回环地址;配置加载后的有效监听地址、初始化入口及正式应用入口均增加非回环拒绝检查,等待原生回归。
- [~] 原生 Linux 正负向监听用例及关联包回归;历史配置可由既有 systemd 环境覆盖为回环地址,不能因校验时机错误导致安全的旧部署无法升级。
- [!] 正式构建两次失败:首次为外加 GOFLAGS 被禁止,移除后第二次被发布路径检查拦截。尚未产生可部署正式包,未改线上程序,不跳过检查。
- [ ] 修复构建环境后重新生成干净提交的候选包、配套升级并复核监听与 HTTPS。
- [!] P0-10、系统通知实发、三数据库清库完整 Web 流程及总体生产验收仍未通过。
## 2026年10月2日12:19 当前复核入口
本节覆盖下方启动通知整改的早期执行态记录;未验证项目不升级为复审通过。
- [x] 启动通知代码、正式与初始化生命周期、静态 unit 和动态安装模板已完成,等待部署复审。
- [x] 修复本轮发现的旧 CLI 测试路径隔离问题:备份恢复、DNS 诊断及 SQLite 并发快照的测试配置全部显式指向临时目录,不再继承 Linux 正式安装路径。
- [x] 第二台 Linux、Go 1.26.6、非特权 nobody 用户执行 serviceready、servicehost、bootstrap、cli 四包完整回归通过;关键启动与取消用例重复 20 次通过;四包 go vet 通过。
- [x] systemd-analyze verify 返回零;隔离传输目录中的 unit 权限已收紧为 0644。主机已有 snapd 的无关配置警告原样保留,不修改其他服务。
- [x] 12:18 线上只读复核:Scert 与 Nginx active,Scert 仅监听 127.0.0.1:8443,正常域名严格 HTTPS readyz 返回 ready。
- [ ] 本轮新代码的正式候选构建、配套部署与真实重启窗口复测尚未进行;线上仍为原候选,不将旧服务采样当作新版本验收。
- [!] T4 不标复审通过;P0-10、Smail 实发、三数据库清库完整 Web 流程及最终生产门禁仍未完成。
## 2026年10月2日启动通知整改任务入口
需求确认:不新增公网端口,Scert 继续回环监听并经 Nginx 80/443 访问;仅 Linux,密码 SSH 与严格主机指纹校验,不关闭 TLS 校验,不创建辅助验收脚本。
- [x] 启动通知代码已实现:正式 HTTPS 接收循环启动后报告状态;本机通道或 HTTP 已退出时拒绝通知;通知失败不启动续期并退出。
- [x] 初始化阶段在 HTTPS 开始接收时报告等待配置状态;业务 readyz 仍返回 503,不把监听成功当作初始化完成。
- [x] 安装模板与分发 unit 同步为 Type=notify、NotifyAccess=main、TimeoutStartSec=90;保留回环绑定与原有沙箱约束。
- [~] Linux 隔离单元回归:复用既有 Go 1.26.6 工具链,使用独立源码目录和测试临时数据,不触碰现有业务数据库。
- [ ] 最新正式候选构建部署、重启窗口与 Nginx 严格 HTTPS 复测;单上游重启停机窗口不能仅靠启动通知消除。
- [!] 本节不代表 T4 整体验收通过;P0-10、邮件及三数据库首次生产流程继续保留未完成状态。
## 2026年10月2日当前任务入口
补充阻塞证据(11:50):T5 所用 web.solit.cn 的权威 DNS 返回 NXDOMAIN,第二台严格 HTTPS 请求解析失败;需要当前有效 Smail 入口及正式系统通知授权配置。其他任务仍可继续,不将邮件阻塞扩大为全部任务停止。
需求确认:仅 Linux;Scert 回环监听,经 Nginx 80/443 访问;SSH 仅密码认证;不关闭 TLS 校验,不创建辅助验收脚本,不额外远端备份,不删除文件或篡改历史恢复证据。历史记录保留,以本节为当前进度入口。
- [x] T1 第二台现有正式证书与运行态复核:20 次严格 TLS readyz 成功,访问日志均为 200;证书域名匹配,有效期至 2026年12月24日。等待复审,不代表续期轮换通过。
- [x] T2 第一台跨机探测第二台 8443、3306、33060 均超时,80、443 可连接;本地代理探测不纳入公网端口结论。等待复审。
- [x] T3 第一台角色核对:未配置 odacm.cn 管理站点,默认站点证书不匹配不作为 Scert 签发失败证据,不擅自新增管理站点。
- [~] T4 启动窗口整改:502 已定位为上游尚未监听,仍需整改和重启复测。
- [!] T5 系统通知:实际授权参数与独立凭据尚未配置,真实投递、验证码重置和新密码登录未完成;不得猜测或绕过 Smail 权限。
- [~] T6 P0-10 负向矩阵、历史恢复证据及三数据库完整 Web 流程。
- [ ] T7 正式候选包清库首次验收、缓存清理和统一复审。
总体仍为 P0-03 完成、等待复审。详见 Linux生产流程测试记录同日补充;本轮只读诊断不计作清库生产验收。
## 2026年10月2日 SSH 登录凭据安全边界复审
本节不记录任何口令、RAM 密钥、令牌、Cookie 或私钥内容。SSH 服务器连接只允许密码认证;HTTPS 证书私钥仍是证书业务材料,不作为 SSH 登录凭据。
- [x] SSH 工厂在连接前强制校验密码认证,非密码认证不能进入连接流程。
- [x] 禁用的兼容服务和重载连接函数不再提供密钥登录提示或可用回退路径。
- [x] 前端部署服务器页面使用“服务器指纹”描述主机校验信息,HTTPS 证书导入明确区分证书私钥。
- [x] 未创建辅助脚本、未做远端备份、未删除历史迁移和兼容文件。
- [~] 仍待完成:候选包双机重新部署、第二台正式域名证书、三数据库 Web 首次流程、Smail 发信和密码重置闭环。
当前总体验收仍为 **P0-03:完成,等待复审**。
## 2026年10月1日 SSH 私钥登录禁用复审记录
本节只记录非敏感代码证据,不记录服务器口令、RAM 密钥、数据库密码、令牌或私钥内容。用户已明确禁止 SSH 私钥登录,生产部署继续使用 SSH 密码认证。
- [x] 后端拒绝私钥引用、私钥认证和认证方式回退,服务器模型及 SSH 工厂仅允许密码认证。
- [x] 前端服务器配置不提交 `private_key_ref`,不调用 SSH 私钥接口,私钥管理组件不再挂载。
- [x] 前端 241 项测试和生产构建通过;后端 `go test ./...`、`go vet ./...` 通过。
- [x] TLS 证书私钥导入与远程证书私钥路径保持不变,未误删证书部署所需功能。
- [x] 代码提交 `df99136` 已推送,等待复审。
- [~] 仍待完成:Linux amd64 干净包部署、清库后的首次初始化、Smail 系统账户发信、验证码密码重置、三数据库 Web 流程和最终生产门禁。
当前总体验收仍为 **P0-03:完成,等待复审**,本节不能单独作为生产部署验收通过依据。
## 2026年10月1日前端私钥安全边界整改
本次仅记录代码和测试状态,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。针对“生产页面不允许出现私钥入口”的要求,已完成以下整改:
- [x] 移除管理页面中的 SSH 私钥导航、私钥列表、私钥录入、私钥文件读取、私钥口令和命令复制入口。
- [x] 前端不再请求或提交 SSH 私钥接口和私钥引用;服务器配置统一提交 SSH 密码认证。
- [x] 历史 `SSHKeyModal` 文件保留但不再挂载,不作为生产页面入口,不删除历史文件。
- [x] 前端回归测试 241 项全部通过,生产构建通过。
- [x] 本项完成,等待复审;不扩大为 P0-10、三数据库 Web 流程或总体生产验收通过。
- [~] 后端历史私钥兼容结构暂保留,待独立评估数据迁移和删除兼容能力的影响。
## 2026年10月1日公网入口安全加固复核
本次只记录非敏感安全证据,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。用户要求不得出现绕过 Nginx 的高风险直连入口,本轮已对双机完成现场加固:
- [✓] 第一台服务器撤销公网 `8443`、`9998`、`9999` 防火墙放行;Scert 仍只监听 `127.0.0.1:8443`,Nginx 继续承接 `80/443`。
- [✓] 第二台服务器针对宽范围防火墙规则,在最前面增加 `8443`、`9998`、`9999` 的拒绝规则;未删除其他业务服务,不影响 Nginx 反代链路。
- [✓] 双机 `3306`、`33060` 仍仅回环监听;两台 Nginx 配置测试均通过,核心服务未因加固重启或异常。
- [✓] 外部 HTTPS 复核:第一台管理域名返回 200,第二台管理入口按当前认证策略返回 401;两台服务器的 `8443`、`9998`、`9999` 直连请求均无法建立 HTTPS 会话。
- [✓] 本轮未创建辅助验收脚本、未清理或改写历史恢复证据、未修改数据库内容;邮件协议端口按 Smail 系统账户职责保留,不作为 Scert 管理入口。
- [~] 该安全入口子项完成,不能扩大为 P0-10、三数据库 Web 流程或总体生产验收通过;其余任务按下方看板继续推进。
## 2026年10月1日历史恢复事务现场核查
本次使用第一台服务器的 SQLite 数据库只读查询和目标证书目录只读核对,不改变数据库、锁或证书文件。
- [✓] 仍存在且仅存在两条 `recovery_required` 事务;两条记录指向同一托管证书目录,状态和阶段均保持 `recovery_required`。
- [✓] 两条事务的恢复证据字段均为空对象;记录中的锁路径当前没有对应锁目录,证书链文件仍为 644,私钥仍为 600,目标目录没有临时文件或备份文件残留。
- [!] 现场不足以证明历史锁归属、恢复执行者和安全回滚顺序;产品已按保守策略拒绝自动接管,不能据此人工改成已恢复或成功。
- [✓] 已清除第一台已结束临时测试单元和一次性重置激活器的 systemd failed 标记,仅保留 journal;未删除单元文件、事务记录或历史证据。
- [~] T3 历史事务核查继续阻塞,等待可验证的现场来源;P0-10 和总体生产验收状态不变。
## 2026年10月1日加速执行任务列表
本节为当前执行看板,任务状态按 `[ ]` 未开始、`[~]` 进行中、`[x]` 已完成等待复审、`[✓]` 复审通过、`[!]` 暂缓或阻塞标记。任务清单不记录任何认证信息,Windows 环境按要求排除。
### 需求确认
- Linux 双服务器生产部署和验收,不处理 Windows。
- 公网只保留 Nginx 80/443,内部管理、数据库和测试端口不得外放。
- P0-10 必须覆盖负向恢复、锁归属、文件摘要、多服务器部分失败和重试幂等。
- 三数据库必须走完整 Web 生产流程;清库后首次初始化、系统发信、密码重置和改密登录必须闭环。
- 历史恢复事务只接受可证明的现场证据,不手工改库、删锁或伪造恢复记录。
### 执行顺序
- [✓] T0:双机基础服务、严格 TLS、Nginx 入口和内部端口范围。
- [✓] T1:MySQL 5.7.44 实机与正式 CLI 实库复核。
- [~] T2:P0-10 负向恢复矩阵、锁归属及摘要不匹配实机验证。
- [~] T3:历史 `recovery_required` 事务逐笔证据核查。
- [~] T4:SQLite、MySQL、PostgreSQL 完整 Web 流程。
- [~] T5:清库后首次初始化、Smail 系统账户发信、验证码重置和新密码登录。
- [ ] T6:干净 Linux 候选包重新部署、缓存清理及最终生产门禁复审。
- [!] T7:Windows 环境及无法由本机证明的公网平台限制不纳入本轮验收。
### 当前结论
局部测试已通过,但总体仍为 **P0-03 完成,等待复审**;在 T2 至 T6 全部取得对应实机证据前,不得宣布生产验收完成。
## 2026年10月1日进度更新(MySQL 5.7 实机复核)
本次记录不包含服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。当前总体验收仍处于 P0-03 完成待复审,不能以局部数据库通过替代生产验收。
- [x] 第二台 Linux 实机 MySQL 5.7.44 隔离实例全套测试通过,退出码为 0;覆盖迁移、DDL 中断恢复、数据保留、严格 TLS、重启持久化、连接池断线恢复、重试和历史范围迁移。
- [x] 第一台 Linux 实机正式发行程序 CLI 的 MySQL 5.7 实库测试通过,退出码为 0;官方 MySQL 客户端及 `mysqldump` 互操作、对象权限、目录可见性、快照与恢复规划均已复核。
- [x] 测试实例使用非 root 用户和回环监听,未连接线上 MySQL 8.0,未重启或修改 Smail,公网仍只使用 Nginx 80/443。
- [x] 已修正 MySQL 5.7 正常关闭耗时造成的测试夹具误报:等待上限由 15 秒调整为 30 秒,提交 `a139e6b` 已推送;修复后专项与完整数据库测试均通过。
- [~] 待复审:P0-10 剩余负向窗口、锁归属和摘要不匹配,历史恢复事务证据,完整三数据库 Web 矩阵及最终清库首次流程。
- [!] 暂缓或阻塞:系统账户 SMTP 真实投递、验证码密码重置闭环、改密后重新登录闭环,以及第一台公网平台限制;不得宣称总体生产验收完成。
## 当前有效安全任务结果(2026年10月1日22:50)
- [✓] 需求确认:所有合法用户名、邮箱均使用同一公开处理提示,不披露账号存在性、角色、命令、重置地址或凭据。
- [✓] 开发:公开路由绑定独立通用提示处理器,不执行历史账户分类逻辑;使用独立响应结构,只输出标题、说明、处理动作,并设置no-store。
- [✓] 回归:七类标识一致性、输入格式、未知字段、尾随JSON、超大请求和初始化边界通过;旧实现实际失败。后端全量测试、vet、build及重置专项race通过,前端242项通过。
- [✓] 发行:源码51ab0a6已推送,source_dirty=false的正式Linux归档通过密码SSH安装双机;归档和包内摘要全部校验通过。
- [✓] 实机:第二台公网无凭据五类标识响应相同;第一台独立访问同一公网接口四类标识响应相同;第一台本机严格TLS四类标识响应摘要相同。页面不显示账号身份或重置链接。
- [✓] 收尾:服务健康、严格TLS、内部端口、任务保留、历史事务、邮件服务均复核;未新增辅助验收脚本、未清库或改密码。
- [!] 该账户枚举子项关闭,不代表系统通知、实际密码重置、其余P0-10、完整数据库Web流程或最终生产门禁通过。
## 当前有效安全任务(2026年10月1日22:31)
- [✓] 只读复核当前正式候选:内部端口回环、严格上游 TLS、临时重置入口关闭及最终部署事务已提交。
- [!] 公开密码重置账户枚举已实机复现:无登录凭据即可区分超级管理员和未知账户。既有“不泄露维护命令”回归未覆盖此风险。
- [ ] 统一合法标识的公开查询响应;补充已知用户名、已知邮箱、未知用户名、未知邮箱的一致性测试,并复核无重置会话或其他副作用。
- [ ] 整改后构建正式候选、部署并复测。当前仅发现和记录风险,尚未修复,不扩大既有安全通过结论。
## 当前有效任务看板(2026年10月1日22:22,启动恢复与多目标负向实证)
需求确认:不降低 TLS 校验、不手工释放恢复锁、不补造恢复证据;复用已有有效证书,通过正式导入、部署和任务重试执行。本轮不重复签发、不清库、不创建辅助验收脚本。
- [✓] T5-6-6 基线与入口:核对双机正式候选、有效新旧证书;确认历史版本恢复接口已停用,使用正式导入入口复用旧证书,未直接改托管文件。
- [✓] T5-6-6 缺口复现:不同证书切换后真实 SIGKILL;文件及运行证书恢复,但启动恢复仅核验一次而留下指纹不符状态及锁,保留真实失败记录。
- [x] T5-6-6 开发:`00aeedc` 复用有限次严格 HTTPS 核验,覆盖回滚和提交证书切换、持续不符、空指纹、校验失败、取消及截止时间。后端全量、静态检查、构建、前端 241 项通过。
- [x] T5-5 正式候选:干净源码 Linux amd64 包完成构建与路径检查,密码 SSH 上传并核验包内摘要,双机通过正式安装器升级,程序哈希一致。
- [✓] T5-6-6 实机:修复版真实不同证书中断后自动恢复双机文件和运行证书,两个新事务自动回滚,无本次残锁,无人工状态修补。
- [✓] T5-6-6 重试:同一任务两次失败历史保留,第三次正式重试双机成功;成功后重复请求为 409。
- [✓] T5-6-7 多目标部分失败:第二台成功重载到新证书、第一台配置校验失败;第二台自动恢复运行证书,第一台未重载且文件回滚,两个事务均 rolled_back。后续恢复标准配置,正式部署当前证书双机成功。
- [✓] T5-5 安全与收尾:两台配置均恢复 nginx -t 与 nginx -s reload;内部端口回环监听、六次公网跨机探测超时、严格 TLS、证书私钥匹配、邮件服务及无活动任务复核通过。
- [~] T5-6 其余负向窗口与锁归属/摘要不匹配实机、T5-8 历史缺证据事务仍未闭环。
- [!] 系统发信闭环、第一台公网平台限制、MySQL 5.7 和完整三库 Web 等剩余门禁、最终清库首次验收未完成;Linux 总体生产验收不放行,Windows 不在本轮范围。
## 当前有效任务看板(2026年10月1日21:43,运行证书自动恢复)
需求确认:不允许仅回滚磁盘文件就认定服务恢复;只有重新校验旧配置、重载并核验实际 HTTPS 证书后,才能释放本次锁和标记恢复成功。使用真实不同的新旧证书,保留失败历史;不开放内部公网端口,不关闭 TLS 或 SSH 主机身份校验。
- [✓] T5-6-1 基线:核对双机旧证书文件摘要、实际 TLS 指纹、证书与私钥对应关系,无活动任务后通过正式接口申请一次新证书。
- [✓] T5-6-2 缺口复现:旧候选出现文件已回滚、运行证书仍为新证书;任务如实失败并保留锁。通过已有启动恢复机制核验并恢复旧证书,未手工改库或删锁。
- [x] T5-6-3 开发:提交 `2e6d992` 将重载失败的目标纳入待恢复事务;新增退出码失败、连接返回错误及三类恢复证据不足回归,五个场景通过,后端全量与前端 241 项通过。
- [x] T5-5 正式候选:干净源码构建 Linux amd64 包,两台通过密码 SSH、完整性检查及正式安装器升级;本轮保留数据,不冒充清库首次测试。
- [✓] T5-6-4 双机不同证书失败恢复:两台均观测到新证书生效,随后自动回到旧证书;恢复校验成功,事务已回滚,文件摘要及实际 TLS 一致,无本次残锁,主进程未重启。
- [✓] T5-6-5 原任务重试:任务 `87166c03-5501-482f-a4f6-db83ffc87a05` 的首次失败记录保留,第二次尝试双机成功;成功后重试返回 409。两台重载命令均已恢复为标准 Nginx 命令。
- [✓] T5-5 端口:双机内部服务只监听回环;六次跨机公网内部端口探测均超时,管理入口保持严格 TLS 反代,第一台邮件服务正常。
- [~] T5-6 其余负向窗口、不同证书进程崩溃、多目标部分失败及 T5-8 历史证据缺失事务继续推进,本项局部通过不等于 P0-10 全部完成。
- [!] 系统发信闭环、第一台测试域名公网限制、MySQL 5.7 与完整三库 Web 等剩余门禁以及最终清库首次流程未完成。此前已完成的数据库迁移、独立正式 CLI 备份恢复和 Linux 原生构建证据继续有效;Windows 不在本轮范围。
- [!] 总体 Linux 生产验收未放行。
## 当前有效任务看板(2026年10月1日21:12,双机安全接口候选)
需求确认:公开页面和接口均不得暴露可执行维护命令或入口名称;只推进 Linux。本节覆盖下方本项待构建、待部署的历史记录,不扩大为整个密码重置流程验收通过。
- [x] T4-3-1:公开查询与状态接口使用通用联系管理员标识,修复提交 `9c58c5b` 已推送。
- [x] T4-3-2:整个公开响应的命令信息检查、入口和令牌字段检查、无重置 Cookie 回归,以及前端 241 项、后端全量测试、静态检查和构建通过。
- [x] T4-3-3:干净源码正式 Linux 候选完成双机密码 SSH 安装,全部包内校验通过,线上程序哈希一致。
- [x] T4-3-4:第二台隔离浏览器页面查询和公开接口复核完成;第一台使用实际管理证书作信任锚,在校验 IP SAN 的回环连接中验证接口与就绪状态。
- [x] T5-5 端口子项:双机内部服务回环监听,两服务器互测公网内部端口超时,第二台严格 TLS 反代保持;既有邮件服务不受影响。
- [!] T4-3 实发闭环:两服务器查询邮件管理域名均为 NXDOMAIN;真实系统通知 SMTP、验证码收件、新密码登录仍需完成。
- [~] T5-6:继续部署负向恢复、多目标部分失败、历史恢复事务及重试幂等,保留现场,不修改业务数据伪造成功。
- [ ] Linux 最终清库首次流程、数据库矩阵、备份恢复与完整业务验收尚未补齐。
- [!] Windows 实机工作按用户要求不在本轮执行;整体 Linux 生产验收保持未放行。
## 当前有效任务看板(2026年10月1日,密码重置页面安全信息收敛)
- [x] T4-3 安全页面子项:公开密码重置页面不再显示 Linux、Windows、本机管理命令或 `Scert-admin` 入口名称。
- [x] T4-3 接口子项:超级管理员查询只返回通用本机安全维护说明,不返回重置入口、会话令牌、验证码或命令文本。
- [x] T4-3 回归子项:前端 241 项测试、后端全量测试、`go vet ./...`、`go build ./...`、生产前端构建及差异检查通过。
- [~] T4-3 实机子项:最新候选包尚未重新部署并清理浏览器缓存复测;Smail SMTP 和超级管理员新密码登录闭环仍待生产验证。
- [!] 当前结论:密码重置页面安全信息整改完成,整体生产验收继续保持未放行。
## 当前有效任务看板(2026年10月1日,可信恢复证据候选已完成双服务器基础回归)
- [x] T5-5 构建与安装:正式 Linux amd64 候选包已构建并校验,已使用密码 SSH 安装到 `45.136.13.241`。
- [x] T5-6 正常路径子项:一个域名绑定两台服务器,连续两次部署均两台推送成功、配置校验及 reload 成功、站点 HTTPS 校验通过;服务重启后管理入口保持可用。
- [x] T5-7 代码子项:恢复证据、锁 owner、文件摘要和目标证书指纹已持久化,重启不会接管无可信证据的历史事务。
- [~] T5-6 负向实机子项:进程中断、锁 owner 不匹配、文件摘要不匹配、负向 HTTPS 恢复、部分目标失败和重试幂等仍需验证。
- [~] T5-8 历史现场核查:两条历史 `recovery_required` 事务保留原状,等待逐笔核查,不直接改库或删锁。
- [ ] T4-3:清库后的首次初始化、Smail 系统 SMTP、超级管理员密码重置和新密码登录。
- [ ] T7:`8.137.23.95` 独立回归、SQLite/MySQL/PostgreSQL 三数据库、Linux/Windows 双平台、备份恢复、公网 DNS/ACME 和最终生产门禁。
- [!] 当前结论:核心代码与 Linux 双服务器正常部署已通过;整体生产验收未放行。
## 当前有效任务看板(2026年10月1日,回滚事务终态整改)
- [x] T5-5 构建子项:源码 `8899f7a` 已从干净克隆正式构建 Linux 候选;二十三项产物及二十二个包内文件校验通过,五个执行入口为可执行权限。
- [~] T5-5 恢复子项:启动恢复仅检查锁目录存在,且没有持久化站点恢复基线;不能直接重启接管旧锁。本批未部署,继续整改归属证明、恢复核验和历史现场处理。
本批收尾记录:后端 `go test ./...`、`go vet ./...`、`go build ./...` 通过;`go test -race ./internal/deployment ./internal/app ./internal/repository -count=1` 三个包通过。条件跳过用例不算通过,尚未部署,不提升生产门禁。
需求确认:沿用原始四十四项要求,继续完整生产整改;先修复明确代码缺陷,再构建候选并执行生产流程。运维使用密码登录,产品保留自动公钥部署能力。以下为当前状态,下方快照只作历史证据。
- [x] T5-1:以双目标回归复现恢复核验成功但事务写为需要恢复,修复不可达的已回滚分支。
- [x] T5-2:已核验恢复只将事务记为已回滚,不将原失败任务改为成功;恢复失败或锁释放失败仍保留需要恢复状态。
- [x] T5-3:补充双目标恢复核验、恢复失败、锁释放失败和部分目标失败的持久化接口回归。
- [x] T5-4:后端全量、静态检查、构建及专项竞态检查;最终命令结果见本批收尾记录。
- [ ] T5-5:规范构建新候选;旧部署事务先核对归属与恢复证据,不人工改库,不直接清理现场。
- [ ] T5-6:正式页面多域名多服务器部署、负向恢复、锁收尾及重试幂等实机复测。
- [ ] T4-3:清库后的首次初始化、系统 SMTP、超级管理员密码重置和新密码登录。
- [ ] T7:三数据库、双平台服务、备份恢复、公网 DNS 与 ACME、最终生产门禁。
- [!] 本批仅代码与回归整改,线上版本未变。整体生产验收未放行;P0-03 的历史局部复审不能替代 P0-10 与其他门禁。
## 本轮任务看板(2026-09-30,最新候选已完成双服务器基础部署)
- [x] T2 子项:识别 Smail `notify:` 系统通知账号,固定系统通知发件身份并禁止 HTTP 通道发送。
- [x] T2 子项:超级管理员验证码只发送绑定邮箱;系统通知账号只走 SMTP,SMTP 未启用时返回明确错误。
- [x] T2 子项:通知专项测试、后端全量测试、`go vet`、`go build` 和差异检查通过。
- [x] T4-1:提交本轮实现,编译正式 Linux amd64 候选包,并完成归档及包内完整性校验。
- [x] T4-2:使用密码 SSH 将候选包安装到 `8.137.23.95` 和 `45.136.13.241`,两台服务基础健康检查通过。
- [~] T4-3:按清库后的生产首次流程验证 Smail SMTP 验证码、超级管理员密码重置和新密码登录。
- [~] T5:继续验证多服务器、多域名、证书推送、失败恢复、重试幂等及任务状态持久化。
- [ ] T7:三数据库、Windows 服务、清库首次初始化、公网 DNS/ACME、备份恢复和最终生产上线结论。
- [!] 总体验收位置不变:**P0-03 完成,等待复审**;基础部署通过不等于完整生产验收通过。
## 当前任务看板(2026-09-30 17:39 UTC,恢复标准 Nginx 重载命令后正式页面复测)
- [x] 已通过正式服务器配置页面将临时 `/usr/bin/true` 重载命令恢复为 `nginx`、`-s`、`reload`,并保存成功。
- [x] 正式页面重新部署 `scert-multi-20260930.apmmk.cn` 成功,页面显示 1 台推送成功、站点 HTTPS 校验通过,服务器结果显示配置校验与 reload 成功。
- [x] 未创建辅助验收脚本,未修改主机指纹校验,Git 工作区保持干净。
- [~] 继续执行 P0-10 负向实机验证:后置 HTTPS 失败自动恢复、进程崩溃事务接管、多目标部分失败及重试幂等仍未通过。
- [!] 第二台真实服务器、一个域名多服务器、三数据库、双平台服务、备份恢复和最终清库首次生产流程仍待完成,不能标记完整生产验收通过。
## 当前任务看板(2026-09-30 16:55 UTC,陈旧部署锁清理后正式页面复测)
需求确认:继续按生产页面完成现场复测;清理只针对已确认为空且无活动任务的陈旧锁目录,不删除业务数据、证书、私钥或配置,不以人工清理结果替代自动恢复验收。
- [x] 通过 SSH 核查三个目标锁目录为空,确认无活动部署进程及活动任务后,使用 `rmdir` 安全清理;证据目录中的历史锁未删除。
- [x] 正式页面重新部署 `scert-multi-20260930.apmmk.cn` 成功,页面显示 1 台推送成功、站点 HTTPS 校验通过,域名状态恢复正常。
- [x] 复核 `Scert`、`Scert-storage.socket`、`nginx` 为 active,公网 `/readyz` 为 200;两个域名 HTTPS 为 200,目标证书和公网证书指纹一致,目标托管目录无部署残留。
- [x] 运行概览显示进行中任务为 0,最新任务状态为已完成;本次未创建辅助验收脚本。
- [~] 继续执行 P0-10 负向实机验证:后置 HTTPS 校验失败自动恢复、进程崩溃事务自动接管仍未通过;本轮人工清理陈旧锁后的正常部署不计入自动恢复通过。
- [!] 第二台真实服务器、一个域名多服务器、三数据库、双平台服务、备份恢复和最终清库首次生产流程仍待完成,不能标记完整生产验收通过。
## 当前任务看板(2026-09-30 23:55,密码部署公钥并切换密钥复测)
需求确认:继续按生产方式验证 SSH 认证闭环;密码只用于本次公钥部署,后续部署必须使用加密托管私钥,不在页面或日志中记录密码。
- [x] 服务器配置通过密码 SSH 保存后,自动生成并使用服务器专属托管私钥,部署公钥到远端授权文件。
- [x] 自动使用托管私钥执行回连命令验证,正式页面显示“已部署并验证”;托管指纹与远端授权公钥指纹一致。
- [x] 自动切换为私钥认证后,再次部署第二域名成功,页面显示证书推送、配置校验、reload 和站点 HTTPS 校验全部成功。
- [~] 当前单服务器 SSH 认证闭环完成,待第二台真实服务器复测;后置 HTTPS 失败恢复和进程崩溃恢复仍是 P0-10 阻塞项。
- [!] 未创建辅助脚本,未关闭主机指纹校验,未将密码或密钥材料写入文档;完整生产验收仍未放行。
## 当前任务看板(2026-09-30 23:42,正式候选正常部署复测)
需求确认:加快明日上线准备,但不缩减既定生产门禁;本轮完成当前候选在正式页面上的双域名正常部署复测,保留所有未验证阻塞项。
- [x] 3cc8fb6 正式候选已通过密码 SSH 部署到测试服务器,`Scert.service`、目录 socket、Nginx 和管理入口就绪检查均正常。
- [x] 正式页面登录和第二域名部署复测通过:页面显示 1 台推送成功、站点 HTTPS 校验通过;配置校验、reload 和服务器结果均成功。
- [x] 两个域名公网 HTTPS 返回 200;目标证书与公网证书指纹一致;活动任务为零,目标目录无残留部署锁。
- [~] P0-10:继续执行后置 HTTPS 校验失败自动恢复和进程崩溃事务恢复的正式负向实机测试;本轮正常路径不计入负向恢复通过。
- [!] 今天无法诚实标记完整生产验收通过。第二台真实服务器、一个域名多服务器、三数据库、双平台服务、备份恢复和最终清库首次流程仍待完成;若第二台服务器及测试条件明日可用,先完成这些门禁再给出上线结论。
## 当前任务看板(2026-09-30 22:56,锁冲突测试已收尾)
需求确认:继续完整整改与生产验收;本批先补齐部署后 HTTPS 校验失败的事务恢复,不以提示改善代替恢复能力。修改前检查点 c623e2d 已推送。
- [x] 新诊断版本 6efc890 已正式构建部署;锁冲突页面提示与任务结果查询接口均已核实。
- [x] 测试锁移回受限证据目录后,正式页面重新部署成功,任务 179bb071-486d-4356-8ba2-e15ce1164eb5 为 success;两站点 HTTPS 200、证书指纹正确,目标目录无残留锁。
- [~] 将事务旧文件与部署锁保留至站点校验完成;失败时恢复各服务器文件、校验和重载,并核对部署前可信站点证书。
- [ ] 增加多目标、取消、恢复失败及诊断回归,正式构建部署复测。
- [!] 进程崩溃事务自动恢复、第二台真实服务器、三数据库、双平台服务、备份恢复和最终清库首次流程仍未完成。
以下时间章节保留历史记录,最新状态以本节为准。
## 当前任务看板(2026-09-30 22:35,中断恢复实测与诊断整改)
需求确认:沿用完整 P0-10 与生产验收范围。修改前检查点 b27eedc 已推送;本轮验证部署中断、遗留锁、人工核查后的恢复,并修正公开诊断,不把诊断改善当作远端事务自动恢复。
- [x] 真实部署执行中 SIGKILL 主进程,systemd 自动重启;任务、尝试恢复为 failed,阶段 service_restart,审计写入,没有悬挂或误报成功。
- [x] 实测直接重试被遗留锁拒绝;核实无活动任务、远程延迟进程结束及新旧文件一致后,将三个锁和三个事务旧文件移入受限证据目录,未删除现场;产品重新部署成功,两站点正常。
- [x] 新增固定阶段错误码和中文安全诊断,覆盖连接、目录、锁、上传、替换、校验、回滚、运行态未确认及清理;接口和持久化结果只放行固定诊断,保留底层受保护证据。
- [x] 中断任务提示不再要求直接重试,明确执行结果未确认及关联资源核查;正式回归修复前失败、修复后通过。部署、仓储、应用和接口四包测试通过。
- [x] 接口读取与前端诊断回归通过;后端全量测试、静态检查、部署/仓储/应用/接口四包竞态均退出零,前端 240 项通过。
- [~] 提交当前修复,使用干净源码正式构建及部署复测。
- [!] 当前线上仍为 91e1123;新诊断尚未部署。远端崩溃事务没有自动恢复,P0-10 整项未完成。
- [ ] 第二台真实服务器、三数据库矩阵、Linux 原生与 Windows 服务、备份恢复和最终清库首次生产流程继续保留。
以下带时间章节为历史证据,当前状态以上节为准。
## 当前任务看板(2026-09-30 22:18)
需求确认:沿用已确认完整整改范围;新包正式安装、DNS 复测、旧证书负向与恢复、单机多域名依次推进,不缩减多服务器、数据库和最终首次流程验收。修改前检查点 7d0ce94 已推送。下方各时间章节保留为历史证据,当前状态以本节为准。
- [x] 91e1123 干净源码正式构建和清单核对完成,密码上传完成;正式安装器部署,线上主程序哈希一致,服务及重新登录正常。
- [x] 产品 DNS 权限检查连续四次返回 200,三十六位十六进制随机记录名、写入、读取、清理均成功;不以失败重试充当连续成功。
- [x] 正式页面申请新证书完成签发;无操作重载时公网仍提供旧有效证书,六次身份校验后任务和尝试失败,页面没有误报成功。
- [x] 已恢复 nginx 正常重载,通过正式页面部署已有证书成功;新公网、目标、托管指纹一致,Nginx worker 更新,HTTPS 正常。
- [x] 单机双域名实机通过:新域名完成真实 DNS-01 和签发;独立目标目录由产品创建,旧域名文件不变。补齐独立 Nginx 站点并等待真实 DNS 缓存到期后,正式页面部署成功,两个域名均为正常 HTTPS。
- [x] 精确解除第二域名的服务器关联不影响第一域名,服务器记录保持一条;已经重新关联第二域名,不以此替代多台服务器验收。
- [~] 下一任务为在真实部署执行中中断主进程,核对重启后的任务、尝试和远端现场;先使用已有证书,避免重复申请。修改前检查点 380adf2 已推送。
- [ ] 三数据库矩阵、Linux 原生构建及 Windows 服务验收。
- [ ] P0-12 备份恢复和其余既定整改门禁;最终清库、清缓存、完整首次生产流程。
- [!] 第二台真实服务器缺失,不能用同机多条记录替代;后置 HTTPS 校验失败没有自动运行态恢复证据。
## 当前阻塞修复(2026-09-30 21:45,随机 DNS 探测记录名)
需求确认:修复真实申请链中随机探测记录名格式错误,不绕过权限验证;补正式回归、重建部署并复测,随后继续 HTTPS 身份与多域名验收。
- [x] 新候选正常部署通过;真实重载后主动返回失败,原文件 inode、哈希和权限恢复,无残留锁;恢复正常命令后重新部署成功。
- [x] 再次申请在 DNS 授权探测阶段返回 InvalidRR.Format,未生成第二张证书;产品权限接口相邻两次验证一成功一失败,失败记录首标签以连字符结尾。
- [x] 将记录名随机后缀与 TXT 随机值分离,十八字节随机数完整编码为三十六个小写十六进制字符;保留 TXT 随机强度和精确清理规则。
- [x] 新增四类域名各三十二次正式回归及格式错误脱敏诊断回归,修复前失败、修复后通过;DNS 包测试、静态检查和竞态通过。
- [x] 后端全量测试与静态检查退出 0。
- [ ] 正式构建、部署后权限探测及签发复测。
- [!] 同域名旧有效证书的公网负向验证尚未执行到 HTTPS 阶段;不能将本次 DNS 失败计入 HTTPS 验收。服务器重载命令已恢复正常。
## 当前执行任务(2026-09-30 21:33,最新候选实机复测)
需求确认:沿用已确认范围,核对最新正式包、密码 SSH 正式安装、复测部署身份与状态、推进单机多域名和失败恢复,并同步真实证据;不新增辅助验收脚本,不以升级复测替代清库首次验收。修改前检查点 03e10e1 已推送。
- [x] 应用、接口、部署专项竞态均退出 0;前端 239 项、后端全量及静态检查通过,补齐上一批收尾状态。
- [x] fc57b8e 规范克隆正式 Linux 构建成功,source_dirty=false;23 项清单和 22 个实际归档文件校验通过,五个执行入口权限为 0755。
- [x] 密码上传并核对远端 SHA256SUMS,停止主服务及目录服务 socket 后用正式安装器升级;主服务、目录 socket 恢复 active,readyz 为 ready,管理页面重新登录成功。
- [~] 正式页面部署已有证书,验证新字段和实际站点指纹;继续失败状态与恢复验证。
- [ ] 单机多域名、真实多服务器、任务恢复、三数据库及最终清库首次初始化。
- [!] 第二台真实服务器尚缺;本轮未清库,不提升完整生产验收状态。
## 当前整改任务(2026-09-30,部署后 HTTPS 校验)
需求确认:沿用已确认生产验收范围,先消除成功误报,再推进真实失败恢复;不以状态文案修改替代恢复能力。修改前检查点 1b2b45d 已推送。
- [x] 先写回归并复现旧有效证书误通过、校验失败报告仍成功。
- [x] 从实际证书文件计算待部署指纹,先校验私钥和完整链一致性;缺失或损坏时不执行远端写入。
- [x] 旧指纹、空指纹重试后仍不匹配则失败;元数据缺失或陈旧不影响从文件核对;取消不接受迟到成功。
- [x] 区分单台推送与站点验证,校验失败整体报告失败;任务、尝试、接口和页面不再宣称完成,不伪造回滚。
- [x] 本地 TLS 握手回归、任务持久化和接口回归已加入;前端全量 239 项及生产前端构建通过。
- [x] 后端全量测试和静态检查通过。
- [~] 应用/接口/部署竞态检查正在收尾,不以尚未退出的进程声明全通过。
- [ ] 提交后从规范克隆构建正式新候选,并推进尚未完成的实机测试。
- [!] 线上暂未更新;后置校验仍在文件部署事务之外,自动恢复、多服务器和完整生产门禁不提升状态。
## 最新执行结果(2026-09-30 21:07)
需求确认:沿用已确认范围,完成最新构建整改的正式发布验证并同步证据,不用本地通过替代生产部署验收。本批修改前检查点 7c727d3 已推送。
- [x] 在已有规范独立克隆获取并签出 9e89eda,使用新输出目录,保留历史发布包。
- [x] 正式入口完成 Windows amd64、Linux amd64 双目标构建;发布清单记录干净源码及后端、前端 LF 检查结果。
- [x] 清单 33 项大小及校验和、两个平台 SHA256SUMS、实际压缩包文件集合与内容全部核对通过;Linux 执行入口权限通过。
- [x] 同一克隆后端全量测试、静态检查、发布模块专项、前端 237 项测试通过;检查结束后源码及锁文件无变化。
- [x] 更新总清单 P0-04 正文、执行清单、支持矩阵和 Linux 测试记录,明确本地包身份及未部署边界。
- [~] 后续继续单台多域名、重载失败、后置 HTTPS 校验失败及任务恢复实机验收。
- [ ] Linux 原生构建、双平台服务、三数据库和清库首次初始化仍待完成。
- [!] 第二台真实服务器尚未落实;完整生产验收仍未放行。
## 构建换行整改任务更新(2026-09-30)
- [x] 已实现拒绝非规范换行,不替换用户中文源码;记录后端、前端检查策略及文件数量。
- [x] 正式回归覆盖 LF、无换行、二进制、中文和换行文件名、CRLF、混合换行、空输出、截断、无效格式、未知状态及非 Git 目录。
- [x] 实际 Git 夹具验证:Git diff 无差异时仍能拒绝 CRLF;正式工具链退出 1,不安装依赖、不生成锁文件、不改写源码。
- [x] 工具链 31 项和前端全量 237 项通过,规范克隆工具链检查通过。
- [~] 提交后完整构建验证;Linux 原生构建、双平台服务、数据库与生产业务门禁仍未完成。
## 最新任务状态(2026-09-30 20:53)
- [✓] P0-03 按本项范围完成复审,不再与整体生产验收混为一谈。源码与产物隔离、独立克隆构建、忽略规则、索引与实际部署包边界均有本轮证据。
- [x] 配置校验失败回滚及恢复后的再次部署完成实机验证,具体步骤与证据见《Linux生产流程测试记录》20:53 章节。
- [~] P0-04 构建输入换行一致性整改。需求确认:正式构建不能仅依赖 Git 干净状态判断输入一致;只检查并拒绝非规范换行,不自动改写用户中文文件;补充正常、异常、二进制、空输出与命令失败回归。
- [ ] 完成上述开发后重新构建验证,明确新包身份;本轮独立克隆包未部署,不能与线上包哈希混用。
- [ ] 继续多域名复用、重载失败、后置 HTTPS 校验边界、任务恢复、三数据库与清库首次初始化。
- [!] 第二台真实服务器仍缺;整体生产验收没有放行。其余任务保留原状态,不因 P0-03 复审而自动提升。
## 最新任务清单(2026-09-30 20:06,签发成功后的交叉复核)
需求确认:沿用已确认生产验收范围;先核对真实成功路径,再用现有证书验证失败回滚,不创建辅助验收脚本、不修改禁止操作的业务域名。
- [x] 正式候选 0bb427d 已构建部署;主程序本地与远端校验和一致,管理入口健康。
- [x] 正式页面申请生产证书成功;任务 fbefdb52-7fc0-4942-8512-850b0869c07d 与持久化部署结果成功。
- [x] 核对版本化托管目录与目标目录三个文件校验和、私钥权限、Nginx 配置检查与重载日志。
- [x] 核对服务器及外部客户端 HTTPS、证书指纹和两台权威 DNS 的挑战清理结果。
- [~] 通过正式页面配置可控的校验失败,再部署已有证书,检查错误报告、文件回滚、部署锁释放及恢复后成功路径。
- [ ] 一台服务器多域名生产推送及任务恢复验收。
- [!] 第二台真实服务器待落实;三数据库、清库首次初始化及最终生产门禁仍未完成。
本轮仅升级针对性复测,不提升总体验收状态,不报缺少逐项依据的百分比。详细证据见 Linux生产流程测试记录同日章节。
## 最新执行记录(2026-09-30 19:43,DNS 超时现场与补偿)
需求确认:精确限定授权域、临时 TXT 必须可核对清理、不得绕过权限验证、真实证书推送继续推进。基线提交 7d059e0 已推送。
- [x] 实机排查:系统 DNS/SOA 与阿里云 HTTPS 可达;产品权限检查闭环通过,页面新域名保存成功。
- [x] 缺陷整改:纠正查询搜索模式;新增创建响应丢失后的独立取消上下文补偿,最长十秒,不自动重试创建。
- [x] 专项回归:响应丢失、错误名称/值/托管区/类型、空 ID、多条结果、不完整分页、未发现记录、查询失败、删除失败、取消、明确拒绝和共享 ACME 排除;页面保留待核对记录提示。
- [~] 最终全量检查与新正式包部署;实机补偿功能尚未复审,不替代本地测试。
- [~] 新子域独立解析准备完成,下一步签发、目录创建、推送、校验重载和公网 TLS。
- [ ] 回滚、多服务器、三数据库及完整首次初始化门禁仍未完成;总体验收仍为 P0-03 完成待复审。
## 最新执行记录(2026-09-30 19:20,SSH 自动部署阻塞已通过一次实机复测)
- [x] 两批修复已中文提交推送;7147532 为实际部署源码提交。
- [x] 全量后端测试、静态检查、构建及部署/接口/应用竞态检查通过。
- [x] 正式包由干净提交构建,通过密码上传与包内校验;安装器先拒绝仍运行的证书目录 socket,停止该 socket 和服务后正常升级,再恢复 socket 与主服务。
- [x] 页面保留并重新编辑既有失败服务器,PUT 返回 200;状态 deployed、错误为空、私钥认证方式和两项成功时间均经接口复读确认。
- [x] 目标 SSH 日志确认密码、公钥认证先后成功;公钥文件及 sshd 配置通过只读核对,未输出私钥或密码。
- [x] 三份清单/记录已同步本轮本地和实机证据;不再使用未经逐项统计的完成百分比。
- [ ] 后续继续真实证书推送、Nginx 校验/重载/回滚、多对多、任务恢复和三数据库验证。
- [!] 第二台真实服务器仍缺失;总体验收保持 P0-03 完成待复审,不以本项成功提前升级整项状态。
### 19:13 执行补充:有界重试源码与回归完成
- [x] 只在公钥安装后私钥回连处接入重试,保留原私钥认证方式和已登记主机指纹,最多五次尝试。
- [x] 恢复、耗尽、非可重试错误、取消路径回归及后端全量测试、静态检查、构建通过。
- [~] 第二批竞态检查仍在运行;提交后构建正式包,继续密码 SSH 部署复测。
- [ ] 远端更新服务器返回 200 与密钥状态 deployed 尚未确认,不新增生产放行或复审通过项。
### 19:10 执行补充
- [x] 部署、接口、应用包竞态检查全部通过,退出 0。
- [x] 精确远端日志确认:私钥回连处于 SSH 重载与恢复监听之间,相差约 17 毫秒;没有发现本次失败需要通过关闭校验或改用密码部署来解决。
- [~] 当前新增任务:公钥安装后短暂连接拒绝的有界重试,覆盖成功恢复、耗尽、认证拒绝和上下文取消。
- [ ] 本批修复提交后再开始该项修改;远端部署与生产验收仍待执行。
## 最新执行记录(2026-09-30 19:08,单次 SSH 协商)
本轮沿用已确认需求:密码连接自动部署密钥,严格校验主机指纹,复用既有服务器记录,不以辅助脚本或单元测试代替真实生产验收。总体验收仍为 **P0-03:完成,待复审**。
- [x] 修改前中文基线提交 189b798 已推送。
- [x] SSH 默认改为单次多算法协商;指纹不匹配再回退,认证失败停止重连;显式算法列表兼容行为保留。
- [x] 新增四个叶子回归场景,专项测试及后端全量测试、静态检查、构建通过。
- [~] 部署、接口、应用三个包的竞态检查正在运行。
- [x] 密码 SSH 只读检查确认远端 Scert、SSH 正常运行;不算自动密钥登录成功证据。
- [ ] 提交修复、构建正式候选并部署,验证更新既有服务器接口返回 200、密钥状态 deployed、错误为空、部署与测试时间有值。
- [ ] 继续证书目录创建、证书推送、Nginx 校验与重载、失败回滚、真实多对多和三数据库验收。
- [!] 第二台真实服务器缺失仍未解决;本轮不新增复审通过项,不再使用未经逐项统计的完成百分比。
## 最新执行记录(2026-09-30 15:26,版本与日志只读核对)
**P0-03 保持完成,待复审。** 本轮仅排查既有失败现场,没有新建测试资源、清理数据库或重启服务。
- [x] 已通过密码 SSH 确认 Scert 服务处于运行状态。
- [x] 已对比远端主程序与本地正式候选的 SHA-256,结果一致;当前失败不是两者文件不一致造成的。
- [x] 已读取既有日志,确认服务器新增、更新曾返回 502,耗时分别为 25 毫秒、19 毫秒;没有将读取历史日志算作重新通过测试。
- [~] 已发现公钥转换、内置安装命令与参数校验的源码疑点;下一步用正式回归用例确认,不用辅助脚本替代验收。
- [ ] 尚未完成代码修复、重新部署、密钥回连和真实证书推送;不新增复审通过状态。
## 最新执行记录(2026-09-30,远端密码 SSH 自动公钥部署阻塞)
总体验收继续保持 **P0-03:完成,待复审**。本批只登记生产 HTTPS 和密码 SSH 实机证据;自动公钥部署失败,不能替代真实证书推送验收。
- [x] 执行:通过 `https://odacm.cn` 登录并读取域名、服务器资源列表。
- [x] 执行:按正式页面添加授权测试服务器,登记主机指纹并保存密码认证配置。
- [x] 证据:从目标机外部密码 SSH 直连成功,目标机 ED25519 指纹与登记值一致。
- [!] 阻塞:Scert 添加服务器流程自动部署 SSH 公钥返回 502,资源状态明确为失败;尚未开始证书上传、Nginx 校验或重载。
- [~] 继续执行:定位自动公钥部署失败原因,修复后重新走页面流程并验证密钥登录。
- [ ] 尚未执行:第二台真实服务器、多服务器证书推送、真实 DNS/ACME、三数据库实机和最终生产验收。
- [!] 状态约束:不标记 `[✓]`,总体验收仍为 **P0-03:完成,待复审**。
## 最新执行记录(2026-09-30,域名与服务器多对多统一回归)
总体验收继续保持 **P0-03:完成,待复审**。本批仅登记多对多专项开发复核和自动化测试结果,不替代真实数据库、真实服务器和生产部署验收。
- [x] 需求复核:一个域名可选择多台服务器,一个服务器可显示并复用于多个域名。
- [x] 后端复核:`domain_servers` 联合主键、同项目校验、当前域名绑定替换、显式清空和其他域名关联保留均符合需求。
- [x] 安全复核:重复 ID 去重、跨项目拒绝、共享路径冲突保护、失败审计与事务回滚均有测试覆盖。
- [x] 页面复核:域名编辑多选服务器;服务器卡片显示当前关联的全部托管域名。
- [x] 自动化验证:后端仓储/HTTP/应用专项测试通过;前端全量 231 项测试通过。
- [~] 继续执行:三数据库实机矩阵、真实多服务器证书推送、HTTPS/DNS/ACME、密码 SSH 和生产流程。
- [ ] 尚未执行:本轮多对多功能的远端生产部署门禁和最终复审。
- [!] 状态约束:不标记 `[✓]`,总体验收仍为 **P0-03:完成,待复审**。
## 最新执行记录(2026-09-30,P0-10 崩溃恢复边界修复)
总体验收继续保持 **P0-03:完成,待复审**。本批登记任务恢复边界修复和本地自动化证据,不替代真实服务器、真实数据库和生产部署验收。
- [x] 仓储层:恢复任务尝试时先按恢复前活动任务范围更新,再收敛父任务状态。
- [x] 回归覆盖:历史 `service_restart` 任务与本次活动任务使用相同完成时间时,历史任务尝试保持原状态。
- [x] 自动化门禁:后端全量测试、静态检查、差异检查均通过。
- [~] 继续执行:P0-10 的 DNS 验证、重试幂等、跨数据库实机矩阵和统一复审。
- [ ] 尚未执行:P0-12、真实三数据库生产数据清理、密码 SSH、远端多服务器部署、HTTPS/DNS/ACME 和最终生产门禁。
- [!] 状态约束:不标记 `[✓]`,总体验收仍为 **P0-03:完成,待复审**。
## 最新执行记录(2026-09-30,P0-10 部署结果查询闭环)
总体验收继续保持 **P0-03:完成,待复审**。本批只登记代码开发和本地回归证据,不替代真实服务器、真实数据库和生产部署验收。
- [x] 数据库:0016 `task_deployment_results` 已在三种数据库迁移目录登记并通过迁移目录一致性测试。
- [x] 应用层:统一证书任务工作流保存每台服务器的部署结果,覆盖失败和部分成功结果。
- [x] 接口层:`GET /api/v1/tasks/:id/deployment-results` 已注册并按项目任务可见范围返回结果。
- [x] 安全性:失败部署消息统一脱敏;管理员、项目成员、项目外账户、未登录请求和撤权后的旧会话均已专项验证。
- [x] 自动化门禁:后端全量测试、静态检查、差异检查均通过;当前批次提交为 `126cb6d`、`40d2b61`、`79e57cd`。
- [~] 继续执行:P0-10 的 DNS 验证、任务崩溃恢复、重试和跨数据库实机矩阵。
- [ ] 尚未执行:P0-12、真实三数据库生产数据清理、密码 SSH、远端多服务器部署、HTTPS/DNS/ACME 和最终生产门禁。
- [!] 状态约束:不标记 `[✓]`,总体验收仍为 **P0-03:完成,待复审**。
## 最新执行进度(2026-09-29)
**总体验收位置仍为 P0-03:完成,待复审。** 本轮完成任务中心剩余一批边界修复和本地回归,不代表远端生产环境已验收。
- [x] 幂等键重放对全部活动状态统一返回冲突。
- [x] 管理证书任务与业务证书任务均执行同类活动任务保护。
- [x] 域名删除保护覆盖证书申请、校验、部署、导入、恢复和自动续期任务。
- [x] 重启恢复的任务尝试更新范围已限定为本次写入 `service_restart` 失败状态的任务。
- [x] 本轮专项及全量本地测试通过,前端生产构建通过。
- [~] 继续审查剩余任务入口、三数据库实机矩阵和跨平台服务流程。
- [ ] 尚未执行生产服务器清库、重新部署、浏览器清缓存、密码 SSH 及最终验收。
- [!] 当前总体验收仍停留在 **P0-03:完成,待复审**,不得提前标记 `[✓]`。
## 最新进度摘要(2026-09-29 继续开发)
**总体验收位置仍为 P0-03 完成,待复审。** 本轮继续推进 P0-10 任务事务链,不把局部代码或专项测试视为整项复审通过。
- [x] HTTP 证书申请任务补齐“开始执行”审计;开始审计与终态审计均关联任务创建人、项目和任务 ID。
- [x] 开始审计写入失败时,任务和任务尝试收敛为失败并停止证书申请;专项回归测试已覆盖该异常路径。
- [x] `go test ./internal/httpapi` 已通过;尚未据此升级 P0-10 或总体验收状态。
- [~] P0-10 的 DNS 验证任务、批量部署结果、崩溃恢复、重试幂等及其他长耗时入口仍需继续审查。
- [ ] P0-12 备份恢复、三数据库实库矩阵、浏览器清缓存、密码 SSH、远端部署和生产验收尚未执行。
- [!] 不新增 `[✓]` 复审通过项,总体验收继续保持 **P0-03 完成,待复审**。
## 最新任务批次(2026-09-29 继续开发)
总体验收仍保持 **P0-03 完成,待复审**;本批只补齐 P0-10 任务创建人和审计归属,不代表生产部署验收通过。
- [x] HTTP 证书工作流上下文已传递当前已认证操作者;证书部署、导入、恢复、校验任务不再默认丢失创建人。
- [x] 任务开始、完成审计已写入任务创建人;后台续期无认证操作者时保持空值,不使用请求身份以外的信息填充。
- [x] 创建人归属回归测试已通过;专项测试为 `go test ./internal/app ./internal/httpapi ./internal/repository`,并通过 `git diff --check`。
- [~] P0-10 仍需继续审查 DNS 验证任务、批量部署 `partial_success`、崩溃恢复、重试和其他同步长耗时入口。
- [ ] P0-12、三数据库实库矩阵、浏览器、密码 SSH、远端部署和生产验收尚未执行。
- [!] 总体验收位置不变:**P0-03 完成,待复审**。
## 最新任务批次(2026-09-29 继续开发)
总体验收仍保持 **P0-03 完成,待复审**;本批代码已完成,统一测试已完成本地自动化部分。
- [x] 证书导入、恢复、校验入口已接入应用任务工作流,提交 `b899751`。
- [x] 当前证书部署、导入、恢复、校验工作流已接入任务取消上下文,可由任务中心取消实际执行上下文。
- [x] 已新增任务取消绑定回归用例;专项测试、后端全量 `go test ./...` 和 `git diff --check` 已通过。
- [x] 已核对任务创建、尝试记录、审计收尾、取消状态和 HTTP 响应的一致性;本批等待复审。
- [ ] 三数据库矩阵、浏览器、密码 SSH、远端部署和生产验收尚未执行。
- [!] 不升级总体验收位置;P0-10 仍在开发中,P0-12 尚未开始。
## 最新任务批次(2026-09-29 23:48)
本节优先于下方历史批次;总体验收保持 **P0-03 完成,待复审**。
本批需求确认:沿用已有域名与服务器多对多模型,继续补齐 P0-10 状态模型的业务保护,不扩大为新一轮页面重构或生产验收。
- [x] 上一批代码已提交并推送 `2b9d82d`,工作区检查无遗留修改。
- [~] 将域名删除互斥范围从排队中、运行中扩展到等待重试、取消中。
- [ ] 添加各证书任务类型与活动状态的删除拒绝用例,并检查域名、服务器关联与审计不受拒绝操作影响。
- [ ] 添加终态任务允许删除域名的用例,确保部分成功不被误判为活动任务。
- [ ] 开发完成后运行专项检查并同步四份文档的证据;尚未通过整项复审。
- [~] 后续继续 P0-10 其余任务链与 P0-12;生产构建、三库矩阵和实机统一验收保持待办。
## 当前执行位置(2026 年 9 月 29 日 16:55):总体验收仍在 P0-03,P0-07 并行开发
**开发位置与验收状态分开记录:** 按用户当前口径,总体验收仍处于 P0-03 完成待复审;P0-04~P0-06 并非未开始,仍有开发或验证未收尾;P0-07 作为并行开发批次继续推进,但不代表总体验收已越过 P0-03。总项状态以《Scert整改合并优化清单》首节为准,下方批次记录保留其历史时间和证据范围。
### 18:22 进度更新(2026 年 9 月 29 日)
- [x] 已提交并推送 `802109e`、`114514b`:任务路由项目隔离、证书任务入口判权、typed-nil 依赖处理及 HTTP 测试夹具修复。
- [x] 后端 `go test ./...` 当前本地运行通过;该结果不替代 PostgreSQL/MySQL 矩阵、浏览器、远端部署和生产验收。
- [~] P0-07 继续推进任务执行、其他业务资源写入和统一权限链;总体验收仍停在 P0-03。
本批需求:域名新增、修改、删除使用真实项目授权,服务端确定归属,成功变更与审计同事务;保留任务及资源引用保护,不通过全局管理员身份绕过项目权限。继续先开发、后统一测试。
- [x] 已提交并推送 `5180c7d`:项目授权域名写入仓储、成功事务审计、应用接线及回归夹具。
- [x] 已提交 `82448c9`:更新域名使用项目可见资源读取;任务创建在事务内锁定域名,与删除流程共用资源锁。
- [x] 已提交并推送 `e36794a`:审计失败时新增、修改、删除均回滚的 SQLite 专项测试。
- [x] HTTP 与仓储专项测试已运行:`go test ./internal/repository`、`go test ./internal/httpapi` 均通过。
- [~] 完整后端、前端、三库矩阵、竞态检测、构建、浏览器、SSH/HTTPS 和远端部署仍待统一执行;专项测试通过不等于生产验收。
- [!] P0-03 总体验收仍缺最终复审与生产证据,P0-07 不能据局部结果升级为复审通过。
## 2026 年 9 月 28 日:多对多表单保存收尾(21:54 接续)
需求确认:沿用已确认的多对多及同项目边界,先开发后统一测试。本批修复创建域名后关联失败的重试状态,限制服务器候选范围,并防止读取关联失败被误当作空数组提交。
- [x] 核对上一批 `e220053` 已提交推送,工作区干净;确认资料与关联仍是两个独立请求,不宣称跨请求原子性。
- [x] 已拆分 `DomainForm.js`,创建资料成功后保留域名标识并更新列表;关联失败重试不再次创建,资料未改时只重试关联,资料改动时更新既有域名。创建结果不明时禁止盲目重试,并提示关闭表单刷新确认。
- [x] 已接入同项目候选过滤,未知归属不默认为默认项目;保存期间防重复及防切换,编辑前重新读取关联,失败时禁用保存并提供重读按钮;旧读取响应不污染新表单。
- [x] 已补齐真实组合式状态、管理页接线及模板回归源码,覆盖共享、清空、失败重试、项目过滤、并发点击、卸载与不确定结果;已同步总清单及交接边界,仅做源码与差异检查。
- [ ] 跨请求原子性、创建请求服务端幂等键、跨页面刷新后的不确定结果恢复仍未实现;不得把本地表单重试保护描述为完整幂等事务。其他资源写入授权及部署安全边界继续按原始清单推进。
- [!] 本批不运行测试、构建、浏览器或部署,待开发阶段完成后统一执行。
## 2026 年 9 月 28 日:域名与服务器多对多(21:32 接续)
需求确认:一个域名允许关联多台服务器,一台服务器允许关联多个域名;修改、清空某个域名的关联不改变其他域名的关联。沿用同项目授权边界,关联保存不触发 SSH 或证书推送。先开发,完成后再统一测试。
- [x] 核对现有联合主键及页面多选;保留多对多模型,不增加服务器或域名单边唯一约束。修改前检查点 `f38e290` 已提交推送。
- [x] 已补齐两个域名共享两台服务器、重复去重、局部修改、清空及失败保留的仓储与 HTTP 回归源码;旧关联格式用例改为真实账户、项目成员和授权仓储,不靠全局管理员绕过权限。
- [x] 已补齐同一服务器记录当前绑定的远程路径冲突保护:默认按域名与证书类型分目录,关联保存、服务器修改和部署预检均检查实际规范化路径;固定路径冲突拒绝,单域名固定路径兼容。新增路径及工作流回归源码,待统一测试。
- [x] 页面增加多选复用悬浮提示及 Vue 模板用例;已同步模型、第三版接口交接、总清单对应条目、开发清单、基础规格、审查记录、发布记录与支持矩阵第二十六节。
- [x] 已进行源码检查、Go 格式化和差异检查;不将格式正确视为编译或行为验证。源码与文档精确提交,状态以 Git 记录为准,未提交运行产物或凭据。
- [ ] 同一主机的多条服务器记录、配置变化与在途任务、远端符号链接和解绑遗留文件的路径占用仍待整体部署整改;本批只完成当前绑定的多对多与路径预检,不宣称覆盖这些边界。
- [!] 本批仅开发,不运行测试、构建、浏览器、SSH 或部署;已有通过记录不得用于本批验收。
## 2026 年 9 月 28 日:先开发、后统一测试(20:57 接续)
需求确认:按照用户最新指令先完成开发,再集中运行测试。沿用 P0-06/P0-07 的既定需求,不缩减原始 44 项,不将未测试的源码记为复审通过。本阶段不清库、不部署、不创建辅助验收脚本。
- [x] 核对当前分支和交接差异;生命周期候选已在 `dcca17e`,两处测试修正另以检查点 `fd767b2` 提交推送。
- [x] 生命周期收尾源码已完成,待统一测试:领域、接口及失败审计统一项目标识校验;项目与成员操作共享忙状态,补充控制字符和表单渲染用例。
- [x] 资源读取隔离源码已完成,待统一测试:域名、服务器、绑定列表及证书元数据入口根据真实资源归属判权,列表在 SQL 内过滤。
- [x] 正式应用依赖已接入;缺少授权仓储拒绝读取,不退回旧全量列表;无权限与不存在统一拒绝,内部错误不向客户端透传。
- [x] 模型、第三版接口交接及实际进度文档已同步;SQLite/MySQL、HTTP 和前端新增回归用例仅编写,不执行。
- [x] 绑定写入已接入真实项目授权与事务审计,候选检查点为 `f38e290`;随后补齐多对多及路径预检,详见首节,均待统一测试。保存关联不触发 SSH 或部署。
- [!] 统一测试推迟至开发阶段完成之后;构建、浏览器和生产验收均未执行,旧证据不能证明新代码。
历史补记:上一批完整前端 210 项通过且生产构建成功;MySQL 5.7 组合通过,MySQL 8.0 的三条审计故障注入用例因业务账户无建触发器权限失败。夹具改由隔离实例管理员建触发器,未提高业务权限,修正后尚未运行。新增非法项目 ID 回归已复现失败,详见 `artifacts/project-lifecycle-20260928/invalid-id-before.jsonl`。以下 20:47 及更早记录仅为历史快照。
## 2026 年 9 月 28 日:项目生命周期与审计(20:21 开始,20:47 同步)
需求确认:继续 P0-06/P0-07,补齐项目创建、资料修改和空项目删除的正式入口;项目不是用户分组。创建仅允许当前有效超级管理员,修改沿用项目管理员实时权限;删除仍遵守默认项目与域名、服务器、成员引用保护,不自动删除业务资源或成员,不清理现有业务数据。名称允许重名,标识由服务端生成且不可修改。所有成功变更与审计同事务,失败记录不泄露请求正文。
- [x] 核对上一批提交 `61652f0` 与干净工作区;浏览器工具问题不阻止本批源码整改。
- [x] 已确认本批权限、引用及事务审计需求;修改前任务检查点 `dcede93` 已提交推送,行为正确性仍须后续测试证明。
- [~] 项目生命周期仓储、实时判权、事务审计及失败回滚已有实现;首轮局部测试通过,随后补充的跨数据库回滚及非事务引擎边界尚待运行,不以 HTTP 层检查代替仓储实时授权。
- [~] 项目创建、编辑、删除 API、失败审计及真实应用接线首轮通过,包含非法字段、确认、引用、缓存和审计失败回滚;新增会话验证后停用/降权及请求取消审计测试尚待执行。
- [~] 页面已接入创建、编辑、二次确认删除与能力提示;局部组合式逻辑及模板回归通过,完整前端与真实浏览器尚未验证。
- [~] 首轮仓储/HTTP/应用组合共 136 个叶子通过、5 条条件跳过,退出 0;项目页面与生命周期专项 35 项通过、0 失败、0 跳过,退出 0。完整回归、MySQL 双版本、竞态及构建尚待执行;PostgreSQL 当前实库和生产验收仍单独保留。
- [~] 已同步总清单顶部及 P0-06/P0-07 的实际进行中状态;模型和验证记录待本批实现及测试后更新,本次只提交进度文档,不夹带未验证代码、运行包、业务库、凭据或日志。
20:47 证据:`artifacts/project-lifecycle-20260928/api-first.jsonl` 与 `frontend-first.log`。首轮结果仅证明执行时的候选及对应测试范围;此后新增测试尚未执行,全部源码仍在工作区,未发布部署。旧批次正式包与回归结果不得套用于当前代码。
原始 44 项及其验收标准不缩减。删除引用冲突必须明确提示且不产生部分删除,授权能力提示不能替代服务端每次检查。
## 2026 年 9 月 28 日:项目页面浏览器验证(19:57 开始,20:15 同步实际进展)
需求确认:使用已提交的项目入口与成员页面,在最新正式构建上验证实际页面、权限操作和布局;不以 SSR 代替浏览器,不扩大为生产验收。正式首次初始化必须经过临时 HTTPS 身份核对、数据库验证、DNS 权限验证和管理证书配置,不通过手工改库或关闭 TLS 校验绕过。
- [x] 19:57 核对基线 `a11315d` 已提交推送、工作区干净且未启动 Scert;后续构建采用已推送的干净检查点 `5f9af32`,主程序于 20:02:26 启动。初始未启动状态不再代表当前运行状态。
- [x] 已有正式脚本构建 Windows 服务端与 Web 成功,运行副本位于独立目录;发布清单 10 个产物、压缩包内 9 个文件、实际运行的主程序及 4 个 Web 文件均校验一致,版本命令退出 0。
- [x] 临时 HTTPS 指纹与可信本机日志一致,主机名校验通过;核对后仅对该临时入口接受浏览器证书例外,未关闭全局 TLS 校验、未安装根证书。浏览器已到达真实的未认证初始化入口。
- [x] 浏览器验证公开状态返回 200,受保护配置返回 401,无效令牌兑换返回 401,之后配置仍为 401;响应包含禁止缓存保护。未兑换真实令牌或创建业务数据。
- [x] 首次初始化后端专项 128 个叶子通过、0 失败、4 条平台条件跳过,退出码 0;三条符号链接权限和一条 Unix 文件权限条件未满足,不能作为对应边界实机通过。
- [!] 浏览器文件工具拒绝访问 Scert 工作区中的一次性地址文件,原因是工具配置的工作区范围不包含当前项目。未尝试绕过;尚未取得合法初始化会话,数据库、DNS 与管理入口证书步骤未执行。
- [ ] 验证管理员与普通项目管理员入口、角色授予撤销、分页、撤权拒绝及桌面布局。
- [x] 已按真实范围同步总清单、开发清单、基础规格、审查记录及支持矩阵第二十五节;没有发现并修复新的产品源码问题,未运行的验收不勾选。
证据目录仍为 `artifacts/project-members-ui-20260928/`,新增正式发布完整性记录及初始化专项日志;浏览器响应另作脱敏记录,不保存真实令牌。运行包、日志、数据库和凭据均不进入源码提交。后续先恢复当前项目专用工具的正常文件访问配置,继续合法初始化;该工具阻塞不阻止项目生命周期、资源授权等后续源码整改。
原始 44 项及验收标准不变。若本机生产式初始化的外部前置条件未满足,明确记录相应缺口并继续其他可执行整改,不将替代环境测试写成完整端到端通过。
## 2026 年 9 月 28 日:项目入口与成员页面(19:17 开始,19:54 回归完成,等待复审)
需求确认:承接现有成员接口,提供当前账户可见项目的入口和成员管理页面;普通用户担任项目管理员时也必须能够进入,不放开整个管理员控制台,不暴露无权限的项目或全站账户目录。保留原始 44 项范围,本批子项不等于 P0-07 整项完成。
- [x] 核对真实工作区、成员接口、账户可见性和普通用户工作台;上一批结果只作为基线。
- [x] 保存本批任务清单;修改前检查点 `af77981` 已提交推送,命令行认证失败后经 Git 专用工具成功推送。
- [x] 新增服务端过滤的可见项目分页接口,实时检查账户状态与项目角色,不写死默认项目;项目和成员响应禁止缓存,最后修改后的专项与完整回归已通过。
- [x] 新增独立拆分的项目成员页面,接入管理员导航和普通用户工作台;账户建议沿用已有可见性边界,未知账户使用明确的账户 ID,不开放全站搜索。账户页补充可分享的账户 ID。
- [x] 支持每页 5、10、15、30 位成员、多角色授予/撤销、冲突刷新和撤权清空;切换项目、分页及卸载后的旧响应隔离已覆盖正式前端测试。
- [x] 前端完整回归 198 项通过、0 失败、0 跳过;包含真实 Vue 模板渲染而非浏览器测试,前端生产构建通过。首轮导航测试三处失败保留,不覆盖历史日志。
- [x] 最后源码专项 83 个叶子通过、4 条外部 MySQL 条件跳过;完整后端 1700 个叶子通过、54 条条件跳过,均无失败。静态检查、模块校验及双平台构建退出码均为 0;证据使用新建的最终日志,不以缓存保护修改前的记录代替。
- [x] MySQL 5.7/8.0 三轮成员/目录组合各 195 个叶子通过、0 失败、0 跳过,退出码均为 0;含 SQLite 用例,不称纯 MySQL 测试。
- [x] 最后源码三轮专项竞态 249 个叶子通过、0 失败、12 条外部 MySQL 条件跳过,退出码 0;不称全仓库或实库竞态通过,不用上一批记录替代。
- [x] 同步总清单 P0-07 对应说明、执行清单、模型、开发清单、审查记录、基础规格与第二版接口交接,补齐支持矩阵第二十四节及最终候选哈希;旧批次明确标为历史,不再用顶部新增记录掩盖对应条目的过时说明。提交和推送状态以 Git 记录为准,产物及隔离数据库不纳入提交。
- [ ] 本批真实浏览器验收、项目创建编辑、完整资源隔离、排队任务重判、PostgreSQL 当前实库、Linux 原生和生产验收仍保留待办。
## 2026 年 9 月 28 日:项目成员接口与分页(19:10 同步,本批回归通过,等待复审)
本批于 18:42 进入实施,接续 `bf10eb5`,不再重复数据库驱动选型;原始 44 项及验收标准不缩减。源码修改前检查点为 `4618670`,接口实现与修复候选已随 `3857dac` 提交推送,随后增加正式边界测试并重跑回归。不清理业务库,不新增辅助验收脚本。
- [x] 确认需求:接入现有成员事务仓储,操作者只取服务端验证的会话;用户分组和全局管理员角色不隐式授予项目权限。
- [x] 增加成员列表分页与授予/撤销接口;同一用户的多个项目角色合并显示,列表不返回邮箱、密码摘要或分组,应用实际接线测试通过。
- [x] 成员查询在读取数据的 SQL 内判权;专项验证跨项目、会话验证后撤权/停用均拒绝,合法空列表与未授权区分处理。
- [x] 成功变更沿用事务审计,失败请求补充有界审计;验证取消请求仍记录失败、审计存储故障不伪报持久化,不记录请求正文或原始数据库错误。
- [x] 首轮审计失败误报 409 已通过精确唯一键冲突分类修复;最后专项 62 个叶子通过、3 条实库条件跳过,退出码 0,首轮失败证据保留。
- [x] MySQL 5.7/8.0 三轮成员组合各 171 个叶子通过、0 失败、0 跳过;含 SQLite 和错误分类用例,两个版本依次执行。
- [x] 完整后端 1679 个叶子通过、53 条条件跳过;Windows 独立程序历史备份/升级/成员恢复路径、静态检查、模块校验与双平台构建通过,顺序进程退出码 0。
- [x] 仓储、HTTP 与应用接线三轮成员专项竞态 186 个叶子通过、0 失败、9 条外部 MySQL 条件跳过,退出码 0;不称全仓库或实库竞态通过。
- [x] 同步总清单、模型、接口交接及支持矩阵第二十三节,说明错误、分页和授权边界;Smail 参考接口文档保持原样。
- [ ] 成员管理页面、项目入口、全部业务资源授权及排队任务重判继续后续交付;本批接口通过不等于完整权限隔离或生产验收。
## 2026 年 9 月 28 日:数据库最终候选(18:36,回归完成,等待复审)
- [x] 确认继续解决运行时和迁移阻塞,不删减原 44 项;源码修改前检查点 `0edde01` 已推送。
- [x] 读取 5.7 初始化日志与 8.0 崩溃证据,确认两次内存分配失败;按可执行程序和隔离数据目录核验并停止两个残留测试进程,保留全部文件,不影响本机其他数据库服务。
- [x] 核查官方 WAL-reset 修复说明和驱动版本源码,选择 `sqlite v1.59.0`/`libc v1.75.7`,实测引擎 3.53.4;旧 v1.40.1 测试降为中间证据。
- [x] 最后源码取消查询与 WAL 完整性专项各 10 次通过,共 30 个叶子;服务并发关闭另重复 30 次通过。最终专项文件为 `sqlite-verified.jsonl`,初版 `sqlite-final.jsonl` 仅为中间证据。
- [x] 在资源受限机器上以 `GOMAXPROCS=2`、`go test -p 1` 依次完成 MySQL 5.7/8.0 三轮原组合,各 531 个叶子通过、0 失败、0 跳过,退出码均为 0;不降低 TLS、不减少用例,包含 SQLite 用例。
- [x] 最终完整后端 1635 个叶子通过、52 条条件跳过;Windows 独立程序历史备份/升级/成员恢复通过,静态检查、模块校验和双平台构建成功,最终顺序进程退出码为 0;Linux 仅交叉构建。
- [x] 最终三轮扩大竞态 `race-final.jsonl`:831 个叶子通过、0 失败、15 条外部 MySQL 条件跳过,退出码为 0;不使用旧驱动的 828 个叶子通过数替代,也不把普通 MySQL 实库组合称为竞态验证。
- [!] 旧索引元数据不一致根因未关闭;保留失败证据及生产门禁,不以重跑成功宣称修复。
- [ ] 成员 Web/API、失败请求审计、全部业务入口与任务重判、PostgreSQL 当前实库及生产验收继续后续实施。
当前证据目录仍为 `artifacts/runtime-migration-20260928/`;最终批次为 `backend-final.jsonl`、`mysql57-final.jsonl`、`mysql80-final.jsonl`、`sqlite-verified.jsonl`、`service-close-final.jsonl` 与 `race-final.jsonl`,不覆盖旧失败记录。具体运行结果见支持矩阵第二十二节。原始 44 项状态不升级,下方章节按各自时间保留为历史。
## 2026 年 9 月 28 日:运行时与迁移回归(13:05 同步,双版本实库仍有阻塞)
本节是 13:05 的历史快照,当前进度以首节为准。彼时事务审计源码已保存到检查点 `83a3ada`,不是正式验收发布;以下实现、失败和待办按当时状态保留,不覆盖最新结果。
- [x] 确认本次进度同步需求:核对实际源码状态、日志与进程退出码,同步总清单和执行清单,不用历史通过结果代替当前验证。
- [x] 新增正式 SQLite 取消查询文件释放回归,旧驱动复现失败;候选 `modernc.org/sqlite v1.40.1` 下 direct/prepared 各 10 次通过,服务并发关闭连续 30 次通过,等待复审。
- [x] Windows 构建与当前完整后端通过:1634 个叶子通过、0 失败、52 项条件跳过;后续静态检查和模块校验成功,顺序进程退出码为 0。
- [x] 扩大范围三轮竞态累计 828 个叶子通过、0 失败、15 项条件跳过,进程退出码为 0;跳过项不计通过。
- [!] MySQL 5.7 三轮组合累计 530 个叶子通过、1 个失败、0 跳过,包含 SQLite 用例;成员迁移重试测试有一次隔离实例初始化失败,进程退出码为 1,不能用后两轮通过覆盖失败。
- [!] MySQL 8.0 组合已完成 247 个叶子通过,但数据库包发生运行时内存分配失败,组合进程退出码为 1;中断用例不算通过,三轮完整验证未完成。
- [~] 已强化预期 MySQL 故障码 1644、消息及历史索引字段顺序断言。旧 Error 1280 与索引元数据不一致根因仍未关闭,重复未复现不能标记修复完成。
- [ ] 定位初始化和内存分配失败、复核索引异常,确认最终驱动选择,对最终候选完成双版本与完整回归,再同步其他专项文档并提交源码。
- [ ] 接入成员 Web/API、分页、失败审计、全部资源入口授权及任务重判;完成 PostgreSQL 当前实库、Linux 原生与生产验收。
最新证据目录:`artifacts/runtime-migration-20260928/`,核对文件为 `sqlite-cancel-after.jsonl`、`service-close-after.jsonl`、`backend.jsonl`、`race.jsonl`、`mysql57-after.jsonl`、`mysql80-after.jsonl`;相关进程退出码均已取回。旧失败日志保留,不创建辅助验收脚本,不清业务库、不进行远端部署。
原始 44 项仍为:`[✓]` 0、`[x]` 3、`[~]` 27、`[!]` 3、`[ ]` 11。上述子项结果不升级 P0-05/P0-06/P0-07/P1-09 总项,生产部署验收未通过。
## 2026 年 9 月 28 日:项目成员变更事务审计(12:48 同步,验证存在阻塞)
上一批成员基础及最终验证已提交并推送为 `b3909d8`。本批继续 P0-07/P1-09,不把仓储能力当作完整项目管理界面或业务隔离。
- [x] 确认需求:成功授予/撤销必须记录项目、实际操作者、目标账户、角色、动作及时间;权限变更与审计同事务提交,审计失败必须回滚权限变更。
- [x] 已将既有授权谓词、成员写入和成功审计接入同一事务;保留实时账户与项目管理员校验,不依赖会话中的缓存角色。审计失败或未实际写入时回滚,MySQL 成员表和审计表不是 InnoDB 时拒绝变更,不自动迁移历史表引擎。源码仍未提交,实现完成待复审。
- [x] 已补充正常变更、重复与拒绝操作、审计故障回滚、自我撤权、历史保留、取消上下文、存储边界及并发重复操作用例;最新仓储专项 41 个叶子通过、0 失败、3 项条件跳过。
- [x] 最新三次竞态累计 123 个叶子通过、0 失败、9 项条件跳过;随后静态检查和模块校验成功,顺序进程退出码为 0。
- [!] MySQL 5.7 最新专项 176 个叶子通过、1 个失败、0 跳过(包含 SQLite 用例);`TestHistoryScopeMySQLMigrationRetry/version` 报索引 `idx_audit_project_history` 的 Error 1280,根因未确认。顺序进程退出码为 1,MySQL 8.0 最新验证未启动,不能以早期验证代替。
- [!] 本批中间版本完整后端 1630 个叶子通过、1 个失败、52 项条件跳过;`TestDesktopConcurrentTransitionAndIdempotentClose` 关闭后 SQLite 文件仍占用。最新独立重复 10 次中 8 次通过、2 次失败,退出码为 1,后续构建及最新完整回归未执行。不得跳过此测试或用上一批 1623 个通过替代当前证据。
- [x] 将本批实现、真实测试结果和两个阻塞同步至总清单与本执行清单;未将任何总项提升为完成或复审通过。
- [ ] 修复并复核两个阻塞,完成最后修复后的双版本实库及完整后端验证,再统一同步其他专项文档、提交并推送本批源码。
- [ ] 成员管理 Web/API、分页、失败请求审计、资源授权入口及任务重判继续后续接入;当前不新增对外路由。
证据目录:`artifacts/project-member-audit-20260928/`。本次核对 `targeted-verified.jsonl`、`race-verified.jsonl`、`mysql57-verified.jsonl`、`service-close-repeat.jsonl` 及中间版本的 `backend.jsonl`;进程退出码已取回。不存在最新 `mysql80-verified.jsonl` 或 `backend-verified.jsonl` 的通过证据。P0-05/P0-06/P0-07/P1-09 保持 `[~]`,全部 44 项及其验收标准不变;生产部署验收未通过。
## 2026 年 9 月 28 日:项目成员与实时判权(已完成子项待复审)
修改前检查点 `4f1900d` 已推送。需求沿用 P0-06/P0-07:项目成员独立于用户分组,支持六类项目角色;普通管理员不自动获得所有项目权限;普通用户不能读取完整私钥。系统级权限仍由有效超级管理员承担。
- [x] 核对原始范围和当前模型,确认不向旧用户或默认项目自动授予成员权限。
- [x] 第 14 号迁移、成员授予/撤销及实时判权实现;多项目、多角色、禁用账户、未知操作默认拒绝。仅有效超级管理员拥有系统级跨项目能力,普通用户仍不能读取完整私钥。
- [x] 两项目隔离、撤权和降权、父记录引用、迁移失败重试通过;MySQL 5.7/8.0 各 242 个叶子通过、0 失败/跳过(命令同时包含 SQLite 用例)。
- [x] 复现并修复本批 SQLite 负行号误拒绝、扩展唯一索引替换可删除关联账户、空邮箱被误当唯一冲突三个边界;保留失败证据 `replacement-before.jsonl` 和 `empty-email-before.jsonl`,最后修复后重新执行全部本批验证。
- [x] 最终完整后端 1623 个叶子通过、0 失败、51 项条件跳过;Windows 独立产品程序包含历史备份升级与新增成员多角色的备份恢复,恢复后重新验证授权和跨项目拒绝。
- [x] 三次竞态合计 633 个叶子通过、0 失败、18 项条件跳过;`go vet ./...` 和 `go mod verify` 退出码为 0。最终证据为 `*-verified.jsonl`,原 `*-final.jsonl` 只作最后空邮箱修复前的中间证据,详见支持矩阵第二十一节。
- [ ] 接入所有业务资源入口、资源真实项目解析、排队任务执行/取消/重试重判;当前基础模块不代表 Web/API 已隔离。
- [x] 同步总清单、执行清单、模型、基础规格、开发清单、审查记录、支持矩阵和运维边界;本批代码与文档同批提交。P0-05/P0-06/P0-07 总项继续保持 `[~]`。
成员管理 Web/API、角色变更审计和所有业务调用链仍未交付;不开放不完整的项目管理入口。删除有成员的项目或账户必须先显式撤销关系,不能用删除身份再重建的方式继承旧权限。已有历史用户与用户分组不自动回填项目角色。
本批仅操作隔离测试库;不清理生产业务数据,不创建辅助验收脚本,不将新表或单项测试代替完整生产验收。
## 2026 年 9 月 28 日:任务/审计范围快照(本批实现与回归完成,等待复审)
修改前检查点 `5237e8d` 已推送。当前批次接续模式 12,不改写旧迁移,不删除历史任务,不给已删除资源伪造默认项目,不伪造操作者。
- [x] 已实现三库模式 13 及历史回填;任务、审计保存范围快照,管理证书使用明确系统范围,未知历史保留未知。
- [x] 已实现业务任务从实际域名项目创建、尝试关联校验及历史读取;HTTP 操作者取自服务端会话,工作流审计关联实际任务。
- [x] 当前专项重测通过:`HistoryScope|TaskAPI|AuditLogResponse|SQLiteBusinessUpgradePreservesDependentObjects`,覆盖仓储、数据库、接口三包;未配置外部 MySQL 的条件用例不算实库通过。
- [x] 补充资源删除/项目变更后新尝试拒绝、历史孤儿读取、HTTP 与工作流任务和身份关联断言;正常管理续期必须有开始和收尾审计,故障注入场景只校验实际可写入记录,不强行要求被拒绝的开始审计存在。
- [x] 正式回归复现登录初版身份漏记/错记及自身账户更新后身份丢失;修复为本次已验证身份或写入前身份快照,登录失败不冒用旧 Cookie。改密审计保留实际身份,后续请求仍拒绝旧会话。
- [x] MySQL 5.7/8.0 专项各 135 个叶子通过;完整后端 1514 个叶子通过、49 项条件跳过;三次竞态共 258 个叶子通过、6 项条件跳过;最新 Windows 程序两条备份恢复路径、静态检查和模块校验通过。日志及统计边界见支持矩阵第二十节。
- [x] 同步总清单、执行清单、模型与接口字段、基础规格、开发清单、审查记录、支持矩阵及运维边界;本节与源码同批提交。
- [ ] 剩余资源关联、项目成员授权和撤权重判、跨项目越权验证、PostgreSQL 当前实库、Linux 原生与生产门禁。
范围快照没有项目外键,不用于授权,也不保证任意直接 SQL 写入的正确性。回填会正常执行既有更新触发器;若触发器拒绝,迁移失败,不绕过触发器。P0-05、P0-06、P0-07 仍为 `[~]`。
## 2026 年 9 月 28 日:资源归属与替换约束复核
### 已提交的第 11 号迁移(源码 `7284958`)
- [x] 域名、服务器保存 `project_id`、`owner_id`、`created_by`、`updated_by`;历史资源回填默认项目,未知所有者和操作者保留空值,不编造历史身份。
- [x] HTTP 从服务端会话填写归属,拒绝客户端伪造归属字段;普通更新保留项目、所有者和创建者,仅更新操作者。原 CLI 更新保持原归属,不重新开放已停用业务入口。
- [x] 绑定替换在同一事务校验域名、服务器及项目一致性;失败保留旧绑定。MySQL/PostgreSQL 新增外键;SQLite 不重建业务表,以触发器保护引用且保留原有对象。
- [x] 重新读取上一批最终日志:后端 1432 个叶子通过、含父项 1562 条,0 失败、47 项条件跳过;竞态三次共 114 个叶子通过、6 项条件跳过。不能把无测试文件包的 skip 事件算作测试跳过。
- [x] 上一批 MySQL 5.7.44/8.0.45 专项各 37 个叶子通过、0 失败、0 跳过;每条命令包含 SQLite 用例,不能称为 37 个纯 MySQL 用例。Windows 独立程序含普通项目的资源和绑定备份恢复通过;当时程序是未提交源码构建,不称干净发行包。
### 本轮新增修复(修改前检查点 `cad238a`)
- [x] 正式回归复现 20 个失败叶子:递归触发器关闭时,主键或隐藏行号冲突可通过 `UPDATE OR REPLACE` / `INSERT OR REPLACE` 删除被引用行;外键开关不能消除此缺口。保留 `artifacts/resource-replacement-20260928/before.jsonl`。
- [x] 新增第 12 号迁移;SQLite 增加目标行替换保护和插入后引用检查,防止隐式删除绕过。MySQL/PostgreSQL 沿用外键,仅统一模式登记;不改写第 11 号历史迁移。
- [x] 专项覆盖四种连接开关组合、十类替换、正常编辑、无引用替换及负行号后自动插入;版本登记故障、触发器重名及既有无效引用必须完整回滚并可修复重试。
- [x] 修复源码已提交为 `92c844f`;完整后端 1480 个叶子通过、47 项条件跳过,三次竞态共 255 个叶子通过、6 项条件跳过,MySQL 双版本专项各 83 个叶子通过且无跳过。独立 Windows 产品程序两条路径均通过;构建来自当批未提交工作区,不称干净发行包。最终证据见支持矩阵第十九节。
- [x] 同步合并清单、基础规格、开发清单、关系模型、测试记录、支持矩阵和运维说明;保留历史批次,不用新结果覆盖旧失败记录。
- [ ] 任务、尝试与审计的项目关系继续实施;管理证书任务目前使用 `management-certificate` 特殊资源 ID,必须明确系统范围,不能伪造业务域名满足外键。历史已删除资源的任务和审计需要保留且区分未知归属,不自动删除。
- [ ] PostgreSQL 当前实库、完整资源成员授权、Web/API 越权、Linux 原生、完整发行包、服务重启和生产门禁。
本轮优先封堵已复现的数据完整性缺口,再接下一批任务/审计关联。P0-06、P0-07、P0-05 总项均不提升;原始 44 项及验收要求不变。
## 2026 年 9 月 28 日:项目根实体最终验证结果
本节更新下方启动阶段记录;详细命令与限制见《构建版本与数据库支持矩阵》第十八节。
- [x] 项目根实体、三库第 10 号迁移与仓储实现;默认项目保护、资料保留和错误语义专项通过。
- [x] SQLite 历史模式 0~10 的升级覆盖(模式 1~10 含代表性业务),项目迁移失败回滚和重试通过;三套迁移目录、登记和嵌入检查通过。
- [x] MySQL 5.7.44、8.0.45 各 8 个叶子用例通过,0 失败、0 跳过;包含严格 TLS 实连下的项目 CRUD 和 DDL 部分成功后的重试。
- [x] 54 个项目/迁移叶子用例连续 3 次竞态检测通过;外部 MySQL 用例在该命令中条件跳过,已由上述实库专项分别执行。
- [x] 最终后端全量 1409 个叶子通过,含父项 1535 条通过记录,0 失败、46 项条件跳过;静态分析与模块校验通过。
- [x] 当批 Windows 产品程序通过 2 条独立 CLI 恢复路径,核对默认项目与普通项目、历史业务、凭据及证书;不是完整发行包或实机服务验收。
- [ ] PostgreSQL 原生项目实库验证;全部资源归属回填、关联约束、项目成员权限、Web/API、Linux 原生运行及完整生产门禁。
P0-06、P0-07 均保持 `[~]`。当前完成的是项目根实体,不是统一项目资源模型或权限隔离;不更改原始 44 项范围。
## 2026 年 9 月 28 日:P0-06 项目根实体实施
- [x] 重新核对干净工作区和 P0-06/P0-07 原始要求;修改前检查点 `adb7d7f` 已推送。
- [x] 新增项目模型、三库 `0010_projects.sql`、统一登记与嵌入、项目 SQL 仓储;旧迁移文件未改写。
- [x] 本地专项验证项目校验、CRUD、默认项目保护、中文及四字节字符、取消上下文、缺失对象、重复写入、关闭重开,以及 SQLite 迁移回滚重试和历史业务保留。
- [~] 完整后端与 MySQL 5.7/8.0 隔离实库回归正在执行,证据目录 `artifacts/project-model-20260928/`;跳过项不算通过。
- [ ] PostgreSQL 实库专项、资源项目字段与历史回填、关联及引用删除约束、项目成员权限、接口越权、Web 页面和生产验收。
需求确认、实体关系与后续验收条件见《项目资源关联模型.md》。本批只建立项目根实体,未将现有资源视为已经分配到默认项目;P0-06/P0-07 和全部 44 项范围不缩减,均不提升为整项完成。
> 本清单依据《Scert整改合并优化清单.md》建立,用于跟踪实际代码整改、自动化验证、隔离环境验证和生产验收。
>
> 当前日期:2026 年 9 月 27 日
>
> 状态定义:`[ ]` 未开始;`[~]` 进行中;`[x]` 已完成,等待复审;`[✓]` 复审通过;`[!]` 暂缓或存在阻塞。
## 一、执行规则
1. 代码实现、自动化测试、隔离环境验证和生产验收分开记录。
2. 构建成功、接口返回 HTTP 200 或单元测试通过,不直接等同于生产验收通过。
3. 真实 DNS、ACME、HTTPS、SSH 主机指纹、备份恢复和远程部署必须保留可复核证据。
4. 不使用 `-k`、`--insecure`、跳过 SSH 主机指纹或强制 IP TLS 的方式替代正式验证。
5. 不将密码、RAM 密钥、Token、私钥、真实证书或 Cookie 写入代码、文档、日志和 Git。
6. 每个任务完成后先标记为 `[x]`,复审和对应范围的验收证据齐全后才能标记为 `[✓]`。
逐项规格入口:《整改任务规格与验收约定.md》。P0/P1/P2/P3 分别见《基础整改任务规格.md》《核心能力任务规格.md》《运维验收任务规格.md》《增强能力任务规格.md》,共 44 项;每项具备全部原定字段及独立六阶段状态。汇总状态、原始清单状态与规格同步更新;原始清单的需求和验收标准仍保留为基准,不随局部实现缩减。
## 二、当前基线证据
| 项目 | 当前事实 | 证据或命令 | 结论 |
|---|---|---|---|
| Git 工作区 | `main` 与 `Scert/main` 同步,工作区干净 | `git status --short --branch` | 已建立基线 |
| 后端模块 | `backend/go.mod` 声明 Go `1.26.6`,模块内实际使用 `go1.26.6` | 在 `backend` 执行 `go version`、`go env GOVERSION GOTOOLCHAIN` | `GOTOOLCHAIN=auto`;根目录的 `1.26.2` 不代表后端构建版本 |
| Node.js | `v24.19.0` | `node --version` | 已记录 |
| npm | `11.17.0` | `npm.cmd --version` | 已记录 |
| Vue | 锁文件实际版本 `3.5.41` | `frontend/package-lock.json` | 已记录 |
| Vite | 锁文件实际版本 `6.4.3` | `frontend/package-lock.json` | 已记录 |
| 数据库驱动 | SQLite、MySQL、PostgreSQL 均有代码和迁移目录 | `backend/internal/database/` | 正式支持范围仍需确认 |
| SSH | 已有主机指纹、密钥部署和安全测试代码 | `backend/internal/deployment/` | 远程实机仍需复核 |
| 生产门禁 | 现有文档明确正式验收尚未全部通过 | `doc/生产部署与运维说明.md` | 不能宣称生产放行 |
## 三、P0 基础整改和阻塞项
| 编号 | 状态 | 任务 | 当前问题 | 下一步交付 | 验证证据 |
|---|---:|---|---|---|---|
| P0-01 | [x] | 明确产品范围 | 正式发布仅含 Web/服务端,桌面源码保留;CLI 已收敛且实际 Windows 产物验证通过 | 等待最终复审;Windows/Linux 实机安装仍归对应验收项 | 双平台归档及 SHA256、独立克隆、命令树及实际退出码 |
| P0-02 | [x] | 建立完整任务清单 | 44 项逐项规格、原始编号名称、字段、六阶段、引用和汇总状态核对通过 | 等待最终复审,随实现同步状态和证据 | 四份规格、统一验收约定及 `fab98d1` 独立克隆 |
| P0-03 | [x] | 整理源码、构建产物和部署产物 | 全仓库及子目录规则、目录说明、正式回归和独立克隆构建校验通过 | 等待最终复审,后续提交继续执行边界检查 | 正式 Go 回归、完整索引、双平台 33 项清单及解包校验 |
| P0-04 | [~] | 统一开发和构建版本 | 精确工具链、安装策略、发布前后校验、系统清单及固定换行已实现,双独立克隆和完整自动化通过 | Linux 原生构建与双平台实际运行环境记录,不以交叉编译替代 | `94237b8`、175 项前端测试、后端完整回归、4 个 Web 文件一致、33 项清单和解包校验 |
| P0-05 | [~] | 确认数据库正式支持矩阵 | 保留 MySQL/SQLite 既有证据;修复历史模式带数据升级,增加事务回滚和独立 Windows 程序备份恢复 | 继续旧发行包实际数据升级、完整发行包、真实服务重启、Linux 原生和取消边界;其余数据库及生产门禁不缩减 | `fd2810b` SQLite 专项 71 个叶子用例;27 个升级/恢复用例连续 3 次竞态检测通过;支持矩阵第十七节 |
| P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 |
| P0-07 | [~] | 增加项目级权限和资源隔离 | 用户组和角色已有实现,项目级资源边界未闭环 | 为证书、DNS、服务器、任务和审计补齐项目归属及越权测试 | 权限矩阵、接口越权测试 |
| P0-08 | [~] | 完善凭据和主密钥生命周期 | 已有凭据存储与测试,轮换、恢复、删除和失效证据不完整 | 补齐创建、轮换、恢复、删除、脱敏和不可恢复边界 | 安全测试、日志审查、恢复演练 |
| P0-09 | [~] | 强化 SSH 主机身份验证 | 已有指纹校验和安全测试,人工确认、更新与远程公钥部署需逐项复核 | 完成指定服务器上的密码部署、公钥登录和指纹复核 | 指纹、授权文件、公钥登录日志 |
| P0-10 | [~] | 统一任务、部署和回滚事务模型 | 部署事务已有实现,不代表所有长操作、项目关联和八类状态已经实现 | 将申请、部署、回滚、重试统一关联任务记录 | 事务测试、失败回滚证据 |
| P0-11 | [!] | 建立生产验收门禁 | 现有自动化证据不能替代 DNS、HTTPS、ACME 和远程验收 | 固化准入清单、证据目录和阻塞规则 | 生产验收记录逐项复核 |
| P0-12 | [~] | 完成备份和恢复方案 | 已有 CLI 备份恢复,自动备份、列表、下载、确认和审计仍需逐项核查 | 补齐完整备份能力并进行隔离恢复演练 | 隔离数据库恢复报告 |
## 四、P1 核心产品能力
| 编号 | 状态 | 任务 | 当前判断 | 主要验收 |
|---|---:|---|---|---|
| P1-01 | [~] | 统一证书中心 | 已有证书申请、导入和列表能力,统一详情和状态仍需复审 | 申请、导入、续期、部署、回滚 |
| P1-02 | [~] | 证书详情和版本管理 | 已有证书相关模型,版本、SAN 和历史展示需复核 | 版本切换、SAN 变化、旧证书保留 |
| P1-03 | [~] | ACME 和 DNS 管理 | 已有多 DNS Provider 和 DNS 账户能力,真实授权范围需复核 | Production/Staging、DNS-01、泛域名、CNAME |
| P1-04 | [~] | 任务中心 | 已有任务和执行记录基础,取消、重试和日志展示需复核 | 长任务、失败重试、取消、执行历史 |
| P1-05 | [~] | 续期策略 | 已有续期相关代码,重复申请保护和调度验收需补齐 | 到期阈值、锁、幂等、失败保留旧证书 |
| P1-06 | [~] | 服务器和部署目标中心 | 已有服务器管理和 SSH 密钥展示 | 服务器归属、验证、密钥登录、部署目标 |
| P1-07 | [~] | 多服务器部署策略 | 已有部署客户端和回滚测试 | 多目标顺序、失败回滚、部分成功状态 |
| P1-08 | [~] | 通知中心 | 已有 Smail 系统账户发信接入方向 | 成功、失败、重试、脱敏和系统账户调用 |
| P1-09 | [~] | 审计中心 | 已有审计仓储和接口基础 | 登录、密码、凭据、证书和部署危险操作 |
| P1-10 | [ ] | 证书监控仪表盘 | 页面和监控口径尚未完成复审 | 到期、失败、部署状态、异常统计 |
| P1-11 | [~] | 备份恢复页面 | CLI 和文档已有,Web 操作和权限需补齐 | 备份列表、恢复确认、审计和失败保护 |
| P1-12 | [~] | API 契约和权限矩阵 | 已有后端接口说明文档,需与实际路由同步 | 接口字段、角色、项目和错误码一致 |
## 五、P2 Web、运维和验收
| 编号 | 状态 | 任务 | 当前判断 | 主要验收 |
|---|---:|---|---|---|
| P2-01 | [~] | 统一 Web 页面结构 | 已按页面拆分,仍需逐页检查一页完整显示和中文布局 | 桌面页面、响应式、导航和空状态 |
| P2-02 | [~] | 统一中文显示和错误信息 | 已有中文界面,需扫描 HTML 实体和英文残留 | 页面、接口、日志错误信息 |
| P2-03 | [~] | 长操作任务化 | 部分部署/证书操作已有任务基础 | 页面不阻塞、刷新可恢复、任务状态可追踪 |
| P2-04 | [~] | 幂等和重复操作保护 | 已有部分锁和事务测试 | 重复提交、并发操作、幂等键 |
| P2-05 | [~] | 日志、指标和追踪 | 有日志和任务记录,Request ID/脱敏需复核 | 请求 ID、任务 ID、敏感信息审查 |
| P2-06 | [~] | 接口和前端测试 | 已有后端及前端测试,覆盖面需按清单补齐 | 全量测试、关键页面、越权和失败路径 |
| P2-07 | [~] | 升级、降级、卸载和回滚 | 已有安装器和发布说明,实机闭环未完成 | 升级、降级、卸载、失败恢复 |
| P2-08 | [!] | Windows Service 实机验收 | 当前证据不足以标记通过 | 安装、启动、升级、卸载和日志 |
| P2-09 | [!] | Linux systemd 实机验收 | 有 unit 和历史测试,当前版本需重新核对 | 安装、启动、重启、日志、Nginx、回滚 |
| P2-10 | [~] | 安全基线 | 已有 SSH、凭据和数据库安全测试,仍需完整门禁 | TLS、Cookie、CSRF、越权、路径和命令注入 |
## 六、P3 后续增强
| 编号 | 状态 | 功能 |
|---|---:|---|
| P3-01 | [ ] | 多租户支持 |
| P3-02 | [ ] | API Token 管理 |
| P3-03 | [ ] | Webhook 事件订阅 |
| P3-04 | [ ] | 更多 DNS Provider 插件 |
| P3-05 | [ ] | 证书标签和批量操作 |
| P3-06 | [ ] | 多实例高可用 |
| P3-07 | [ ] | 分布式任务队列 |
| P3-08 | [ ] | Prometheus 指标接口 |
| P3-09 | [ ] | OpenAPI 自动生成 |
| P3-10 | [ ] | 移动端适配 |
## 七、本轮执行记录
### 2026-09-27:建立整改执行基线
- 已检查 `main` 分支和工作区,当前无未提交代码变更。
- 已确认 Go、Node.js、npm 和前端锁文件实际版本。
- 已确认数据库代码同时包含 SQLite、MySQL 和 PostgreSQL 适配,但正式支持矩阵尚未统一。
- 已发现桌面二进制和桌面前端构建入口仍在 Git 索引中,暂不直接删除,列入 P0-03 复审。
- 已补强 `.gitignore`,覆盖桌面构建产物、部署暂存目录、发布/证据目录和本地数据库/密钥文件。
## 八、下一轮优先顺序
1. 继续 P0-04 工具链固定、锁文件安装策略及构建机/运行机版本记录;独立安装仍有 esbuild 脚本批准策略警告,不自动批准绕过审查。
2. 继续 P0-05 三数据库正式版本矩阵、真实迁移和恢复验证,明确非跳过证据。
3. 推进 P0-06/P0-07 领域模型和项目隔离;用户分组不能替代项目权限。
4. 继续定位 SSH 公钥自动部署实机失败阶段,完成密码安装和密钥登录双路径验收。
5. 将生产验收门禁与当前远程部署、DNS、HTTPS 和 ACME 证据逐项对应;P0-01/P0-02/P0-03 保持待最终复审,不重做已取得的同提交证据。
### 2026-09-27:自动化基线验证
| 验证项 | 命令 | 结果 |
|---|---|---|
| 后端单元和集成测试 | `go test -p 1 -count=1 -timeout=3m ./...` | 通过 |
| 后端静态检查 | `go vet -p=1 ./...` | 通过 |
| Go 模块完整性 | `go mod verify` | 通过 |
| 前端测试 | `npm.cmd test` | 150 项通过,0 失败 |
| 前端生产构建 | `npm.cmd run build` | 通过 |
| 前端生产依赖审计 | `npm.cmd audit --omit=dev --audit-level=high` | 0 个漏洞 |
以上结果仅证明当前代码在本地自动化层通过,不替代 Windows Service、Linux systemd、真实 DNS、ACME、HTTPS、SSH 和备份恢复验收。
### 2026-09-27:P0-03 生成物索引清理
- 已确认 `desktop/scripts/build-frontend.mjs` 从根目录 `frontend/dist` 重新构建并复制桌面资源。
- 已将 `desktop/desktop.exe` 和 `desktop/frontend/dist/index.html` 从 Git 索引移除;本地文件仍保留,未物理删除。
- `deploy/tests/install-linux-test.py` 保留为可复用测试代码。
- 本项仍需在独立克隆中验证正式发布包和生成物边界;按 P0-01 的范围调整,不再以桌面构建作为正式门禁。
### 2026-09-27:P0-04、P0-05、P2-07 版本和迁移保护
- 纠正工具链误报:`backend` 模块内实际为 Go `1.26.6`,`GOTOOLCHAIN=auto`。没有降低模块版本要求。
- 新增《构建版本与数据库支持矩阵》,区分本地代码检查、SQLite 实测和外部数据库实机验收。
- 新增迁移目录/嵌入/版本登记一致性检查,以及七类反例测试。
- `Migrate` 拒绝新版数据库和不连续的迁移历史,避免旧程序误用更新后的数据库。
- 数据库定向测试通过:五类异常历史拒绝后原数据不变;SQLite 从 0~9 版本升级并重复执行通过。
- 仅使用测试临时库,没有访问或清空外部业务数据库。三种数据库兼容性不能据此标记全部通过。
### 2026-09-27:P0-01 正式发布范围收敛
- 依赖:原始整改清单 P0-01,已推送的 `8b33282` 作为修改前检查点;未删除桌面源码或本地生成物。
- 涉及文件:`build/build-release.ps1`、`backend/internal/releasearchive/verify_test.go`、根目录及各模块 README、生产和历史测试文档。
- 正式发布已移除 Wails 调用和桌面打包;清单新增 `delivery_scope=[web,server]`,兼容字段 `desktop_requested=false`。
- 旧参数 `SkipDesktop` 仅警告并兼容,显式设假也不能恢复桌面构建;传入 `DesktopDirectory` 在构建前报错。
- 保留路径扫描、Go `-trimpath`、文件及归档 SHA256、拒绝覆盖旧输出、源码提交和脏状态记录。
- 已通过 PowerShell 语法解析、`go test -count=1 -timeout=3m ./internal/releasearchive ./cmd/scert-release`、`git diff --check`。
- 发布范围验证已完成,证据见下节;这仍是构建层验证,不代表 Windows/Linux 实机安装验收。
- 历史业务 CLI 的执行入口及最终产物检查已由后续批次完成,见本节末尾的范围验收记录。
### 2026-09-27:双平台和独立克隆发布验证
- 源码提交:`25fd4cf`,已推送。默认双平台构建成功,`manifest.json` 的 `source_dirty=false`、`delivery_scope=[web,server]`、`desktop_requested=false`、路径检查通过。
- 输出:`build/release-scope-20260927-25fd4cf/`。清单共 33 项(31 个包内文件、2 个归档),逐项文件长度和 SHA256 匹配。
- 真实解包核对:Windows 9 个文件、8 条包内校验和;Linux 22 个文件、21 条包内校验和。解包内容与清单一致,无桌面产物。
- `DesktopDirectory` 反例返回退出码 1,且没有创建输出目录。
- 独立克隆:`build/checkout-scope-20260927-25fd4cf/`。执行 `npm.cmd ci --no-audit --no-fund`、`npm.cmd test`,150 项通过;显式 `-SkipDesktop:$false` 构建双平台通过,33 项清单的长度和 SHA256 再次匹配。
- 独立克隆保留 `desktop/main.go`,不包含 `desktop/desktop.exe` 或桌面 dist。跟踪清单没有 `.runtime`、`node_modules`、dist、可执行文件、数据库或私钥后缀文件;克隆工作区仍干净。
- `npm ci` 提示 esbuild 的安装脚本尚未列入批准清单,但命令、前端测试及构建均退出成功;未自动批准额外脚本。可复现安装策略仍归 P0-04 后续审查。
### 2026-09-27:CLI 运维范围收敛
- 依赖 P0-01 正式范围;涉及 `backend/internal/cli/root.go`、根命令/范围/运维测试、README 和《命令行运维范围说明》。
- `domain`、`server`、`ssh-key`、`renew`、`deploy` 不再注册业务实现;仅保留隐藏的中文迁移提示,返回错误,不解析或回显旧凭据参数。
- 保留初始化、服务启动、状态、证书诊断、DNS 诊断、配置、日志、备份恢复及系统服务运维;服务端自动续期未更改。
- 新增命令树白名单和 11 类旧入口拒绝测试;用无效配置和模拟凭据证明拒绝先于配置读取,配置内容不变且没有新增运行数据。
- CLI 定向测试、后端全量 `go test -p 1 -count=1 -timeout=3m ./...` 和 `go vet -p=1 ./...` 已通过。使用测试临时目录,没有清空或连接生产数据库。
- 本批实际 Windows 可执行文件的帮助和旧入口退出码已在后续干净发布包中验证;Linux 安装及服务运行仍需独立实机验证。
### 2026-09-27:CLI 实际产物复核修正
- `d90ddaa` 已推送并完成干净工作区双平台构建,产物位于 `build/release-scope-20260927-d90ddaa/`。
- 实际 Windows 可执行文件的默认帮助仅显示运维命令;旧 `domain add` 返回退出码 1,没有执行旧业务。
- 实测发现框架先输出英文 `Error:`,入口随后又输出中文错误,造成重复提示。已设置根命令 `SilenceErrors=true`,由 `Execute` 统一输出中文错误;新增无重复输出断言。
- 修正后 CLI 和发布模块定向测试及静态检查通过;最终复核使用修正后的 `885478a` 干净发布包,没有用之前的二进制代替。
### 2026-09-27:P0-01 范围验收记录
| 验收点 | 当前证据 | 结论 |
|---|---|---|
| 正式范围只有 Web 和服务端 | 根 README、构建/部署说明、当前执行清单和历史范围声明一致;无额外 CI 或发布入口调用 Wails | 本地复核通过 |
| 桌面历史源码保留 | 桌面目录及开发说明仍在;原本机桌面二进制和 dist 未物理删除 | 符合不删除要求 |
| 双平台实际发布包 | `build/release-scope-20260927-885478a/`;源码 `885478a7e0dfc3832cdd094ed388891c41062eb9`,`source_dirty=false` | 构建层通过 |
| 清单及归档一致 | 33 项长度和 SHA256 一致;Windows 解包 9 文件/8 校验项,Linux 22 文件/21 校验项,均无桌面产物 | 构建层通过 |
| Linux 可执行权限 | 归档内 `scert`、`scert-admin`、`scert-nginx`、`scert-storage` 和安装器均为 `0755` | 归档层通过,不代表 Linux 已运行 |
| 实际 CLI 帮助 | 从最终 Windows ZIP 解出的 `scert.exe help` 返回 0,仅公开运维入口 | 本机执行通过 |
| 实际旧 CLI 拒绝 | `domain`、`server`、`ssh-key`、`renew`、`deploy` 均返回 1;仅一条中文错误,无模拟凭据回显,无运行目录创建 | 本机执行通过 |
| 自动化回归 | 最终应用代码通过后端全量测试、全量 vet 和 `go mod verify`;前端独立克隆 150 项通过,源码未再修改 | 本地自动化通过 |
| 归档测试范围 | Linux 测试改用 `scert-storage`,不再要求桌面;Windows 测试逐项核查实际平台文件,不再仅判断 Web 入口存在 | 发布模块测试和 vet 通过 |
P0-01 标记 `[x] 已完成,等待复审`,不标记生产放行。整体 44 项整改未完成:P0-02 执行规格、P0-03 全仓库边界、三数据库实机验证、项目权限、统一任务、备份页面及生产门禁等仍需继续。上述输出均在忽略目录内,没有提交二进制、运行数据或辅助测试脚本。
### 2026-09-27:P0-02/P0-03 规格与产物边界验收记录
本批从北京时间约 17:40 开始,基线 `96883b3`;修改前已推送中文检查点 `61b8cac`。实现提交为 `fab98d1069c29729959c031ce6cf112512751017`,随后仅更新本批证据与状态。没有 SSH、真实 DNS、生产数据库清理或浏览器操作,也没有删除工作区既有文件、添加临时辅助验收脚本。
| 验证项 | 实际结果 | 边界 |
|---|---|---|
| 44 项执行规格 | P0 12、P1 12、P2 10、P3 10;编号和名称与原始清单一致,每项有 12 个必需字段及独立六阶段 | 规格齐全不代表 44 项功能完成 |
| 结构和引用 | 显式依赖编号、既有文件路径、汇总状态核对通过;拟新增路径明确标注 | 使用只读核对,没有生成辅助脚本 |
| 目录及忽略边界 | 新增发布、证据、测试及辅助目录说明;通用二进制、归档、缓存、补丁、数据库旁路和私钥规则;公共 CA 和迁移仍保留 | 忽略规则不是内容级秘密扫描器 |
| 正式边界回归 | `source_boundary_test.go` 在隔离 Git 仓库核对根/子目录规则和所有受跟踪路径,屏蔽调用者 Git 配置 | 不依赖 `.git/info/exclude`,不把已有被跟踪产物自动放过 |
| 后端完整回归 | `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 均通过 | 当前 Windows 主机自动化,不是 Linux 平台专用代码实机测试 |
| 边界测试开销 | 改为一次空字节分隔的批量 Git 查询;发布模块完整回归约 2.48 秒,独立克隆约 3.75 秒 | 保持相同路径及索引断言,避免逐文件启动 Git 的约 32 秒开销 |
| 独立克隆 | `git clone --no-local --no-hardlinks` 到 `build/checkout-boundary-20260927-fab98d1/`,当前提交及规格齐全 | 不共享源仓库硬链接或专属排除配置 |
| 干净前端安装与测试 | 克隆内 `npm.cmd ci --no-audit --no-fund` 成功,`npm.cmd test` 150/150 通过,0 跳过 | esbuild 安装脚本批准策略警告仍属 P0-04,不自动放行 |
| 双平台候选 | 克隆内正式脚本输出至 `release/boundary-20260927-fab98d1/`,Web、Windows amd64、Linux amd64 构建和路径检查通过 | `source_dirty=false`,范围为 web/server,无桌面产物 |
| 实际清单与解包 | 33 项 manifest 长度/SHA256 一致;Windows 9 文件/8 校验项,Linux 22 文件/21 校验项全部一致,无额外包内文件 | 本批没有将包部署到远端运行 |
| 构建后源码边界 | 独立克隆安装依赖、构建和解包后 `git status --short` 为空,发布及证据输出由仓库规则忽略 | 没有二进制、归档、数据库、密钥进入本批提交 |
本批将 P0-02、P0-03 标记为 `[x] 已完成,等待复审`。连同 P0-01,共 3 项处于待复审状态,不标为 `[✓]`。其余任务及全部生产门禁继续保留,整体整改目标尚未完成。
### 2026-09-27:P0-04 固定工具链、安装策略与重复构建记录
本批北京时间约 18:12 开始。先核查当前工作区,没有待提交改动;修改前检查点 `5fdb5e4`,主要实现 `410ce75`;发现换行差异后检查点 `510a854`,修复后最终候选为 `94237b8e7da37f6242fa115aaf60fef0a88392c2`。所有代码提交已推送,后续仅补充本批证据文档。
本批没有 SSH、真实 DNS、浏览器、生产数据库清理或外部数据库连接;只使用正式构建入口和正式回归。没有增加临时辅助验收脚本,没有删除既有发布包和证据目录。`npm ci` 按正式安装语义重建对应克隆的前端依赖目录。
| 验证项 | 实际证据 | 边界 |
|---|---|---|
| 精确工具链 | 模块内 Go `1.26.6`;Node `24.19.0`、npm `11.17.0`;Vue `3.5.41`、Vite `6.4.3`、插件 `5.2.4` | 不升级依赖图,只固定已有版本并检查声明与锁文件一致 |
| 安装策略 | `.npmrc` 与正式命令均显式禁用安装脚本;构建包含开发及平台可选依赖 | esbuild 安装警告不再被误当作脚本未执行的证明 |
| 真实安装正反对照 | 离线本地依赖和根项目的生命周期标记在正式安装下均不出现,主动放行对照能出现;环境尝试关闭限制仍被命令行覆盖 | 使用正式 Node 回归中的隔离夹具,不是对生产服务的攻击测试 |
| 嵌套 npm 回归 | 首次完整测试暴露用户级白名单被 npm 导出后导致项目安装拒绝;修复为仅隔离子进程该变量,随后 175 项全部通过 | 未改用户 npm 配置,未开启脚本绕过错误 |
| 发布前拒绝 | 版本、锁文件、策略、外部 esbuild、Go 覆盖等拒绝回归;实际 PowerShell 入口拒绝后未创建发布目录 | 前端 175 项中含 25 项工具链回归,0 跳过 |
| 换行问题与修复 | `410ce75` 在 CRLF 克隆中产生不同 Web 哈希;`.gitattributes` 固定文本 LF,正式 Go 测试实际签出 `true/false/input` 三种配置且保护二进制原样 | 没有用终端脚本批量改写中文源码或重写主工作区 |
| 最终候选完整回归 | `94237b8` 独立克隆中 `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 均通过;前端 175/175 通过 | PostgreSQL 真实测试未显式启用,跳过的数据库集成门禁不算实机通过 |
| 双独立克隆 | 分别用 `core.autocrlf=true/false` 与 `--no-local --no-hardlinks` 创建;两份均按新策略干净安装 | 不共享源仓库硬链接或专属排除配置;构建机和工具缓存相同,不称两台独立机器 |
| 前端重复构建 | 两份克隆输出共 4 个文件,路径与 SHA256 全部一致;5 份依赖/策略输入哈希也全部一致 | 不宣称带时间戳的全部发布归档逐字节一致 |
| 构建机证据 | Windows 11 Home China,系统 `10.0.26200`,amd64,PowerShell `5.1.26100.9444` | manifest 不含用户名、主机名或本地绝对路径;Linux 原生构建尚未验证 |
| 最终候选清单 | `source_dirty=false`,`dependency_install=npm-ci`,`dependency_scripts=disabled`;33 项长度和 SHA256 全部正确 | 正式范围仅 Web/服务端,没有桌面产物 |
| 实际解包 | Windows 9 文件/8 条包内校验,Linux 22 文件/21 条包内校验;逐项与 manifest 一致且无额外文件 | 包已解出但未在远端或 Windows Service 中安装运行 |
| 源码边界 | 两份克隆安装、构建和解包后 Git 工作区均干净 | 构建产物及证据没有进入源码提交 |
最终候选与证据路径:
```text
build/checkout-toolchain-lf-20260927/
release/toolchain-94237b8/
artifacts/toolchain-94237b8/
build/checkout-toolchain-lf-control-20260927/frontend/dist/
```
P0-04 保持 `[~] 进行中`;代码实现与自动化阶段标 `[x]`,Windows 隔离构建证据已齐,但 Linux 原生构建、双平台实际运行系统及最终复审未齐。不得据此宣称 44 项整改或生产部署验收完成。下一批继续 P0-05 的真实数据库版本、迁移与恢复矩阵;不清空现有共享 MySQL 服务中的业务库。
### 2026-09-27:P0-05 双版本 MySQL 隔离迁移与编码修复
本批北京时间约 18:39 开始,修改前检查点 `fd4929c`,代码候选 `ee9ac857a9855fd1993deb3b03498ca921a5b559`,均已推送。使用本机 MySQL 程序启动全新独立实例,没有连接、停止或清空原有 MySQL57/MySQL80 服务,没有 SSH、DNS、浏览器或生产部署操作;没有新增临时辅助脚本。
首次 MySQL 5.7.44 实测在第 7 号迁移报 1064。实际原因是嵌入 SQL 文件头存在 UTF-8 BOM,原解析器将其直接发给数据库,也使字段重入匹配失败。修复仅在解析入口去掉文件头编码标记,保留 SQL 字面量内部字符;没有批量改写迁移文件和中文。新增两项常规编码回归及正式隔离实库测试。
| 验证项 | 本批结果 | 证据边界 |
|---|---|---|
| MySQL 5.7.44 | `ee9ac85`:48 项子测试通过,0 失败、0 跳过;包测试约 29.8 秒 | Windows 本机独立真实数据库,不是远端生产实例 |
| MySQL 8.0.45 | 同候选:48 项子测试通过,0 失败、0 跳过;包测试约 42.8 秒 | 单独初始化与验证,没有以 5.7 代替 8.0 |
| 空库及历史升级 | 0~9 共 10 个起点,重复迁移无报错 | 历史结构由仓库旧迁移构造,不声称覆盖全部历史程序导出的生产库 |
| 迁移中断重入 | 9 份迁移共 29 个语句边界逐一落盘后重入,包括 DDL 全部执行但版本号未写入 | 模拟已落盘的中间状态,不是电源故障或操作系统崩溃演练 |
| 结构和数据 | 每条成功路径的表引擎、字符集、字段、默认值、索引与全新迁移快照一致;中文哨兵和用户、域名、服务器关联保留 | 不替代所有应用业务或权限 API 回归 |
| 连接安全 | 严格 TLS;不可信 CA、错误主机名、明文连接均被对应校验拒绝;业务账户无跨库及账户表权限 | 测试注册的 TLS 信任不等于正式配置、证书轮换及连接 UI 已验收 |
| 异常迁移历史 | 缺首项、缺中间项、零、负数和新版历史全部拒绝,保留数据、不创建业务表 | 不删除迁移记录绕过版本检查 |
| 冷重启 | 正常停止独立数据库,重新启动并重新打开应用连接后,数据和结构一致 | 不等于 Windows Service、systemd 或在线断线恢复验收 |
| 环境收尾 | 所有本测试启动的数据库已正常退出;原服务仍运行,进程号未变;随机监听已关闭,bootstrap 文件为空 | 数据目录和日志留在被忽略的产物目录,未删除既有文件或提交产物 |
| 常规回归 | 同候选 `go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 全部通过 | 常规测试默认跳过外部实库门禁;MySQL 以本批两份显式运行日志为准,PostgreSQL 未启用;前端未改,本批未重跑前端 |
开发阶段曾在保留旧连接池后重启数据库,首次迁移收到 `invalid connection`。此项作为在线断线恢复待办保留,没有用自动重试掩盖 SQL 执行结果不确定性。最终冷重启用例明确关闭并重新打开应用连接,不将其算成该待办通过。TLS 反向测试也修正了错误码假设:账户的 `REQUIRE SSL` 可先返回认证拒绝,测试同时检查全局安全传输开关及严格证书错误类型,没有放宽加密要求。
正式命令在 `backend/` 执行,设置各版本独立的 `SCERT_MYSQL_TEST_BIN` 和共用产物根 `SCERT_MYSQL_TEST_ROOT`,然后运行 `go test -count=1 -v -timeout=8m -run '^TestMySQLRealMigrations$' ./internal/database`。每次运行自行新建数据目录与随机端口,完整参数见《构建版本与数据库支持矩阵.md》。最终非跳过日志:
```text
artifacts/mysql-matrix-20260927/mysql57-ee9ac85.log
artifacts/mysql-matrix-20260927/mysql80-ee9ac85.log
```
P0-05 从 `[!]` 调整为 `[~]`,并未标记完成;P0-04 剩余门禁和全部 44 项原始范围保持不变。下一步需继续处理在线数据库连接恢复、MySQL 备份恢复及完整业务初始化,再补 PostgreSQL 当前候选和 SQLite 并发锁证据。
### 2026-09-27:P0-05 Windows MySQL 在线连接恢复
整改前检查点 `f0a9475`;实现候选 `9cf3a3b`。新增正式 Go 回归首先在未修复代码的 MySQL 5.7.44 重现:保留应用池、重启独立数据库后,第一条业务写入返回 `invalid connection`。没有用额外健康请求、重开应用池或业务重试绕过问题。
- `[x]` 根因与修复:Windows 驱动空闲检查缺位;在业务发送前增加单次最多 2 秒的复用探测,失败淘汰连接。Linux 不增加额外往返;查询、写入及提交错误保持原样。
- `[x]` 安全边界单测:探测截止时间、取消、失败关闭、仅在写入前替换连接,以及查询、写入、提交不确定时不自动重放。
- `[x]` 双版本隔离实库:每个版本原有 48 项迁移及安全测试,加 7 项连接恢复、预编译、参数转换和事务测试,合计 55 项通过,0 失败、0 跳过。
- `[x]` 后端回归:`go test -p 1 -count=1 -timeout=3m ./...`、`go vet -p=1 ./...`、`go mod verify` 通过;Linux 数据库测试包交叉编译通过。本批没有改前端,未重跑前端测试。
- `[ ]` 尚缺:Linux 实库恢复、真实网络提交确认丢失演练、MySQL CLI 备份恢复、正式 Web 初始化和业务回归;不能用上述测试替代服务部署验收。
实现、命令、行为成本及更完整的覆盖边界见《构建版本与数据库支持矩阵.md》第六节。最终日志位于 `artifacts/mysql-matrix-20260927/mysql57-9cf3a3b.log`、`mysql80-9cf3a3b.log`,测试产物不提交。共享 MySQL 服务不在测试操作范围。
本批只关闭 Windows 隔离环境中已复现的首次请求故障,不把 P0-05 或全部 44 项标记完成。下一批继续 MySQL 备份恢复的实库一致性与失败回滚门禁。
### 2026-09-27:P0-05 MySQL 基本备份恢复与指定失败回滚
共享夹具重构 `07429ad` 已通过双版本原有 55 项回归;本批修改前检查点 `ac205e2`,产品修复及正式测试候选 `7bfd400`。
- `[x]` 修复前实证:MySQL 5.7.44 禁用空闲连接时,跨语句会话变量丢失,恢复返回 1048;DECIMAL 被导出为十六进制字面量,基本恢复返回 1264。两者都先由正式 Go 测试复现。
- `[x]` 修复:恢复全过程使用同一连接,出错即返回,不通过换连接重放;根据列类型将 DECIMAL 保存为精确文本,二进制数据仍用十六进制字面量,不经浮点转换。
- `[x]` 新增 10 项双版本实库子测试:固定会话;两种空闲连接配置下的基本恢复、出错停止、提前取消;同进程正式备份恢复命令成功、SQL 导入失败、证书恢复失败。验证中文与特殊字符、二进制、DECIMAL、NULL、微秒时间、自增、外键,以及数据库、配置、加密凭据和证书文件的恢复或回滚。
- `[x]` 候选最终复测:5.7.44、8.0.45 各 65 项子测试通过,0 失败、0 跳过;8 个本批实例已退出,端口关闭,初始化口令文件清空,共享 MySQL 进程不变。
- `[x]` 后端全量 `go test -count=1 ./...`、`go vet ./...`、`go mod verify` 通过;Linux CLI 测试包交叉编译通过,未执行 Linux 实库。前端未修改,未重跑。
- `[ ]` 下一步:MySQL 并发写入下一致性快照、视图/触发器/生成列等对象完整性、官方工具互操作、独立发行命令及真实网络故障验证。历史 DECIMAL 备份没有自动修复,不能把新备份的回归结果用于旧档案。
正式测试和 JSON 证据命令见《构建版本与数据库支持矩阵.md》第七节;产物位于 `artifacts/mysql-restore-session-20260927/`,不提交。测试只创建独立 loopback 实例,未清理共享数据库,也没有新增辅助脚本。P0-05 仍为 `[~]`,44 项目标保持原范围。
### 2026-09-27:P0-05 MySQL 跨表快照与备份失败边界
跨表快照修复 `8d742fe` 已提交并通过双版本回归。本批约 19:48 开始,修改前检查点 `79d7042`,产品与测试候选 `73df576`,均已推送。
- `[x]` 跨表快照:两种空闲连接配置下,用第二张表的真实写锁控制并发边界;修复前备份恢复出从未真实存在的 `(0,1)`,修复后恢复为同一快照的 `(0,0)`。所有 InnoDB 表共享只读可重复读事务。
- `[x]` 取消故障实证:首表已导出、第二张表等待元数据锁时取消,原实现返回取消错误后,首表 DDL 仍超过 5 秒被阻塞;两种目标文件状态均复现。修复为备份专用会话设置 5 秒的单次元数据锁等待上限,不修改数据库全局配置。
- `[x]` 新增 10 项实库用例:拒绝 MyISAM/视图;中途取消、SQL 中断、锁超时各覆盖目标文件不存在与已存在;临时文件冲突;发布重命名失败。检查错误类别、不发布残缺备份、保留既有文件、清理本次临时文件及失败后释放首表元数据锁。
- `[x]` 最终候选复测:Windows MySQL 5.7.44、8.0.45 各 77 项子测试通过,0 失败、0 跳过。全量后端测试、`go vet ./...`、`go mod verify` 通过;Linux CLI 测试包交叉编译通过,未在 Linux 运行。前端未修改,未重跑。
- `[x]` 收尾:本批目录中 18 个隔离实例均退出,已记录端口无监听,初始化口令文件为空;共享 MySQL 进程保持不变。测试数据、随机测试密钥及日志仅留在忽略目录,不提交。
- `[ ]` 后续:对象完整性、官方工具互操作、独立发行命令、Linux 实库与正式业务初始化;继续 PostgreSQL、SQLite 剩余矩阵及全部 44 项整改。
证据为 `artifacts/mysql-backup-boundaries-20260927/mysql57-73df576.jsonl` 和 `mysql80-73df576.jsonl`;命令和限制见《构建版本与数据库支持矩阵.md》第八节。这里验证的是指定锁等待和文件失败场景,不宣称任意查询取消都立即释放服务器资源,也不把临时拒绝视图等对象视为完整支持。P0-05 继续标记 `[~]`,不作生产放行。
### 2026-09-27:P0-05 特殊列互操作与官方存储对象恢复
待提交代码审查已完成:`f260b22` 保留并修复 4 个有价值的源码和正式测试文件,无无用待提交文件被删除。本轮约 20:19 开始,检查点 `6707059`,恢复修复与正式测试候选 `e6e6719`,均已推送。
- `[x]` 特殊列:生成列不再写入计算结果,不可见列的非默认实际值不再遗漏,仅生成列表保留行数;修复扫描越界,用真实结构元数据比较,双版本官方工具双向验证通过。
- `[x]` 存储对象恢复:先由真实官方导出文件复现 1064,再实现 `DELIMITER` 客户端拆句;保留复合语句、字符串和可执行版本注释,拒绝词法格式错误的部分执行。
- `[x]` 正式对象用例:核对两个触发器的顺序与执行结果,核对过程、函数的定义、参数、权限上下文与实际调用,核对禁用事件的元数据并在独立实例显式启用后验证实际调度;源库没有被目标事件修改。
- `[x]` 失败边界:不足权限返回数据库原始错误,不提升权限或继续后续例程;格式错误预检阻止此前建表语句执行。没有降低 TLS,也没有启用函数信任开关。
- `[x]` 最终回归:MySQL 5.7.44、8.0.45 分别 85、87 个叶子用例通过,0 失败、0 跳过。后端全量测试、vet、模块校验通过;Linux 测试包仅交叉编译,前端未修改。
- `[x]` 收尾:本批 22 个隔离实例退出,测试端口无监听,初始化口令文件为空;共享 MySQL 进程不变,产物没有提交。
- `[ ]` 后续:自有导出对触发器、例程、事件、视图的完整性及有效权限检查;更多 SQL 模式、跨账户定义者、跨库引用和已启用事件恢复期间的调度隔离;独立发行 CLI、Linux 实库、PostgreSQL、SQLite 与正式业务部署。
证据:`artifacts/mysql-pending-review-20260927/review-mysql57.jsonl`、`review-mysql80.jsonl`;本轮为 `artifacts/mysql-stored-programs-20260927/mysql57-review.jsonl`、`mysql80-review.jsonl`。权限、官方工具选项、SQL 模式差异和准确计数口径见支持矩阵第九、十节。
已重新核对原始需求及执行清单,44 个任务编号全部保留。P0-05 仍为 `[~]`,没有把某个导入方向通过等同于完整备份恢复或生产放行。
### 2026-09-27:P0-05 自有触发器备份、权限及文档进度同步
修改前检查点 `d7f6ac1`;实现与正式测试 `3f6d5b8` 已提交推送。本批从 20:42 开始,最终双版本复测于 21:45 结束,中间包含非持续执行时间,不把墙钟间隔当成测试耗时。
- `[x]` 实库复现:自有备份遗漏触发器;无 `TRIGGER` 权限时对象被隐藏,旧实现仍报告成功并覆盖已有备份。
- `[x]` 导出修复:保存原始触发器定义和定义者,按真实执行顺序导出;保留 SQL 模式、字符集和排序规则,先恢复表数据再创建触发器。
- `[x]` 权限预检:覆盖全局、库级、表级、精确授权遮蔽、启用及嵌套角色、未启用角色、动态权限与部分撤销。无可证明权限时失败并保留旧备份;歧义通配组合仍保守失败,后续需完善。
- `[x]` 正式验证:Scert 与官方客户端分别恢复四个触发器,比较元数据并实际执行;覆盖名称与执行顺序相反、审计副作用、Latin-1 正文、分隔符冲突和创建时不同数据库排序规则。
- `[x]` 最终专项:Windows MySQL 5.7.44 / 8.0.45 分别通过 97 / 104 个叶子用例,0 失败、0 跳过;后端全量测试、vet、模块校验通过;Linux 仅交叉编译。前端未修改、未重测。
- `[x]` 测试收尾:累计 51 个独立实例退出,记录的测试端口无监听,初始化口令文件为空;共享 MySQL 进程未动。测试数据、随机密钥、日志和二进制不提交。
- `[x]` 文档进度同步:原始清单只更新状态和进度说明,不修改需求与验收标准;执行清单、基础规格、支持矩阵、历史开发清单、审查记录和生产运维说明同步指向本批证据。
- `[ ]` 后续:例程、事件、视图、完整对象清单权限、其他 SQL 模式、复杂授权组合、定义者迁移、独立发行命令、Linux 实库、PostgreSQL、SQLite 及正式业务部署。
证据目录:`artifacts/mysql-native-triggers-20260927/`,最终结果为 `mysql57-final.jsonl`、`mysql80-final.jsonl`;详见支持矩阵第十一节。全部 44 项范围不变,P0-05 保持 `[~]`,本批不作生产放行。
### 2026-09-27:P0-05 自有存储过程与函数备份
实现前检查点 `db7d132`、未完成实现保存点 `c4051c9` 已推送。本批在保存点上修复 5.7 Latin-1 注释乱码,接续触发器子任务,全部 44 项和原验收标准不变。
- `[x]` 在独立 MySQL 5.7 实例复现例程遗漏,以及权限不足时仍成功覆盖原备份;复现证据为 `artifacts/mysql-native-routines-20260927/mysql57-before.jsonl`。
- `[x]` 增加原始例程定义导出、同名替换、创建元数据与编码保留;复用触发器的存储对象读写逻辑,先恢复数据和例程,再创建触发器。
- `[x]` 增加完整例程可见权限检查;5.7 检查 `mysql.proc` 完整读取权限,8.0 检查有效 `SHOW_ROUTINE` 或全局 `SELECT`,拒绝把隐藏对象当作不存在。
- `[x]` 修复 5.7 注释双重编码,保留 8.0 声明头处理;增加字符集往返检查和错误上下文,五种无效元数据均明确拒绝且不写回部分转换结果。
- `[x]` 正式回归覆盖两种恢复入口、重复恢复、输入输出参数、Latin-1 名称/注释/正文、元数据一致性、角色和部分撤销。最终 Windows 5.7.44 / 8.0.45 全专项分别通过 110 / 121 个叶子用例,0 失败、0 跳过;对应含父项记录为 125 / 136。
- `[x]` 后端全量回归、vet、模块校验和 Linux CLI 测试包交叉编译通过;常规回归有 32 个条件测试跳过,不替代实库证据。前端未修改、未重测。
- `[x]` 专项目录累计 90 个独立实例退出、167 个记录端口无监听、90 份初始化口令文件为空,共享 MySQL 进程未动;测试产物均不提交。
- `[x]` 支持矩阵第十二节、基础规格、原始清单进度说明、历史开发清单、审查记录和生产运维说明同步更新;最终证据为 `artifacts/mysql-native-routines-20260927/mysql57-verified.jsonl`、`mysql80-verified.jsonl`。
- `[ ]` 事件、视图、完整表清单权限、其他 SQL 模式及剩余数据库/平台/生产门禁继续整改。
### 2026-09-27:P0-05 自有事件备份与恢复安全
- `[x]` 原始事件定义、定义者、计划、时区、启停状态及创建会话属性导出;数据、例程、触发器和外键检查先于事件恢复。
- `[x]` 全局、库级、角色、部分撤销和授权遮蔽的 EVENT 可见权限检查;无权限空库也明确拒绝。
- `[x]` 恢复前检查 PROCESS 权限、工作线程及调度状态;产品不修改全局调度器、不终止线程、不自动扩权。维护窗口仍由管理员保证。
- `[x]` Latin-1 事件名称与注释编码、无效元数据、已到期事件及恢复警告保护;失败保留既有备份。
- `[x]` 修正旧触发器测试精确授权漏 EVENT,以及官方存储对象测试只等第一条事件更新的竞态,不放宽产品校验或原有业务断言。
- `[x]` 最终源码 `3625e8b`:Windows MySQL 5.7.44 / 8.0.45 完整专项分别 139 / 155 个叶子用例通过,含父项记录为 159 / 175,0 失败、0 跳过;后端无缓存全量测试、vet、模块校验通过。
- `[x]` 最终证据为 `artifacts/mysql-native-events-20260927/mysql57-commit-final.jsonl`、`mysql80-commit-final.jsonl`;对应测试端口无监听,初始化口令文件均为空,三个共享 MySQL 进程未动。源码、正式 Go 测试和运维文档已提交推送,产物不提交。
- `[x]` 支持矩阵第十三节及关联任务文档同步进度;Windows 隔离证据不替代 Linux 实库或生产放行,全部 44 项范围不变。
- `[~]` 下一子任务:视图自有备份与恢复,先复现现状并核对依赖、定义者、字符集、权限与官方工具互操作。
- `[ ]` 完整表清单、其他编码/SQL 模式、跨库和跨服务器定义者、独立发行 CLI、Linux 实库及其余三库/业务/生产门禁继续保留。
### P0-05 视图、完整清单与提交复核(源码 `777c716`)
- `[x]` 原始视图定义、创建字符集及排序规则导出;仅对本库视图依赖排序,反向删除、正向创建,不创建占位表或删除同名基础表。
- `[x]` 先证明库级或全局 SELECT,防止把权限过滤后的表/视图清单当成完整备份;逐视图检查有效 SHOW VIEW,覆盖角色、部分撤销及授权遮蔽。
- `[x]` 原始官方嵌套 CHECK OPTION 夹具在官方客户端复现 1368;Scert 对连续且闭合的最终视图块按依赖排序,原文件 SHA256 不变,并独立验证成功恢复。
- `[x]` 补充复杂查询、宽视图、失效视图、目标同名基础表、无效计划及会话上下文保护;不跨业务语句重排,不承诺任意 SQL 或全局 DDL 原子回滚。
- `[x]` 修正视图、事件、触发器测试的 SELECT 前提;例程测试分开验证定义可见与完整清单可读,仍检查拒绝时原备份不变,并验证补足读取权限后成功导出。
- `[x]` 原 15 个待提交文件均为正式实现或测试,另修正 3 个旧测试;分为 `d95ecfa`、`777c716` 提交并推送。没有删除文件,没有提交产物、密钥或数据库。
- `[x]` 5.7 / 8.0 完整专项分别 176 / 202 个叶子用例通过,常规后端、vet、模块校验和 Linux 测试包交叉编译通过;证据、失败历史与收尾结果见支持矩阵第十四节。
- `[x]` 本批同步原始清单、开发清单、审查记录、分级规格、支持矩阵及运维说明;上述事件段的剩余项为当时记录,当前视图和完整清单进展以本节为准。
- `[~]` 下一子任务:SQLite 文件库的多连接/多实例并发、写锁等待与取消、事务回滚及重连后的会话配置;先核对现有实现,再复现实际缺口。
- `[ ]` MySQL 其他编码/SQL 模式、跨服务器定义者、并发 DDL/授权变化、独立发行 CLI、Linux 实库、PostgreSQL 当前复测和生产门禁。全部 44 项及 P0-05 总状态不变。
### P0-05 SQLite 连接池、并发与锁(源码 `af831ae`)
本节保留上一批执行记录;当前恢复进展补充在下节及支持矩阵第十六节,不将历史待办误认为本批已完成。
- `[x]` 修改前检查点 `6cab85d` 已推送;正式回归先复现扩容、零空闲连接、连接替换和 DSN 参数四类忙等待丢失,保留失败日志。
- `[x]` 每条物理连接入池前配置默认 5000 毫秒忙等待和 WAL;失败关闭连接,不依赖初始化时恰好选中的连接。
- `[x]` 为带截止时间的执行、查询、预处理、事务启动及逐行读取缩短等待预算,结束后恢复;状态不确定时淘汰连接,不重放业务 SQL,不把执行后清理错误转成自动重试信号。
- `[x]` 真实文件库验证读写隔离、读事务快照、双连接池 200 次并发写入、三子进程就绪后释放写锁并完成 150 次写入、事务回滚及关闭后重新打开。
- `[x]` 活动 WAL 下的未提交/已提交两类快照内容及完整性验证通过;已有 CLI 备份恢复回归继续通过,不等同于独立发行命令或生产恢复验收。
- `[x]` Windows SQLite 3.49.1 专项与竞态检测各 42 个叶子用例通过,0 失败、0 跳过;26 个核心用例重复 10 次通过;后端全量、vet、模块校验和 Linux 测试包交叉编译通过,详见支持矩阵第十五节。
- `[~]` 无截止时间的手动取消仍可能等待原生忙等待结束(本批约 5 秒);继续核查取消边界、完整业务升级恢复和真实服务重启,不将现状记录测试算作缺口已经修复。
- `[ ]` Linux 原生运行、独立发行 CLI、PostgreSQL 当前实库复测、MySQL 剩余项及双平台生产门禁;P0-05 和全部 44 项总范围不变。
### P0-05 SQLite 异常退出及业务恢复(源码 `6db5d7b`)
本节为上一批记录,当前历史模式升级及独立 Windows 程序证据见下节;未完成项按当前证据区分,不覆盖历史结果。
- `[x]` 修改前检查点 `5e5abf2` 已推送;子进程提交 WAL 后不关闭数据库直接退出,复现恢复返回成功但数据仍为旧值,保留 `wal-before.jsonl`。
- `[x]` 服务维护锁内由 SQLite 合并日志并切换到 DELETE 模式,关闭连接后确认 WAL/SHM/回滚日志不存在;占用、孤立日志及非普通路径均拒绝恢复,不手动删除日志。
- `[x]` 成功恢复和证书资产失败回滚均核对原有已提交 WAL 数据进入恢复前快照;不再依赖残留 WAL 偶然恢复原数据。
- `[x]` 通过正式备份/恢复命令处理器验证当前全部业务表及模式、迁移记录、自增序列、资源关联、用户密码和分组、DNS 归属、加密凭据、真实证书/私钥与重复恢复。
- `[x]` SQLite 专项 55 个叶子用例、恢复专项 13 个用例连续 5 次竞态检测通过;后端全量 1368 条叶子通过记录,0 失败、43 项条件跳过,vet/模块校验及 Linux CLI 测试包交叉编译通过。
- `[ ]` 带历史业务数据的跨版本升级、独立发行二进制命令、真实服务重启、Linux 原生运行、断电/磁盘故障、取消边界及其余数据库/平台与生产门禁;本批不调用外部 DNS、SSH 或邮件服务,全部 44 项范围不变。
### P0-05 SQLite 历史模式升级及独立程序(源码 `fd2810b`)
- `[x]` 修改前检查点 `0e16d28` 已推送;模式 1、2、3 写入历史任务后均复现迁移 4 失败,保留 `upgrade-before.jsonl`。
- `[x]` 固定物理连接,在同一事务内重建任务表并记录版本;保留原始业务列、行号、索引、依赖视图和触发器,外键检查通过后提交,恢复连接原外键设置。
- `[x]` 模式 1~9 的代表性数据升级及重复执行;外键开关、生成列、级联关联、依赖对象、版本记录失败、临时名称冲突和外键冲突后的回滚重试均通过。
- `[x]` 干净提交构建的独立 `scert.exe` 实际执行历史模式 3 备份、正式应用入口升级、旧备份恢复后再升级,以及升级后备份恢复;核对完整表/模式、资源绑定、用户密码、加密凭据及证书。
- `[x]` SQLite 专项 71 个叶子用例,27 个升级/恢复用例连续 3 次竞态检测;后端全量、静态/模块检查和 Linux 测试包交叉编译通过,证据见支持矩阵第十七节。
- `[ ]` 旧发行包产生的实际历史数据与配置升级、完整发行包安装、真实服务重启、Linux 原生执行、取消边界及其余数据库/平台和生产门禁。历史模式由现有迁移文件构造,不冒充旧发行二进制运行证据;全部 44 项范围不变。
## 本轮开发进度(2026-09-29 17:50)
按总体验收口径,当前仍为 **P0-03 完成待复审**;本轮只推进 P0-07 的项目审计读取权限,未将局部开发或自动化测试标记为复审通过。
- [x] 审计日志路由改为登录后的项目资源路由,不再依赖全局管理员路由作为唯一入口。
- [x] 新增项目审计读取仓储,在 SQL 查询中按实时账户状态、全局角色、项目成员角色和日志范围过滤。
- [x] 普通项目成员仅可读取其拥有 `audit.read 能力项目的项目审计;不能读取其他项目或系统范围日志。
- [x] 超级管理员和全局管理员保留系统审计读取能力;账户停用后不再返回日志。
- [x] 新增撤权立即生效、跨项目隔离和全局管理员范围回归测试。
- [x] 已通过 go test ./... 和 go vet ./...;这只证明本地自动化验证通过,不代表生产部署验收通过。
- [~] 任务读取、任务取消/重试、证书签发/导入/部署、DNS、SSH 及其他资源写入的完整项目权限链仍待开发。
- [!] PostgreSQL/MySQL 矩阵、浏览器、Linux/Windows 服务、远端 SSH、HTTPS/DNS/ACME 和生产验收仍未执行。
下一步:继续补齐任务与证书/部署权限链,完成开发阶段后再统一运行三库、浏览器和远端生产流程测试。
## ???????2026-09-29 18:38?
???????????? **P0-03 ?????**??????? P0-07??????????????????????
- [x] ??????????????????????????????????????
- [x] ?????? `certificate.manage`??????? `certificate.private_key.read`????????? `deployment.execute`????????? `deployment.rollback`?
- [x] ????????????????? HTTP ?????`go test ./internal/httpapi` ????
- [~] ????SSH ???DNS?????????????????????????????? SSH?HTTPS/DNS/ACME ????????????
## 本轮开发进度(2026-09-29 18:57)
按总体验收口径,当前仍为 **P0-03 完成待复审**;本轮仅推进 P0-07 项目资源权限开发,局部测试通过不代表生产部署验收通过。
- `[x]` 服务器新增、修改、删除接口已纳入认证后的项目资源路由。
- `[x]` 服务器写入前按真实项目成员关系校验 `server.manage`,更新和删除先读取当前账户可见的服务器。
- `[x]` 已补充无项目权限新增、修改、删除服务器的拒绝回归测试,确认拒绝后原资源不变。
- `[x]` 本批代码已提交并推送:服务器权限隔离提交 `747e897`,拒绝回归测试提交 `fbb516e`。
- `[x]` `go test ./...`、`go vet ./...` 及 HTTP API 专项测试通过。
- `[~]` SSH 私钥归属与服务器引用隔离、DNS 账户项目使用权限、续期及其他任务写入权限仍在开发。
- `[!]` PostgreSQL/MySQL 矩阵、浏览器验收、Linux/Windows 生产部署、远端 SSH、HTTPS/DNS/ACME 和 `odacm.cn` 实机验收尚未执行。
下一步继续开发剩余资源权限链,完成开发阶段后再统一执行三数据库、浏览器、远端部署和生产流程测试。
## 本轮开发进度(2026-09-29 19:06)
总体验收位置继续保持 **P0-03 完成待复审**。本轮完成 P0-07 的 SSH 私钥项目归属开发,但尚未进行三数据库、浏览器、远端服务器或生产流程验收。
- `[x]` SSH 私钥加密载荷和安全元数据记录项目归属;历史未记录归属的私钥兼容归入默认项目。
- `[x]` 服务器新增、修改时按服务器项目校验 SSH 私钥引用,跨项目引用被拒绝。
- `[x]` 自动生成的服务器 SSH 密钥写入服务器所属项目。
- `[x]` SSH 私钥列表、新增、删除接口按项目归属和 `server.manage` 权限过滤与校验。
- `[x]` 已补充 SSH 私钥服务项目隔离专项测试;本批提交 `56c88c3` 已提交并推送。
- `[~]` DNS 账户项目归属与使用权限、续期任务及其他任务/资源写入权限仍在开发。
- `[!]` PostgreSQL/MySQL 矩阵、浏览器验收、Linux/Windows 生产部署、远端 SSH、HTTPS/DNS/ACME 和 `odacm.cn` 实机验收尚未执行。
下一步继续开发 DNS 账户及任务相关权限链,开发阶段结束后统一执行生产构建、部署和验收流程。
## 本轮执行状态(2026-09-29 19:30)
- **总体验收位置:P0-03 完成待复审。**
- **P0-07 DNS 项目权限批次:** DNS 账户项目归属、凭据使用权限、项目归属修改授权和前端项目归属展示已完成,等待复审。
- **自动化验证:** 后端 HTTP API/配置专项通过,前端 230 项测试通过,前端生产构建通过;这些结果不等同于生产部署验收。
- **仍在开发:** 续期任务、证书导入/部署、任务执行/重试及其他资源写入的完整实时授权和拒绝副作用验证。
- **尚未执行:** PostgreSQL/MySQL 矩阵、浏览器清缓存验收、远端密码 SSH、HTTPS/DNS/ACME 和生产部署流程。
## 本轮开发进度(2026-09-29 19:50)
按用户要求,总体验收位置继续保持 **P0-03 完成待复审**;本轮完成“域名与服务器多对多部署关联”开发,不将本地测试结果视为生产验收通过。
- `[x]` 保留并验证域名绑定多台服务器的事务模型,单次替换只影响当前域名,不覆盖其他域名的服务器关联。
- `[x]` 新增服务器反向读取关联域名的项目资源接口:`GET /api/v1/servers/:id/domains`。
- `[x]` 服务器关联域名读取按实时账户状态、项目成员权限、服务器项目和域名项目同时过滤,未知或越权资源统一拒绝。
- `[x]` 管理页面在服务器卡片展示当前托管的全部域名,解绑一个域名时不影响同服务器的其他域名。
- `[x]` 新增多对多反向关联回归测试;后端 `go test ./...`、`go vet ./...`、前端 230 项测试和前端生产构建通过。
- `[~]` P0-07 其他任务执行、证书部署、续期、审计完整覆盖及跨数据库矩阵仍待继续开发或复审。
- `[!]` 浏览器清缓存验收、远端密码 SSH、HTTPS/DNS/ACME、Linux/Windows 服务和生产部署验收仍未执行。
下一步:继续完成开发阶段剩余权限与部署闭环,之后统一按生产流程编译、部署和测试;验收位置仍以 P0-03 为准。
## 最新进度追加(2026 年 9 月 29 日)
- [x] 已完成失败证书任务重试开发:支持 failed、cancelled 两种状态,拒绝成功、排队、运行中及非证书申请任务重试。
- [x] 已完成 task.retry 权限、项目可见任务读取、证书管理、部署执行和 DNS 凭据使用的重试前复核;事务内防止并发重复重试。
- [x] 已完成后端全量测试与静态检查、前端 230 项测试、生产构建及差异检查。
- [x] 已提交 35260bc、aa587d3,最后一次远程推送成功。
- [~] P0-07 继续进行;待完成三数据库矩阵、浏览器、SSH/HTTPS、远端部署和生产门禁。
- [!] 总体验收仍停在 **P0-03 完成,待复审**,不能将局部测试结果写成生产验收通过。
## 本轮开发进度(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**,本轮仅推进 P0-07 的同步证书申请权限闭环,不将局部自动化测试结果视为生产部署验收通过。
- `[x]` 无任务仓储的同步证书申请路径已补齐项目资源可见性、`certificate.manage`、`deployment.execute` 与 DNS 凭据使用权限校验。
- `[x]` 已补充项目证书权限不足、DNS 凭据使用权限不足及权限拒绝后不调用证书工作流的回归测试。
- `[x]` 当前候选后端 `go test ./...`、`go vet ./...` 通过;该结果仅代表本地自动化验证,不代表三数据库、浏览器、远端服务器或生产部署验收通过。
- `[~]` P0-07 其他资源写入权限、三数据库矩阵、浏览器清缓存验收、密码 SSH、远端部署及 Linux/Windows 生产服务仍需继续开发或复审。
- `[!]` 总体验收不得升级,P0-03 仍为“完成,待复审”。
下一步继续执行前端回归与生产构建,再提交并推送本轮测试代码;完成开发阶段后,统一进行三数据库、浏览器、远端服务器和生产部署测试。
## 本轮开发进度(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮继续推进 P0-07 项目任务权限闭环,不将局部测试结果视为生产部署验收通过。
- [x] 项目任务取消入口新增 `task.cancel` 实时项目权限校验,权限拒绝时不会调用取消写入,也不会改变任务状态。
- [x] 已补充缺少任务取消权限的 HTTP 回归测试;任务取消、工作流任务保护及成功证书任务回归测试通过。
- [x] 已确认域名与服务器多对多部署关联仍按既有事务模型工作:一个域名可绑定多个服务器,一个服务器可关联多个域名,解绑单个域名不影响其他关联。
- [~] P0-07 仍需继续补齐续期、证书导入/部署、其他任务写入权限及三数据库矩阵。
- [!] 浏览器清缓存验收、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务和生产部署验收尚未执行。
下一步继续完成开发阶段剩余权限闭环,再统一执行生产构建、部署和验收;总体验收位置仍以 P0-03 为准。
## 本轮开发进度(2026-09-29,续)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮完成手动批量续期入口的全局权限收紧,不将局部权限测试结果视为生产部署验收通过。
- [x] 手动批量续期接口 `/api/v1/renewal/run` 改为仅超级管理员可执行,普通管理员请求在进入续期工作流前返回 403。
- [x] 已补充普通管理员不得触发续期工作流的 HTTP 回归测试;续期成功、错误脱敏及权限拒绝专项测试通过。
- [x] 已复核服务器新增、修改、删除及域名—服务器多对多绑定:均按项目归属和写权限判定,绑定事务继续校验同项目、路径冲突和失败审计。
- [x] 已复核单域名证书导入、部署、恢复、同步申请以及任务申请、重试、取消的项目权限链路;任务取消和手动批量续期的本轮缺口已补齐。
- [~] P0-07 仍需继续完成三数据库生产矩阵、浏览器清缓存验收、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务及最终生产门禁。
- [!] 总体验收不得升级,P0-03 仍为“完成,待复审”。
下一步完成开发阶段剩余非权限项后,再统一执行生产构建、部署和实机验收。
## 本轮开发进度(2026-09-29,续)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮完成全局系统设置与 DNS 管理权限收紧,不将局部自动化测试结果视为生产部署验收通过。
- [x] 普通管理员保留系统设置、DNS 服务商目录和 DNS 账户归属信息的读取能力。
- [x] 系统设置修改、DNS API 在线测试和阿里云 DNS 权限检查统一限制为超级管理员。
- [x] 前端普通管理员进入系统设置时改为只读,并隐藏全局续期执行按钮;后端继续保留权限拒绝保护。
- [x] 新增后端全局配置权限回归测试和前端普通管理员操作保护测试;前端 230 项定向测试通过,DNS、设置和续期定向后端测试通过。
- [~] P0-07 仍需继续完成三数据库生产矩阵、浏览器清缓存验收、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务及最终生产门禁。
- [!] 总体验收不得升级,P0-03 仍为“完成,待复审”。
下一步继续审查剩余资源权限联动,开发阶段完成后统一执行生产构建、部署和实机验收。
## 22:44 统一回归进度(2026 年 9 月 29 日)
- [x] 前端全量回归 `npm.cmd test -- --runInBand`:231 项通过,0 失败。
- [x] 后端全量回归 `go test ./...`:通过;`go vet ./...`:通过。
- [x] 前端生产构建 `npm.cmd run build`:通过;本轮权限回归测试会话已修正并提交 `853a7cd`、`93a190f`。
- [~] P0-07 仍需三数据库矩阵、浏览器清缓存、密码 SSH、远端部署及生产矩阵验证。
- [!] 总体验收位置继续保持 **P0-03 完成待复审**,本轮自动化回归通过不等于生产部署验收通过。
## 本轮开发进度(2026-09-29 23:21)
- `[x]` P0-08 已完成敏感凭据禁用/启用、元数据状态返回、主密钥缺失保护和主密钥轮换;轮换失败时保留旧主密钥恢复路径。
- `[x]` 已补充凭据生命周期、主密钥缺失和主密钥轮换后的重新打开读取测试;`go test ./...` 与 `go vet ./...` 通过。
- `[x]` 本轮代码已提交并推送:`bac67b6`。
- `[~]` P0-09 继续核对 SSH 主机指纹、密码登录后公钥部署及私钥回连验证;人工更新指纹审计和实机密码 SSH 验证仍待完成。
- `[~]` P0-10、P0-12 仍待继续开发审查和统一回归。
- `[!]` 总体验收位置保持 **P0-03 完成,待复审**;本轮本地自动化测试通过不构成生产部署验收通过。
## 本轮开发进度(2026-09-29 23:58)
- [x] P0-10 补齐任务状态模型:支持 `partial_success`、`retry_wait`、`cancelling` 状态,任务更新、取消、重试等待、活动任务互斥和服务重启恢复均纳入统一状态范围。
- [x] 批量部署一成一败时,HTTP 任务、任务尝试和审计记录统一保存为 `partial_success`,新增对应回归测试。
- [x] 已通过 `go test ./internal/repository ./internal/app ./internal/httpapi`、`go vet ./...` 和 `git diff --check`。
- [x] 本轮代码已提交本地提交 `c9a82e6`;已按要求尝试推送,但远程返回 `Authentication failed`,因此不把远程推送结果作为验收依据。
- [~] P0-09、P0-10、P0-12 仍需继续开发审查;三数据库、浏览器清缓存、密码 SSH、远端部署和生产矩阵尚未统一执行。
- [!] 总体验收位置继续保持 **P0-03 完成,待复审**;本轮代码开发和自动化测试不构成生产部署验收通过。
## 进度追加(2026-09-29,本批结果)
本节追加本批实际结果;此前摘要中同一子项的“进行中/待验证”为历史状态,以本节为准。总体验收位置仍为 **P0-03 完成,待复审**,没有新增复审通过项。
本批需求确认:补齐活动任务对域名删除的保护,更新清单证据;继续先开发、后统一测试,不启动生产验收。
- [x] 已完成,等待复审:P0-10 域名删除保护覆盖申请、校验、部署、导入、恢复任务的 `queued`、`running`、`retry_wait`、`cancelling` 状态。
- [x] 已完成,等待复审:新增 SQLite 仓储回归,验证部署任务处于 `retry_wait`、`cancelling` 时返回域名忙错误;改为 `partial_success` 后不再阻止合法删除。保留原有运行中申请任务保护和审计失败回滚用例。
- [x] 已完成,等待复审:本批仓储专项测试通过;接续的 `go test ./...` 全量测试会话已确认退出码为 0;提交前差异检查通过。以上仅为本地自动化证据,不代表三数据库实库或生产验收。
- [x] 已完成,等待复审:代码已提交并推送 `96c8f44`(完善活动任务删除保护),本批未进行远端部署、运行数据库清理或浏览器测试。
- [ ] 未开始:补全五种证书任务类型与四种活动状态的组合覆盖,以及拒绝删除时关联和审计不变的专项断言;本批新增用例未覆盖全部组合。
- [ ] 未开始:补全 `failed`、`cancelled` 终态的专项删除用例;不得将本批 `success`、`partial_success` 路径外推为所有终态均已验证。
- [~] 进行中:P0-10 其余长任务取消、重试、幂等、崩溃恢复及 P0-12 备份恢复仍需继续整改,不标记整项完成。
- [ ] 未开始:开发收尾后,统一执行当前候选的生产构建、SQLite/PostgreSQL/MySQL 矩阵、浏览器清缓存、密码 SSH、远端部署和平台服务验收。
下一步优先补齐上述开发缺口和测试用例,再推进剩余任务链;原始整改范围不缩减,总体验收不得因本批测试通过而升级。
## 本轮开发进度(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅推进 P0-10 域名删除保护矩阵,不将专项测试结果视为整项复审或生产部署验收通过。
- [x] 已完成,等待复审:域名删除保护已覆盖 `certificate_issue`、`certificate_validate`、`certificate_deploy`、`certificate_import`、`certificate_restore` 五类证书任务,以及 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。
- [x] 已完成,等待复审:每个活动状态拒绝删除时,回归测试确认域名仍存在、当前域名与服务器关联仍存在;共享同一服务器的其他域名和服务器本身不受影响。
- [x] 已完成,等待复审:补充 `success`、`failed`、`cancelled`、`partial_success` 终态场景,确认活动任务清空后可以合法删除目标域名,并保留其他域名及服务器关联。
- [x] 已完成,等待复审:`go test ./internal/repository` 与后端全量 `go test ./...` 均通过,`git diff --check` 通过。
- [x] 已完成,等待复审:本轮代码已提交并推送 `14d5e53`(补齐活动任务删除保护矩阵测试)。
- [~] 进行中:P0-10 其他长任务取消、重试、幂等、崩溃恢复及任务尝试记录仍需继续审查,不能因本批通过而关闭整项。
- [ ] 未开始:P0-12 备份恢复、三数据库生产矩阵、浏览器清缓存、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务和最终生产门禁。
- [!] 总体验收不得升级:仍处于 **P0-03 完成,待复审**,当前没有新增 `[✓]` 复审通过项。
下一步继续审查 P0-10 剩余任务执行链和 P0-12 备份恢复;开发阶段完成后,再统一执行生产构建、部署和实机验收。
## 本轮开发进度(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮只推进 P0-10 任务幂等并发保护,不代表整项复审或生产部署验收通过。
- [x] 已完成,等待复审:新增 `task_idempotency` 数据表及 SQLite、PostgreSQL、MySQL 三套 0015 迁移;历史非空幂等键在迁移时建立登记。
- [x] 已完成,等待复审:任务创建在同一事务登记幂等键,数据库层拒绝同一域名同一幂等键的并发重复任务,避免仅依赖单进程互斥锁。
- [x] 已完成,等待复审:接口在并发创建冲突后回读已存在任务并返回重放结果,不再把可恢复的幂等冲突直接返回为普通创建失败。
- [x] 已完成,等待复审:新增并发重复幂等键回归测试;`internal/repository`、`internal/database`、`internal/httpapi` 及后端全量 `go test ./...` 均通过,`git diff --check` 通过。
- [~] 进行中:P0-10 其余长任务取消、重试、任务尝试记录、崩溃恢复,以及证书校验、导入、部署、恢复入口是否全部纳入任务中心仍需继续审查。
- [ ] 未开始:P0-12 备份恢复、三数据库实库矩阵、浏览器清缓存、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务和最终生产门禁。
- [!] 总体验收不得升级:当前仍为 **P0-03 完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
本轮下一步继续审查任务中心剩余入口和备份恢复;开发阶段收尾后,再统一执行生产构建、实机部署和验收。
## 本轮开发补充(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮完成服务重启恢复审计链开发,不代表 P0-10 整项复审或生产部署验收通过。
- [x] 已完成,等待复审:服务重启恢复会为每个 `queued`、`running`、`retry_wait`、`cancelling` 任务写入 `task_recovery` 失败审计,并保留任务、项目和创建人归属。
- [x] 已完成,等待复审:恢复事务新增审计写入失败回滚保护;审计数量与实际恢复任务数量不一致时,任务、尝试和审计全部回滚。
- [x] 已完成,等待复审:新增重复恢复与审计失败回滚测试;专项恢复测试、后端全量 `go test ./...` 和 `git diff --check` 均通过。
- [~] 进行中:P0-10 的 DNS 验证、批量部署结果、其他入口任务事务链、重试幂等及跨数据库实机验证仍需继续审查。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署和最终生产门禁仍未执行。
- [!] 总体验收不得升级:当前仍处于 **P0-03 完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 本轮执行记录(2026-09-29,P0-10 任务取消入口)
- [x] 已完成,等待复审:修正 HTTP 任务取消入口,使其与仓储层支持的四种活动状态保持一致。
- [x] 已完成,等待复审:覆盖 `retry_wait`、`cancelling` 的任务及任务尝试取消回归;管理证书和自动续期任务继续拒绝通用取消。
- [x] 已完成,等待复审:后端定向测试、全量测试、静态检查和差异检查通过。
- [~] 进行中:P0-10 仍需继续审查其他任务入口、重试、幂等、恢复和跨数据库行为。
- [ ] 未开始:P0-12 备份恢复以及最终生产流程门禁。
- [!] 总体验收保持 **P0-03:完成,待复审**,没有新增 `[✓]`。
## 最新执行摘要(2026-09-29 继续开发)
总体验收位置继续保持 **P0-03 完成,待复审**。本轮完成开发阶段的证书任务并发保护、DNS 验证阶段进度记录,以及域名与服务器双向多对多部署关联的回归核验;不代表生产部署验收通过。
- [x] 已完成,等待复审:同一域名的同类活动证书任务增加仓储层并发保护,重复创建返回冲突,避免并发任务绕过入口检查。
- [x] 已完成,等待复审:DNS 凭据权限验证、逐域名验证和证书申请阶段会同步任务阶段及中文进度信息。
- [x] 已完成,等待复审:一个域名可关联多个部署服务器,一个服务器可关联多个域名;关联读取、解除单个关联、项目权限和共享路径冲突已有回归覆盖。
- [x] 已完成,等待复审:后端多对多专项测试通过;前端 231 项测试全部通过,生产构建通过。
- [~] 进行中:P0-10 其余长任务取消、重试、崩溃恢复、实机数据库矩阵和统一复审仍需继续执行。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署和最终生产门禁仍未执行。
- [!] 总体验收不得升级:当前仍为 **P0-03 完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 最新验证摘要(2026-09-29)
- [x] 已完成,等待复审:双向多对多部署关系专项回归通过;一个域名支持多个服务器,一个服务器支持多个域名。
- [x] 已完成,等待复审:后端 `go test ./...`、前端 231 项测试、前端生产构建和 `git diff --check` 均通过。
- [~] 进行中:生产实机部署、三数据库矩阵、浏览器清缓存、密码 SSH、HTTPS/DNS/ACME 和服务重启恢复仍待执行或复核。
- [!] 总体验收位置继续保持 **P0-03:完成,待复审**,不得提前升级。
## 最新实机部署与验收进度(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮完成 Linux amd64 候选包部署、HTTPS 健康检查、服务重启恢复和浏览器缓存清理后的页面复核,不将这些结果提前标记为最终生产验收通过。
- [x] 已完成,等待复审:基于提交 `4229f44` 构建的 Linux amd64 发布包已通过 SHA-256 校验并部署到授权测试服务器;发布清单确认 `source_dirty=false`。
- [x] 已完成,等待复审:`https://odacm.cn/healthz` 和 `https://odacm.cn/readyz` 均返回成功;Nginx 配置检查通过并处于运行状态。
- [x] 已完成,等待复审:HTTPS 证书主题为 `odacm.cn`,SAN 包含 `odacm.cn`,签发方为 Let's Encrypt;未关闭 TLS 校验。
- [x] 已完成,等待复审:`Scert` 服务重启后保持 `active (running)`,重启后健康检查和就绪检查仍成功;重启后的日志未复现证书目录权限错误、路径所有者不可信或 HTTPS 证书读取失败。
- [x] 已完成,等待复审:清理浏览器缓存后重新登录,首页显示当前用户、邮箱、服务状态、版本、SQLite 数据库和反向代理 HTTPS 等基本信息;中文显示正常。
- [x] 已完成,等待复审:超级管理员访问 `/api/v1/ssh-keys` 返回 `200` 和空列表,不再出现“无权管理此项目的服务器”;私钥内容未通过接口返回。
- [x] 已完成,等待复审:域名配置页面的部署服务器选择支持多选,并明确显示一个域名可关联多个服务器、一个服务器可关联多个域名;5、10、15、30 条分页选项可见。
- [~] 进行中:远端数据库当前为空,现场只有一台可用测试服务器,尚未用虚构数据替代第二台真实服务器;双向多对多的生产数据关联、实际证书推送和回滚仍需具备真实目标后复核。
- [~] 进行中:三数据库生产矩阵、真实 DNS/ACME 申请、真实多服务器证书推送、最终生产门禁仍需继续执行。
- [!] 总体验收不得升级:当前仍为 **P0-03 完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 最新执行记录(2026-09-29,P0-10 任务取消入口)
- [x] 已完成,等待复审:HTTP 任务取消入口已支持仓储层定义的四种活动状态。
- [x] 已完成,等待复审:覆盖 `retry_wait`、`cancelling` 的任务和任务尝试取消回归;自动续期和管理证书任务仍由工作流控制。
- [x] 已完成,等待复审:后端定向测试、全量测试、静态检查和差异检查通过。
- [~] 进行中:P0-10 仍需继续审查其他任务入口、重试、幂等、恢复和跨数据库行为。
- [ ] 未开始:P0-12 备份恢复以及最终生产流程门禁。
- [!] 总体验收保持 **P0-03:完成,待复审**,没有新增 `[✓]`。
## 最新进度追加(2026-09-29,P0-10 通用取消入口状态一致性)
总体验收继续保持 **P0-03:完成,待复审**;本轮补齐通用仓储取消入口,不代表 P0-10 统一复审或生产部署验收通过。
- [x] 已完成,等待复审:通用 `CancelTask` 取消任务时,任务尝试同步覆盖 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。
- [x] 已完成,等待复审:新增四种活动状态的仓储回归测试,确认任务及任务尝试均进入 `cancelled` 并记录完成时间。
- [x] 已完成,等待复审:`go test ./...`、`go vet ./...`、`git diff --check` 均通过。
- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。
- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项。
## 最新执行记录(2026-09-29,P0-10 证书任务入口回归)
总体验收继续保持 **P0-03:完成,待复审**;本轮完成证书任务入口的开发阶段回归,不代表生产部署验收通过。
- [x] 已完成,等待复审:导入、恢复、校验入口均通过统一证书任务工作流,任务终态和尝试记录可核验。
- [x] 已完成,等待复审:无效证书任务执行配置在任务创建前被拒绝,不产生空任务或空尝试记录。
- [x] 已完成,等待复审:应用、HTTP、仓储专项测试、`go vet` 和差异检查通过,提交 `9741721` 已推送。
- [~] 进行中:DNS 验证任务、批量部署结果、崩溃恢复、重试幂等、三数据库实机矩阵和统一复审。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署及最终生产门禁。
- [!] 总体验收不得升级,仍为 **P0-03:完成,待复审**,没有新增 `[✓]`。
## 本轮开发进度(2026-09-29,P0-10 空部署目标防护)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅继续完成 P0-10 批量部署边界防护,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:批量部署目标为空时显式返回失败,不再把 0 台服务器错判为部署成功。
- [x] 已完成,等待复审:证书工作流在域名未关联任何部署服务器时提前失败,不调用远程部署。
- [x] 已完成:新增应用层与部署层回归测试;`go test ./...`、`go vet ./...` 和 `git diff --check` 均通过。
- [~] 进行中:P0-10 其余任务入口、失败回滚结果持久化、跨数据库矩阵、崩溃恢复与统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署、真实 DNS/ACME 和最终生产门禁仍未完成。
- [!] 总体验收不得升级:当前仍为 **P0-03:完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 本轮开发进度(2026-09-30,P0-10 证书任务启动取消竞态)
本轮按“先开发、后统一测试”执行,总体验收保持 **P0-03:完成,待复审**。
- [x] 已完成,等待复审:证书申请任务在启动状态更新、启动审计期间收到取消时,统一停止后续执行器调用。
- [x] 已完成,等待复审:取消响应为 HTTP 409,父任务及任务尝试保持 `cancelled`,覆盖启动错误竞态。
- [x] 已完成:新增 `TestTaskAPICancellationDuringStartupDoesNotExecuteCertificate`,并通过 `go test ./...`、`go vet ./...`、`git diff --check`。
- [x] 已完成,等待复审:代码提交 `415d504` 已在本地生成;推送因 `Authentication failed` 未确认远端收到。
- [~] 进行中:P0-10 其他任务链、DNS、跨数据库实机、崩溃恢复、重试幂等及统一复审。
- [ ] 未开始:P0-12 备份恢复、浏览器缓存清理、密码 SSH、远端部署及最终生产门禁。
- [!] 当前不得升级验收状态,仍为 **P0-03:完成,待复审**,不得新增 `[✓]`。
## 本轮执行记录(2026-09-30,P0-10 DNS 验证取消与临时凭据回收)
本轮按“先开发、后统一测试”执行,总体验收仍保持 **P0-03:完成,待复审**。
- [x] DNS 验证上下文在测试前已取消时不调用服务商适配器,且不保存临时凭据。
- [x] DNS 凭据保存成功后请求被取消时,已删除临时凭据并阻止令牌发布,避免未绑定密钥残留。
- [x] `go test ./...`、`go vet ./...`、`git diff --check` 已通过;本轮仅完成本地开发与自动化回归。
- [~] 继续执行:DNS 清理失败、令牌生命周期、初始化回滚、任务链、三数据库实机矩阵和统一复审。
- [ ] 尚未执行:P0-12、真实生产数据库清理、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁。
- [!] 不新增 `[✓]`;总体验收继续为 **P0-03:完成,待复审**。
## 本轮执行记录(2026-09-30,P0-10 DNS 临时凭据清理失败可重试)
本轮按“先开发、后统一测试”执行,总体验收仍保持 **P0-03:完成,待复审**。
- [x] 单个 DNS 临时凭据回收失败后保留验证令牌,修复为可重试清理。
- [x] 批量 DNS 临时凭据回收失败后仅恢复失败会话,受保护正式凭据仍不受影响。
- [x] `go test ./...`、`go vet ./...`、`git diff --check` 已通过;本轮仅完成本地开发与自动化回归。
- [~] 继续执行:DNS 过期清理、初始化回滚、令牌生命周期、任务链、三数据库实机矩阵和统一复审。
- [ ] 尚未执行:P0-12、真实生产数据库清理、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁。
- [!] 不新增 `[✓]`;总体验收继续为 **P0-03:完成,待复审**。
## 本轮执行记录(2026-09-30,P0-10 DNS 过期凭据清理重试)
本轮按“先开发、后统一测试”执行,总体验收仍保持 **P0-03:完成,待复审**。
- [x] 过期 DNS 会话删除临时凭据失败时恢复原会话,避免清理失败造成不可重试残留。
- [x] 清理重试成功后令牌仍不可用,验证会话不会因补偿清理重新获得授权。
- [x] `go test ./...`、`go vet ./...`、`git diff --check` 已通过;本轮仅完成本地开发与自动化回归。
- [~] 继续执行:DNS 初始化回滚、令牌消费、任务链、三数据库实机矩阵和统一复审。
- [ ] 尚未执行:P0-12、真实生产数据库清理、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁。
- [!] 不新增 `[✓]`;总体验收继续为 **P0-03:完成,待复审**。
## 本轮执行记录(2026-09-30,P0-10 DNS 清理状态与容量边界)
本轮开发仍处于 **P0-03:完成,待复审**,未进入生产部署验收通过状态。
- [x] 待清理凭据:保存失败或请求取消后的删除失败引用进入重试集合,后续操作自动执行补偿清理。
- [x] 容量边界:过期会话清理失败并等待重试期间,继续计入会话容量,避免并发超限。
- [x] 验证结果:`go test ./...`、`go test -race ./internal/setup`、`go vet ./...`、`git diff --check` 已通过。
- [~] 继续执行:初始化回滚、令牌消费、任务链、三数据库实机矩阵、生产环境测试和统一复审。
- [!] 本地自动化验证不得替代密码 SSH、远端部署、真实 DNS/ACME 和最终生产门禁;不得新增 `[✓]`。
## 本轮开发进度(2026-09-30,P0-10 数据库验证取消与清理状态收敛)
总体验收位置继续保持 **P0-03:完成,待复审**。本轮完成数据库验证生命周期的取消边界、凭据清理串行化和单个令牌回收状态收敛;仅代表本地开发验证,不代表生产部署验收通过。
- [x] 已完成,等待复审:数据库验证在凭据保存前、配置解析前、连接验证后和令牌生成前检查请求取消,取消请求不再发布验证令牌。
- [x] 已完成,等待复审:临时凭据删除操作串行化,避免并发清理同一引用产生状态竞态。
- [x] 已完成,等待复审:单个数据库令牌回收失败时恢复可重试会话,成功时移除过期状态;过期清理失败仍保持令牌不可用并保留内部重试状态。
- [x] 已完成:`go test ./internal/bootstrap`、`go test -race ./internal/bootstrap` 通过;本轮提交 `6711c9b`、`14833be` 已推送。
- [~] 进行中:P0-10 初始化回滚、任务链、重试幂等、三数据库实机矩阵和统一复审仍需继续。
- [ ] 未开始:P0-12、真实生产数据库清理与初始化、密码 SSH、远端多服务器部署、真实 HTTPS/DNS/ACME、Linux/Windows 服务和最终生产门禁。
- [!] 不得标记 `[✓]`;总体验收仍为 **P0-03:完成,待复审**。
## 本轮更新(2026-09-30,expiredCleaning 状态保护)
总体验收位置仍为 **P0-03:完成,待复审**。本轮完成数据库过期清理的执行状态和批量接管边界,仅作为本地开发和回归验证证据,不等同于生产验收通过。
- [x] 过期会话开始清理时记录 `expiredCleaning`,避免单项清理与批量清理重复删除。
- [x] 批量清理可接管失败后尚未执行的过期清理,但不接管正在执行的清理。
- [x] 新增批量接管失败过期清理的回归测试,专项测试和竞态测试均通过。
- [~] P0-10 其他任务、跨数据库实机矩阵和统一复审继续进行中。
- [ ] 真实生产数据库、密码 SSH、远端部署、HTTPS/DNS、ACME、Linux/Windows 服务和最终生产门禁仍未完成。
- [!] 不新增 `[✓]`,不以本地结果代替生产验收。
## 本轮开发进度(2026-09-30,P0-03 SSH 公钥部署阻塞修复)
总体验收继续保持 **P0-03:完成,待复审**,本轮仅完成 SSH 公钥部署实现修正与本地回归,不代表生产部署验收通过。
- [x] 已完成,等待复审:修正公钥安装脚本的 `fmt.Sprintf` 参数传递,确保实际编码公钥被写入远端。
- [x] 已完成,等待复审:修正 `authorized_keys` 追加逻辑,使用真实换行,不再写入字面量 `\\n`。
- [x] 已完成,等待复审:补充公钥读取失败、密码连接关闭失败的 SSH 阶段日志。
- [x] 已完成:新增公钥安装脚本回归测试;`go test ./...`、`go test -race ./internal/deployment ./internal/httpapi ./internal/app`、`go vet ./...`、`go build ./...`、`git diff --check` 均通过。
- [~] 进行中:需重新构建正式候选包并部署到实机,通过现有失败服务器记录复测密码连接、公钥写入、私钥回连和状态持久化。
- [ ] 未开始:证书文件推送、Nginx 配置校验/重载、失败回滚、真实多服务器部署和最终生产门禁。
- [!] 第二台真实服务器仍不可用,不以虚构数据替代多服务器生产验收。
- [!] 总体验收不得升级:仍为 **P0-03 完成,待复审**,没有新增 `[✓]`。
## 本轮实机阻塞修复进度(2026-09-30,Ed25519 公钥编码)
总体验收继续保持 **P0-03:完成,待复审**。实机日志已确认前一轮 502 的真实根因,本轮完成代码修复和专项回归,尚未重新部署复测。
- [x] 已定位:`AuthorizedPublicKey` 将 `ssh.Signer.PublicKey()` 错误再次传给 `ssh.NewPublicKey`,导致 `ssh: unsupported key type ssh.ed25519PublicKey`。
- [x] 已完成,等待复审:改为直接使用 `ssh.MarshalAuthorizedKey(signer.PublicKey())` 输出授权公钥。
- [x] 已完成:新增 Ed25519 私钥授权公钥读取及指纹一致性测试;`go test ./internal/sshkey ./internal/deployment ./internal/httpapi` 通过。
- [~] 进行中:重新执行全量检查、构建 Linux amd64 候选包、部署并通过现有服务器记录复测。
- [ ] 未开始:证书推送、Nginx 配置校验/重载、失败回滚、真实多服务器部署和最终生产门禁。
- [!] 总体验收不得升级:仍为 **P0-03 完成,待复审**,没有新增 `[✓]`。
## 本轮任务看板更新(2026-09-30,双 Linux 候选服务健康复核)
- [x] T1 固化主清单、执行清单和生产门禁矩阵;当前总体验收位置仍为 P0-03,相关清单已同步本轮证据。
- [~] T2 审查并补齐 P0-10 任务恢复、重试和幂等运行态缺口;本地专项测试已持续通过,统一复审仍未完成。
- [x] T3 完成全量 Go/前端测试、构建和静态检查;正式候选构建前源码工作区为干净状态。
- [x] T4 编译正式候选包并部署到两台 Linux 服务器;两台服务器服务、Nginx、存储 socket 均恢复正常。
- [~] T5 验证一域名多服务器、多域名单服务器、失败回滚和重试幂等;两台服务器的 `/readyz` 已返回 200,但真实业务部署证据和失败恢复证据仍需补齐。
- [x] T6 更新整改主清单、执行清单、Linux 测试记录和数据库支持矩阵;本轮实机健康检查结果已写入相关文档,等待复审。
- [ ] T7 输出最终上线结论;在 T5、三数据库矩阵、Windows 服务、清库初始化、公网 HTTPS/DNS/ACME 和备份恢复门禁完成前,不标记全量生产验收通过。
### 本轮现场证据摘要
- `8.137.23.95`(`ikun1`):`Scert=active`、`nginx=active`、`Scert-storage.socket=active`、内部 `/readyz=200`。
- `45.136.13.241`(`yc`):`Scert=active`、`nginx=active`、`Scert-storage.socket=active`、内部 `/readyz=200`。
- `odacm.cn` 首页当前返回 HTTP `200`,但本机解析为 `198.18.0.109`,尚不能作为公网 DNS 指向测试服务器的证据。
- 本轮只读复核未修改远端数据库、DNS、证书或 Smail 服务。
总体验收仍为 **P0-03:完成,待复审**,本轮没有新增 `[✓]`。
## 本轮任务看板更新(2026-09-30,多服务器 HTTPS 逐台校验代码完成)
- [x] T1 主清单、执行清单和生产门禁矩阵已同步当前证据。
- [~] T2 任务恢复、重试和幂等仍需结合实机失败场景统一复审。
- [x] T3 多服务器 HTTPS 校验代码已接入;全量 `go test ./...`、`go vet ./...` 和差异检查通过。
- [~] T4 需要使用最新提交重新构建正式 Linux amd64 候选包并部署到两台服务器,不能沿用旧候选包作为本轮代码证据。
- [~] T5 逐台验证一域名多服务器、单服务器多域名、真实证书推送、Nginx 校验/重载、失败回滚和重试幂等;第一台服务器的真实 Nginx 站点配置仍需补齐并复核。
- [x] T6 整改主清单、执行清单和 Linux 测试记录已追加本轮代码证据。
- [ ] T7 三数据库、Windows 服务、清库初始化、公网 HTTPS/DNS/ACME、备份恢复和最终上线结论仍未完成。
- [!] 总体验收继续保持 **P0-03:完成,待复审**,不能以自动化测试或页面提示替代生产验收。
## 任务看板更新(2026-10-01)
- [x] T2 部署事务锁获取失败终态修复:补齐锁冲突、锁归属写入失败和锁阶段持久化失败的事务收尾逻辑。
- [x] T2 回归测试:新增无锁持有冲突和部分锁持有冲突测试,确认已有锁保留、本次锁释放、事务最终状态正确。
- [x] T3 本地后端全量回归:`go test ./...` 通过。
- [~] T4 最新候选包重新构建及双 Linux 服务器部署复核。
- [~] T5 双服务器业务部署、失败回滚、重试幂等和恢复证据仍需使用最新候选包复审。
- [ ] T7 三数据库矩阵、Windows 服务、清库初始化、公网 HTTPS/DNS/ACME、SMTP、备份恢复和最终上线结论。
- [!] 总体验收不得升级,当前仍为 **P0-03:完成,待复审**。
本轮提交:`1fad8db`(代码修复)、`d315179`(回归测试)。
## 最新实机复核(2026-10-01,最新候选包双服务器业务部署)
本轮使用密码 SSH 和正式管理接口复核,未创建辅助验收脚本,未修改远端数据库内容,未关闭 TLS 校验。Windows 环境按当前上线范围暂不处理。
- [x] 最新候选包已安装到 `8.137.23.95` 和 `45.136.13.241`;两台服务器的 `Scert`、`Scert-storage.socket`、Nginx 均为 `active`。
- [x] 两台服务器的 `https://127.0.0.1:8443/readyz` 均返回 HTTP `200`。
- [x] 已验证域名 `scert-multi-20260930.apmmk.cn` 同时绑定两台服务器;服务器端反向查询也能看到该域名。
- [x] 已验证服务器 `45.136.13.241` 同时托管 `scert-20260930.apmmk.cn` 和 `scert-multi-20260930.apmmk.cn`;满足一台服务器多个域名的关系模型要求。
- [x] 使用最新候选服务重新执行证书部署,返回 `total=2`、`success=2`、`failed=0`,两台服务器均报告“证书部署、配置校验并 reload 成功”,`verification_status=success`。
- [x] 两台服务器目标证书文件均已写入 `/ssl/scert-multi-20260930.apmmk.cn/single/`,证书 SHA-256 指纹均为 `43:06:3C:07:26:D3:43:62:B2:54:CE:28:B6:6D:7E:B6:37:E0:0B:16:5F:68:EC:0D:07:FC:ED:0D:F2:C6:4A:D2` 的同一证书(记录中保留冒号格式时以 OpenSSL 输出为准)。
- [x] 两台服务器均执行 `nginx -t` 成功,并通过本机 SNI HTTPS 请求返回 HTTP `200`。
- [x] 已确认历史失败部署任务的失败结果持久化了各服务器状态和备份标识;最新候选服务启动后未再产生新的空归属 `acquiring` 事务。
- [!] 现有历史 `recovery_required` 事务仍缺少可信恢复证据,未直接改库伪造成功;相关现场保留人工核查状态。
- [~] 失败回滚的真实双服务器故障注入、任务级重试幂等、真实公网 DNS/ACME、Smail 系统账户 SMTP、三数据库矩阵和备份恢复仍需继续。
### 当前任务看板
- [x] T1 主清单、执行清单和 Linux 实机记录已同步。
- [x] T2 部署锁获取失败、空锁恢复和事务终态修复已完成并部署复核。
- [x] T3 最新 Linux amd64 候选包双服务器安装及基础健康检查完成。
- [x] T4 一域名多服务器、单服务器多域名关系和最新候选证书部署成功。
- [~] T5 真实失败回滚、重试幂等和历史恢复证据统一复审。
- [~] T6 公网 DNS/ACME、Smail SMTP、数据库生产矩阵和备份恢复。
- [ ] T7 最终生产门禁和上线结论。
总体验收位置仍为 **P0-03:完成,待复审**,本轮不得标记全量生产验收通过。
## 2026-10-01 反向代理端口收敛记录
本节补充当前部署要求,不覆盖历史记录。当前仅处理 Linux;本轮是保留数据的端口配置复核,不代表清库首次初始化验收。
- [x] 已完成,等待复审:两台服务器通过密码 SSH 核验,Scert 均仅监听 `127.0.0.1:8443`;没有 `0.0.0.0:8443` 或 `[::]:8443` 监听。
- [x] 已完成,等待复审:Nginx 对外监听 `80/443`,两台服务器的 `nginx -t` 均通过;未修改邮件及其他既有站点。
- [x] 已完成,等待复审:第二台管理入口 `odacm.cn` 的 HTTP 请求返回 301 并跳转 HTTPS,反代 `/readyz` 和回环上游 `/readyz` 均返回 200;上游启用 SNI 和证书校验。
- [x] 已完成,等待复审:从第二台服务器按正常 DNS 访问管理域名,连接地址为 `45.136.13.241`,HTTPS 就绪检查返回 200;该结果不是独立外部客户端的完整生产验收。
- [x] 已完成,等待复审:静态 systemd 模板已提交并推送 `48d10fe`;动态生成的 Linux unit 同步回环监听约束,并补充模板与生成器回归断言。
- [x] 已完成,等待复审:本地后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过;本机 Windows 测试不代替 Linux 专属用例执行。
- [~] 进行中:使用干净提交构建 Linux 候选包,核对安装后的默认 unit 和动态生成配置,并补充 Linux 专属用例证据。
- [!] 暂缓或存在阻塞:历史恢复事务、双服务器真实失败回滚与重试幂等、Smail SMTP、数据库生产矩阵、备份恢复及最终生产门禁仍未完成。
端口边界:不新增公网业务端口,不为内部 `8443` 添加防火墙或安全组放行规则。SSH 运维端口与其他已有服务不属于本次端口收敛的修改范围。总体验收保持 **P0-03:完成,待复审**,不新增全量验收通过结论。
### 反向代理端口收敛复核结果(2026-10-01 16:35,北京时间)
- [x] 已完成,等待复审:构建提交 `51f7f3e55cee16d3b747bea30e0382fca4b25dd1`,发布清单 `source_dirty=false`;Linux 包位于 `build/release-20261001-loopback/Scert-20261001-V0.1.0-linux-amd64.tar.gz`。
- [x] 已完成,等待复审:包 SHA-256 为 `2953f52d252194fda7865e1ee06e548204fdfdb818dab28ce10611087ba94443`;两台服务器上传后校验一致,包内 `SHA256SUMS` 全部通过。
- [x] 已完成,等待复审:两台服务器均经官方安装器安装成功并启动,安装退出码均为 0;主服务、存储 socket 和 Nginx 均正常,主服务重启计数为 0。
- [x] 已完成,等待复审:两台服务器 `/scert/scert` 的 SHA-256 均为 `beeade4c38e1be7f8af29b42d08896ca4f9efcb782c3f0a278f58fd0abc9baae`,与本地候选二进制一致;已安装的主 unit 自身包含回环监听设置,不再仅依赖 drop-in。
- [x] 已完成,等待复审:在第二台 Linux 上执行仓库 `internal/servicehost` 的编译测试程序,9 项全部通过,覆盖动态 unit 和发布模板回环约束;没有创建辅助验收脚本,此结果仅作为代码回归证据。
- [x] 已完成,等待复审:本地前端 241 项测试通过,正式前端及 Linux 后端构建通过。
- [x] 已完成,等待复审:升级后两台 Scert 均监听 `127.0.0.1:8443`,Nginx 仍对外监听 `80/443`,`nginx -t` 通过;未改动已有站点或新增公网放行规则。
- [x] 已完成,等待复审:第二台回环上游按管理域名 SNI 和系统 CA 严格验证返回 200;第一台作为独立客户端按正常 DNS 访问 `https://odacm.cn/readyz` 返回 200,连接地址为 `45.136.13.241`。
- [x] 已完成,等待复审:两台服务器交叉探测对方公网 `8443` 均超时;结合实际监听地址确认该内部端口未对外监听,未据此声称其他已有服务端口全部关闭。
- [!] 边界说明:第一台内部管理服务沿用原有 IP 自签证书,使用测试域名和系统 CA 直连会失败;通过密码 SSH 核查证书及 IP SAN 后,以该证书作为显式信任文件访问回环上游返回 200,未关闭 TLS 校验。这仅是该机内部健康核验,不是第一台管理入口的公网受信 TLS 验收。
- [!] 边界说明:本轮保留数据库,没有执行清库首次流程;未额外制作数据备份,官方安装器自身保留升级前发布文件以支持失败回退。完整生产验收仍为 **P0-03:完成,待复审**。
### 部署重试阻塞修复进度(2026-10-01 16:51,北京时间)
本节为本轮当前状态说明,前文保留为历史记录。P0-03 的局部代码复审状态不代表整个项目的生产验收状态;本轮上线范围仅 Linux,不将 Windows 列为阻塞。
- [✓] 复审通过:双机服务保持回环监听 127.0.0.1:8443,由 Nginx 80/443 对外提供服务;本轮未新增公网业务端口。
- [x] 已完成,等待复审:通过正式部署接口制造第一台 Nginx 校验命令失败,两台部署报告整体失败,恢复报告为 success;随后已恢复正常校验命令,双机 nginx -t 通过。该验证使用同一证书重部署,不代表不同新旧证书切换验收。
- [x] 已完成,等待复审:定位部署重试自冲突。HTTP 重试已创建尝试并标记原任务运行,但应用装配再次调用创建任务的工作流,将自身判为同类活动任务。新增真实应用登录与路由装配回归,修复前稳定返回 502。
- [x] 已完成,等待复审:拆分普通部署与已有任务执行回调,普通部署继续创建任务,重试只执行原始证书部署流程,保留权限、审计、尝试记录与事务关联。
- [x] 已完成,等待复审:定向回归验证唯一父任务、失败后成功的两次尝试、原任务事务关联、并发重试 409、成功后重复重试 409;后端 go test ./... 与 go vet ./... 通过。
- [~] 进行中:竞态测试、干净提交构建、双机升级和真实失败任务重试复核。当前尚未取得修复后的实机成功证据。
- [!] 暂缓或存在阻塞:历史恢复事务、Smail SMTP、数据库生产矩阵、备份恢复与最终清库首次部署门禁仍未闭环,不宣称生产验收通过,不给缺乏依据的完成百分比。
现场失败任务标识:683ef23a-c912-4f46-b2a6-3ec11908808e。本轮保留其数据用于复现与修复验证,不属于清库首次流程;没有直接改库伪造状态,也没有创建辅助验收脚本。
本轮补充回归:应用装配测试同时核对双服务器结果归属于第二次尝试,以及开始和成功审计的操作者关联;缺少已有任务执行器时返回 501,不回退到创建任务入口,不改变原任务状态。后端全量测试与 vet 再次通过;app/httpapi/repository 竞态测试通过,补充用例的定向竞态测试通过;前端 241 项通过。实机复测尚待新包部署。
### 部署重试双机实测复核结果(2026-10-01 17:02,北京时间)
以下为本轮最新结果,更新前述“尚待实机复测”的状态;只关闭部署重试自冲突这一子项,不等同于完成全部生产门禁。
- [✓] 复审通过:修复提交 302111c8affd6c31c6d616eed45a2a8cee42843c 已推送,发布清单 source_dirty=false;使用正式构建流程生成 Linux 包,并通过官方安装器升级两台测试服务器,安装及启动退出码均为 0。
- [✓] 复审通过:发布包 build/release-20261001-deploy-retry/Scert-20261001-V0.1.0-linux-amd64.tar.gz,SHA-256 为 0ad94de03e625eb5fd6789e1fa84f8cad8298e2487876f55d34e36f14df7c878;双机上传和包内 SHA256SUMS 校验均通过。
- [✓] 复审通过:两台 /scert/scert 的 SHA-256 均为 393ae5a1cfaf8e4442ec30e47950f020e6ab47adb47af7fdca45a36eb9486ed2;Scert 与 Nginx active,NRestarts=0。
- [✓] 复审通过:复用真实失败任务 683ef23a-c912-4f46-b2a6-3ec11908808e,通过正式重试接口同时提交两次请求,一个返回 200、双服务器部署成功并通过 HTTPS 校验;另一个返回 409,没有执行第二次部署。成功后再重试返回 409。
- [✓] 复审通过:原任务保留,未产生嵌套父任务;尝试记录只从 3 增加到 4,第 4 次为 success,两台部署结果均关联该次尝试 b9ca3a51-30af-4d2c-9655-758509140f5e。旧失败记录保留用于追溯。
- [✓] 复审通过:只读核对数据库,首次失败的两个事务均为 rolled_back;本次两个事务 20261001-085936.117414575-5eecfbb86709、20261001-085940.320149826-09d1cf34f629 均为 committed;开始及成功审计均关联原任务和实际操作者。没有直接修改数据库状态。
- [✓] 复审通过:两台证书目录均无残留锁及 scert-tmp 文件;nginx -t 通过,证书和证书链文件哈希一致。第一台通过带 SNI 和主机名校验的 TLS 连接核对第二台站点证书指纹,仍与部署前同一正式证书一致。
- [✓] 复审通过:升级后 Scert 仍仅监听 127.0.0.1:8443,Nginx 通过 80/443 提供 Web 服务;管理入口前端与 readyz 返回 200,第二台回环上游仍使用系统 CA 严格校验。没有开放额外公网业务端口,未关闭 TLS 或 SSH 主机校验。
- [!] 仍需处理:历史事务 20260930-231310.231207974-5bf9d1e37542、20260930-231313.144123222-ce71b1dfe14e 的恢复证据字段为 null,服务保留 recovery_required 并拒绝自动接管;本轮没有伪造历史证据或强改终态。
- [ ] 未开始:本轮修复后的最终清库首次部署验收。Smail SMTP、数据库矩阵及备份恢复等其余上线门禁仍需按原任务清单验证。
本轮运维使用密码 SSH,没有新建辅助验收脚本;没有额外制作远端数据备份。安装器自行保留升级前发布文件,未擅自删除。以上域名、服务器及凭据仅用于测试,不作为产品验收规则。
## 最新有效任务看板补充(2026-10-01 17:15,北京时间)
本节更新前文过时看板,保留历史证据。当前只处理 Linux,Windows 不在本轮范围内。
- [✓] T5-6 进程崩溃恢复子项:双机事务进入 reload_attempted 后终止主进程,systemd 自动拉起,启动恢复将两个事务回滚完成。双机无残留锁或临时文件,Nginx 校验和本机严格 HTTPS 均正常。
- [✓] T5-6 中断任务重试子项:恢复正常重载命令后,原任务 72f4222a-3706-419c-847c-0fcb55b436f2 重试成功;第二次尝试关联双机成功结果及两个 committed 事务,成功后再次重试为 409。
- [✓] 临时配置收尾:第一台 reload_command 已恢复为正常 nginx -s reload,未遗留 sleep 延迟;人工运维继续使用密码 SSH。
- [✓] 端口边界:双机只在本机监听 Scert 8443,Web 访问通过 Nginx 80/443;管理入口正常,未增加公网业务端口。
- [!] 第一台测试域名公网访问:HTTP 返回 403 及 Non-compliance ICP Filing 拦截页面,HTTPS 握手失败;本机严格 HTTPS 正常。此项不计公网验收通过,不绕过平台限制。
- [~] T5-6 其余负向场景:锁归属不匹配、文件摘要不匹配、负向 HTTPS 恢复及不同新旧证书切换继续待复核;本轮没有重复签发证书。
- [~] T5-8 历史现场:两条无可信恢复证据事务保持 recovery_required,禁止强改终态或伪造证据。
- [ ] T4-3 与 T7 剩余生产门禁:最终清库首次流程、系统 SMTP、超级管理员密码重置、数据库矩阵、备份恢复与升级回滚等按原清单继续执行。
本轮是保留故障证据的连续复测,不是清库首次初始化验收;没有创建辅助验收脚本,没有额外制作远端数据备份。整体生产验收仍未放行。
## 最新有效数据库整改进度(2026-10-01 17:45,北京时间)
本节沿用已确认需求并补充最新进度;前文各日期记录保留为历史证据,不再以旧版模式 14 推断当前代码状态。当前迁移最高版本为 18;只处理 Linux,不将本地交叉编译视作 Linux 原生构建。
- [✓] SQLite 正式 CLI 子项:修正写死模式 14 的过时断言,检查内嵌源码迁移序号及数据库历史连续性;增加幂等表、任务尝试、部署结果、部署事务与恢复证据的非空恢复样本。第二台 Linux 的历史备份、升级后备份两个恢复子场景通过,进程退出 0。测试修正提交 dbcdf05 已推送。
- [✓] MySQL 8.0.46 仓储子项:第二台隔离实库的 9 个主测试、92 个子场景全部通过,无失败或跳过;涵盖项目、成员及资源相关仓储行为,不等同于完整 Web 验收。
- [✓] PostgreSQL 16.15 备份恢复子项:success、certificate、cancel、permission、inventory、authentication、tls 七场景通过,进程退出 0。六场景使用独立正式 CLI;cancel 是进程内确定性取消加真实数据库回退,不冒充独立 CLI 取消验收。
- [!] PostgreSQL 14.24 首次尝试:因工具版本低于当前备份入口要求而失败,保留失败记录;之后改用经官方签名索引验证的隔离 16.15 工具,不修改系统 APT 源、不安装全局 PostgreSQL 服务。
- [~] MySQL 中断恢复修复:原有实测发现模式 15~17 的四个中断边界因表已存在而失败。正在加入结构校验、可重入建表、事务内幂等回填与版本记录,并补充部分回填、数据冲突、字段和索引异常负向测试;新版实库回归尚在运行,不能提前标记通过。
- [✓] 网络边界只读复核:双机 Scert 仍只监听 127.0.0.1:8443,MySQL 只监听 127.0.0.1:3306;Web 由 Nginx 80/443 提供。没有增加公网服务端口。
- [ ] 待完成:MySQL 修复后的全量门禁、正式构建及双机部署;MySQL 5.7、本轮三库完整 Web 流程、系统发信及密码重置、备份恢复剩余矩阵、最终清库首次部署等。
本轮各实库测试创建自己的隔离数据库,未清空现有业务数据库;没有创建辅助验收脚本、没有额外备份远端业务数据。整体生产验收仍未放行。
## 最新有效复核结果(2026-10-01 18:02,北京时间)
本节更新 17:45 记录中的 MySQL 迁移修复及正式包部署状态;只关闭这些子项,不放行整体生产验收。
- [✓] MySQL 中断重入修复:提交 c6982ab827038c2cb16bc1432fb393f68a5296e2 已推送。模式 15~17 恢复前校验字段、默认值、空值约束、排序规则、索引和存储引擎;模式 15 将幂等回填与版本标记放在同一事务,拒绝不一致历史,不覆盖冲突数据。
- [✓] Linux MySQL 8.0.46 最终实库回归:18 个部署迁移恢复与负向子场景、91 个完整迁移子场景,共 109 个子场景全部通过,无失败或跳过;临时单元已结束,退出 0。此前四个真实失败边界已复测通过。
- [✓] 本地质量门禁:后端 go test -count=1 ./...、go vet ./... 通过;database 和 cli 两个包竞态测试通过;前端 241 项通过。未启用的本地外部数据库测试不因此视为通过。
- [✓] 正式构建:仅生成 Linux 包,source_dirty=false,23 项 manifest 产物哈希与大小核对一致;此为交叉编译,不冒充 Linux 原生构建。归档 SHA-256 为 c075297e9f8f76f4ebb8fa28d43a4099ca853a3619212d5e7f51e78d4b0e9e4d。
- [✓] 新正式程序回归:SQLite 历史与升级后备份恢复两个子场景通过;PostgreSQL 16.15 七场景再次通过,独立 CLI 与进程内取消的范围区分不变。
- [✓] 双机部署:官方安装器安装及启动成功,主程序 SHA-256 均为 39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d;服务 active、NRestarts=0,Nginx 校验成功,管理入口首页及 readyz 正常。双机仍为 Scert 回环监听、Nginx 80/443 对外,无新增公网业务端口。
- [x] 停服保护现场:安装器先后拒绝主服务及目录 socket 尚未停止的操作;完整停服后重试成功,失败记录保留。这是停服升级,不宣称零中断。
- [~] MySQL 备份恢复剩余实库矩阵:已启动 scert-mysql-cli-20261001-1801,运行中,尚无最终结论。该套测试主要调用正式命令与维护实现的进程内入口,不能冒充全部独立发行 CLI 验收。
- [!] 其余限制仍有效:第一台测试域名公网平台拦截、两条无可信恢复证据历史事务、MySQL 5.7、完整 Web 流程、系统发信与密码重置、最终清库首次部署及其余原清单门禁尚未全部闭环。
### 最新接续状态与任务确认(2026-10-01 18:15,北京时间)
本节更新前文历史快照;旧章节中“当前有效”仅指其记录时点,不代表本轮状态。沿用原始四十四项需求,本次仅验收 Linux,Windows 不在本轮范围;不以历史 P0-03 局部状态代表全部生产门禁。
- [x] 已完成,等待复审:MySQL 8.0.46 备份恢复矩阵单元 `scert-mysql-cli-20261001-1801` 已真实结束,退出零;日志 `mysql-cli-release.log` 中二十一个主测试、一百三十六个子场景通过,零失败、零跳过。服务器日志开始时间为北京时间 18:01:26,结束为 18:06:49。
- [x] 已完成,等待复审:本批矩阵覆盖备份快照、官方导入导出互操作、视图、触发器、例程、事件、权限和失败回退。主要调用进程内正式实现,不冒充独立发行程序全量验收。
- [x] 已完成,等待复审:双机服务正常;Scert 仅监听回环 8443,MySQL 仅监听回环 3306;第二台的 33060 同样仅监听回环。Web 对外使用 Nginx 80/443,不新增公网业务端口,不修改第一台现有邮件端口。
- [!] 暂缓或存在阻塞:只读检查确认双机 Scert 均未启用 SMTP,主机、系统通知用户名、凭据引用均为空;缺少可用系统通知配置,不能宣称真实发信与邮件密码重置通过,不使用普通邮箱替代。
- [~] 进行中:复用仓库现有 MySQL 隔离实库测试,增加独立正式发行程序调用;保留严格 TLS、凭据加密存储、成功恢复及 SQL/证书失败回退断言,不创建辅助验收脚本,不接触业务数据库。
- [ ] 未开始:将新增测试编译到 Linux,在第二台隔离数据库中验证当前正式发行程序,再记录实际通过或失败结果。
- [!] 暂缓或存在阻塞:MySQL 5.7、完整三库 Web 流程、Linux 原生构建、其余部署负向场景、历史事务核查、系统发信与最终清库首次部署等仍未闭环;整体生产验收未放行。
### MySQL 独立发行程序验收结果(2026-10-01 18:22,北京时间)
- [x] 已完成,等待复审:新增仓库测试 `TestMySQLRealReleaseBackupRestoreCommands`,复用现有成功、SQL 失败、证书恢复失败场景;通过独立进程调用正式发行程序,不再依赖测试进程的 TLS 注册表。未创建辅助验收脚本。
- [x] 已完成,等待复审:第二台 Linux 上单元 `scert-mysql-release-cli-20261001-1818` 真实结束,退出零;三个子场景全部通过,耗时 33.85 秒,日志为 `/var/tmp/scert-db-matrix-20261001-1720/mysql-release-cli.log`。
- [x] 已完成,等待复审:验证对象为已部署候选同源的正式发行程序 `/var/tmp/scert-release-mysql-reentry-20261001/scert`,SHA-256 为 `39b70a1a11148982baeb699bae749f7e2988a2fba02b001c0da740ba8b86f36d`;测试程序 SHA-256 为 `88ff0fec3f2ab9a14f89dd52f384a677ecfb450f679b077ec47e83649644eb09`。
- [x] 已完成,等待复审:隔离 MySQL 8.0.46 仅监听回环,使用严格 TLS;只在子进程中信任隔离证书,数据库密码通过加密凭据引用读取,未更改系统信任库。断言覆盖业务数据、审计数据、配置、主密钥、加密凭据、证书及失败后恢复前快照。
- [x] 已完成,等待复审:本地后端全量测试、全量静态检查、CLI 竞态测试和差异检查通过。本地条件跳过不计实库通过;本批只修改测试,没有更换线上程序。
- [~] 进行中:准备在隔离目录使用固定工具链执行 Linux 原生正式构建,避免将 Windows 交叉编译包冒充 Linux 原生证据;不新增公网监听,不更改生产工具链或业务配置。
- [!] 暂缓或存在阻塞:上述三个独立 CLI 场景不代表全部数据库、Web 或生产流程验收通过;既有 SMTP 配置缺失、历史事务核查及其他未完成门禁继续保留。
### 2026-10-01 19:27 端口约束与原生部署复核
- [x] 已完成,等待复审:Linux amd64 原生正式构建完成,归档哈希已核对。
- [x] 已完成,等待复审:同一正式归档已通过官方安装器部署到双机,Nginx 保持运行。
- [x] 已完成,等待复审:Scert、MySQL 和 MySQL X Protocol 均保持回环监听;公网项目入口仅使用 Nginx 80/443。
- [x] 已完成,等待复审:绕过本机代理直连检查内部端口不可达,排除代理造成的端口探测误报。
- [!] 暂缓或存在阻塞:整体生产验收仍等待发信、密码重置、完整 Web 流程、历史事务和最终清库首次部署等门禁闭环。
## 2026年10月1日安全边界与反代复核
本轮只记录不含认证信息的实机结果;不记录服务器口令、RAM 密钥、数据库密码、邮件服务密码、私钥、令牌或一次性链接。用户要求的安全边界解释为:Scert 管理入口不得绕过 Nginx 对公网提供服务,公开入口只使用 Nginx `80/443`。
- [✓] 双机 `Scert.service`、证书目录 socket、Nginx 和数据库服务均处于运行状态;两台 Scert 均只监听 `127.0.0.1:8443`,数据库端口只监听回环地址。
- [✓] 双机 Nginx 配置检查通过;第二台 `odacm.cn` 本机反代复核为 HTTP `301` 跳转 HTTPS,`/readyz` 返回 HTTP `200` 和 `status=ready`。
- [✓] 第一台已确认 `8443`、`9998`、`9999` 的拒绝规则位于宽范围规则之前;第二台入站默认拒绝,邮件 Web 上游端口仅保留本机来源规则,不作为公网 Scert 管理入口。
- [✓] 本轮未停止或删除 Smail/PMail,不修改邮件协议端口;邮件 Web 继续由 Nginx 站点代理,Scert 验收只认 `80/443`。
- [!] Scert 日志仍保留两条历史 `recovery_required` 事务的证据不足错误;不得清理、改写或伪造终态,P0-10 和总体生产验收继续阻塞。
- [~] 当前安全入口子项可复审;完整三数据库 Web 流程、系统账户真实发信、验证码重置、P0-10 负向实机矩阵和干净候选包最终门禁仍未完成。
## 2026年10月1日 SSH 密码认证实机复核
- [✓] 已完成,等待复审:两条历史部署服务器记录已通过正式服务器编辑接口切换为 SSH 密码认证,历史 SSH 私钥引用已清空,主机指纹、TLS 证书路径和密码凭据引用保留。
- [✓] 已完成,等待复审:两台部署服务器均使用 SSH 密码完成证书推送、Nginx 配置校验和 reload;两个托管域名均完成双服务器部署,站点 HTTPS 校验通过。
- [✓] 已完成,等待复审:生产 API 不提供 SSH 私钥路由,历史 CLI `ssh-key` 命令仅返回停用提示,不读取配置、不读取凭据、不执行远程操作。
- [✓] 已完成,等待复审:远端孤立 SSH 私钥密文记录已清理为零;SSH 密码凭据、TLS 证书私钥和业务数据保持不变。
- [✓] 已完成,等待复审:Scert 重启后重新登录并再次部署证书成功;Scert 仅监听 `127.0.0.1:8443`,数据库仅监听回环地址,公网入口仍仅为 Nginx `80/443`。
- [!] 暂缓或存在阻塞:整体生产验收仍受系统账户真实发信、密码重置完整闭环、三数据库完整 Web 矩阵、历史恢复事务核查、DNS/ACME 负向矩阵和最终清库首次部署等门禁限制。
## 2026年10月1日 SSH 密钥登录彻底停用复核
本次安全修复仅记录非敏感代码、构建和测试结果,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。根据“SSH 私钥登录不允许出现,安全风险太大”的要求:
- [x] 删除部署客户端的 SSH 公钥部署接口,不再提供远程 `authorized_keys` 写入能力。
- [x] 删除远程 `PubkeyAuthentication` 配置、SSH 服务重载和公钥安装脚本,不再通过 Scert 开启公钥登录。
- [x] 保留证书部署使用的 TLS 证书私钥文件路径;该路径仅用于证书业务,不用于 SSH 登录。
- [x] 后端全量 Go 测试、Go 静态检查、部署专项测试、前端 241 项测试和前端生产构建全部通过。
- [x] 提交 `7264149` 已使用中文提交信息并推送远程仓库。
- [!] 总体生产验收仍未通过;清库后的首次生产初始化、Smail 系统账户发信、密码重置闭环、三数据库 Web 矩阵、P0-10 负向矩阵和最终候选包实机复核仍需继续。
当前总体验收状态仍为:**P0-03:完成,等待复审**。本次修复不代表生产验收通过。
## 2026-10-01 SSH 私钥登录能力安全复核
当前总体状态仍为:**P0-03:完成,等待复审**。本轮安全整改不代表生产部署整体验收通过。
- [x] 后端服务器模型、SSH 连接工厂、服务器 API 和服务器仓储已收敛为密码认证,未保留 SSH 登录私钥字段或部署路径。
- [x] 新增数据库迁移 19,清理历史服务器记录中的 SSH 私钥引用和 SSH 密钥状态;历史表结构迁移文件仅用于兼容既有数据库,不代表当前能力重新启用。
- [x] 敏感信息存储测试已改为 DNS 凭据场景,不再创建或读取 `secret://ssh/key-*` 测试引用。
- [x] TLS 证书业务的 `private_key_path`、证书上传、部署和回滚逻辑保持不变;该字段只用于证书私钥,不用于 SSH 登录。
- [x] `go test ./...`、三个 Go 命令构建和 `git diff --check` 已通过。
- [!] 仍未完成清库后的三数据库 Web 首次初始化、Smail 系统账户真实发信、验证码重置闭环、P0-10 负向矩阵、双机失败重试和最终生产门禁,因此不得标记为整体验收通过。
## 2026-10-01 实机部署复核补充
- [x] 使用正式 Linux amd64 候选包通过密码 SSH 安装到 `45.136.13.241`,安装器清单校验通过。
- [x] 安装后 `Scert`、`Scert-storage.socket`、Nginx 均为 `active`;Scert 和数据库保持回环监听,公网只保留 Nginx `80/443`。
- [x] `nginx -t`、严格 HTTPS `odacm.cn/readyz`、HTTP 到 HTTPS 跳转均通过。
- [x] SSH 服务端仅允许密码认证,关闭公钥认证;本轮没有生成或部署 SSH 私钥、公钥及 `authorized_keys`。
- [!] 生产整体验收尚未完成,仍受清库后的首次初始化、Smail 系统账户发信、密码重置闭环、三数据库 Web 流程、P0-10 负向矩阵及历史恢复证据复核限制。
任务状态:T3 已完成等待复审;T5、T6 继续进行;T7 未开始。总体状态仍为 **P0-03:完成,等待复审**。
### 服务重启复核补充
- [x] `Scert` 重启后保持 `active`,等待启动完成后回环和 `odacm.cn` 严格 HTTPS `/readyz` 恢复正常。
- [!] 重启瞬间 Nginx 可能短暂返回 `502`,原因是 Nginx 先于 Scert 上游恢复;这不是通过放开 `8443` 或关闭 TLS 校验解决的问题,是否要求无感切换仍列入最终生产门禁。
- [!] 两条历史 `recovery_required` 事务仍缺少可信恢复证据,已保留现场,未删除锁、伪造证据或自动接管。
## 2026-10-01 双机密码认证候选包部署记录
- [x] 已完成,等待复审:使用密码 SSH 上传正式 Linux amd64 候选包到 `8.137.23.95` 和 `45.136.13.241`,全程未使用 `-i`、SSH 私钥、公钥或 `authorized_keys`。
- [x] 已完成,等待复审:两台均使用官方安装器完成停服升级,包内 `SHA256SUMS` 全部通过,安装器未强制覆盖运行中的服务。
- [x] 已完成,等待复审:两台 `Scert`、`Scert-storage.socket`、Nginx 均 active;Scert 仅绑定 `127.0.0.1:8443`,数据库仅绑定回环地址,公网入口为 Nginx `80/443`。
- [x] 已完成,等待复审:两台 `nginx -t` 通过;第二台 `odacm.cn/readyz` 严格 HTTPS 返回 ready。
- [x] 已完成,等待复审:两台 SSH 服务端均为密码唯一认证,明确关闭公钥认证;本轮没有生成、读取、上传或部署任何 SSH 私钥、公钥或 `authorized_keys`。
- [!] 暂缓或存在阻塞:第二台仍保留两条缺少可信恢复证据的历史 `recovery_required` 事务;未删除锁或伪造恢复证据。
- [!] 暂缓或存在阻塞:第一台既有 `php-fpm-82.service` failed 与 Scert 无关,不能作为 Scert 通过依据,也不能在未授权范围内清理。
当前任务状态:T3 双机密码认证部署复核完成,等待复审;T5、T6 继续进行;T7 未开始。总体状态仍为 **P0-03:完成,等待复审**。
## 2026-10-01 当前日期候选包复核
- [x] 已完成,等待复审:重新生成当前日期候选包 `Scert-20261001-V0.1.0-linux-amd64.tar.gz`,SHA-256 为 `56426C1BBCECA68B32D122E813A950D2EE345349F89C3178080BD313F6F77E8E`,来源提交 `79bae3b` 且构建树干净。
- [x] 已完成,等待复审:双机重新部署后运行二进制摘要与本地构建产物一致,服务、存储 socket、Nginx 和回环监听边界正常。
- [x] 已完成,等待复审:后端 SSH 私钥 API 定向测试通过,返回 404;前端 241 项测试通过,其中包含服务器认证提示和 SSH 私钥入口不可达回归。
- [x] 已完成,等待复审:第二台当前候选包重启恢复测试记录第 0、1 秒为 502,第 2 秒恢复 200,未通过开放 8443 或关闭 TLS 校验规避。
- [!] 暂缓或存在阻塞:短暂 502、两条历史恢复事务、清库后的三数据库流程、Smail 系统账户发信、密码重置闭环和 P0-10 负向矩阵仍未完成。
当前任务状态:T3 当前日期候选包复核完成,等待复审;T5、T6 继续进行;T7 未开始。总体状态仍为 **P0-03:完成,等待复审**。
## 2026年10月1日 Linux上线加速复核(当前执行记录)
本节是本轮目标的当前状态入口,只记录非敏感证据,不记录服务器口令、RAM 密钥、数据库密码、授权码、令牌或其他认证信息。Windows 环境不在本轮范围;公网邮件服务端口属于既有 Smail 服务,不作为 Scert 管理入口处理。
### 本轮需求清单
- [x] 仅验证 Linux 双机:第一台 `8.137.23.95`,第二台 `45.136.13.241`。
- [x] Scert 服务器连接只使用 SSH 密码认证,不使用或新增 SSH 私钥、公钥、`authorized_keys` 和密钥登录流程。
- [x] Scert 公网入口只经 Nginx `80/443`;Scert `8443` 和数据库端口保持回环监听。
- [x] 不创建辅助验收脚本,不把辅助脚本作为验收依据。
- [~] 继续完成 P0-10 负向恢复矩阵和历史 `recovery_required` 事务的可信证据核查。
- [~] 继续完成 SQLite、MySQL、PostgreSQL 三数据库的清库后完整 Web 首次流程。
- [!] Smail 系统通知 SMTP 当前未启用且未配置系统账户凭据,真实发信、验证码密码重置和改密登录闭环暂不能完成;不得猜测 SMTP 主机、账号或授权码。
- [~] 完成最终 Linux 候选包部署、浏览器缓存清理和生产门禁复审。
- [!] Windows 环境明确排除,不纳入本轮上线验收。
### 当前任务状态
- [✓] T0:双机 Scert、存储通道、Nginx 均为 active;Scert 仅监听 `127.0.0.1:8443`,数据库仅监听回环地址,公网入口为 Nginx `80/443`。
- [x] T1:MySQL 5.7 隔离实例和正式发行程序 CLI 实库测试已有通过证据,等待整体验收复审;不能替代 Web 首次流程。
- [~] T2:P0-10 剩余负向窗口、锁归属不匹配、文件摘要不匹配和历史恢复证据仍在核查。
- [~] T3:三数据库完整 Web 流程尚未取得全部直接实机证据。
- [!] T4:Smail 系统账户发信凭据尚未配置,密码重置邮件和新密码登录闭环阻塞。
- [~] T5:候选包已在双机运行并通过健康检查;最终清库后的首次流程、缓存清理和统一门禁复审仍未完成。
- [!] T6:Windows 不在本轮范围。
### 本轮直接证据
- [✓] 两台服务器均通过密码 SSH 复核:Scert、存储 socket、Nginx active。
- [✓] 两台服务器均保持 Scert `127.0.0.1:8443`、MySQL 回环监听;`odacm.cn` 的 `/readyz` 返回 200 ready,HTTP 入口跳转 HTTPS。
- [✓] 生产页面 DOM 未出现 SSH 私钥、公钥或 `authorized_keys`,服务器配置只提交密码和主机指纹;`/api/v1/ssh-keys` 返回 404。
- [✓] 本地 Go 全量测试、前端 241 项测试和 Vite 生产构建通过;工作区无未提交代码修改。
- [!] 当前 `/api/v1/settings` 显示通知 SMTP 未启用且系统通知凭据未配置;该项需要从 Smail 系统通知页面取得真实授权配置后才能继续。
### 当前总体验收结论
总体仍为 **P0-03:完成,等待复审**,不能因为 T0、T1 和 SSH 安全整改通过而宣布生产验收通过。上线前必须补齐 T2、T3、T4、T5 的直接证据;其中 T4 受 Smail 系统账户授权配置阻塞。
## 2026年10月2日最新候选包部署执行记录
本节仅记录本轮非敏感执行结果,不记录任何认证信息。部署使用密码 SSH,未使用 SSH 私钥、公钥或 `authorized_keys`,未创建辅助脚本,未做远端备份。
- [x] 候选包来源为提交 `cc3ac06`,Linux amd64 正式构建通过;`source_dirty=false`,归档 SHA-256 为 `e4623636c5021a99998ce04f4680ebd3d107c02fb4a118a17875fc84c7faeefa`,包内校验全部通过。
- [x] 第二台 `45.136.13.241` 安装器成功执行并恢复 Scert、存储 socket、Nginx;启动后早期探测得到一次 502,等待后 `/readyz` 严格 HTTPS 返回 200 ready。
- [x] 第一台 `8.137.23.95` 安装器成功执行并恢复 Scert、存储 socket、Nginx;该机使用 `odacm.cn` 严格验证时因现有证书 SAN 不匹配而被拒绝,属于真实安全阻塞,不作成功处理。
- [x] 两台公网入口和监听边界未放宽:Scert 8443、MySQL 3306/33060 仅回环;跨服务器直连探测均超时;Nginx 80/443 配置测试通过。
- [x] `/api/v1/ssh-keys` 实测为 404,生产构建静态扫描未发现 SSH 密钥 UI 标记。
- [x] 后端 `go test -count=1 ./...`、`go vet ./...` 和前端 241 项回归通过。
- [!] 安装器自身保留升级前发布事务目录,这是正式安装器的失败恢复保护,不是本轮额外远端备份;未删除历史事务目录。
### 当前未完成门禁
- [~] P0-10 负向恢复矩阵及历史 `recovery_required` 可信证据。
- [ ] SQLite、MySQL、PostgreSQL 清库后的完整 Web 首次流程。
- [!] Smail 系统通知账户、真实发信、验证码、超级管理员重置密码和改密后重新登录闭环。
- [!] 第一台 `odacm.cn` 证书 SAN 不匹配及启动早期短暂 502 的生产结论。
## 2026年10月2日 SSH 登录密钥入口移除复核
本轮按安全要求收紧产品边界:SSH 登录只允许密码认证,不提供私钥、公钥、密钥生成、授权文件写入或密钥登录管理能力。HTTPS 证书部署所需的证书私钥路径仍保留,二者用途不同。
- [x] 删除未注册的 SSH 密钥 CLI 入口文件,正式 CLI 不再包含密钥管理命令。
- [x] 删除未注册的 SSH 密钥 HTTP 处理文件,生产路由继续不注册相关接口,`/api/v1/ssh-keys` 保持 404。
- [x] 删除未引用的前端密钥弹窗文件和遗留样式,生产页面不提供密钥管理入口、命令或授权文件提示。
- [x] 保留服务器主机指纹校验、SSH 密码字段和 HTTPS 证书私钥路径;没有把证书私钥误当作 SSH 登录凭据。
- [x] 后端 `go test ./...` 全部通过;前端 241 项测试全部通过;Vite 生产构建通过;`git diff --check` 通过。
- [~] 需要将最新候选包按正式安装流程部署到双机,并复核页面和 API 后再进入最终生产验收。
本轮不删除历史数据库迁移文件和禁用兼容测试;它们只用于既有数据库升级和安全回归,不会启用 SSH 密钥能力。总体生产验收仍未通过,既有证书 SAN、启动早期 502、Smail 系统账户发信和三数据库完整 Web 流程仍是门禁项。
## 2026年10月2日 最新执行进度:Linux 候选包已完成双机部署
本批按当前任务清单仅处理 Linux,不处理 Windows;使用密码 SSH,未使用、生成、上传或部署 SSH 私钥、公钥及 `authorized_keys`,未创建辅助验收脚本,未进行远端备份,也未清理业务数据库。
### 本批任务清单
- [x] 阅读并按本清单拆分本批候选包、双机部署、端口安全和生产复核任务。
- [x] 完成 Linux amd64 候选包组装,补齐 `web/index.html` 及前端静态资源。
- [x] 发布路径检查通过:三个 Linux 二进制均为 ELF,启用 `-trimpath`,候选包不含符号链接或特殊文件。
- [x] 归档校验通过;本批归档 SHA-256 为 `1c8e5100e23be5bdc7003ad025eca84de3d1890093c8daee3e881d9f1a9635e5`。
- [x] 使用已核对的 SSH 主机指纹和密码方式,将同一候选包部署到 `8.137.23.95` 与 `45.136.13.241`。
- [x] 两台服务器的 `Scert`、`Scert-storage.socket` 和 Nginx 均为 `active`;两台运行二进制摘要与候选包一致。
- [x] 两台服务器仍保持 Scert `127.0.0.1:8443`、MySQL `127.0.0.1:3306/33060`,公网仅监听 Nginx `80/443`;Nginx 配置测试通过。
- [x] 第二台通过 `odacm.cn` 严格 HTTPS 访问 `/readyz` 返回 `{"service":"scert","status":"ready"}`。
- [!] 第一台现有管理证书的 SAN 不包含 `odacm.cn`,严格 TLS 校验按预期失败;未使用跳过校验方式,第一台正式管理域名证书仍是生产门禁。
- [!] 第二台启动日志仍保留历史 `recovery_required` 事务缺少可信恢复证据,系统按设计拒绝自动接管;未伪造数据、删除锁或改写历史事务。
- [~] 待完成浏览器清缓存后的首次初始化、Smail 系统账户发信和密码重置、三数据库 Web 矩阵、DNS/ACME 正负向矩阵、证书恢复与最终业务回归。
### 当前结论
本批已经从“候选包未完成”推进到“最新候选包双机运行并完成基础安全复核”,但仍不能标记最终生产验收通过。当前状态保持 **P0-03:完成,等待复审**;下一阶段优先处理第一台管理证书 SAN、历史恢复现场核查和清库后的浏览器业务验收。
## 2026年10月3日17:22 当前执行进度补充
- [x] 本轮修改前检查点 `80b6c0c` 已提交并推送;历史检查点 `ba57490` 也已成功推送。
- [x] 第一台原生 Linux Go 1.26.6、nobody 隔离测试用户已核验;复用既有工具链,不新增公网端口,不创建辅助测试脚本。
- [x] 部署只读核查增加整体超时、取消语义和锁归属读取限制;专项、部署包全量竞态与静态检查均通过。
- [~] 后端全量回归已启动,结果未出之前不标通过。
- [ ] 后续顺序:本机 IPC 和终端入口、人工处置审计和并发幂等、Linux 正式构建、双机及数据库/邮件/DNS/HTTPS/回滚完整验收。
生产服务和历史恢复现场未因隔离测试改变;总体上线门禁仍未通过。具体专项证据见《Linux生产流程测试记录》和《部署事务人工核查任务清单》。
### 17:35 验证执行状态
- [x] 已确认中止的联网及首次离线全量测试进程退出;复核生产服务和本机严格 TLS 就绪状态。
- [~] 后端全量改用 `scert-inspection-full-20261003-1735.service` 受限运行,结果待获取;不得按前面的专项结果替代。
## 2026年10月3日18:06 执行进度
本节优先于后续历史状态。P0-10 的 R2 本机核查入口已编码,原生 Linux 部署、本机协议、管理员终端首批回归通过;最新 Unix socket 菜单集成、异常协议响应和 HTTP 会话测试仍待完成验证,状态为 `[~] 进行中`。修改前检查点 `c9045a0` 已推送。
上一轮后端全量回归触发二十分钟上限,已终止且未通过。本轮不改变 R3 人工处置、R4 审计幂等及 R5 双机正式部署的未完成状态;总体生产验收继续保留。详细任务状态见《部署事务人工核查任务清单》18:06 章节。
## 2026年10月4日最新执行进度:邮件配置确认与第一台候选部署
本轮仅操作第一台 `8.137.23.95`,第二台 `45.136.13.241` 未操作;没有清理业务数据库,没有创建辅助验收脚本,没有远端备份,没有开放新的公网端口,也没有使用或生成 SSH 密钥材料。
- [x] 旧系统 DNS 账户启动导入已完成编码,固定标识为 `legacy-system-dns`,重复启动幂等,保留现有账户修改并拒绝固定标识冲突;仓储、应用、HTTP API、通知定向测试及 `go vet` 通过。
- [x] 提交 `920b318` 已提交并推送;使用干净 worktree 生成 Linux amd64 候选包,`source_dirty=false`、`trimpath=true`、`local_path_check=passed`,归档 SHA-256 为 `0d2f05892f223c96c305e792a424ccc84905dcb57c0179be3732ff83b668bdc4`。
- [x] 最新候选包已通过密码 SSH 部署到第一台;归档 `SHA256SUMS` 全部通过,服务器 `/scert/scert` 摘要与候选包一致,`Scert.service` 和 `Scert-storage.socket` active。
- [x] 第一台运行边界复核通过:公网仅由 Nginx 提供 `80/443`,Scert 监听 `127.0.0.1:8443`,MySQL 仍为回环监听;没有新增外部业务端口。
- [x] 通过域名页面登录并只读核对超级管理员邮件配置:SMTP 已启用,`smtp.cdis.cn:587`、STARTTLS、系统通知用户名和收件人已保存,凭据已配置且未回显;未读取、记录或覆盖邮件密码。
- [!] 真实系统发信及收件箱送达尚未通过:网页公开密码恢复流程按设计不发验证码;本轮本机 `Scert-admin` 重置会话未形成有效请求并退出,未修改密码,也没有把失败结果误判为发信成功。
- [!] 服务启动日志仍保留历史中断部署事务缺少可信站点恢复基线,继续等待人工核查;未自动接管、删除锁或改写事务终态。
- [~] 待从真正保持前台终端的本机管理员会话重新验证验证码发送与密码重置闭环;随后继续三数据库首次 Web、DNS/ACME 正负向、真实证书部署回滚和公共域名严格 TLS 验收。
当前结论:第一台最新候选已运行,邮件配置已确认保存,但生产整体验收仍未通过;第二台仍只保留给后续证书推送、重载和回滚测试。
## 2026年10月4日15:27 当前任务状态
- [✓] Linux 范围及双机职责已固定:第一台 `8.137.23.95` 做主部署测试,第二台 `45.136.13.241` 只做证书推送、重载和回滚;不处理 Windows。
- [✓] 第一台最新候选包已运行,Scert、存储 Socket、Nginx active;Scert 与数据库保持回环监听,公网仅 Nginx `80/443`。
- [✓] 第一台 `odacm.cn` 证书 SAN、有效期和严格 HTTPS `/readyz` 已复核通过。
- [✓] 正式本机管理菜单已对两条历史恢复事务完成只读核查;文件和临时现场均缺失,归属锁仍存在且匹配,未做删除或终态改写。
- [!] 第一台实际 SMTP 配置未启用:`smtp_enabled=false`,主机和用户名为空;域名页面当前命中第二台,不能作为第一台配置证据。
- [!] 超级管理员验证码重置及新密码登录未通过,等待第一台系统通知凭据由用户补齐后重测。
- [~] 三数据库首次 Web、DNS/ACME、第二台证书推送及不同版本回滚、最终公共域名验收待执行。
- [~] 最终候选包和相关文档复审待完成;整体生产验收保持未放行。
### 下一轮执行顺序
1. 让管理入口明确连接第一台,仅填写 SMTP 非秘密参数,密码由用户输入;保存后只读核对启用状态,不读取秘密。
2. 通过第一台 `Scert-admin` 本机终端完成验证码、新密码设置和 Web 登录验证。
3. 按正式人工处置流程记录两条无可信基线事务的安全拒绝结果,不删除锁、不伪造成功。
4. 执行三数据库首次 Web、DNS/ACME 以及第二台证书推送、重载、不同版本回滚矩阵。
5. 重新构建部署 Linux 候选包,清理浏览器缓存,完成最终验收和文档复审。
## 2026年10月4日15:36 历史事务处置进度
- [✓] 第一条 `20261003-142919.192475924-417b9bcc5b09` 已完成“仅记录核查”,处置编号 `f23507a439fb63e2c829ac9c01020af560ce46dd96b248da851991516195212d`。
- [✓] 第二条 `20261003-142924.300953335-fac63bc92b1f` 已完成“仅记录核查”,处置编号 `0f65a3d3c4fe8cb881e61e6e39f86747767a8e21421b9d6ca02ea46bf7ad208b`。
- [✓] 菜单 4 查询结果与处置记录一致;原事务仍未被改写,锁和现场保持不变。
- [!] 历史事务安全拒绝边界已验证,但不能作为历史部署成功证据;SMTP、本机重置和最终业务矩阵仍是生产门禁。
## 2026年10月4日15:45 源码回归进度
- [✓] 后端全量测试通过:`go test ./...`。
- [✓] 后端静态检查通过:`go vet ./...`。
- [✓] 前端测试 338 项全部通过,生产构建通过。
- [!] 源码回归不关闭真实 SMTP、密码重置、三数据库首次 Web、DNS/ACME 和最终公共 HTTPS 门禁。
## 2026年10月4日15:52 SMTP 配置落点复核
- [✓] 第二台已保存 SMTP 非敏感配置并启用;仅作为现有页面配置落点的诊断证据,不重复第二台主程序验收。
- [!] 第一台 SMTP 实际未启用;域名页面当前命中第二台,不能把第二台的配置当作第一台系统发信配置。
- [✓] 第一台到 `smtp.cdis.cn:587` 的 STARTTLS 网络握手通过,未进行认证尝试,未读取密码。
- [!] 等待用户在指向第一台的页面输入 SMTP 密码并保存,之后立即进行本机重置闭环。
## 2026年10月4日 第二台部署包清理
- [✓] 第二台 `45.136.13.241` 不再保留本轮 Scert 候选包、解包目录和安装事务目录。
- [✓] 已清理 `/scert/.install-VSIoJ4Cj`;`/scert/data/scert.db`、证书目录、备份目录及 Nginx 配置未删除。
- [✓] 第二台继续限定为 SSL 推送测试目标,不重新安装当前 Scert 项目候选包。
- [!] 第二台旧版 Scert 服务仍受数据库版本不兼容影响而失败;该结果不能标记为服务恢复成功。
- [~] SSL 推送、Nginx reload、故障回滚、恢复后指纹核验和幂等重试仍待完成。
## 2026年10月4日 当前接手加速整改与上线任务清单
### 已完成
- [✓] 重新阅读合并优化清单并核对当前 `main` 工作区,未发现未提交源码改动。
- [✓] 后端全量测试、`go vet`、前端 338 项测试、前端生产构建和差异检查通过。
- [✓] 第一台 `8.137.23.95` 服务、回环监听、Nginx 和 `/readyz` 复核通过。
- [✓] 第二台 `45.136.13.241` 的 Scert 自有数据目录 `/scert/data`、`/scert/backups`、`/scert/log` 已清空。
- [✓] 第二台 `/scert`、`/var/tmp`、`/tmp` 已复核无本项目部署包和安装临时物;Nginx 与证书现场保留。
### 上线门禁
- [!] 第一台 SMTP 未启用,真实发信、验证码和本机密码重置闭环待用户在第一台入口完成凭据输入后复核。
- [~] 正式证书部署流程待执行:普通业务域名正向推送、第二台 `nginx -t`、reload、失败回滚、恢复指纹和幂等重试。
- [ ] 三数据库首次 Web 初始化和重启后重新登录持久化待执行。
- [ ] DNS/ACME 正负向、公共 HTTPS/SNI、证书历史恢复和最终公共入口待执行。
- [!] 历史恢复事务保留人工处置状态,不删除锁或改写终态。
- [!] 总体生产门禁继续保持未关闭。
### 本轮执行原则
- 只处理 Linux/Web;第二台不安装当前 Scert 候选包。
- 不使用 `-k`、`--insecure`、强制 IP TLS 或未核验 SSH 主机。
- 不把构建、单元测试、HTTP 200 或局部回环结果写成生产验收。
- 不记录服务器密码、SMTP 密码、验证码、私钥或令牌。
## 2026年10月4日 19:22 实机推进记录
- [✓] 第一台服务和严格 SNI `/readyz` 已完成实时复核。
- [✓] 第二台部署包残留扫描已完成,扫描结果为空;Nginx 语法检查通过。
- [~] Linux 候选包仅完成本地 manifest 校验,未上传或安装到第二台。
- [!] SMTP 凭据和第一台 Web 有效登录会话仍待用户输入后继续,不通过绕过认证方式推进。
- [ ] 正式 SSL 推送及失败回滚矩阵。
- [ ] 三数据库首次 Web、DNS/ACME、公共 HTTPS/SNI 和最终生产复审。
## 2026年10月4日 19:35 候选包与事务复核
- [✓] 第一台运行二进制与已记录 Linux 候选包主程序哈希一致。
- [✓] `Scert-admin` 只读事务核查完成,历史恢复现场继续保留。
- [!] SMTP 凭据和第一台 Web 有效管理会话仍待用户在第一台入口完成输入。
## 2026年10月4日 第二台清理任务
- [✓] T2-清理-1:确认第二台为 `45.136.13.241`,仅清理 Scert 项目归属路径,不操作 PMail、共享 MySQL 和其他业务目录。
- [✓] T2-清理-2:移除 `/scert`、Scert systemd 单元、`scert-nginx` 辅助程序及项目证书/事务现场。
- [✓] T2-清理-3:移除项目专用 Nginx 测试配置;保留 Nginx、PMail、MySQL、`/ssl/vcer.cn`,重建空的 `/ssl/scert` 推送目标。
- [✓] T2-清理-4:清理并扫描临时发布物,未发现 `Scert-*.tar.gz`、`production-candidate*`、`.install-*` 或 `.restore-from-*`。
- [✓] T2-清理-5:清理后 `nginx -t`、Nginx reload 和服务状态复核通过;无 Scert 进程及 `8443` 监听,MySQL 3306/33060 仍为回环监听。
- [ ] T2-SSL-正式推送:待在该干净目标上重新执行正式证书推送、Nginx reload、受控失败、回滚、恢复指纹和幂等重试。
第二台清理项已完成并等待复审;正式 SSL 推送项仍未完成,不能据此关闭总体生产验收。
## 2026年10月4日 第二台数据及部署包清理实时复核
- [✓] 通过已登记主机指纹登录第二台 `45.136.13.241`,仅检查和清理 Scert 项目归属路径;未操作 PMail、共享 MySQL 或其他业务目录。
- [✓] 已移除 `/var/lib/scert` 下的项目证书数据、`/var/tmp/scert-install-mysql-reentry-20261001.log`、项目专用 Nginx 测试配置和 `/ssl/scert-multi-20260930.apmmk.cn` 测试证书目录。
- [✓] 清理后未发现 Scert 进程、Scert systemd 单元、`8443`/`8080`/`9000` 监听或项目命名的部署压缩包、解包目录和安装临时物。
- [✓] `nginx -t` 和 Nginx reload 通过;PMail 的 25/465/587/993/995、共享 MySQL 的 3306/33060 及现有 Nginx 的 80/443 保持运行。
- [✓] 未清理共享数据库、`/ssl/vcer.cn`、现有 Nginx 业务配置或 SSH 登录安全配置;未留下本项目部署包。
- [ ] 正式 SSL 推送、受控失败、回滚、恢复指纹和幂等重试仍待重新建立最小推送目标后执行。
本节仅证明第二台项目数据及部署包清理完成,不证明正式 SSL 推送或总体生产上线已通过。
## 2026年10月4日 22:18 清理结果更正与保护边界
- [✓] 第二台主机 `yc`(公网地址 `45.136.13.241`)的部署包扫描结果为 0;未发现 `.tar`、`.tar.gz`、`.tgz`、`.zip` 等本项目发布归档。
- [✓] `/ssl/scert` 当前为空;Scert systemd 单元、进程和运行端口均不存在;Nginx 配置检查成功,Nginx、MySQL、PMail 保持 active。
- [!] `/ssl/acceptance-0928.odacm.cn/single/` 下仍保留 3 个 `.scert-lock` 恢复锁目录。它们属于失败部署事务的受保护恢复现场,不能手工删除、改名或伪造终态;待正式人工处置流程完成后再复核。
- [!] `/etc/ssh/sshd_config.d/99-scert-password-only.conf` 和 `99-scert-pubkey.conf` 仍保留,用于当前 SSH 登录认证边界;本轮未修改 SSH 安全配置。
上述保护性残留不属于部署包。此前“全盘无项目命名文件”的表述仅适用于当时的限定扫描,现以本节更正结果为准。
## 2026年10月4日 22:24 第一台实时复核
- [✓] 第一台 `8.137.23.95` 主机 `ikun1` 的 `Scert.service`、`Scert-storage.socket`、Nginx 和 MySQL active;Scert 仅监听 `127.0.0.1:8443`,MySQL 仅监听回环地址,公网入口仍为 Nginx `80/443`。
- [✓] 通过严格域名/SNI 的浏览器公共入口访问 `https://odacm.cn/readyz` 返回 `{"service":"scert","status":"ready"}`;当前仅证明健康检查和 HTTPS 入口,不代表登录、邮件、证书部署或生产上线门禁全部通过。
- [✓] 第一台证书返回 `CN=odacm.cn`,签发方为 Let's Encrypt,当前有效期为 2026年10月2日至2026年12月31日;未使用强制 IP 或不安全 TLS 选项。
- [!] 第一台配置中的 `smtp_enabled=false`,SMTP 主机和用户名为空;真实通知、验证码和密码重置闭环仍待用户在第一台管理入口输入凭据后复核。
- [ ] 正式 SSL 推送及第二台受控失败/回滚矩阵仍未执行。
## 2026年10月4日 22:55 接手加速整改任务状态
- [✓] 需求范围确认:仅 Linux/Web;第一台 `8.137.23.95` 部署测试,第二台 `45.136.13.241` 仅做 SSL 推送测试,不安装 Scert。
- [✓] 当前源码回归复核完成:后端全量测试、`go vet`、前端 338 项测试和前端生产构建通过。
- [✓] 第一台基础服务和监听边界复核通过;当前 `/scert/conf/scert.json` 仍为 `smtp_enabled=false`,`smtp_host`、`smtp_username` 为空。
- [!] 有效超级管理员 Web 会话尚未取得;错误密码尝试未修改任何远端状态,禁止通过数据库直改或公网重置绕过。
- [✓] 第二台项目数据及部署包清理完成,保留共享业务与受保护恢复现场。
- [~] 用户补齐第一台管理会话或 SMTP 系统通知凭据后,执行真实邮件、验证码、本机重置和新密码登录。
- [ ] 正式 SSL 推送、故障注入、旧证书回滚、恢复指纹、幂等重试。
- [ ] 三数据库清库后首次 Web 初始化、重启持久化、DNS/ACME 和公共 HTTPS/SNI 验收。
- [!] 总体生产上线门禁未关闭;Windows 明确不纳入本轮。
## 2026年10月4日 23:36 候选升级与第二台部署包复核
- [✓] T1-候选包一致性:本地归档和第一台远端归档 SHA-256 一致,包内 `SHA256SUMS` 全部通过。
- [✓] T1-官方升级:第一台先按安装器门禁停止 `Scert-storage.socket`,再用官方 `install-linux.sh` 成功升级;未修改第二台。
- [✓] T1-升级后运行:Scert、存储 Socket、Nginx、MySQL active;Scert `127.0.0.1:8443`、MySQL `127.0.0.1:3306/33060`,公共入口仍只有 Nginx `80/443`;严格 `/readyz` 返回 ready。
- [✓] T1-临时物清理:第一台本轮 `/var/tmp` 上传归档及解包目录已删除;保留安装器历史回滚目录,未删除未知归属文件。
- [✓] T2-第二台清理复审:`45.136.13.241` 无 `/scert`、Scert 辅助程序、运行端口、项目部署包或解包目录;`/ssl/scert` 为空。
- [✓] T2-共享业务保护:第二台 Nginx `-t` 通过,PMail、共享 MySQL、现有 Nginx 继续运行;3 个受保护 `.scert-lock` 未删除。
- [!] T3-系统通知和重置:第一台当前 `notification.smtp_enabled=false`,有效超级管理员会话和 SMTP 凭据仍未取得。
- [ ] T4-正式 SSL 推送及回滚矩阵:未开始,必须通过正式 Web/API 流程建立最小推送目标。
- [ ] T5-三数据库首次 Web、DNS/ACME、公网 HTTPS/SNI 和最终上线复审:未完成。
当前任务状态:第一台候选升级与第二台“无部署包”复核完成,T3/T4/T5 仍是生产上线门禁;Windows 不纳入本轮。
## 2026年10月4日 23:53 Smail 系统通知授权
- [✓] T3-1:通过 `web.cdis.cn` 正式管理页面确认 `xuans` 为系统通知账号。
- [✓] T3-2:已开启 `xuans` SMTP 发信授权,确认 `smtp.cdis.cn:587`、STARTTLS 和 `notify:xuans@cdis.cn` 参数。
- [✓] T3-3:已生成独立系统通知发信凭据;凭据未写入代码、文档、日志或普通配置文件,当前仅保留在受控浏览器流程中待一次性填入。
- [!] T3-4:第一台 Scert 管理会话尚未建立,SMTP 参数和凭据尚未在第一台正式保存。
- [ ] T3-5:第一台 SMTP 保存后的只读状态核对、真实发信、验证码、本机重置和新密码登录。
- [ ] T4:第二台正式 SSL 推送、Nginx 重载、受控失败回滚、恢复指纹和幂等重试。
- [ ] T5:三数据库首次 Web、DNS/ACME、公网 HTTPS/SNI 和最终生产复审。
当前任务状态:Smail 授权子项完成等待复审,第一台 Scert 正式配置仍等待有效管理会话;Windows 不纳入本轮。
## 2026年10月4日 Linux 加速执行结果
### 任务清单
- [✓] L1:阅读整改合并清单并确认 Linux/Web 范围、双机职责和生产验收边界。
- [✓] L2:后端全量回归 `go test -count=1 ./...`。
- [✓] L3:后端静态检查 `go vet ./...`。
- [✓] L4:前端 338 项测试和生产构建。
- [✓] L5:第二台部署包清理复核;删除空 `/ssl/scert`,确认没有 Scert 包、解包目录、归档、进程或专用监听。
- [✓] L6:删除第二台两个项目专用 SSH 测试配置,`sshd -t` 通过;不重载 SSH,不触碰共享业务配置。
- [✓] L7:复核第二台受保护 `.scert-lock` 目录仍在,未手工删除或改写。
- [!] L8:第一台 `Scert-admin` 正式本机重置因 SMTP 尚未配置而被服务拒绝;第一台 Web 有效超级管理员会话仍缺失。
- [ ] L9:通过第一台正式 Web 设置保存 Smail SMTP 参数并只读核对非敏感配置状态。
- [ ] L10:真实系统发信、验证码送达、本机重置和新密码登录闭环。
- [ ] L11:正式 SSL 推送到第二台、Nginx 检查与重载、受控失败回滚、恢复指纹和同幂等键重试。
- [ ] L12:三数据库清库后的首次 Web、重启持久化、DNS/ACME、公共 HTTPS/SNI 和最终生产复审。
### 复核边界
本轮没有把构建成功、HTTP 健康检查、SSH 登录成功或第二台清理结果扩大为总体上线结论;Windows 环境不在本轮范围。任何密码、验证码、SMTP 凭据和私钥均未写入任务清单、日志或仓库。
## 2026年10月4日 当前实机复核:SMTP 参数推进与 Smail 阻塞
- [✓] T3-4a:第一台通过官方 CLI 写入 SMTP 主机、端口、STARTTLS、系统通知用户名及明文认证关闭状态。
- [✓] T3-4b:第一台 `scert config validate` 通过;没有读取、记录或写入 SMTP 密码和授权码。
- [!] T3-4c:SMTP 加密凭据引用尚未配置,`smtp_enabled` 仍为关闭,真实发信和本机重置不能开始。
- [!] T3-4d:`web.cdis.cn` 当前返回 `502 Bad Gateway`,无法从 Smail 正式页面取得待填入凭据。
- [~] T3-5:待 Smail 恢复后完成 SMTP 保存复核、真实发信、验证码、本机重置及新密码登录。
- [ ] T4:第二台正式 SSL 推送、Nginx 重载、受控失败回滚、恢复指纹和幂等重试。
- [ ] T5:三数据库首次 Web、DNS/ACME、公网 HTTPS/SNI 和最终上线复审。
当前任务状态:第一台 SMTP 非敏感参数推进完成,敏感凭据和 Smail 上游恢复仍是 T3 门禁;Windows 不纳入本轮。
## 2026年10月5日 Smail 恢复后接续任务清单
### 需求确认
- [✓] 只处理 Linux/Web;第一台 `8.137.23.95` 做部署测试,第二台 `45.136.13.241` 只做 SSL 推送测试。
- [✓] 第二台不安装本项目;项目数据和部署包清理结果保持通过,PMail、共享 MySQL、现有 Nginx 和受保护恢复锁不动。
- [✓] Smail `web.cdis.cn` 清理缓存后恢复正常页面,当前为 `xuans` 超级管理员会话。
- [✓] Smail 系统通知页面显示 `xuans` 已开启,SMTP 非敏感参数已确认。
- [!] 第一台 SMTP 凭据引用为空、开关仍关闭;真实邮件闭环未完成。
### 任务列表
- [✓] T3-恢复-1:重新加载并检查 Smail 页面及系统通知授权状态。
- [~] T3-凭据-1:第一台 root 受控终端交互录入 SMTP 敏感凭据;不读取、不回显、不保存到文件或日志。
- [ ] T3-验证-1:第一台 `config validate`、真实通知投递、收件箱到达核验。
- [ ] T3-重置-1:本机 `Scert-admin` 验证码、重置、新密码登录及旧会话失效。
- [ ] T4-推送-1:通过正式 Web/API 向第二台推送 SSL 并核验目标文件权限、摘要和 `nginx -t`。
- [ ] T4-推送-2:注入可控失败,验证停止策略、旧证书回滚、恢复指纹和同幂等键重试。
- [ ] T5-初始化-1:SQLite、MySQL、PostgreSQL 清库后按生产流程完成首次 Web 初始化和重启持久化。
- [ ] T5-公网-1:DNS/ACME 正负向、公共 HTTPS/SNI、证书历史恢复及清缓存后的最终入口复审。
- [!] T5-总体验收:在上述证据全部齐备前保持未通过。
### 接续结论
历史 `502 Bad Gateway` 仅保留为历史证据;本次正式页面复核已显示 Smail 收件箱和系统通知授权页面正常。下一阻塞点为第一台敏感 SMTP 凭据的受控录入,不通过数据库直改、公网重置或绕过认证推进。
## 2026年10月4日实时复核纠偏与下一步
- [✓] 第一台 `8.137.23.95` 配置校验通过,`https://odacm.cn/readyz` 返回 ready。
- [✓] 第一台服务监听边界符合预期:Scert 为 `127.0.0.1:8443`,公网入口为 Nginx `80/443`。
- [✓] Smail `web.cdis.cn` 当前页面可用,`xuans` 系统通知授权已开启;未读取授权码。
- [!] `smtp.cdis.cn` 解析到 `47.108.78.12`,第一台到 `25/465/587` 均连接被拒绝,尚不能进行真实发信。
- [!] 第一台 `smtp_enabled=false` 且凭据引用为空;不得猜测密码或通过数据库直改绕过正式流程。
- [✓] 第二台项目数据和部署包清理复核通过,未删除受保护 SSL 恢复锁。
### 接续任务
- [~] 查明 `smtp.cdis.cn` 对应的实际 SMTP 提交服务和监听端口,优先通过 Smail 正式配置或服务端运维恢复,不改动无关业务。
- [ ] 在 SMTP 网络层恢复后,使用官方 CLI 交互式录入敏感凭据,执行 `config validate` 和真实通知投递。
- [ ] 完成验证码、本机受保护重置、新密码登录和旧会话失效验证。
- [ ] 获取有效管理会话后完成第二台 SSL 推送、reload、受控失败回滚、恢复和幂等重试。
- [!] 在上述证据齐备前保持总体上线门禁未通过。
## 2026年10月4日 Smail 接口状态补充
- [✓] `GET /api/v1/system/notification/status?user_id=1` 返回成功,确认系统通知主机为 `smtp.cdis.cn`,提交端口为 `587/465`,`xuans` 账号已启用;本记录不保存会话 Cookie 或授权码。
- [!] 同一浏览器会话随后对邮件列表和分组接口多次返回 `502 Bad Gateway`,控制台同时出现连接关闭错误;Smail 页面可打开不代表后端邮件链路稳定。
- [!] 结合第一台对 `smtp.cdis.cn` 的 `25/465/587` 连接拒绝,当前硬阻塞为 Smail 上游和 SMTP 服务可达性,不能通过猜测密码或修改 Scert 数据库绕过。
## 2026年10月4日 最新候选升级任务状态
### 任务清单
- [✓] U1:当前提交 `9cd8ce3` 已完成后端全量测试、`go vet`、格式检查,并已中文提交推送。
- [✓] U2:仅构建 Linux amd64 候选包,manifest 为 `source_dirty=false`、`trimpath=true`、`local_path_check=passed`。
- [✓] U3:第一台 `8.137.23.95` 已按正式安装器升级;服务停止门禁、包内校验、服务恢复均有实机证据。
- [✓] U4:第一台 `config validate`、Nginx 语法、核心服务状态和 HTTPS `/readyz` 通过。
- [✓] U5:SMTP 587 STARTTLS 与 465 TLS 网络握手通过,25 端口关闭;只证明网络和证书链路,不证明认证和投递。
- [!] U6:SMTP 凭据引用为空、`smtp_enabled=false`;真实通知、验证码和本机重置仍未完成。
- [ ] U7:通过 Smail 正式授权取得正确 SMTP 凭据,交互式写入并核验真实投递。
- [ ] U8:完成第一台本机受保护重置、新密码登录及旧会话失效。
- [✓] U9:第二台 `45.136.13.241` 继续保持清理状态,不上传、不安装本项目。
- [ ] U10:完成第二台正式 SSL 推送、Nginx reload、受控失败回滚、恢复指纹和幂等重试。
- [ ] U11:完成三数据库首次 Web 初始化、重启登录持久化、DNS/ACME、公共 HTTPS/SNI 和最终复审。
- [!] U12:总体生产门禁未通过。
### 复核边界
安装器拒绝运行服务 active 的第一次尝试已保留为安全门禁证据,随后通过停止服务后正式重试完成升级;没有强制覆盖数据库、证书或受保护恢复锁。未读取或记录任何 SMTP 密码、验证码、Cookie、令牌或私钥。Windows 不在本轮范围。
## 2026年10月4日 前端回归补充
- [✓] U2-前端:`npm.cmd test` 通过 338 项,失败 0、跳过 0、todo 0。
- [✓] 前端生产构建已包含在本次 Linux-only 候选包中。
- [!] 本地前端回归不关闭实机与生产上线门禁。
## 2026年10月4日 当前现场复核:清理结果与上线门禁
- [✓] L5/L6/L7:第二台 `45.136.13.241` 清理复核通过,无本项目部署包、解包目录、Scert 运行实例或专用监听;受保护 SSL 恢复锁保留。
- [✓] U3/U4:第一台 `8.137.23.95` 服务、配置校验、Nginx 和严格 HTTPS `/readyz` 复核通过。
- [!] U6:第一台通知脱敏状态仍为 `smtp_enabled=false`,SMTP 凭据引用为空;没有读取或猜测密码。
- [!] U7:当前 `https://web.cdis.cn/` 为 Smail 登录页,当前浏览器没有有效管理会话,暂不能从正式页面取得授权凭据。
- [!] U8:最近一次 `Scert-admin` 受保护操作请求无效或已失效,尚未完成验证码、重置、新密码登录和旧会话失效。
- [ ] U10:在有效管理会话下完成第二台 SSL 推送、`nginx -t`、reload、失败回滚、恢复指纹和同幂等键重试。
- [!] U12:总体生产门禁继续未通过。
本次没有修改代码、数据库、证书或共享业务配置,也没有把任何敏感凭据写入任务清单;下一步只接受交互式敏感凭据录入和正式 Web/API 流程。
## 2026年10月5日12:14 Linux SMTP 敏感输入整改任务
本节纠正上一批新增现场复核章节的日期:提交 070ca17 对应的现场操作发生于 2026年10月5日,章节误写为 10月4日;历史章节保留,以本勘误为准。
- [✓] 源码核查发现 config set-secret 当前使用普通行输入,没有关闭终端回显;此前仅建议交互输入不足以保证终端保密。
- [~] 改为 Linux 真实终端隐藏输入,拒绝命令行敏感值与管道输入,失败或取消时恢复终端设置。
- [ ] 增加 Linux 伪终端测试,验证无回显、恢复和拒绝边界;不使用真实凭据。
- [ ] 补全配置流程:保存引用并不自动启用 SMTP,也不代表运行进程已重载配置;须另外校验、启用、受控重启并真实投递。
- [!] 本轮不依赖 Smail 会话修复上述缺陷;真实邮件、密码重置与第二台正式推送仍未验收。不改共享业务、恢复锁或第二台部署状态。
## 2026年10月5日 Linux整改执行进度
### 任务状态
- [✓] C1:Linux 敏感输入整改已提交推送,提交 `0788b6e`;拒绝命令行敏感值和管道输入,终端回显关闭后在退出路径恢复。
- [✓] C2:后端全量测试和 `go vet ./...` 通过。
- [✓] C3:前端 338 项测试全部通过,生产构建通过。
- [✓] C4:Linux amd64 `scert`、`scert-admin` 构建及 CLI 测试编译通过。
- [✓] C5:第二台 `45.136.13.241` 保持清理状态,不上传、不安装本项目,受保护 SSL 恢复锁保留。
- [~] T3-凭据-1:第一台 root 受控终端交互录入 SMTP 敏感凭据;不读取、不回显、不写入文件或日志。
- [ ] T3-验证-1:第一台 `config validate`、真实通知投递、收件箱到达核验。
- [ ] T3-重置-1:本机 `Scert-admin` 验证码、重置、新密码登录及旧会话失效。
- [ ] T4-推送-1:通过正式 Web/API 向第二台推送 SSL,核验目标权限、摘要和 `nginx -t`。
- [ ] T4-推送-2:注入可控失败,验证停止策略、旧证书回滚、恢复指纹和同幂等键重试。
- [ ] T5-初始化-1:SQLite、MySQL、PostgreSQL 清库后完成首次 Web 初始化和重启持久化。
- [ ] T5-公网-1:完成 DNS/ACME 正负向、公共 HTTPS/SNI、证书历史恢复及清缓存后的入口复审。
- [!] T5-总体验收:在上述证据全部齐备前保持未通过。
### 当前执行顺序
1. `[~]` 由有权限人员在第一台 root 受控终端交互录入 SMTP 敏感凭据。
2. `[ ]` 只读复核凭据引用和 `config validate`,发送真实系统通知并确认收件箱到达。
3. `[ ]` 执行本机受保护验证码、重置、新密码登录和旧会话失效闭环。
4. `[ ]` 取得有效管理会话后执行第二台 SSL 推送、reload、失败回滚、恢复和幂等矩阵。
5. `[ ]` 完成三数据库首次 Web、DNS/ACME 和最终公共 HTTPS/SNI 复审。
### 约束
敏感凭据不进入聊天、参数、环境变量、日志、文档或仓库;不通过数据库直改、公网重置、`-k` 或未核验主机指纹绕过门禁。Windows 环境不纳入本轮。
## 2026年10月5日 实时凭据与第一台访问复核
### 当前实测
- [✓] `https://web.cdis.cn/` 登录页可访问,页面中文显示正常。
- [!] 使用当前任务记录中的账号进行一次正式登录尝试,接口返回 `errorNo=100`、`账号或密码错误`;未建立管理会话。
- [!] 第一台 `8.137.23.95` 的已登记 SSH 主机指纹匹配,但密钥认证被服务器拒绝;随后仅进行一次密码认证尝试并失败,已停止继续尝试。
- [✓] 未猜测密码、未直改数据库、未开放公网重置、未使用未核验主机指纹或不安全 TLS 绕过。
### 对上线任务的影响
- [!] 尚不能在第一台受控终端录入 SMTP 敏感凭据,因此真实通知、验证码和密码重置闭环不能开始。
- [ ] 需要由有权限人员提供正确的 Smail 管理凭据或第一台 SSH 受控登录方式;凭据不得发送到任务文档、日志、参数或仓库。
- [ ] 获得有效管理会话后,继续第一台通知投递、受保护重置和第二台 SSL 推送回滚矩阵。
- [!] Linux 总体生产上线门禁继续未通过。
本节仅记录当前实测阻塞,不记录任何密码、授权码、Cookie、令牌或私钥内容。
## 2026年10月5日 第二台实时清理复核任务清单
### 本轮任务状态
- [✓] 读取并按《Scert整改合并优化清单》重排 Linux 上线任务;不处理 Windows。
- [✓] 第二台 `45.136.13.241` 不安装 Scert,仅保留 SSL 推送测试边界。
- [✓] 清理 `/run/scert-nginx`、`/run/scert-storage` 及对应 systemd 传播目录等残留运行时数据。
- [✓] 限定范围部署包扫描为空;未发现本项目归档、解包目录、运行实例或专用监听。
- [✓] 保留 `/ssl/vcer.cn`、受保护 `.scert-lock` 恢复目录、PMail、共享 MySQL 和现有 Nginx;`nginx -t` 通过。
- [~] 第一台受控登录、SMTP 交互录入和真实通知验证。
- [ ] 第二台正式 SSL 推送、重载、失败回滚、恢复和幂等复核。
- [!] Linux 总体生产验收。
### 执行边界
第二台清理已完成;后续不得向第二台上传或安装本项目部署包。正式推送只能由第一台有效管理会话通过 Web/API 建立最小目标并执行。敏感凭据不写入文档、日志、参数或仓库。
## 2026年10月5日 14:08 公网入口与第一台访问复核补充
### 本轮任务状态
- [✓] 第二台 `45.136.13.241` 的项目残留、运行时目录和部署包清理状态继续保持;未再次上传或安装本项目。
- [✓] `https://web.cdis.cn/` 严格 HTTPS 页面可访问,返回 HTTP 200;该结果仅证明 Smail 页面可访问,不替代 Scert 第一台管理会话和真实发信验收。
- [!] `https://odacm.cn/readyz` 当前严格 TLS 握手失败;当前解析环境通过 `1.1.1.1` 和 `8.8.8.8` 得到 `198.18.0.137`,不能作为正常公网管理入口验收证据。
- [!] 第一台 `8.137.23.95` 当前没有可用的受控 SSH 密钥会话;未继续猜测密码、未关闭 TLS 校验、未通过数据库或公网接口绕过管理流程。
- [~] 待获得第一台有效 root 受控登录或有效 Scert 管理会话后,继续 SMTP 敏感凭据录入、真实通知、受保护重置、第二台 SSL 推送与回滚。
- [!] Linux 总体生产上线门禁继续未通过。
### 验收边界
本节只记录当前公网和访问阻塞,不把页面 HTTP 200、构建结果或第二台清理结果扩大解释为整体上线通过;Windows 环境不在本轮范围,敏感凭据未写入文档。
## 2026年10月5日 Linux 本地回归复核补充
### 本轮验证结果
- [✓] 后端 `go test -p 1 -count=1 -timeout=12m ./...`:全部通过。
- [✓] 后端 `go vet ./...`:通过。
- [✓] 前端 `npm.cmd test -- --run`:338 项通过,0 失败、0 取消、0 跳过、0 todo。
- [✓] 前端 `npm.cmd run build`:Vite 生产构建通过。
- [✓] 本轮没有修改源码,没有重新上传或安装第二台服务器,不以本地回归结果替代生产实机验收。
- [~] 第一台受控访问、SMTP 真实投递、受保护重置和第二台正式 SSL 推送仍待外部访问条件满足。
- [!] Linux 总体生产上线门禁继续未通过。
### 验收边界
本节只证明当前工作区的后端、前端回归和生产构建状态;不证明第一台 SMTP、验证码、密码重置、第二台 SSL 推送回滚或公网 HTTPS/SNI 已完成。
## 2026年10月5日 第一台入口诊断补充
### 本轮实测
- [✓] 通过 Cloudflare 和 Google 公共 DoH 查询,确认 `odacm.cn` 公网 A 记录为 `8.137.23.95`。
- [✓] 第一台 `8.137.23.95:80` 可达,返回 `nginx/1.30.5` 和 `301`,将 `/readyz` 重定向到 HTTPS。
- [!] 第一台 `8.137.23.95:443` 的严格 TLS 握手失败,尚未取得证书或 HTTP 响应。
- [!] 对 443 端口发送普通 HTTP 请求返回 `Server: Beaver`、`403 Forbidden`,说明前置网关/TLS 路由仍未形成可验收的 `odacm.cn` HTTPS 入口。
- [!] SSH 主机指纹匹配且 22 端口可达;服务器当前仅继续提供密码认证,公钥认证被拒绝,未重复猜测或记录密码。
### 任务状态
- [✓] 公网 DNS 指向第一台已复核。
- [~] 第一台 HTTPS/SNI 前置路由和受控 SSH 登录仍待修复或提供有效授权。
- [ ] 第一台 SMTP 真实通知、验证码、受保护重置、新密码登录和旧会话失效闭环。
- [ ] 第二台正式 SSL 推送、Nginx reload、失败回滚和幂等验证。
- [!] Linux 总体生产上线验收继续未通过。
本节不记录密码、授权码、Cookie、令牌或私钥;不使用不安全 TLS 绕过方式,Windows 环境不在本轮范围。
## 2026年10月5日 当前接续任务清单
### 任务进度
- [✓] LINUX-LOCAL-1:后端全量测试、前端全量测试、前端生产构建和差异检查通过。
- [✓] SERVER-2-CLEAN:第二台 `45.136.13.241` 仅保留 SSL 推送测试边界,项目部署包和运行残留继续保持清理完成。
- [~] SERVER-1-ACCESS:第一台 `8.137.23.95` 端口可达,但严格 SSH 主机校验下公钥认证不可用;单次密码认证被拒绝,等待有效受控登录条件。
- [~] SMTP-CREDENTIAL:浏览器仍停留在邮件通知配置页,当前凭据状态为“凭据尚未配置”;等待用户完成正式凭据保存后再复核。
- [ ] SMTP-DELIVERY:执行 `config validate`、真实系统通知、收件箱到达和验证码闭环。
- [ ] LOCAL-RESET:执行本机受保护验证码、密码重置、新密码登录和旧会话失效验证。
- [ ] SSL-PUSH:通过正式 Web/API 向第二台推送 SSL,核验目标权限、文件摘要和 `nginx -t`。
- [ ] SSL-ROLLBACK:执行可控失败、旧证书回滚、恢复指纹和同幂等键重试。
- [!] LINUX-RELEASE-GATE:在上述实机证据齐备前保持未通过。
### 执行约束
第二台不得安装本项目或留下部署包;不得使用数据库直改、公网重置、不安全 TLS 选项或未经核验的 SSH 主机。敏感凭据只允许通过正式交互流程录入,不写入任务清单、日志、参数或仓库。
## 2026年10月5日 最新发布候选进度
- [✓] RELEASE-CANDIDATE:基于 `3b41713` 生成 Linux amd64 候选包,清单、路径扫描和归档摘要校验通过。
- [~] DEPLOY-1:候选包待第一台有效受控 SSH 或正式 Web/API 部署条件满足后上传;不上传第二台。
- [ ] DEPLOY-2:第一台安装后执行服务、Nginx、HTTPS/SNI 和业务流程复核。
- [!] RELEASE-GATE:候选包生成不等于生产上线,真实邮件、重置、SSL 推送回滚和公网验收仍未完成。
## 2026年10月5日 第一台升级后任务进度
### 已完成
- [✓] 第一台 root 受控 SSH 登录成功,主机身份按已知指纹核对。
- [✓] 发布归档远端校验通过,包内 `SHA256SUMS` 全部通过。
- [✓] 升级前完成官方停服备份:`/scert/backups/scert-20261005-102823.324971777`。
- [✓] 完成 `install-linux.sh --source-dir` 安装升级;配置、数据库、证书和旧备份均保留。
- [✓] `config validate`、Nginx `nginx -t`、systemd 服务状态和监听边界复核通过。
- [✓] 严格 SNI HTTPS `/readyz` 返回 `200`,服务状态为 `ready`。
### 未完成或需人工处置
- [!] 历史中断部署事务启动恢复失败,已保留现场并等待 `Scert-admin` 本机人工核查;禁止手动删除锁或直接修改事务状态。
- [ ] SMTP 敏感凭据交互录入、真实通知和收件箱到达核验。
- [ ] `Scert-admin` 验证码、本机重置、新密码登录和旧会话失效闭环。
- [ ] 第二台正式 SSL 推送、`nginx -t`、reload、失败回滚、恢复指纹和幂等重试。
- [!] 总体生产门禁继续未通过;本轮只能确认第一台服务已升级并就绪,不能宣称项目完整上线。
## 2026年10月5日 19:12 Smail HTTPS与浏览器入口实时复核
### 本轮实测
- [✓] 已使用已登记 SSH 主机指纹只读连接 Smail 管理机 `47.108.78.12`;未接受新指纹,未修改远程配置。
- [✓] Smail 服务保持 `active`,直接监听公网 `80/443`;本机 Nginx 未运行,不影响 Smail 进程提供 HTTPS。
- [✓] 管理机本机按 `web.cdis.cn` SNI 进行严格 TLS 校验,TLS 1.3、证书校验通过、HTTP 返回 `200`。
- [✓] 从第一台 `8.137.23.95` 进行跨主机严格 TLS 复核,连接 `web.cdis.cn` 返回 `200`,证书校验结果为零;未使用 `-k`、`--insecure` 或强制 IP 作为生产验收。
- [✓] 浏览器已恢复打开 `https://web.cdis.cn/#/login?redirect=/`,中文登录页显示正常。
- [!] 当前浏览器没有有效 Smail 管理会话,未代填账号、密码或授权凭据;SMTP 凭据录入和真实发信仍待用户登录后完成。
### 任务状态
- [✓] Smail HTTPS/TLS 服务恢复并完成跨主机严格复核。
- [~] 用户登录 Smail 并完成系统通知凭据配置。
- [ ] 第一台真实 SMTP 投递、收件箱到达、验证码、本机受保护重置和旧会话失效。
- [ ] 第二台正式 SSL 推送、Nginx reload、受控失败回滚、恢复指纹和幂等重试。
- [!] Linux 总体生产上线门禁继续未关闭。
本节不记录密码、授权码、Cookie、令牌或私钥;Windows 环境不在本轮范围。
## 2026年10月5日 22:02 当前代码候选升级任务进度
### 任务进度
- [✓] `LINUX-REGRESSION`:后端全量测试、`go vet`、前端 338 项测试通过。
- [✓] `LINUX-RELEASE`:仅生成 Linux amd64 候选包,源码提交为 `9cf01ad1ab45a5c42464cad4502fd66cd99a95ca`,归档摘要为 `ff8773849ca404bb1b73e272aaa5a7de4ee9a395955c2cd20e29b40df68559b9`。
- [✓] `SERVER-1-UPGRADE`:第一台远端归档与包内清单校验通过,按官方备份和安装器流程完成升级;新备份为 `/scert/backups/scert-20261005-140005.579855102`。
- [✓] `SERVER-1-READY`:`Scert.service`、`Scert-storage.socket` active,`Scert-admin.service` inactive;Scert 仅监听 `127.0.0.1:8443`,严格 `/readyz` 返回 ready。
- [✓] `SERVER-2-CLEAN`:第二台仍未上传、未安装、未留下本项目部署包;其现有业务边界未纳入本轮升级。
- [~] `SMTP-CREDENTIAL`:等待用户在 `web.cdis.cn` 完成正式系统通知凭据配置;不代填、不读取、不写入文档或参数。
- [ ] `SMTP-DELIVERY`:配置保存后执行真实通知、收件箱到达和验证码闭环。
- [ ] `LOCAL-RESET`:完成本机受保护验证码、密码重置、新密码登录及旧会话失效验证。
- [ ] `SSL-PUSH`:通过有效管理会话向第二台执行正式 SSL 推送并复核目标权限、摘要、`nginx -t` 和 reload。
- [ ] `SSL-ROLLBACK`:执行可控失败、旧证书回滚、恢复指纹和同幂等键重试。
- [!] `LINUX-RELEASE-GATE`:邮件、受保护重置、第二台推送回滚及最终公网验收未齐,不得宣布总体上线。
### 本轮边界
候选包和第一台升级已完成,但构建、测试或 `/readyz` 不能替代真实邮件和第二台 SSL 生产验收。历史恢复事务保留现场,禁止手工删除锁或直接改数据库状态。
## 2026年10月5日 22:22 双机只读复核进度
- [✓] `SERVER-1-READY`:第一台服务状态、监听边界和严格 HTTPS `/readyz` 只读复核通过。
- [✓] `SERVER-2-CLEAN`:第二台未安装 Scert,未发现限定范围内的部署包、运行进程或 `/ssl/scert` 目标目录;未改动现有业务。
- [~] `SMTP-CREDENTIAL`:Smail 页面已打开但仍处于登录页,等待用户完成系统通知凭据配置。
- [ ] `SMTP-DELIVERY`:真实通知、收件箱到达和验证码闭环。
- [ ] `LOCAL-RESET`:本机受保护验证码、密码重置、新密码登录和旧会话失效。
- [ ] `SSL-PUSH` / `SSL-ROLLBACK`:第二台正式 SSL 推送、校验、失败回滚与幂等重试。
- [!] `LINUX-RELEASE-GATE`:上述生产门禁未齐,不宣布总体上线。
## 2026年10月5日 Linux 上线冲刺续接执行清单
- [✓] `LINUX-REGRESSION`:后端全量测试、`go vet`、前端 338 项测试及差异检查通过。
- [✓] `LINUX-RELEASE`:已生成仅含 Linux amd64 的正式候选包,源码提交为 `63c2643c72b8c58442e73490e2869379cc12b560`,归档摘要为 `195df566297830bf86ffa15a96df546f37a037ea6da97f88f4a100e7b493c528`。
- [~] `SERVER-1-UPGRADE`:候选包已就绪,待第一台按正式备份与安装器流程升级并重新验证服务、监听和严格 HTTPS。
- [✓] `SERVER-2-CLEAN`:第二台不安装本项目;上一轮只读复核确认无限定范围部署包、Scert 服务和 `/ssl/scert` 目录,本轮没有再次上传或删除业务数据。
- [~] `SMTP-CREDENTIAL`:用户反馈 Smail 发信已配置;待第一台读取有效配置并以真实测试邮件确认,不读取或记录密码。
- [ ] `SMTP-DELIVERY`:真实通知、收件箱到达和验证码送达闭环。
- [~] `LOCAL-RESET`:受保护 Scert-admin 终端保持运行,等待人工输入验证码;随后验证重置、新密码登录和旧会话失效。
- [ ] `SSL-PUSH`:通过有效管理会话向第二台执行正式 SSL 推送,并复核目标权限、证书摘要、`nginx -t` 和 reload。
- [ ] `SSL-ROLLBACK`:执行可控失败、旧证书回滚、恢复指纹和同幂等键重试。
- [ ] `FIRST-WEB`:三数据库清理后的首次 Web 初始化、重新登录持久化及权限矩阵复核。
- [ ] `DNS-ACME`:DNS/ACME 正负向矩阵和公共 HTTPS/SNI 验收。
- [!] `LINUX-RELEASE-GATE`:邮件、受保护重置、第二台推送回滚和最终公网验收未齐,不宣布总体上线。
### 安全边界
敏感凭据、验证码、Cookie、令牌和私钥不进入聊天、命令参数、日志、文档或仓库。第二台只作为 SSL 推送目标,不上传或安装 Scert 发布包;Windows 环境不纳入本轮。
## 2026年10月6日 接续证据更正
- [✓] 本轮实际执行日期为北京时间 2026年10月6日;上一节续接标题误记为10月5日。候选归档采用显式日期参数20261005命名,不代表实际构建日期。
- [✓] 后端全量测试和静态检查在本机 Windows 构建环境运行;前端338项通过。交叉构建目标仅为 Linux amd64,以上不等同于 Linux 实机回归或生产验收。
- [✓] 文档提交4c467e3之后重新生成干净 Linux 候选包,目录为 release/production-candidate-20261005-4c467e3-linux;归档 SHA-256 为 efa32b7e6bf86212dcd7a4264611ecb580b086e8b2f388428eda2a9a2f769c79。该包尚未部署。
- [!] 旧工具会话7806仅确认进程仍运行且没有新输出,不能证明正在等待验证码,也不能证明用户可以操作该会话;上一节相关表述以本条更正为准。
- [~] 已通过可见窗口方式启动独立 Windows Terminal,连接第一台的 SSH 子进程存在,终端窗口有非零窗口句柄。尚未确认用户完成 SSH 登录,不发送验证码或重启原受保护会话。
- [ ] 第一台升级、邮件真实送达及本机重置、第二台正式推送回滚、三数据库首次 Web 和 DNS/ACME 完整验收继续未完成。第二台清理状态仅有历史记录,本轮未做远端复核。
本条只校正证据范围;不重新打包纯文档更正,不删除文件、数据库或恢复锁,不改变生产验收状态。
## 2026年10月6日 邮件模板补齐执行清单
### 已确认需求
所有邮件清晰展示用途与状态;错误通知简短易懂,但不能隐藏人工恢复风险。验证码只在用户可操作的独立终端输入,不写入聊天或记录。
### 本轮任务
- [x] 验证码 HTML 卡片、有效期和安全提示;保留纯文本内容及绑定邮箱隔离。
- [x] 修正失败任务摘要、独立恢复警告、证书域名回退与 HTML 样式引号。
- [✓] 新增回归覆盖真实恢复状态、六类失败码、摘要截断、隐藏明细、已确认恢复、域名回退、全部任务类型与样式属性解析。
- [✓] 通知包、后端全量、静态检查、前端338项及 Linux 专用发布构建通过;代码 `b55688c` 已推送。
- [✓] 发布清单24项摘要复核通过,候选源码干净;未纳入 Windows 产品交付物。
- [~] 独立用户终端已打开且窗口句柄存在;尚未确认用户登录成功,不把窗口存在当作正在等待验证码的证据。
- [!] 独立只读 SSH 检查的一次密码认证被拒绝,未执行远程检查;管理域名在本机严格 TLS 握手失败。
- [ ] 第一台部署最新候选并完成严格 HTTPS、真实发信、收件样式及本机重置验证。
- [ ] 第二台正式 SSL 推送与受控回滚。第二台不上传或安装 Scert 部署包。
- [ ] 三库首次 Web、DNS/ACME 正负向、权限及公共入口完整生产验收。
本次源码回归和构建在本机 Windows 构建环境执行,目标仅为 Linux;尚无本次修复的 Linux 实机和真实收件证据。具体包摘要及访问失败证据见《Linux生产流程测试记录》同日条目。
- [✓] 同日补充:正式浏览器登录页已打开,同源无缓存 `/readyz` 返回200和就绪正文;不能把命令行 TLS 路径失败解释为服务离线。
- [ ] 浏览器登录后业务验收及本次新包实机验收尚未完成。
## 2026年10月6日 账号权限线上复核与部署前状态
### 已确认需求
仅交付 Linux;第一台部署 Scert,第二台仅推送 SSL。右侧需要显示真实登录账号和权限;邮件需要简洁美观,同时保留恢复风险提示。既有用户会话、数据和部署锁不得为通过验收而清除。
### 本轮任务状态
- [✓] 超级管理员当前会话复核通过,账号为 xuans,权限为超级管理员,用户正在使用的页面未退出或刷新。
- [✓] 在隔离浏览器上下文验证管理员、普通用户的指定密码登录;均返回完整登录状态。管理员列表仅含管理员自身与普通用户,普通用户列表仅含自身;两者读取系统设置均返回403。仅为现有数据下的线上接口验收,不代表完整权限矩阵或新包验收。
- [✓] 隔离测试完成后注销,随后读取会话确认未认证;未改动主页面超级管理员会话。
- [✓] 线上旧资源 index-CFcXnkqC.js 无缓存读取仍缺少账号组件标记,当前页面也无该组件;本地源码已有组件及账号传参。无需重复修改已有功能,应先部署新包。
- [✓] 线上 SMTP 已启用,主机 smtp.cdis.cn、端口587、模式 starttls,凭据已配置;本轮仅输出配置白名单,不输出密码。
- [✓] 现成 Linux 发布包摘要重新核验一致;本轮文档变动无需重新构建发布包。
- [!] 独立 SSH 认证此前失败,等待用户核对成功登录第一台时的用户名和端口;现存工具会话33769本轮轮询仍运行但无新输出,不能据此确认认证成功或正在等待验证码,未重启或中断。
- [ ] 第一台升级后复核右侧账号与中文权限实际显示,验证全部邮件的真实送达及收件效果。
- [ ] 本机受保护重置、新密码登录与旧会话失效;第二台正式 SSL 推送回滚;三库首次 Web、DNS/ACME 正负向及最终公共入口验收。
此前关于 SMTP 尚未配置或三个目标账号尚不存在的历史待办,以本节实时证据为准;新包未部署和整体生产验收未完成的结论不变。
## 2026年10月6日10时 连接恢复与新版线上验收
### 本轮已确认需求及范围
采用用户更正后的连接凭据,继续第一台 Linux 部署验收;第二台只做 SSL 推送用途核查。优先验证账号显示实际生效,不重复安装已经在线的新包,不记录密码、不删除生产数据。
- [✓] 两台 root SSH 登录成功,严格使用已登记主机密钥;此前认证阻塞解除。
- [✓] 第一台当前进程主程序与候选一致;主程序、管理程序、存储程序、首页、主 JS、主 CSS 六项本地与远端摘要一致。主服务及存储套接字正常,配置与 Nginx 检查通过。
- [✓] 正常域名严格 HTTPS 返回新首页和就绪正文,公网取得的主 JS 摘要与已安装文件一致。
- [✓] 通过正式 Web 登录表单验证超管指定密码登录;右侧显示 xuans 和超级管理员,账号卡片位于当前视口内,导航截图确认可见。页面保持登录并打开。
- [✓] 第二台限定范围核查无 Scert 安装目录、服务单元及常见路径中的包;既有 Nginx、MySQL、PMail 正常。本轮未做上传、部署、删除或锁处置。
- [✓] SMTP 设置白名单再次确认启用和凭据存在;配置修改时间早于当前主服务启动时间,不再把此前要求重启的页面通知直接当作当前仍未加载配置的证据。
- [ ] 验证码真实投递、用户可操作终端中的受保护重置、新密码登录和旧会话失效。
- [ ] 管理员与普通用户的新包完整界面验收,全部邮件客户端样式及真实任务通知。
- [ ] 第二台正式 SSL 推送、受控回滚及恢复;历史事务和锁必须由正式核查流程确认,不依据有限目录扫描宣告已恢复。
- [ ] 三库首次 Web、重启持久化、DNS/ACME 正负向与最终整体验收。
本轮没有进行源码修改、重复构建、安装或服务重启。第一台安装时间为现场文件时间及服务状态所示,本轮仅核验当前结果,不把未知操作者的安装过程记为本轮操作。
## 2026年10月6日10时32分 SSL 推送恢复条件核查
### 已确认需求与范围
继续第一台 Linux 验收和第二台仅 SSL 推送核查;本轮先确定失败原因与历史恢复条件,不清库、不删文件、不处置锁,不干扰 PMail。
- [✓] 第二台 Nginx、MySQL、PMail 均 active;目标 SNI 严格校验返回 hostname mismatch,错误码62,现有 TLS 站点只配置 xuans.vcer.cn 和 vcer.cn 证书路径。
- [✓] 锁扫描改为 *.scert-lock;第二台 apmmk 测试域名及 acceptance 测试域名目录各有三个锁,之前精确匹配 .scert-lock 的有限扫描漏检。
- [✓] 受保护管理台菜单2只读核查列出4条待恢复事务;最近一条事务的三类目标文件、临时文件及备份不存在,三个锁仍归属该事务。未进入处置流程。
- [✓] 第一台实际应用数据库为 SQLite;MySQL 服务运行不代表应用使用 MySQL。以 mode=ro 和 query_only 读取事务字段白名单,确认4条记录旧指纹均缺失。
- [✓] 管理台本次退出状态 success、inactive;主服务、存储套接字、Nginx 均 active。
- [!] 正式回滚受旧指纹缺失阻塞;最近一条事务缺少目标证书,不能提交。此处保留安全限制,不把文件不存在解释为运行态恢复成功。
- [ ] 制定缺少初次站点基线的安全处置方案,再建立隔离测试站点并进行正式推送、受控回滚验收。
- [ ] 继续独立验收项:新版其他角色界面、真实邮件及用户可输入终端中的受保护重置、三数据库隔离首次流程。
本轮只读检查不触发清库或重新初始化;没有源码修改、构建、Scert 上传、Nginx 配置变更、服务重载、文件删除或事务状态更新。
### 2026年10月6日最新实机复核
- [✓] 第一台服务与正确 SNI 的 `/readyz` 已复核通过;邮件 SMTP STARTTLS 配置存在,但真实邮件收件仍未验收。
- [✓] 第二台未发现 Scert 安装目录、systemd 单元或发布包;现有 PMail/Nginx 站点未修改。
- [!] 第二台历史 SSL 锁仍在,且恢复事务缺少可信旧基线;保留锁并暂停直接重试,不能把“无部署包”扩大解释为“SSL 恢复完成”。
## 2026年10月6日 当前 Linux 任务执行清单
### 已完成
- [✓] 仅处理 Linux 范围,未执行 Windows 部署。
- [✓] 构建 `b2d9eb6` 对应 Linux amd64 候选包,`source_dirty=false`。
- [✓] 完成发布清单、包内文件和 SHA-256 校验;归档不含桌面端、Wails、源码或第二台部署残留。
- [✓] 第一台 `8.137.23.95` 已完成候选包升级,服务和存储套接字恢复为 active。
- [✓] 第一台正确 SNI 的 `/readyz` 检查通过,远端核心二进制摘要与本地候选包一致。
- [✓] 第二台 `45.136.13.241` 未上传、未安装、未运行本项目,也未保留本项目部署包。
- [✓] 邮件模板统一为中文卡片样式,并通过通知包测试、后端全量测试和静态检查。
### 进行中或待执行
- [~] 浏览器正式页面登录与登录后右侧账号名、中文权限显示验收。
- [ ] 创建或核验 `xuans` 超级管理员,不回显或记录密码。
- [ ] 创建或核验管理用户。
- [ ] 创建或核验普通用户。
- [ ] SMTP 真实收件及主题、摘要、验证码、失效时间、安全提示和卡片样式验收。
- [ ] 全部邮件模板在真实邮件客户端中的样式复审。
- [ ] 打开用户可输入的可见终端,完成受保护验证码重置。
- [ ] 使用新密码登录并确认旧会话失效。
- [ ] 在第二台隔离测试站点执行正式 SSL 推送。
- [ ] 验证第二台 SSL 推送失败回滚、恢复状态和幂等重试;不删除历史锁。
- [ ] 完成三数据库首次 Web 流程与重启持久化验证。
- [ ] 完成 DNS/ACME 正负向验证、公网 HTTPS/SNI 和最终上线验收。
### 当前阻塞与安全边界
- [!] 第一台历史恢复事务缺少可信旧文件基线,不能自动重试、删除锁或伪造恢复成功。
- [!] 第二台历史 SSL 锁和恢复事务保留,不能把“未留下部署包”误判为 SSL 恢复完成。
- [!] Linux 总体生产门禁未关闭。
本清单为当前状态补充,历史执行记录继续保留;不删除文件、数据库、部署锁或历史记录。
## 2026年10月6日 Web 账号与权限实机复核
- [✓] 正式页面登录 `xuans` 成功,右侧显示当前账号 `xuans`、权限 `超级管理员`。
- [✓] 用户管理页核验 `xuans` 超级管理员账号正常。
- [✓] `管理` 账号登录成功,右侧显示权限 `管理员`。
- [✓] `普通用户` 账号登录成功,进入普通用户中心,右侧显示权限 `普通用户`。
- [✓] 用户管理页核验默认分组内共有 `xuans`、`管理`、`普通用户` 三个正常账号。
- [✓] 邮件通知页核验 SMTP 已启用、STARTTLS 配置存在、凭据已配置且收件人已设置。
- [ ] 真实 SMTP 投递、收件箱到达、邮件 HTML 渲染及验证码重置仍未完成。
### 当前实时页面证据
- 正式入口:`https://odacm.cn/login`。
- 初始化状态接口返回 `initialized=true`、`phase=ready`、`web_enabled=true`。
- 未登录会话返回 401;三种角色登录后均显示对应中文账号和权限。
- 密码、验证码、Cookie 和 SMTP 凭据未写入本清单。
## 2026年10月6日 受保护重置进度
- [~] 第一台 `8.137.23.95` 可见 SSH 终端已打开,等待通过 `/scert/scert-admin` 执行本机受保护重置。
- [ ] 最新验证码输入、新密码登录、旧会话失效和真实邮件到达仍待核验。
## 2026年10月6日 Smail 入口检查
- [✓] 公共 DNS:`web.cdis.cn -> 47.108.78.12`。
- [!] `web.cdis.cn` 当前从验收环境访问 `/` 和 `/login` 均返回 `502 Bad Gateway`,强制公开 IP 且保持 SNI 后结果不变。
- [!] SMTP 真实收件、收件箱页面和邮件客户端样式因入口 502 仍未完成,不能用配置存在替代真实到达证据。
## 2026年10月6日 SMTP 传输层检查
- [✓] `smtp.cdis.cn` 公共 DNS 解析到 `47.108.78.12`。
- [✓] TCP `587` 端口探测成功。
- [ ] STARTTLS、凭据认证、真实收件和 HTML 样式验收仍待完成。
## 2026年10月6日12时06分 当前 Linux 上线执行状态(本节为当前权威状态)
### 本轮任务清单
- [✓] 已重新阅读整改合并优化清单,确认本轮只处理 Linux;不进行 Windows 构建、部署或验收。
- [✓] 第一台 `8.137.23.95` 只读复核:`Scert.service`、`Scert-storage.socket`、`nginx` 均为 active;Web 文件目录存在,根分区约 94%,仍有约 2.6GB 可用,暂不做无依据清理。
- [✓] 第二台 `45.136.13.241` 只读复核:Nginx、MySQL active;`/scert`、`/opt/scert`、`/var/lib/scert` 均不存在,限定路径未发现本项目部署包;根分区约 12%,无需清理。
- [✓] 两台主机均使用已登记主机密钥进行严格校验;本轮批处理密钥认证未通过,随后使用交互式密码 SSH 完成只读现场复核,未关闭主机密钥校验。
- [✓] 正式浏览器页面仍显示当前账号 `xuans` 和权限 `超级管理员`;邮件通知页读取到 SMTP 启用、STARTTLS、凭据已配置和收件人已配置。
- [~] 真实 SMTP 认证、发信、收件箱到达和真实客户端样式仍待闭环;`web.cdis.cn` 入口此前返回 502,不能把配置存在当作真实投递成功。
- [~] 第一台受保护本机重置仍需用户在可见终端输入最新验证码;不猜测验证码,不把验证码写入文档或日志。
- [ ] 第二台隔离 SSL 正式推送、Nginx 配置校验/重载、失败回滚、可信恢复基线和幂等重试。
- [ ] 三数据库首次 Web 流程、重启持久化、DNS/ACME 正负向验证和最终公网 HTTPS/SNI。
- [!] Linux 总体生产上线门禁尚未关闭;历史恢复事务和部署锁不删除、不伪造成功、不直接重试。
### 当前执行依据
- 第一台与第二台本轮只读复核均未执行部署、服务重启、Nginx 重载、数据库写入或文件删除。
- 第二台继续保持“仅 SSL 推送测试”边界,不安装 Scert,不上传或保留本项目部署包。
- 第一台磁盘空间尚可,清理动作暂缓;如后续升级前空间不足,只清理本项目明确归属且有证据的临时产物,不触碰业务数据、证书、恢复锁或其他项目文件。
- 本节仅记录当前证据,不覆盖历史记录;后续状态以本节及其后的新证据为准。
## 2026年10月6日 最新 Linux 实机复核与邮件认证阻塞
### 当前实机证据
- [✓] 正式 Scert 页面已使用 `xuans` 登录成功,管理后台右侧显示当前登录账号 `xuans`,权限显示为中文 `超级管理员`。
- [✓] 系统设置的邮件通知页已打开并置于 SMTP 密码输入框,当前配置为 `smtp.cdis.cn:587`、STARTTLS,系统通知用户名为 `notify:xuans@cdis.cn`,收件人已配置;密码未读取、未记录。
- [✓] Smail 主机当前 `smail.service` 与 Nginx 均为 active,SMTP 25、465、587 监听正常。
- [!] Smail 日志在 2026年10月6日12时20分51秒和12时21分21秒记录来自第一台 `8.137.23.95` 的 SMTP 客户端认证失败;当前结论为系统通知专用发信凭据尚未通过认证,不能把端口可达或配置存在当作真实发信成功。
- [!] 第一台 `Scert-admin.service` 在 2026年10月6日12时22分44秒因本机重置请求无效或已失效退出;未修改超级管理员密码,不猜测验证码,不删除恢复锁。
- [✓] 第二台 `45.136.13.241` 当前 Nginx、MySQL active;`/scert`、`/opt/scert`、`/var/lib/scert`、`/tmp/scert`、`/root/scert` 均不存在,未发现本项目部署包或安装目录。
- [✓] 第二台现有 Nginx 仍服务 `xuans.vcer.cn`,证书路径仍为既有 `/ssl/vcer.cn/`,本轮未覆盖证书、未重载 Nginx、未写入数据库、未删除业务文件。
### 当前任务状态
- [✓] Linux 范围确认,不处理 Windows。
- [✓] 第一台 Scert 服务、存储套接字、Nginx 运行正常。
- [✓] 第二台不安装 Scert、不上传或保留本项目部署包。
- [✓] Web 登录后账号名与中文权限显示实机复核完成。
- [✓] 邮件模板统一中文紫色卡片样式,HTML 与纯文本正文保留,通知包测试和静态检查通过。
- [~] Smail 系统通知专用发信凭据认证待修正;当前 Scert 页面已停留在 SMTP 密码输入框,等待输入正确凭据后保存并重新验证。
- [~] 受保护本机验证码重置待重新启动;必须先完成真实验证码邮件到达,再由用户在可见终端输入最新验证码。
- [ ] 第二台隔离 SSL 正式推送、失败回滚及幂等重试。
- [ ] 三数据库首次 Web 流程、重启持久化、DNS/ACME 正负向验证及公网 HTTPS/SNI。
- [!] Linux 总体生产上线门禁尚未关闭;历史恢复事务和部署锁继续保留,不直接重试或删除。
本节记录 2026年10月6日最新实机证据,不保存密码、验证码、Cookie 或其他敏感凭据,也不覆盖历史执行记录。
## 2026年10月6日13时41分 当前 Linux 整改任务执行清单
### 任务状态
- [✓] Linux 范围确认,不处理 Windows。
- [✓] 第一台 `8.137.23.95` 用于 Scert 部署测试;第二台 `45.136.13.241` 仅用于 SSL 推送测试,不安装 Scert、不保留本项目部署包。
- [✓] Web 当前登录账号与权限显示复核:`xuans / 超级管理员`。
- [✓] 邮件通知配置页面复核:SMTP 启用、STARTTLS、系统通知用户名、收件人和凭据状态均已配置。
- [✓] `web.cdis.cn`、465 隐式 TLS、587 STARTTLS 严格连通性复核通过。
- [!] Smail 日志仍有 SMTP 认证失败证据,尚未形成真实邮件到达证据,不能提前标记 SMTP 门禁完成。
- [~] 可见 SSH 终端已保持连接,等待执行 `systemctl start Scert-admin` 并完成绑定邮箱验证码流程。
- [ ] 真实邮件到达与 HTML/纯文本模板样式复核。
- [ ] 受保护本机重置、新密码登录、旧会话失效。
- [ ] 第二台隔离 SSL 推送、严格 HTTPS 校验、可控失败回滚、恢复基线和幂等重试。
- [ ] 三数据库首次 Web、重启持久化、DNS/ACME 正负向和公网 HTTPS/SNI。
- [!] Linux 最终上线门禁尚未关闭。
### 当前安全约束
- 不读取、记录或回显 SMTP 密码、验证码、新密码、Cookie、私钥或 SSH 密钥。
- 不使用 `-k`、`--insecure`、强制 IP TLS;不直接重试历史失败部署,不删除部署锁或恢复事务。
- 不清理第二台业务文件;仅在有明确归属和证据时清理本项目临时产物。
### 13时45分第二台现场复核补充
- [✓] `45.136.13.241` 的 `nginx`、`mysql`、`pmail` active,`nginx -t` 通过;既有 Nginx 仍服务 `xuans.vcer.cn`。
- [✓] `Scert`、`Scert-storage.socket`、`Scert-admin` 均 inactive;限定路径未发现 Scert 安装目录、归档或部署包。
- [✓] 本次只读复核未修改第二台任何服务、配置、证书、数据库和业务文件。
- [!] SSL 正式推送、失败回滚、恢复指纹和幂等重试仍未开始。
### 13时47分邮件模板回归复核
- [✓] `go test ./internal/notification -count=1` 通过,覆盖验证码样式、失败摘要、HTML 转义、纯文本兼容和安全提示。
- [✓] 邮件模板代码保持 HTML/纯文本双正文;失败通知采用简洁摘要和重点问题区域。
- [!] 真实 SMTP 投递和收件箱渲染仍未形成现场证据。
## 2026年10月6日13时53分 邮件配置保存与受保护终端连接复核
### 当前任务清单
- [✓] 已重新阅读本清单并保持 Linux-only 范围:第一台用于 Scert 部署测试,第二台仅用于 SSL 推送测试,不在第二台安装或保留本项目部署包。
- [✓] 正式 Web 页面仍显示当前登录账号 `xuans`,权限为 `超级管理员`;邮件通知页显示 SMTP 已启用、`smtp.cdis.cn:587`、STARTTLS、系统通知用户名、收件人和凭据状态均已配置,密码未读取或记录。
- [✓] 已启动新的可见 SSH 终端连接第一台 `8.137.23.95`;当前 SSH 连接已建立,未使用主机密钥或 TLS 绕过。
- [~] 受保护验证码流程等待在该终端执行 `systemctl start Scert-admin`;验证码和新密码只允许由用户在终端输入,不写入聊天、文档、命令参数或日志。
- [ ] 真实验证码邮件到达、HTML/纯文本收件内容和邮件客户端渲染复核。
- [ ] 受保护重置后的新密码登录和旧会话失效验证。
- [ ] 第二台隔离 SSL 正式推送、严格 HTTPS 校验、失败回滚和幂等重试。
- [ ] 三数据库首次 Web、重启持久化、DNS/ACME 正负向验证及最终公网 HTTPS/SNI。
- [!] Linux 总体上线门禁仍未关闭,历史恢复事务和部署锁继续保留,不直接重试或删除。
### 本轮边界
- 本轮未修改源码、未重新构建、未重启 Scert、未清理数据库、未删除证书、备份、部署锁或业务文件。
- 第二台继续保持仅 SSL 推送测试边界;不上传、不安装、不保留本项目部署包。
- SMTP 密码、SSH 密码、验证码、新密码、Cookie 和私钥均不写入文档。
## 2026年10月06日13时57分 受保护终端流程已推进至验证码输入阶段
- [~] 已向第一台可见 Scert 终端发送 systemctl start Scert-admin,随后发送菜单选项 1 和确认输入;当前不把终端画面未回传视为流程成功。
- [~] 下一步等待绑定邮箱中的最新验证码,并由用户在同一终端输入;验证码和新密码不写入聊天、文档、命令参数或日志。
- [ ] 仍需以终端输出、真实收件箱内容和新密码登录结果确认验证码重置闭环。
- [!] 若终端未显示菜单或邮件未到达,不直接猜测、重试或修改历史恢复事务和部署锁。
## 2026年10月06日13时59分 重新打开可见验证码终端
- [✓] 重新打开独立 CMD 可见终端,标题为“Scert 验证码重置终端”,并确认已与第一台 8.137.23.95 建立 SSH 连接。
- [~] 等待用户在该终端输入 SSH 密码并启动 Scert-admin;后续验证码和新密码仅在终端输入。
- [ ] 真实邮件到达、重置完成、新密码登录和旧会话失效仍待现场证据。
## 2026年10月06日14时00分 可见终端已进入受保护流程
- [✓] 新 CMD 终端 SSH 连接保持建立,并已向该终端发送 systemctl start Scert-admin。
- [~] 已发送菜单选项 1 和确认输入,等待终端显示验证码输入提示及真实邮件到达;不把发送操作本身当作重置成功。
- [ ] 用户输入验证码、新密码登录、旧会话失效和收件内容复核仍待完成。
## 2026年10月06日14时01分 受保护终端会话状态复核
- [!] 之前打开的 CMD SSH 会话当前已进入 CloseWait,无法据此证明验证码已发送、重置已完成或新密码已生效。
- [ ] 真实收件箱、终端成功输出、新密码登录和旧会话失效仍缺少权威证据。
- [~] 保留第一台服务和历史恢复事务现状,不直接重试、不删除部署锁;待用户确认终端画面后再继续。
## 2026年10月06日14时02分 第一台公网就绪状态复核
- [✓] 通过正式 HTTPS 页面同源请求复核 /readyz 返回 HTTP 200,正文为 service=scert、status=ready;第一台服务当前可用。
- [~] 当前浏览器已回到登录页,说明现有登录会话不能作为新密码生效证据;仍需完成受保护重置后使用新密码重新登录。
- [ ] 真实验证码邮件、收件内容、重置成功输出、旧会话失效和新密码登录仍待完成。
- [!] /api/v1/health 不是当前公开健康端点,未将 404 误判为服务故障。
## 2026年10月06日14时10分 受保护流程后的账号登录复核
- [✓] 正式登录页使用账号 xuans 和已配置密码登录成功,页面提示“超级管理员登录成功”,并进入管理后台。
- [✓] 登录后右侧实际显示当前账号 xuans、权限 超级管理员;用户管理页实际显示 管理/管理员、xuans/超级管理员、普通用户/普通用户,三条记录状态均为正常。
- [~] 本轮证明当前配置密码可登录,但未取得终端“验证码发送成功/重置成功”输出,不能单独把登录成功等同于验证码邮件闭环完成。
- [ ] 真实收件箱 HTML/纯文本内容、重置终端输出、旧会话失效因果证据、第二台 SSL 推送和其余生产门禁仍待完成。