Scert/doc/Scert整改合并优化清单.md
xuans 821ccfea96 复核超管账号登录和权限
记录受保护流程后 xuans 登录成功、右侧权限显示及三类用户状态;保留真实邮件和终端证据门禁。
2026-10-06 14:10:23 +08:00

4132 lines
360 KiB
Markdown
Raw 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月6日10时47分 最新状态:普通用户身份显示及第一台 Web 更新通过
- [✓] 普通用户独立用户中心已显示当前登录账号和中文权限,跨“账户与密码/项目与成员”切换保持显示;管理员页面继续显示账号和权限。
- [✓] 非超级管理员不再显示系统设置入口;管理员线上直接读取系统设置仍返回403,后端权限边界未被前端改动绕过。
- [✓] 新增会话白名单、旧身份清理、晚到响应保护、HTML 转义及角色入口专项回归;前端专项31项、全量347项和生产构建通过。
- [✓] 仅选择 linux-amd64 生成候选:`build/release-20261006-user-account/Scert-20261006-V0.1.0-linux-amd64.tar.gz`,归档 SHA-256 为 `3a82fff4ab7aeef62ad5d6d217b56a270e81b5678631ed43af9334df31cec029`。清单 source_commit=`39cbd833121f81687a744c15ce0dcb7864fc85e9`、source_dirty=false、desktop_requested=false。
- [✓] 第一台仅切换 Web:新 `/scert/web` 四个文件摘要与候选一致;旧目录保留在 `/scert/backups/web-before-20261006-account-39cbd83`,未删除;Scert、存储套接字、Nginx 未重启且保持 active。
- [✓] 正常 HTTPS 的 `/readyz` 返回 ready,浏览器清缓存刷新后加载 `index-D-Ya24Ph.js`;普通用户、管理员账号权限显示和管理员系统设置隐藏均通过。
- [✓] 第二台未接收项目包;复核无 `/scert`、`/opt/scert` 及本次发布标识,Nginx、MySQL、PMail active。
- [ ] 第二台历史 SSL 事务仍因缺少可信旧基线未处置;真实邮件收件、受保护重置、三库首次流程、DNS/ACME 及整体生产门禁继续未完成。
归档 SHA-256 原始值为 `3a82fff4ab7aeef62ad5d6d217b56a270e81b5678631ed43af9334df31cec029`。本轮只上传第一台 Web 文件,没有向第二台上传或安装 Scert。
## 2026年10月6日10时32分 最新状态:推送失败根因与恢复证据
- [✓] 第二台目标域名未绑定独立 HTTPS 站点,现有 PMail 站点提供 vcer.cn 证书;在已认证服务器内以目标 SNI 严格核验得到域名不匹配,不能当作公网正常 DNS 验收。
- [✓] 更正此前锁扫描:实际名称为 cert.pem.scert-lock 等,必须匹配 *.scert-lock;第二台测试域名目录仍有部署锁,不代表 Scert 服务或部署包残留。
- [✓] 正式管理台只读核查返回4条待恢复事务,最近一条第二台事务的目标、临时文件和备份均不存在,三个锁仍存在且归属匹配。管理台退出结果为 success,未执行处置。
- [✓] 通过 SQLite 只读连接及 query_only 核查,4条待恢复事务的旧证书指纹均为空,新证书指纹均存在;只输出字段白名单,未输出锁令牌或凭据。
- [!] 当前正式回滚入口要求可信旧证书指纹;最近一条事务也不满足提交所需的目标文件条件。保留事务和锁,不伪造基线、不修改终态、不手工向锁定路径写入证书。
- [ ] 在保持 PMail 不受影响的前提下,明确缺少初始站点基线事务的安全处置方案,再进行第二台正式 SSL 推送验收;真实邮件、重置、三库和 DNS/ACME 整体验收继续未完成。
本节覆盖此前有限扫描未发现锁的推断,以及管理台仍为历史 failed 的描述。主服务、存储套接字及 Nginx 当前正常;本轮没有部署、重载、文件删除或数据库写入。
## 2026年10月6日10时 最新状态:连接恢复、新版在线、账号显示通过
- [✓] 用户更正凭据后,两台服务器均已通过严格主机密钥校验并以 root 登录。本节覆盖此前 SSH 认证阻塞记录,不记录凭据内容。
- [✓] 第一台现场已运行新版程序,服务于09:13进入运行状态;运行中主程序、已安装主程序、管理程序、存储程序和前端核心文件摘要均与 b55688c 候选一致。本轮只读验收,没有重复部署或重启,也不追认先前安装过程已被本轮验证。
- [✓] 从正式浏览器登录页面完成 xuans 登录;右侧真实显示当前登录账号和权限:超级管理员。可访问性快照、视口位置及导航截图均通过;覆盖此前仍为旧前端、账号不可见的历史结论。
- [✓] 第一台配置校验、Nginx 检查、正常域名严格 HTTPS 就绪请求通过;主服务仅监听回环地址,受保护管理入口仍为本机 Unix Socket。
- [✓] 第二台本輪限定路径只读检查未发现 Scert 安装目录、服务单元、常见发布目录中的部署包或所查专用端口监听;Nginx、MySQL、PMail 正常。本轮未上传文件、安装项目或删除数据。
- [ ] SMTP 真实收件与邮件外观、本机受保护重置与旧会话失效、第二台 SSL 正式推送回滚、三库首次 Web、DNS/ACME 矩阵及整体生产验收继续未完成。
详细证据见执行清单及生产测试记录同日10时章节。现在关闭的是连接阻塞和超管账号显示待办,不是整体上线门禁。
## 2026年10月6日 最新状态索引:账号权限和邮件配置
- [✓] 本轮实时确认超级管理员会话有效;管理员、普通用户的指定密码登录通过,用户列表可见范围与角色一致,非超管读取系统设置均为403;隔离测试会话已注销,用户主页面会话保留。
- [✓] 已定位右侧账号不显示:线上仍提供不包含账号组件的旧前端资源;本地已实现,不重复修改。新包部署及可视验收仍未完成。
- [✓] SMTP 已启用且凭据已保存,覆盖下文历史未配置状态;真实邮件送达仍待验证。
- [✓] 现有 Linux 候选包摘要复核一致,未为文档变动重复打包。
- [!] 第一台独立 SSH 认证尚未恢复,等待核对用户成功登录的用户名、端口;已有连接和运行会话不等于认证成功,不中断用户终端或验证码流程。
- [ ] 第一台新包部署、账号显示、邮件真实收件和本机恢复闭环;第二台仅 SSL 推送及回滚;三库首次 Web、DNS/ACME 正负向与公共 HTTPS 完整验收仍未完成。
本轮详细证据见《Scert整改任务执行清单》《Linux生产流程测试记录》同日线上复核章节。仅处理 Linux,不清理生产数据或恢复锁,不向第二台上传 Scert 部署包。
## 2026年10月4日 Linux 上线整改接手状态
### 本轮任务清单
- [✓] 已恢复 `main` 分支现场,工作区干净;本轮 Linux 整改检查点为 `f5c425f`,已提交并推送。
- [✓] 已完成后端全量回归、前端全量回归、前端生产构建及 Linux `linux-amd64` 候选包构建。
- [✓] 已将候选包部署到第一台 `8.137.23.95`;安装包校验、主程序哈希、`Scert.service` 和 `Scert-storage.socket` 状态均符合预期。
- [✓] 已核对第一台端口边界:Scert 仅监听 `127.0.0.1:8443`,MySQL 仅监听回环地址,公网入口由 Nginx 提供,未新增公网业务端口。
- [!] 第一台 SMTP 仍为关闭状态,尚未完成真实系统邮件、验证码送达、受保护终端重置及新密码登录闭环。
- [ ] 第二台 `45.136.13.241` 的正式证书推送、Nginx 重载、失败回滚和恢复测试尚未执行。
- [ ] 三数据库首次 Web 初始化、重新登录持久化、DNS/ACME 正负向矩阵及最终公共 HTTPS 验收尚未完成。
- [!] 历史 `recovery_required` 事务仍需按 `Scert-admin` 本机人工处置流程核查;禁止自动接管、手工删除锁或伪造恢复成功。
- [!] 当前总体生产验收门禁保持未通过,构建成功、HTTP 200 和本地测试通过均不作为生产验收结论。
### 候选包与第一台部署证据
- 候选包目录:`release\production-candidate-20261004-f5c425f\Scert-20261004-V0.1.0`。
- Linux 归档 SHA-256:`38fb6986548e3c95295d5ff37b0141e54b2e142798384566a4464018e582f4ef`。
- Manifest:`source_commit=f5c425f4b60fc3c1308ab86d859511868e08e4ff`、`source_dirty=false`、`trimpath=true`、`local_path_check=passed`、目标为 `linux-amd64`。
- `web.cdis.cn` 当前可访问并返回 Smail 页面,但这不等同于第一台 Scert SMTP 已认证或邮件已投递成功。
- 部署过程中未清理业务数据库、证书或现有 Nginx 配置;SSH 主机指纹保持严格校验,未使用不安全 TLS 选项。
## 2026年10月4日 公网超级管理员密码重置入口安全收口
- [x] Web 端 `/password-reset` 和 `/reset` 页面改为静态安全阻断提示,统一提示“当前方式无法使用,请联系运维人员辅助解决”,不再展示账号、验证码或新密码表单。
- [x] 前端密码重置组件及兼容 composable 不再发起公网重置请求、不创建重置会话、不接收密码;页面明确说明必须由部署主机运维人员通过本机受保护终端处理。
- [x] 公开密码处理接口仅返回通用提示,不查询账户、不发送验证码、不设置 Cookie;后端提示文案已与 Web 页面一致。
- [x] 正式 HTTP 路由继续不注册 `/reset`,即使旧版 `Scert-admin` 状态文件存在,生产路径也不会回退到旧 HTML 重置表单;后端边界回归通过。
- [x] 本地后端 `internal/httpapi` 测试、前端全量测试、前端生产构建及差异检查通过,变更等待复审。
- [~] 仍需在第一台 Linux 部署候选包后,以真实 root 前台交互终端复核 Unix Socket 本机重置、系统邮件验证码送达和新密码登录闭环;未完成前不关闭生产验收门禁。
本项未开放公网端口,未操作第二台服务器,未创建辅助验收脚本,未读取或记录任何密码、验证码或邮件密钥。Windows 环境不在本轮范围。
- [x] `Scert-admin` 旧版参数入口已退出生产构建路径,不再接受 `--config`、`--code-output` 或其他参数;Windows 安装器已改为注册无参数的本机管理程序。
- [x] Linux 运维说明已删除公网 `/reset` 激活租约、重置地址和校验码文件描述,明确 Unix Socket/Windows Named Pipe、本机终端和系统通知账户边界。
- [x] `go test ./...` 全量回归通过,`git diff --check` 通过;本次改动尚未完成第一台实机部署验收。
- [~] 待提交本轮安装器、CLI 旧入口和运维说明收口,并重新打包部署第一台后验证 Web 阻断页面、本机邮件验证码和新密码登录闭环。
## 2026年10月4日11:07 权限回归与第一台终态复核
- [✓] 邮件通知配置继续仅允许超管读写;前端直接调用设置入口也拒绝普通管理员和用户,并清除未保存密码。新增角色矩阵、降权、停用和删除会话回归通过,拒绝请求没有配置或秘密仓库副作用。
- [✓] 本地 HTTP、应用、通知三包全量及 vet 通过;前端全量 350 项零失败零跳过,生产构建通过。首次新增夹具遗漏 DNS 已验证状态而失败,修正夹具后通过,没有放宽产品初始化验证。
- [✓] 11:05 再次核验第一台 `0757` 单元 inactive/dead、success、退出零;源码属主下读取确为 `37765ff` 且工作区干净。三库租约仓储 24.044 秒、数据库 40.830 秒、证书 3.095 秒、HTTP 3.372 秒。历史 `0743` 失败记录保留,不重跑已通过任务。
- [~] P1-03 继续旧账户幂等导入及引用保护;安全删除回收、遗留租约外部核对、真实签发续期和最终正式产物仍未完成。
- [ ] 邮件页仅填写非秘密参数,密码及完整系统通知用户名由用户确认;未保存或发送。真实 Smail 发信和本机恢复、最新候选版本第一台域名验收仍未完成。
本批不清业务库、不刷新用户页面、不改第二台,不处理 Windows。上述本地权限回归不等于 Linux 新提交验收。
## 2026年10月4日10:55 邮件通知权限确认及复审任务
用户已明确:邮件通知配置仅超级管理员可管理,普通管理员和普通用户只能通过获授权业务调用系统发信,不提供任意收件人或任意内容的公开邮件中继接口。继续使用系统发信账户,不要求其他用户配置自己的 SMTP 凭据。
- [✓] 已通过域名登录超级管理员并打开邮件通知页,交用户填写;不刷新、不覆盖输入、不清数据库。当前域名入口仍不是第一台最新候选版本验收。
- [~] 增补邮件配置读写角色矩阵、角色撤销与停用会话、秘密仓库零副作用、配置持久化和前端入口防绕过回归。
- [✓] 第一台固定 `37765ff` 的 `0757` 任务于 08:04:50 结束:Linux 全量、vet、三数据库租约及七种 MySQL 迁移故障专项、授权探测与接口竞态通过。10:52 再次读取终态为 inactive、success、退出零。
- [ ] 用户完成配置后的真实 Smail 系统发信及本机安全重置仍待实测;不得把普通用户密码重置现有的管理员协助流程描述成已具备公开邮件验证码自助重置。
- [~] P1-03 旧账户导入、遗留租约核对、安全引用回收和完整签发续期仍未完成;第二台仅推送测试、Linux 与 Web 范围不变。
## 2026年10月4日07:40 执行租约与原子创建进度
07:55 实库结果:`f17ea6c` 第一台 Linux 全量、vet 和三库租约/原子创建竞态通过;整轮仍失败,MySQL 排序规则故障夹具未实际改变默认值。现已修正故障注入并增加列级冲突验证,待与授权探测增量一起复审,不修改产品拒绝规则来迁就测试。
07:51 补充:授权探测也已纳入逐域名租约校验及不确定清理引用保护,本地三包全量与 vet、独立账户十轮专项通过。第一台 `0743` 单元验证固定 `f17ea6c`,仍待终态;探测增量需另行 Linux 复审。
- [x] P1-03 已接入真实任务尝试的 DNS 执行租约,固定账户版本及秘密引用;取消后使用原凭据清理,清理或释放不确定则保留引用。未实现的崩溃遗留核对与安全回收仍是门禁。
- [x] 创建域名、初始 DNS 绑定及审计原子保存;前端一次创建并核对返回绑定,不再先创建再绑定。完整配置快照比较及底层更新、删除租约保护已补齐,忙状态接口返回 409。
- [✓] 本地五包全量、vet、租约十轮专项、接口五轮专项通过;前端再次全量 339 项与构建通过。本地实库未启用,跳过不计三库结果。
- [~] 待第一台干净源码 Linux 全量及三库租约、迁移、竞态实测;旧账户导入、安全回收、真实签发续期、浏览器、邮件及生产门禁尚未关闭。
第一台主程序测试、第二台仅证书推送的分工不变。本批未升级正式服务、清生产库或改 DNS;不处理 Windows,域名登录页保留给用户配置发信。
## 2026年10月4日06:51 最新执行进度
- [✓] 第一台干净 `412c51f` Linux 全量、vet 和单轮三库项目目录及 HTTP 权限竞态全部结束通过;`0630` 单元 success、退出零,PostgreSQL 新增目录用例实际执行通过。
- [x] P1-03 域名配置已接入独立 DNS 账户选择、用户归属展示、版本与绑定令牌校验、显式解除及部分保存失败恢复;新建后不重复创建,绑定不确定时不静默改用系统凭据。
- [✓] 最新前端全量 336 项与构建通过;26 项新增逻辑及渲染回归。真实浏览器和最新正式产物尚未验证,不以单元测试代替。
- [~] 继续执行租约及实际签发、自动续期和重试接入;旧账户导入、安全删除回收、三库首次 Web、Smail 发信与重置、公共域名等生产门禁仍未完成。
第一台仍承担主程序测试,第二台只做证书推送。未升级正式服务,未改变域名解析、发信配置或业务数据库;本轮不处理 Windows。详细证据见《DNS多账户整改任务清单》和《Linux生产流程测试记录》。
## 2026年10月4日06:28 DNS 页面与实库进度
- [✓] `c80530f` 第一台 `0610` 单轮三库竞态四包通过,MySQL 历史排序规则修复获得实库证据。`0555` 先前因磁盘不足失败;仅清理已终止隔离 MySQL 数据目录,保留日志和生产数据,不改写失败记录。
- [x] DNS 账户页已接新建、改名、启停、轮换、授权域名验证;显示项目名称、用户归属和状态,历史账户只读。按项目 DNS 管理能力展示操作,凭据清空及版本冲突不重放;前端全量 310 项、构建、后端两包全量及 vet 通过。
- [~] P1-03 仍缺域名表单选择、执行租约、旧账户导入、签发续期重试、安全删除回收和完整浏览器/实机复审;页面代码等待第一台 Linux 干净源码复核。正式服务未升级,第二台未操作,生产验收未完成。
## 2026年10月4日05:54 DNS 绑定接口及实库阻塞修复
- [x] 域名 DNS 绑定读取、修改和解除接口已接入,包含显式版本令牌、实时权限、在途任务拒绝、同源及缓存隔离;本地接口与数据库全量、vet 通过。
- [!] 第一台 `scert-domain-dns-20261004-0538.service` 已失败退出一:干净 `7a6da6b` 全量及 vet 通过,但三库竞态发现 MySQL 历史主键与新绑定外键列排序规则不兼容。已修复为继承实际父列定义,不删数据、不放宽外键;待修复提交实库复审。
- [~] P1-03 仍缺执行租约、旧账户导入、实际签发续期、安全删除回收和前端。当前线上未升级,第二台未操作,整体生产验收未完成。
## 2026年10月4日05:34 DNS 域名绑定与引用保护
- [x] 迁移二十八、同项目账户绑定仓储、变更令牌、实时双权限、在途任务保护及事务审计已实现;域名读取返回绑定标识,普通编辑不能绕过绑定切换服务商或验证方式。
- [✓] 本地四包全量、追加用例后的仓储二十轮专项和四包 vet 通过;三库实测与最新 Linux 干净源码回归待完成。
- [!] 第一台干净 `1dc72f2` 全量失败,暴露 SQLite 锁冲突被包装为凭据重复错误;已修正分类,首批失败保留,不以先前专项通过代替全量通过。
- [ ] 独立账户实际签发租约、旧账户导入、安全删除和凭据回收、绑定接口及前端仍未完成。执行租约接通前,独立绑定明确拒绝签发,不回退系统账户。本批未升级线上、未操作第二台。P1-03 和生产验收维持未完成。
## 2026年10月4日05:04 DNS 多账户接口接入
本节按运行环境 UTC+8 记录,优先于历史状态;范围仍为 Linux 与 Web。
- [x] 独立 DNS 账户数据层已接入创建、读取、改名、启停、轮换、服务端在线验证接口;账户列表显示项目及用户归属,旧系统账户保留兼容展示。不是只保存数据模型,也不是完整生命周期已完成。
- [✓] 本地四包全量和静态检查通过,追加依赖故障用例后的三轮专项通过;覆盖越权、旧版本、验证期间轮换/禁用/撤权、审计回滚和响应不含凭据。
- [✓] 05:09 实查第一台三库与 HTTP 三轮专项竞态、vet 已成功终止,退出码零;此前触发器权限和启动环境变量错误保留失败记录。故障注入使用隔离库管理连接,业务操作仍使用受限账户。本次为隔离覆盖树,最后两项本地增量待干净源码回归。
- [ ] 旧账户导入、域名绑定、执行租约和引用回收、签发续期、前端账户操作尚未完成。P1-03 和总体生产验收维持未完成。
- [ ] 当前在线版本未升级;第一台公共入口、系统发信、三库首次 Web 和真实云端验收仍需完成。未修改解析、清理生产数据或重复第二台主程序测试。
## 2026年10月4日04:06 DNS 多账户生命周期开发
- [~] 正在按《DNS多账户整改任务清单》补独立账户模型、三库迁移及带实时权限的生命周期仓储;修改前检查点 `26b8c3c` 已推送。
- [ ] 旧系统账户迁移、域名绑定、实际签发与续期、账户操作接口及页面尚待接入,不以数据层代替完整功能。
- [!] 公共域名仍指第二台,尚未改解析;系统发信、公共浏览器角色矩阵和总体验收未完成。继续第一台相关开发,不重复第二台主程序测试。
## 2026年10月4日03:55 系统设置隔离与第一台升级
本节按运行环境 UTC+8 记录,优先于历史状态。本批检查点 `8b26cbf`、实现 `3ff59dd` 和前端兼容增量 `c5774f3` 已提交推送;第一台已通过官方安装器升级至干净 `c5774f3`,第二台未操作。
- [✓] 系统设置 GET 与 PUT 均限制为实时超级管理员会话;成功、未登录和越权响应均禁止缓存,不改变项目 DNS 账户的独立权限。
- [✓] 工作台先获取实时会话,仅超级管理员请求系统设置;重载先清除旧系统配置和未保存凭据,并拒绝旧并发响应覆盖新会话。普通角色也不再请求管理员专属服务商目录。
- [✓] 前端全量 286 项及 Vite 构建通过;包括普通管理员、普通用户、超级管理员、会话失败、降权、设置拒绝和旧响应竞争。旧保存契约夹具补充真实超级管理员会话,原数据断言未放宽。
- [✓] 第一台旧源码红测确认普通管理员原可读全局配置;修复后设置专项已通过。
- [✓] 第一台首批 HTTP API 全量两项旧权限契约失败已修正,失败记录保留;HTTP API 全量、vet 和三轮专项竞态复跑成功,随后干净源码 Linux 全量与 vet 也已成功终止。
- [✓] 干净 `c5774f3` 官方 Linux 包构建、路径及摘要检查通过,第一台安装任务成功结束。运行文件和实际 HTTP 返回的新前端摘要一致,回环严格 TLS 就绪正常,匿名设置返回四百零一并禁止缓存。
- [ ] 本批真实超级管理员与普通管理员公共浏览器会话复核仍待公共域名入口切换;不以回环定向验证代替公网或全部角色实机验收。
- [!] 第一台正常公共域名入口、系统发信及密码重置、三库首次 Web、DNS 多账户与 CNAME 完整生命周期、公共 CA 签发和总体生产验收仍未完成。不以本批权限修复替代整体门禁。
## 2026年10月4日03:14 HTTP 验证回归与第一台部署
本节按运行环境 UTC+8 记录,优先于下方历史状态;仅 Linux 与 Web。第一台运行版本已从 `2513f93` 升级至 `9c26db0`,HTTP-01 不再属于尚未接入的开发项,但公共域名实际签发仍未验收。
- [✓] HTTP-01 正式服务、域名验证方式、迁移二十六与前端选择已接入;同步、异步及重试在实际签发配置快照上重新检查项目与操作权限。
- [✓] 首批编译及 SQLite 快照回归失败已修复;第一台 Linux 全量、vet、专项竞态均终止成功,没有跳过失败用例。
- [✓] 真实独立 Nginx 十项通过;SQLite、MySQL 8.0.46、PostgreSQL 14.24 迁移专项及 MySQL 中断重入、冲突结构拒绝通过。不是三库完整首次 Web 验收。
- [✓] 干净 `9c26db0` 官方 Linux 包构建、前端 279 项及产物摘要通过;第一台正式安装升级完成,本轮重新读取服务终态、运行文件摘要和严格 TLS 就绪均正常。
- [✓] 第一台 Nginx 80 挑战路径已接入,未知令牌返回无缓存 404,普通业务仍跳转 HTTPS;上游严格 TLS 不变,应用和数据库仅回环监听。这是内部诊断,不是公网签发证据。
- [✓] 真实 lego 客户端的隔离 ACME 协议回归四场景通过,五轮竞态、证书包全量与 vet 通过;覆盖注册、签名、逐域名 HTTP 证明、CSR、证书链及失败清理,不等于公网签发或完整 ACME 标准一致性认证。
- [~] 继续 DNS 独立多账户生命周期、CNAME 委派和其余元数据权限复审;已发现普通管理员可读系统设置全局元数据,正补访问限制和前端兼容。
- [!] 正常 DNS 仍指第二台,尚未获准切换;Smail 系统通知授权、真实邮件与重置、三数据库首次 Web、HTTP-01 公网签发及总体上线验收未完成。P1-03 不整项关闭。
证据路径与准确范围见《Linux生产流程测试记录》同时间章节。不清现有业务数据、不重复第二台主程序测试、不新增辅助脚本或远端备份。
## 2026年10月4日02:03 DNS 隔离正式升级完成
- [✓] 干净提交 `2513f93` 正式 Linux 发布包构建完成,路径检查、本地 manifest、上传第一台后的归档及包内摘要均通过。
- [!] 首批全量真实失败:普通源码归档缺 Git 索引,源码忽略规则及换行边界两项失败;不将专项通过冒充全量通过。
- [✓] 同提交真实 Git 仓库干净签出后,第一台全量、vet 与专项竞态已全部结束通过;发布源码边界失败修正的是测试输入,没有跳过用例。
- [✓] 第一台已通过官方安装器升级至 `2513f93`,实际运行二进制与前端资源摘要一致,回环严格 TLS、就绪、监听边界及 DNS 列表匿名/超级管理员路由通过;保留数据,未操作第二台。线上不再是旧发布包。
- [!] 真实域名仍指第二台;HTTP-01、完整账户生命周期、委派管理、系统通知授权、三数据库首次 Web 和整体验收继续未完成。
本节按第一台 UTC+8 记录,优先于下方历史状态。本批只关闭 DNS 列表读取隔离的正式发布及内部复核,不代表全部元数据通道、P0-07 或公共入口最终验收通过。
## 2026年10月4日01:35 DNS 账户读取隔离补漏
- [x] 第一台隔离 Linux 正式用例在旧源码复现全局管理员跨项目读取 DNS 账户、撤权后旧会话继续读取的问题;这不是仅有待验收项,已据实补修。
- [x] DNS 列表改为真实项目的实时 DNS 读取授权,先授权再查询归属及凭据;无权返回空列表、依赖异常拒绝返回数据,匿名及授权响应均禁止共享缓存。项目角色导航同步开放,系统写权限不变。
- [x] 第一台 Linux 专项通过,前端 276 项通过;后端全量、竞态、正式新包与第一台升级待完成。当前线上仍为旧发布包,不提前宣称线上缺口已关闭。
- [!] DNS/ACME 源码核对发现 HTTP-01 尚未接入;完整账户生命周期与委派管理仍不能由单系统账户和 Provider 适配器替代。这些属于开发及验收缺项,不再笼统写作只差实机矩阵。
- [!] 域名页面已经按用户要求通过正常域名打开,但当前仍指第二台;未在那里配置发信,未修改 DNS。公网入口、系统通知授权和三数据库首次 Web 前提仍保留。
仅处理 Linux;第二台不重复主程序测试,无新增辅助脚本、备份或磁盘检查。详细用例及执行记录见《Linux生产流程测试记录》。
## 2026年10月4日01:10 外部前提补充
不同版本回滚与重试的通过结论见下节,不重复执行第二台业务测试。第一台内部前后端正常,但公共入口定向诊断仍为 HTTP 403、HTTPS 握手失败,服务器侧管理域名 DNS 仍指第二台。Smail 网站可达,但 Scert 系统 SMTP 未启用、未配置授权;匿名状态查询的权限拒绝不是发信故障。完整首次 Web 和邮件闭环需要可用且指向第一台的管理域名,以及 Smail 系统通知专用授权;未满足前不清空现有业务数据、不猜凭据、不改用普通邮箱。整体目标及其余门禁保持不变。
## 2026年10月4日01:04 最新有效进度:不同版本恢复与故障回滚通过
第一台负责主程序与业务测试,第二台仅用于推送证书、重载与回滚验证;不重复第二台的主程序、数据库或初始化测试,不再例行检查磁盘。本节优先于历史状态,仅处理 Linux。
- [✓] 复用两张有效且指纹不同的历史正式证书,经第一台正式恢复及部署接口完成版本切换;第二台文件与正常 DNS 严格 HTTPS 叶证书指纹一致。
- [✓] 第二目标重载阶段真实终止第一台 Scert 主进程,systemd 重启后两事务均 rolled_back;文件与第二台实际 HTTPS 恢复旧指纹,不能再归类为同证书回滚。
- [✓] 同一失败任务通过正式 retry 入口完成第二次尝试,两个目标 committed,原失败尝试和 rolled_back 事务保留;托管版本与目标状态一致。
- [✓] 第一台服务和回环监听边界、第二台本次事务文件清理已核实;未新增公网端口、辅助验收脚本、额外备份或新签发。
- [!] 两条无可信基线历史事务、第一台公共入口、Smail 系统通知授权仍未关闭;三数据库首次 Web、系统邮件与重置、DNS/ACME 剩余矩阵继续待验。
任务编号、两次未生效注入及实际证据详见《Linux生产流程测试记录》01:04 章节。不同版本恢复及崩溃自动回滚子项通过,不代表 P0-10 或整体验收全部通过。
## 2026年10月4日00:40 最新有效进度:正式升级、人工回滚及断连查询通过
本节覆盖下方历史状态,仅处理 Linux。沿用已确认需求,不以本次恢复子项代替整体生产验收。
- [✓] 后端全量、静态检查、五包专项与竞态已结束并通过;前端 275 项通过。隔离 SQLite、MySQL、PostgreSQL 重新核查、审计失败和连接池重开验证通过。
- [✓] 实库迁移二十二至二十五通过;首次实库整批失败源于测试比较内存与数据库不同时间精度,修正为比较持久化前后快照后复跑通过,历史不变断言保留。
- [✓] 干净提交 `e00a757` 正式 Linux 包构建、路径检查和摘要校验通过;第一台经官方安装器升级至 schema25,回环严格 TLS 就绪检查通过,Scert 仍仅监听回环地址。
- [✓] 正式本机菜单五重新核查原 uncertain 成功;菜单四查询、只读数据库复核均通过。原历史保留,新审计完整,原事务 committed,处置占用为零;未重放远端动作。
- [✓] 第二台测试域名正常 DNS 严格 HTTPS 返回 200;未新增公网端口、辅助验收脚本或额外数据备份。
- [✓] 真实故障后正式菜单恢复基线成功,事务 rolled_back,审计完整、占用为零;未手工恢复文件或删除锁。
- [✓] 第二次真实故障后正式菜单完成提交,在处置为 running 时主动断开密码 SSH;重新密码登录后菜单四查询 succeeded/committed,原任务失败历史保留,没有重放处置。
- [~] 本批提交及回滚均为同一有效证书重新部署,不同证书版本回滚和 DNS/ACME 剩余实机矩阵继续待验。
- [ ] 三数据库清库后的首次 Web 全流程仍待执行;本批保留生产数据验证升级和恢复,不能计为首次流程验收。
- [!] 两条无可信旧基线的历史事务保持 recovery_required,不补造证据、不删除锁;第一台公网入口与 Smail 系统通知授权仍待解决和复核。
详细编号、发布摘要和测试失败原因见《Linux生产流程测试记录》。整体验收未完成,不能以旧 P0-03 局部状态代指全项目。
## 2026年10月3日23:58 独立重新核查实现与回归
本节优先于下方历史进度,仅处理 Linux;生产验收仍未完成。
- [x] 不确定处置独立重新核查已实现:受保护本机菜单五,方向绑定原处置,只读远端核验,以新审计收尾,原不确定记录保留;不接管运行中处置。
- [✓] 最新五包专项及竞态通过,包含部署、仓储、本机协议、管理终端和 HTTP 会话的 Recovery、Disposition、Reconciliation 用例;不代表真实远端收尾已通过。
- [✓] 上批关闭修复及备份权限夹具在严格 umask 下后端全量通过,静态检查通过;此结论不包含后续重新核查代码。
- [~] 最新代码后端全量、静态检查、隔离 MySQL/PostgreSQL 迁移二十五及执行器验证正在运行。已补充审计失败、连接池重开和持久占用验证。
- [ ] 测试通过后构建干净 Linux 候选包,通过正式安装器升级并以正式本机入口收尾实机 uncertain;禁止手动改终态、删占用或重放原动作。
- [!] 第一台公网备案拦截、Smail 系统通知授权,以及三数据库首次 Web、人工回滚和断连、DNS/ACME 完整验收仍未关闭。
修改前检查点 `f9cd19f` 已中文提交并推送。第二台空间已核实充足,不再作为整改阻塞。
## 2026年10月3日23:14 崩溃恢复实测与关闭误判修复
- [✓] 正式 API 任务 `c68e3956-1b6d-42c7-ba9a-753ef2d1a44b` 在第二目标重载阶段被真实 SIGKILL 中断;systemd 自动重启,两条事务均 rolled_back,任务保留 service_restart 失败记录。
- [✓] 双机证书摘要一致,事务临时文件、备份和锁由产品恢复链路清理;第二台正常 DNS 严格 HTTPS 200。该证据仅覆盖同一有效证书重新部署,不代表不同版本证书回滚。
- [!] 短暂限制 Scert 用户到第二台 SSH 后形成真实待恢复事务。正式人工提交完成文件及锁收尾,却因连接关闭误判持久化 uncertain,持久化占用仍阻止第二台的新部署;网站仍正常。临时网络限制及撤销定时器已撤销。
- [✓] Linux 真实 SSH/SFTP 协议回归复现健康连接关闭返回连接已关闭错误,修复前退出码一;不是内存远端替身。
- [x] 已修正主动关闭产生的预期 SFTP 错误分类,并使重复和并发关闭幂等;既有断连及其他关闭错误仍返回失败。部署整包竞态通过。
- [~] 正在执行 Linux 后端全量与静态检查;随后构建干净候选包并安装。现有 uncertain 记录和占用不直接改写,需独立的受保护重新核查收尾流程,不能自动重放。
- [ ] 人工提交及回滚成功、执行中断连查询、未确定处置安全收尾、三数据库首次 Web、系统邮件、DNS/ACME 全矩阵与公网验收尚未完成。
第一台公网备案拦截和 Smail 系统通知授权缺失仍是门禁;未开放额外端口、关闭 TLS 验证或创建辅助验收脚本。
## 2026年10月3日22:44 多对多推送通过与公网门禁复核
本节为最新结论;仅 Linux,整体生产验收未通过。上批的失败事务继续保留,不用后续成功覆盖失败记录。
- [✓] 正式接口新增并绑定既有测试站点 `scert-multi-20260930.apmmk.cn`,导入现场有效正式证书后双机部署成功,任务 `af31d106-9231-4659-bab1-bca2932f8ff4`;两条事务均 committed。
- [✓] 与 `acceptance-0928.odacm.cn` 合并形成两个有效域名、同两台服务器、四个成功目标的实机多对多证据;第二个域名双机文件摘要一致,第二台正常 DNS 严格 HTTPS 返回 200。
- [✓] 无可信旧站点指纹的失败事务,通过正式本机恢复入口选择恢复基线后被拒绝,持久结果为 rejected,未执行远端变更;该负向通过不代表原事务已恢复。
- [!] 失败的 `.odacm.cn` 多域名记录与现场 `.apmmk.cn` 站点不一致;其目标文件已恢复为原先不存在的状态,但没有可信旧 HTTPS 基线,仍保留锁和证据,不改名覆盖、不补造证据。
- [!] 第一台公网入口当前实测受阻:从第二台请求其 80 端口返回 HTTP 403、Server Beaver 和 Non-compliance ICP Filing 页面;443 对测试域名及管理域名均重置连接。强制 IP 探测仅作诊断,不算正常 DNS 验收,也不据此开放其他公网端口。
- [!] 第一台正式设置接口确认 SMTP 未启用、主机为空、系统账号未配置、凭据未配置。`web.cdis.cn` 严格 HTTPS 返回 200,但通知状态接口要求登录;需有效 Smail 系统通知授权,不能用普通自定义邮箱顶替。
- [ ] 人工提交及回滚成功场景、历史无证据事务、三数据库清库首次 Web、系统邮件与邮箱重置、全量 DNS/ACME 正负向和最终公网验收仍未完成。
本批为既有正式证书导入和推送,不是新 ACME 签发;没有清库、创建辅助验收脚本、手动删锁、降低 TLS 校验或修改其他站点。
## 2026年10月3日22:32 正式包与真实双机推送进度
本节优先于历史进度,仅处理 Linux。以下是保留数据的升级与推送验证,不是清库首次初始化验收。
- [✓] 发行说明已修正并随 `a5dfd42` 推送;干净提交构建的 Linux amd64 正式候选包完成,清单标记 `source_dirty=false`、`trimpath=true`、路径检查通过。
- [x] 第一台已通过包内安装器升级,迁移版本为 24,运行二进制摘要与候选包一致,回环严格 TLS 就绪检查通过;第二台仅作为推送目标,尚未升级本批 Scert 管理程序。
- [✓] `acceptance-0928.odacm.cn` 经正式产品接口推送到两台服务器,任务 `ecfd31f0-ba6d-4cbb-a3e7-485568eabfaf` 成功,两条事务均 committed;文件摘要一致,第二台正常 DNS 严格 HTTPS 返回 200。
- [✓] 同一幂等键重放返回原成功任务和 `replayed=true`,未创建重复部署。
- [!] 第二域名任务 `8efd495b-5511-4070-a7ab-2e02afac82bc` 失败:第一台 HTTPS 命中其他域名证书;两目标恢复未确认,产品保留锁,禁止直接重试或手动删锁。正在核对实际站点配置。
- [✓] 正式 systemd 管理终端已完成真实事务只读核查、仅记录核查和新终端查询;原事务保持需要恢复,不误记为已恢复。
- [ ] 人工提交与回滚、历史无证据事务、三数据库首次 Web、Smail 系统邮件与重置、DNS/ACME 正负向和完整上线门禁继续保留。
总体生产验收未通过;本批成功仅限已取得直接证据的升级、单域名双机推送及记录查询动作。
## 2026年10月3日22:03 发行前收尾任务
沿用已确认的 Linux 上线范围;不处理 Windows,不反复检查磁盘,仅在实际不足时清理。本节优先于历史进度。
- [✓] 21:57 实查外部数据库整组任务已正常结束:PostgreSQL、MySQL、SQLite 竞态、静态检查和后端全量五项退出码均为零。
- [~] 修正发行包中的旧 Web 重置、验证码文件和放宽 TLS 的说明,使其与受保护本机终端及仅 Nginx 80/443 的边界一致。
- [ ] 从干净提交构建 Linux 候选包,核对源码提交、清单与归档哈希。
- [ ] 第一台正式安装及管理员交互,第二台真实推送、失败回滚与恢复;首次 Web、系统邮件和完整生产门禁仍未通过。
## 2026年10月3日21:48 实库与本机入口进度
- [✓] R3 本机接入修复版任务已正常结束,五项退出码零,HTTP 全包竞态约 393.752 秒;代码检查点 `0f2e6bf` 已推送。
- [✓] R4 PostgreSQL 14.24 隔离实库:迁移 22—24 三个事务回滚重入场景,以及执行器三动作、两类审计故障、重开查询/占用、八并发幂等共十个场景通过。
- [✓] R4 MySQL 5.7.44 同一执行器十场景通过,业务连接仍为受限账户;只在本次隔离数据库注入审计故障。
- [~] 最新 SQLite 执行器竞态、静态检查和普通后端全量正在继续;外部实库证明不包括实际远端文件或 TLS 站点动作。
- [✓] 当前前端 275 项测试全部通过,无失败和跳过。
- [ ] 下一项为正式 Linux 候选包和双机生产验证;PostgreSQL 本轮为 SQL 持久化专项,不代表 PostgreSQL 16 备份工具、首次 Web 或最终生产验收。
## 2026年10月3日21:32 最新整改进度
本节优先于历史状态;仅 Linux,生产验收仍未通过。
- [x] R3-F/G/H 本机会话、严格协议与管理员终端已接入准备、一次性执行和查询;只接受受保护本机身份,断连不重放,不新增 HTTP/TCP 恢复入口。
- [✓] 最新 Linux 本机协议、终端、部署三包竞态,HTTP 本机恢复专项竞态,完整静态检查和后端普通全量均通过。
- [~] 同一后台任务的 HTTP 全包竞态仍在执行,整组尚未结束;首轮分片测试夹具失败与五分钟 HTTP 超时记录保留。
- [~] 下一批完成 R4 外部实库的处置原子性、审计故障和重开查询,随后构建正式 Linux 候选包。
- [ ] R5 三数据库首次 Web、系统邮件、DNS/ACME、公共 HTTPS、多对多推送与失败恢复仍需直接生产证据。
## 2026年10月3日21:00 最新整改进度
- [✓] 最新执行器部署竞态、SQLite 五场景、后端静态检查及全量已通过,后台任务已正常结束,四项退出码均为零。
- [x] 执行器底层已提交并推送 `bf4caeb`。
- [~] 开始受保护本机会话、协议和管理员终端接入,具体任务见《部署事务人工核查任务清单》21:00 节。
- [ ] 必要外部实库、正式包和双机生产验收仍未完成;不将自动测试等同于生产验收。
## 2026年10月3日20:52 历史整改进度
本节覆盖下面历史状态;仅 Linux,生产验收仍未通过。
- [x] R3 一次性确认已编码:短时令牌、操作者与准备摘要绑定、复制共享消费状态、错误确认及取消后不可重放。
- [x] 记录、提交收尾、回滚三个明确执行器接入共同操作门和持久化意图/结束审计;失败不切换动作,可能已写入的失败保留占用,历史已核验阶段也须重新核验站点。
- [x] 新增脱敏结果查询,执行中及重启后可读取持久结果,不重放动作、不释放占用;补上历史临时路径列表漏项时的未知文件拦截。
- [✓] 执行器基础两轮部署竞态、SQLite 三动作和两类审计故障/数据库重开测试通过,静态检查和后端全量通过一轮。SQLite 首次测试夹具缺少证据接口,修复后五场景通过,原失败日志保留。
- [~] 最后追加的未知临时文件拦截与安全查询随最新八份源码重新进行 Linux 竞态、SQLite、静态检查和全量回归,当前任务为 `scert-executor-final-20261003-2052.service`。
- [ ] R3 本机协议和管理员终端接入;R4 PostgreSQL 等必要实库及故障矩阵;R5 正式 Linux 包和完整生产门禁。尚未开放人工写入口、未更新线上正式包、未清理业务数据库。
## 2026年10月3日20:17 最新执行进度
本节覆盖下方历史状态;仅 Linux,第一台部署测试、第二台证书推送,Smail 为 `web.cdis.cn`。总体生产验收未通过。
- [x] R4 完整进程内互斥已接入 `Deploy`、`DeployVerified`、`RecoverPending`,覆盖推送、HTTPS、提交、回滚与连接收尾;等待可取消,不提前释放。
- [x] 自动恢复识别持久化人工占用,查询失败或已有占用均不连接远端、不更新原事务;普通部署在连接前检查同服务器及同地址端口别名。
- [x] 原生 Linux 部署包竞态和后端完整静态检查通过;补充并发、取消、未占用正常恢复、SQLite 关闭重开后的真实服务占用拦截竞态通过。
- [~] 最新后端全量正在 `scert-operation-full-20261003-2012.service` 执行,尚未据此记通过;四个关键源文件本地与测试机 SHA-256 一致。
- [x] 前一批 MySQL 迁移十二场景及仓储六场景通过;代码与文档检查点 `d801fb3` 已推送。
- [ ] R3 下一步:一次性确认绑定受保护本机身份和准备摘要,在共同互斥及持久化占用内重新核验,执行明确的记录、提交或回滚动作;再接入本机协议和终端。
- [ ] R4 PostgreSQL 实库、执行器并发/重启边界,以及 R5 正式候选包和三数据库首次 Web、系统邮件、DNS/ACME、公共 HTTPS、多对多部署、失败回滚等生产门禁仍待完成。
## 2026年10月3日20:04 最新执行进度
本节覆盖下方历史状态;仍仅处理 Linux,生产验收未通过。
- [x] MySQL 迁移 22—24 的十二个中断重入与结构冲突场景通过;补充数据库重开及准备绑定竞态专项通过。
- [x] MySQL 三动作正向及三个审计失败回滚场景全部通过,修复后专项退出码零,约三十二秒。原权限失败记录保留;仅隔离实例管理连接创建触发器,业务账户权限未提升。
- [x] 检查点 `17eb2fc` 推送重试成功;第二台实机复核根分区可用 26 GB,五项服务运行,Nginx 配置通过,本次未再删文件。
- [~] R4 下一批:进程内互斥覆盖普通部署、HTTPS 校验、恢复和收尾;自动恢复识别持久化人工占用,查询失败时拒绝操作且不改原事务。
- [ ] R3 一次性本机确认、动作执行器及本机协议接入,R4 PostgreSQL 实库与完整回归,R5 正式候选包及生产门禁仍待完成。
## 2026年10月3日19:43 最新执行进度
本节覆盖下方历史状态。范围仍为 Linux;第一台部署测试,第二台仅证书推送,Smail 地址为 `web.cdis.cn`。状态标记:[ ] 未开始;[~] 进行中;[x] 已完成等待复审;[✓] 复审通过;[!] 阻塞。
- [x] R2 后端全量通过;R3 准备绑定加入后的部署、本机协议、管理员终端三包竞态、完整静态检查和 HTTP 全包竞态通过。HTTP 约 375 秒,整组退出码零;此前四分钟累计超时不再是当前阻塞。
- [x] R3 准备与重新核验基础通过原生 Linux 竞态:操作者、动作、事务、配置和现场摘要绑定;一分钟有效期;缺历史证据拒绝写动作准备。它不是执行授权,不能把 R3 整体标完成。
- [x] R4 持久化基础已编码:独立处置记录、事务唯一占用、开始与结束审计、幂等冲突拒绝;开始和结束分别原子落库。不确定结果保留占用,不按时间自动释放。
- [x] 第一轮仓储、数据库、部署三包竞态与后端完整静态检查通过;这里只包含隔离自动回归,不代表 MySQL/PostgreSQL 实库或正式安装流程通过。
- [~] 补充数据库关闭重开、准备摘要转换和 MySQL 实库 DDL 中断、审计失败专项;结果待取得。迁移为 22—24,每版仅一个表,复用 MySQL 严格结构核验,不改旧迁移回填行为。
- [ ] R3/R4 仍需一次性本机确认、执行器接入、普通部署与恢复的完整互斥、动作专属核验及最终原子结果联动;存储方法不对公网开放。
- [ ] R5 正式候选包、三数据库首次 Web、系统邮件与密码重置、DNS/ACME、严格公共 HTTPS、多对多部署及失败/重启恢复仍未完成。
- [~] 修改前检查点 `ed0c97b` 已推送;总体生产验收未通过,不能承诺已具备上线条件。
## 2026年10月3日19:02 最新进度
本节为最新状态,后续章节仅保留历史过程。第一台用于部署测试,第二台仅用于推送测试,Smail 为 `web.cdis.cn`,只处理 Linux。
- [x] SQLite 截止时间修复后的原生 Linux 后端全量通过;截止时间确定性用例及执行路径专项重复二十次通过。
- [x] R2 长路径响应改为有界分片:单帧仍为 16 KiB,数据片 8 KiB,最多四十八片;不截断、不重复采样,不返回部分结果。长路径转义、缺片、乱序、令牌变化、超限及取消回归通过。
- [x] 最新本机协议、管理员终端、部署三包竞态及后端完整静态检查通过,等待最新全量与正式包复审。
- [!] 旧五包竞态任务四包通过,HTTP 包依赖编译因资源限流达到二十分钟上限;整体退出码一,不能记为通过。
- [~] 最新后端全量与 HTTP 单包竞态串行运行;仅调整隔离测试资源限额,未修改业务服务。
- [ ] R3、R4 人工处置、独立审计与持久化互斥仍未完成;R5 正式候选包及三数据库、邮件、DNS、HTTPS、回滚等生产门禁仍未完成。
- [~] 总体验收未通过,当前不具备最终上线承诺依据。
## 2026年10月3日18:28 范围确认与最新任务入口
本节取代下方历史章节中的“当前”进度描述;后续结果继续按时间记录。用户已确认:第一台 `8.137.23.95` 用于 Scert 部署测试,第二台 `45.136.13.241` 仅用于证书推送测试;不以两台均部署 Scert 为验收要求。Smail 地址为 `web.cdis.cn`,仅处理 Linux。
- [x] 修改前检查点 `978f023` 已提交并推送;根目录未跟踪文件 `=` 保留。
- [x] 本机只读核查入口已编码,第一批 Linux 三包及 HTTP 密码重置、核查专项通过;尚未部署正式候选包。
- [!] 原后端全量退出码一:隔离目录缺少仓库外围文件,并存在 SQLite 截止时间锁等待错误;不能记为通过。
- [~] 已补齐完整源码和隔离 Git 索引;新增确定性用例已复现截止时间已到、取消通知未调度时仅返回 SQLITE_BUSY 的问题,正在修复并回归。
- [ ] 完成本机入口竞态与静态检查、人工处置与独立审计,再将正式候选包部署到第一台。
- [ ] 第一台完成三数据库首次 Web、真实系统邮件和密码重置、DNS/ACME 正负向、严格公共 HTTPS;第二台验证证书推送、重载、失败回滚及恢复。仍需覆盖域名与服务器多对多。
- [~] 总体生产验收未通过;不因第二台磁盘清理或局部测试通过关闭门禁。
> 当前进度以文末「2026年10月3日17:22 最新执行状态」为准:恢复核查底层专项已通过,本机入口和生产门禁仍未完成。
## 2026年10月3日 Linux上线冲刺任务清单(当前执行入口)
本轮只处理 Linux,不处理 Windows;目标是完成明日上线前的可验收闭环。生产结论必须来自两台真实服务器、真实 HTTPS、浏览器、数据库、邮件和回滚证据,不能用构建或单元测试替代。
### 当前任务状态
- [x] 已读取整改清单、任务执行清单和开发任务清单,并核对当前分支、工作区和最近提交。
- [x] 最新 Linux 候选包已部署到 `8.137.23.95` 与 `45.136.13.241`;Scert、存储 socket、Nginx 均为 active。
- [x] 两台服务器保持公网仅 Nginx `80/443`,Scert 仅监听 `127.0.0.1:8443`,未开放内部端口,严格 TLS 校验保持开启。
- [x] 管理域名保护代码、Nginx 配置兜底识别和回归测试已完成,并已部署最新候选包。
- [x] 第二台服务器已清理明确属于历史 Scert 测试的临时构建和测试文件;未清理 `/scert`、数据库、证书或 Nginx 配置。
- [~] 在两台服务器执行 `odacm.cn` 管理域名普通证书部署负向验证,确认拒绝、回滚和现场不变。
- [ ] 使用独立普通业务域名执行双机正向部署,确认管理域名保护不影响正常证书部署。
- [!] 第一台当前管理证书的公共 SAN 与 `odacm.cn` 不匹配;在不更换现有业务证书的前提下,需补齐可验证的正式域名入口证据。
- [!] 两台现场仍有历史 `recovery_required` 事务缺少可信恢复证据;必须通过产品恢复流程核查,禁止手工删锁或伪造证据。
- [ ] 清理浏览器缓存后,分别完成 SQLite、MySQL、PostgreSQL 首次 Web 初始化及重新登录持久化验证。
- [ ] 使用 Smail 系统账户完成真实发信、验证码和超级管理员密码重置闭环;失败时继续按 Smail 项目实现排查。
- [ ] 完成 DNS/ACME 正向和负向矩阵、证书历史恢复、失败回滚、重试幂等及重启恢复验证。
- [ ] 汇总双机、HTTPS、浏览器、数据库、邮件、DNS、回滚证据,满足所有门禁后再标记最终生产验收。
### 本轮结论
当前仍为 **P0-03:完成,等待复审**,整体生产验收未通过。已完成的是候选包双机运行和基础安全边界,不代表全部上线门禁已关闭。
## 2026年10月2日 当前执行入口:自动回归完成,转入双机生产复审
本轮只处理 Linux,不处理 Windows;目标是完成两台真实服务器的最新候选包部署和生产验收,不以自动化测试替代实机验收。
- [x] 当前工作区干净,本地 `main` 与远程 `Scert/main` 同步到 `71367b8`。
- [x] 使用 Go 自动工具链完成后端 `go test -count=1 ./...`,全量通过。
- [x] 完成后端 `go vet ./...`,退出码为 0。
- [x] 前端全量测试 275 项通过,零失败、零跳过;Vite 生产构建通过。
- [x] 部署、证书、应用、历史恢复和首次部署恢复相关专项测试通过;这些结果仍属于自动回归证据。
- [~] P1-02 历史证书恢复继续补齐真实归档恢复、完整证书链、状态提交失败回滚及三数据库验证。
- [~] 首次部署恢复事务测试已补充依赖,待执行最新候选包的原生 Linux 全量回归和双机实机复核。
- [ ] 按正式安装流程重新构建并部署到 `8.137.23.95`、`45.136.13.241`,继续保持公网仅 Nginx `80/443`。
- [ ] 完成清缓存浏览器首次流程、三数据库首次 Web、Smail 系统发信与超级管理员密码重置闭环。
- [ ] 完成第一台正式证书 SAN、重启早期 502、DNS/ACME 正负向场景及最终双机业务验收。
- [!] 当前不能宣布生产验收通过;不使用 `-k`、不关闭 TLS 校验、不创建辅助验收脚本、不做远端备份。
## 2026年10月2日 当前开发进度:证书历史版本恢复前端闭环完成
- [x] P1-02:后端已实现本地证书历史版本读取、版本校验、恢复任务持久化、幂等提交、活动任务冲突、失败收敛及权限复核;恢复仅更新 Scert 本地托管证书,不宣称远端部署完成。
- [x] P2-03 配套:前端已接入历史版本列表、稳定 `history_id` 恢复、二次确认、`Idempotency-Key`、202 任务受理和任务详情跟踪;当前版本不可重复恢复。
- [x] 前端补充历史版本弹窗布局及移动端适配;证书恢复专项测试、前端全量测试 275 项和 Vite 生产构建通过;修复恢复成功后任务详情入口调用错误。
- [x] 代码已提交并推送:`b75773b 完善证书历史版本恢复页面与测试`。
- [~] 接下来执行 Linux 后端全量回归、候选包构建、双机正式部署及浏览器生产验收;本批尚未据此宣布生产验收通过。
- [!] 既有生产门禁仍保留:第一台证书 SAN、重启早期 502、Smail 系统账户发信、密码重置、三数据库首次 Web、DNS/ACME 负向矩阵及双机实机证据。
## 2026年10月2日21:40 当前开发进度:历史版本与恢复
- [~] P1-02:已确认真实存储仍不支持历史恢复,开始补齐本地历史归档读取、恢复校验与失败回滚,不以模拟接口测试代替实现。
- [ ] P2-03 配套:恢复后台任务、实时权限复核及前端操作待接入。
- [!] 本批尚未回归或部署;原升级、通知重置、三库首次 Web、备份恢复、监控与 P3 均保留。
## 2026年10月2日21:30 当前开发进度:手动续期后台化完成待复审
- [x] P1-05/P2-03 子项:全局手动续期持久化为系统任务后返回 202,保留管理证书及业务域名原调度;支持幂等找回、活动任务去重、取消传播和执行前超级管理员复核。
- [x] P0-10/P1-04 配套:统计摘要、任务、尝试与完成审计同事务;失败、部分成功、取消、超时及异常不伪装整体成功。普通管理员及用户不可读取该全局任务或审计;不自动重放,不支持通用重试。
- [x] 前端独立提交模块防重复点击并保留丢失响应的幂等键,复用任务详情;最新 272 项测试及生产构建通过。接口说明已同步,统计保存在摘要,不声称存在独立结构化续期报告。
- [x] 最新原生 Linux 全后端、go vet 及相关专项二十次重复回归通过。首次全量因隔离测试输入不完整而失败,补齐同一提交的完整源码及 Git 索引后重跑通过;失败记录保留,未跳过检查。
- [!] 尚未正式部署,历史版本恢复、升级重启 502、通知重置、三库首次 Web、备份恢复、监控和 P3 未关闭;不处理 Windows,但不从原清单删除范围。
## 2026年10月2日20:34 当前开发进度:证书校验后台化完成待复审
当前开发批次对应 P0-10/P1-04/P2-03;不是仍停留在 P0-03 的代码开发,也不代表这些整项已经复审通过。下方带时间的记录保留为历史证据,最新状态以本入口和执行清单为准。原 P0/P1/P2/P3 范围不缩减,Windows 按本轮要求不处理。
- [x] 校验生产入口返回持久化后台任务,复用排队、取消、关停及执行前实时权限;只保留原有私钥读取权限要求,不误加 DNS、证书管理或部署权限。
- [x] 三库第 21 号迁移及独立公开校验结果存储已实现;成功结果、任务、尝试和审计同事务,不暴露私钥路径,不将校验伪装成部署报告。
- [x] 前端读取校验详情,按最近成功尝试展示域名、指纹、有效期等信息;补齐前端幂等键非法斜线缺陷,先复现再修复。最新前端 266 项及生产构建通过。
- [x] 原生 Linux 全后端、go vet 及相关专项二十次重复回归通过;第一台独立 MySQL 8.0.46、5.7.44 均通过新增迁移的八类恢复与冲突场景,未触碰线上数据库。
- [!] 尚未正式部署或进行浏览器生产验收;历史版本恢复、手动续期等长操作、升级重启 502、通知重置、三库首次 Web、备份恢复、监控及 P3 继续保留。普通重复回归不替代竞争检测。
## 2026年10月2日19:34 证书导入异步化开发进度
- [x] P2-03 子项:生产导入入口返回后台任务,复用任务队列、实时权限复核及事务收尾,不重复创建任务。上传文件在请求结束后保留到工作线程完成,并覆盖拒绝、取消、关停及异常回收。
- [x] P0-10/P1-04 配套:完整报告持久化证书已保存标志,区分导入失败与保存后部署失败;前端跟踪任务并支持响应断开后幂等找回,不提前显示成功,不重放已删除的上传材料。
- [x] 原生 Linux 专项、全后端测试、go vet 及导入专项二十次重复回归通过;前端 260 项和生产构建通过。代码尚未正式部署,子项状态为完成等待复审。
- [!] 历史恢复真实实现仍返回不支持恢复,与 P1-02 清单存在功能差异;该差异及校验等其他长操作继续保留。上传崩溃残留、升级、通知重置、三库、备份恢复与最终门禁均未据此关闭。
## 2026年10月2日19:01 排队执行前权限开发进度
- [x] P0-07/P2-03 子项:确认并修复异步申请、部署及重试只有提交授权、缺少执行前复核的问题。执行槽取得后读取当前账户和域名归属,复核本次操作权限;归属变化即拒绝,不因仍可访问新项目而沿用旧任务。
- [x] 二十八个排队及重试子场景通过,包括撤权、停用、资源变化、依赖故障及正常执行;首次申请需要 DNS/证书/部署权限,已有证书首次部署不误加 DNS 或证书管理权限,重试沿用完整重试权限契约。
- [x] 旧代码二十个负向子场景复现撤权后仍执行;修复后原生 Linux 专项、全后端及静态检查通过,新增专项重复二十次通过。证据见执行清单及 Linux 记录,普通重复回归不替代竞争检测。
- [!] 本批未部署,不代表 P0-07、P0-10、P2-03 整项或生产门禁关闭。其他长操作异步化、升级、通知重置、数据库与备份恢复继续保留;不处理 Windows。
## 2026年10月2日18:35 最新开发进度入口
- [x] 后台取消修复及 MySQL 报告迁移回归基线 cf3bc7a 已提交推送。上一批全后端及 go vet 已确认通过;不等于本批代码或生产验收通过。
- [!] 第一台受限竞争检测十分钟超时,退出一,不记为通过;既有服务正常,未重新启动无限制测试。
- [x] 新回归已复现后台完整报告缺失,以及分散收尾写入导致的状态不一致。
- [x] 后台续期、部署、导入、恢复和校验共用执行器的事务收尾已实现,包含重试报告保留及等待期间取消;应用、仓储、HTTP 三包原生 Linux 回归通过。
- [x] 本批全后端测试和 go vet 通过;报告、逐目标结果、审计、尝试与任务的故障注入全部保持原子回滚。失败审计统一使用 error,与 HTTP 契约一致。
- [x] 收尾及取消专项重复二十次通过,代码、清单和接口说明同步提交保存;三库实库复核与正式部署仍待后续统一执行。
- [!] 原始清单范围不变,P0-10、P0-11 与整体生产验收不关闭。具体执行项及证据见执行清单和 Linux 测试记录的本时段入口。
## 2026年10月2日18:11 历史开发进度入口
- [x] P0-10/P1-04 子项:HTTP 异步任务完整报告已持久化,终态、尝试、逐服务器结果与完成审计共用事务;前端按最新尝试读取验证和恢复状态,旧记录不伪造结论。源码 4e8d509 已推送。
- [x] 最新仓储、HTTP、数据库关联回归通过;前端 256 项通过、生产构建通过。第一、第二轮失败与修复经过保留在 Linux 测试记录中。
- [x] 完整报告批次的全后端回归及静态检查已通过,REPORT_FULL_EXIT=0、REPORT_VET_EXIT=0;自动续期等其他工作流仍需单独核查,不把 HTTP 路径原子化扩大为全项目完成。
- [x] 后台取消问题已用四个失败用例复现并修复:保留部分成功及未确认恢复状态,取消后仍保存实际逐服务器结果;重复二十次通过,最新全量回归进行中。
- [x] 第 20 号报告迁移在独立 MySQL 8.0.46 严格 TLS 实例通过八个恢复/冲突场景,保留已有大中文报告及冲突现场;不是三库完整生产 Web 验收。
- [ ] 新迁移实库恢复、其他长操作、关停 502、系统通知重置、三数据库首次 Web、备份恢复及统一生产复审继续执行。
- [!] 本批未部署、未清库;竞争检测无通过证据,原 P0/P1/P2/P3 清单不缩减,Windows 按要求不在本轮处理。下方带时间的旧状态仅作历史证据,不据此重复报告旧阻塞。
## 2026年10月2日17:11 最新开发进度入口
- [x] P0-10 新增任务与尝试的原子终态保存,避免部分写入造成长期状态冲突;补齐取消到达较晚、部分成功、回滚未确认和收尾持久化失败的处理与测试。
- [x] P0-04 配套修正 Linux 动态安装模板停止预算,与分发单元一致;两种配置路径均有原生回归覆盖。
- [x] 最新隔离 Linux 全后端测试及 go vet 通过;前端沿用未再改动的 252 项通过和构建通过证据。本批仍未部署,各条目仅为完成待复审,不标整体通过。
- [~] 普通专项重复回归正在进行;第一台竞争检测因 SSH 无法获得新结果保持未确认,不能用普通测试替代。Git 两次推送连接超时,本地开发成果已保存。
- [!] 完整部署报告、其他长操作、审计与结果一致性、重启 502、历史恢复证据、系统通知重置、三数据库首次流程和备份恢复仍有待办。P0-10、P0-11 与最终生产验收不关闭。
## 2026年10月2日16:47 最新开发进度入口
- [x] P0-10/P1-04 的申请、部署、重试已完成异步提交和前端任务查询接线,浏览器断线不终止已接收任务;最近尝试、取消收尾和查询失败提示已补充。完成待复审,不表示整个条目关闭。
- [x] 本机前端 252 项全部通过、生产构建通过;第二台隔离原生 Linux 全后端测试与 go vet 通过。本批尚未部署,不能沿用旧候选实机结果作为新代码验收。
- [~] 异步专项竞争检测正在第一台隔离环境执行;同时补核动态安装模板停止预算与终态持久化边界。
- [!] 其他长操作、单实例重启 502、旧恢复事务证据、通知重置、三数据库首次流程和备份恢复仍有未完成项。P0-10、P0-11 和整体生产门禁继续保持未通过。
详细任务点见《Scert整改任务执行清单》,开发回归与实机验收边界见《Linux生产流程测试记录》。下方按时间保留历史证据,不以旧入口覆盖本节进度。
## 2026年10月2日15:31 最新进度入口
- [x] 新候选真实部署负向检查:旧文件摘要变化时停止回滚并保留完整现场;启动恢复遇到锁归属变化同样拒绝接管。仅还原受控注入后,产品自动完成双机回滚。
- [x] 同一任务首次失败、第二次双机成功记录均保留,成功后再重试为 409。本次无残锁,双机证书文件摘要一致、严格本地 SNI 验证通过,第一台邮件服务正常。
- [!] 新确认长任务交互问题:正式部署请求超过反代等待时间返回 504,但后台仍继续执行;任务提交、状态查询与重试提示需要整改。不是以增加反代等待时间替代异步任务要求。
- [!] 受控重启另有一次 502,旧缺证据事务仍两条;系统通知、三数据库首次 Web 流程、备份恢复及最终生产门禁仍未闭环。
## 2026年10月2日15:15 最新进度入口
- [x] 管理入口双层证书不一致的现场阻塞已解除:14:58 环境维护修复接线后,15:03 正式产品续期成功;人工维护与产品轮换分开记证。
- [x] 应用协调与 Nginx 辅助事务均已提交,关联标识一致;两层新证书指纹相同,到期时间延长至 2026年12月31日。Scert 仍仅回环监听,公网 Web 只经 Nginx 80/443。
- [x] 15:14 已通过 Web 恢复六天、十天原续期阈值,持久化配置确认;未重复签发,旧失败任务保留。
- [~] 正常轮换局部验证完成、等待复审,不等于 P0-10 或整体生产验收通过。剩余重点为负向恢复、多目标重试、历史事务、系统通知与密码重置闭环、三数据库首次完整 Web 流程及备份恢复。
## 2026年10月2日14:52 最新进度入口
- [x] 第二台独立 root Nginx 辅助程序已升级为 7ba4046 对应候选;旧策略、事务与引用保留,14:20 的旧版本待办不再代表当前状态。
- [x] 正式 Web 设置触发一次真实管理续期,任务在 preflight 阶段拒绝,未进入签发;临时续期阈值已通过页面恢复,辅助事务和引用摘要未变。
- [!] 新确认阻塞:代理与上游各自为有效证书,但实际叶证书不同,管理证书双层协调不能放行。严格 HTTPS 200 仅证明访问链路可用。
- [~] 继续核验并修复 root 管理的接线基线,随后复测产品协调。不得伪造协调记录、删除旧事务或关闭 TLS 校验;整体生产验收未通过。
## 2026年10月2日14:20 候选部署进度
- [x] 7ba4046 干净源码正式构建完成,发布清单 source_dirty=false,路径检查、归档及包内摘要通过;全量 Go 模块校验通过。
- [x] 前端测试二百四十项通过、一项 Windows 专用用例跳过;候选程序非回环监听负向检查通过。
- [x] 双机 scert、scert-admin、scert-storage 已安装并匹配候选包;只监听回环 8443,Nginx 继续负责公网 80/443。第二台首页、readyz 和第一台跨机 readyz 的严格普通域名 HTTPS 检查通过。
- [!] 第二台曾误用构建工作目录的无执行权限安装器,导致一次额外停服;已恢复旧服务后使用正式归档升级,失败证据不删除,不声称无中断升级。
- [ ] 独立 root Nginx 辅助程序仍为旧提交 431fd043;普通安装器不包含该独立升级动作,版本配套及实际协调复审仍待完成。
- [~] P0-10 与整体生产验收仍未通过;本轮是保留数据的安全修复升级,不替代三数据库清库首次 Web 验收、业务负向恢复或邮件投递闭环。
## 2026年10月2日13:59 全后端隔离回归进度
- [x] 已修复 admin、certificate、database 十个测试文件的正式路径污染,保持产品默认配置及测试语义不变。
- [x] 完整 Git 检出上的原生 Linux 全后端测试通过,退出零;归档目录缺 Git 元数据导致的发布边界失败保留,不跳过源码检查。
- [x] 双机实时确认 Scert 仅监听 127.0.0.1:8443,Nginx 负责 80/443;未开放额外公网端口。
- [x] 竞争检测:第一台原任务阻塞于外部依赖下载,保留日志并中断;改用摘要一致的缓存归档和新依赖目录复测,未关闭依赖校验,恢复及事务场景重复二十次通过,退出零。
- [x] 完整 Git 检出上的全后端 go vet 通过,退出零。
- [ ] 本批代码正式干净构建、双机部署与业务实机负向恢复复审。
- [~] P0-10 保持进行中,整体生产验收未通过;线上尚未部署本批修复。
## 2026年10月2日13:41 上传归属安全整改
- [x] 已复现并修复带事务日志时误删上传碰撞文件、恢复时误删身份已变更临时文件的问题;旧实现两个新增场景均失败。
- [x] 只有独占创建已确认并记录实际上传摘要的文件才允许清理;计划路径不是归属证据。半份私钥在归属及摘要可信时仍能安全清理,未知归属保留文件和锁等待核查。
- [x] 三包原生 Linux 回归、恢复及事务场景重复二十次、全后端 go vet 通过;真实回环密码 SFTP 增加临时文件变更及归属未落库保护。
- [!] 扩大到全后端测试未通过:发现 admin、certificate、database 的旧测试仍使用正式安装目录,另有发布测试因隔离目录未包含仓库构建文件失败。将修复测试隔离并从完整干净源码复测,不提权或修改生产路径规避。
- [~] P0-10 与整体生产验收仍未通过,本批修复尚未正式构建部署。
## 2026年10月2日13:30 恢复安全整改进度
- [x] P0-10 子项:恢复前完整核验锁集合、备份摘要及当前目标身份;存在但无归属的锁拒绝自动处理,已验证阶段允许部分解锁后重入。
- [x] 恢复服务器身份在 SSH 认证前核验;提交恢复先核验全部备份再清理,避免检查失败时已经修改部分现场。
- [x] 原代码的八个负向和两个重入场景均复现失败;修复后部署、仓储、应用三包原生 Linux 回归及 go vet 通过,新增恢复用例重复二十次通过。真实回环密码 SSH/SFTP 覆盖文件内容及权限保护,不扩大为业务服务器恢复验收。
- [!] 竞争检测未通过执行门槛:启用 CGO 后缺少 gcc;没有安装工具链或将普通重复测试冒充竞争检测。
- [~] 待核查带事务日志的上传碰撞路径归属;本批尚未正式构建部署,P0-10 保持进行中,总体生产验收未通过。
## 2026年10月2日12:54 最新进度入口
- [x] Linux 非回环监听风险已完成代码收口、六包原生回归、负向发行程序验证和双机配套部署;两台当前均仅监听 127.0.0.1:8443。
- [x] 正式候选源码提交 1150c39,发行路径检查、归档及包内校验通过;启动通知真实生效,第二台严格 HTTPS 首页及 readyz 正常。
- [x] 双向跨机 IPv4 端口探测没有连接到对方的 8443、3306、33060;未新增公网端口、未改 Nginx、未影响第一台邮件服务主进程。
- [!] 停机升级窗口仍观察到 7 次 502,不能将 Type=notify 等同于无中断升级;T4 不标整体验收通过。
- [!] 总体生产验收仍未通过;P0-10、系统通知实发、三数据库清库首次 Web 流程及统一复审继续待办。详细证据见同日 Linux 测试记录。
## 2026年10月2日12:42 最新进度入口
- [x] 已补齐 Linux 独立启动时的回环监听限制;实际非回环 IP、通配地址及域名均被启动入口拒绝。
- [x] 六个关联包原生 Linux 回归及 go vet 通过,新增监听正负向用例重复 20 次通过。
- [~] 正式候选包重新构建与双机升级待执行,不把源码回归或旧实例健康当作新版部署完成。
- [!] 总体仍未通过生产验收;P0-10、系统通知、三数据库清库 Web 流程和最终复审继续保留。
## 2026年10月2日12:19 最新进度入口
以下为当前状态,下方同日早期记录保留作为过程证据。
- [x] Linux 启动通知开发及四包原生回归通过,关键生命周期用例重复 20 次、go vet 和 systemd unit 配置检查通过;等待配套部署复审。
- [x] 本轮还修复旧 CLI 单元测试误用正式安装路径的问题。首次运行由 nobody 权限拒绝写入,未通过提升权限规避;修复为临时目录后四包全部通过。
- [x] 12:18 旧线上候选仍健康且仅回环监听,未改 Nginx、未开放外部端口,未对业务清库。
- [ ] 新候选正式构建、部署和真实重启窗口尚待执行;本轮源码与单元回归不构成零 502 或生产验收通过证据。
- [!] 当前仍不放行生产验收;P0-10、系统通知授权实发和三数据库首次完整 Web 流程等门禁不变。
## 2026年10月2日启动状态整改补充
- [x] 增加仅通过本机 Unix socket 的 Linux 启动通知,无新增 TCP 端口;正式服务和初始化监听阶段分别报告状态。
- [x] 静态服务配置与动态安装模板同步启用 Type=notify,并补充通知失败、取消、状态字段注入及初始化就绪隔离的测试。
- [~] Linux 实际运行回归进行中;线上仍为原候选,未将源码修改当作已部署。
- [ ] 重启期间严格 HTTPS 采样与故障窗口复审。监听通知不代表业务 readyz、代理切换、证书轮换或零中断已经通过。
- [!] 总体验收尚未放行;下文既有 P0-10、邮件入口与数据库完整流程待办继续有效。
## 2026年10月2日实机证据校正与当前任务入口
### 11:50 邮件入口独立复核
- [!] 从第二台查询 web.solit.cn,本机解析器、公共 DNS 及 solit.cn 两台权威 DNS 均返回 NXDOMAIN;严格 HTTPS 请求以解析失败退出。此时无法从该入口取得系统通知授权参数,需确认当前有效 Smail 地址或修复其 DNS。不得猜测目标 IP、修改其他业务域名或绕过 TLS 校验。
- [x] 同时复核第二台 Scert 与 Nginx 为 active,本机 Nginx 严格 TLS readyz 返回 ready;邮件入口失败与 Scert 管理入口可用性分开记录。
本节为最新进度入口,历史记录保留;本轮为保留数据的只读诊断,不计作清库后的首次生产流程。
- [x] 第二台现有正式域名证书包含 odacm.cn,有效期至 2026年12月24日。北京时间 10:18:39 至 10:19:00,20 次严格 TLS 请求均返回 ready,Nginx 日志均为 HTTP 200。此前第二台证书未完成的状态已过期;本项等待复审,不代表续期轮换通过。
- [x] 第二台 Scert、MySQL 仅回环监听。从第一台探测第二台 80/443 成功,8443/3306/33060 超时;本地 Windows 代理网络的 TCP 连接结果不作为公网开放证据。
- [x] 第一台角色校正:Nginx 未见 odacm.cn 管理站点或 8443 上游;返回默认 salg.cn 证书不能证明 Scert 签发失败。暂按证书部署目标验收,不为消除错误探测而擅自增加管理站点。
- [~] 启动窗口整改:第二台 10:09:05 的 502 为上游连接被拒绝。运行态采样成功不代表重启窗口已解决。
- [!] Smail 实发:Scert 页面显示 SMTP 未启用、连接和专用凭据未配置。已核对 Smail 代码,必须取得账号授权及独立凭据,不用登录密码代替,不从 Web 域名猜测邮件主域名。
- [~] P0-10 负向矩阵及历史 recovery_required 可信恢复证据核查。
- [ ] 三数据库清库后的完整 Web 初始化、实际邮件投递、密码重置和新密码登录。
- [ ] 最新候选包清库首次流程、缓存清理及最终生产门禁复审。
- [!] Windows 不在本轮范围;总体验收仍为 P0-03 完成、等待复审,生产验收未放行。
## 2026年10月2日 SSH 密码认证边界最终收口
本节只记录非敏感安全结果。根据“SSH 私钥、公钥和密钥登录不允许出现”的要求,生产功能只保留密码认证;HTTPS 证书私钥仅用于证书部署和 TLS 服务,不属于服务器登录凭据。
- [x] SSH 客户端连接在认证前再次硬性校验密码认证,不能通过其他认证方式或回退路径建立连接。
- [x] 禁用兼容服务、重载连接逻辑和 CLI 帮助文字均明确为密码认证;没有新增密钥生成、上传、授权文件写入或密钥登录入口。
- [x] 服务器页面不再把主机指纹描述为登录密钥;证书导入明确标注为 HTTPS 证书私钥,避免与 SSH 登录凭据混淆。
- [x] 未删除历史数据库迁移、禁用兼容文件或证书私钥功能;历史结构只用于升级兼容,生产代码不会读取或使用其作为 SSH 登录凭据。
- [~] 待完成:候选包重新构建部署、三数据库清库后的 Web 流程、Smail 系统账户发信、密码重置闭环及第二台正式域名证书验收。
当前总体验收仍为 **P0-03:完成,等待复审**,本安全子项不能单独作为生产验收通过依据。
## 2026年10月1日 SSH 私钥登录安全边界收口
本次仅记录代码、构建和测试结果,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。根据“安全风险太大,不允许 SSH 私钥登录”的要求:
- [x] 后端生产服务器配置统一使用 SSH 密码认证,拒绝私钥引用、非密码认证和私钥登录回退。
- [x] 前端服务器配置仅提交 SSH 密码及主机指纹,不再请求或提交 SSH 私钥接口和 `private_key_ref`。
- [x] 前端生产页面不再挂载 SSH 私钥管理弹窗,不显示私钥录入、文件读取、私钥口令、公钥部署命令或密钥生成引导;历史文件保留但不作为入口。
- [x] TLS 证书私钥导入和远程证书私钥路径未删除,仍仅用于证书业务部署,不用于 SSH 登录。
- [x] 前端 241 项测试、Vite 生产构建、后端 `go test ./...` 和 `go vet ./...` 全部通过。
- [x] 本项提交 `df99136` 已推送,等待复审;总体生产验收仍未通过。
- [~] Linux amd64 正式包、清库后的完整 Web 流程和实机生产复验继续按 P0-10、T2-T6 门禁推进。
## 2026年10月1日前端私钥安全边界整改
本节只记录非敏感代码证据,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。根据安全要求,生产前端不再提供任何 SSH 私钥管理能力:
- [x] 已移除私钥导航、私钥管理板块、私钥录入和文件读取控件、私钥口令字段、密钥生成与安装命令展示及复制操作。
- [x] 已移除前端 `/api/v1/ssh-keys` 请求和服务器 `private_key_ref` 提交;编辑历史服务器配置时强制使用密码认证。
- [x] `SSHKeyModal` 历史文件未删除,仅保持未挂载状态,不能从生产页面访问。
- [x] 前端 241 项测试全部通过,Vite 生产构建通过。
- [x] 本项完成,等待复审;总体生产验收仍未通过,P0-10、系统账户发信、密码重置和三数据库 Web 流程等门禁继续按看板推进。
- [~] 后端历史私钥兼容接口和数据结构暂不删除,避免破坏历史配置,后续单独制定迁移方案。
## 2026年10月1日公网入口安全加固复核
本次仅记录非敏感现场证据,不记录服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息。为落实“只通过 Nginx 80/443,不允许高风险直连管理端口”,双机已完成防火墙与入口复核:
- [✓] 第一台移除公网 `8443`、`9998`、`9999` 放行规则;Scert 管理服务保持 `127.0.0.1:8443` 回环监听,外部只能经 Nginx `80/443` 访问。
- [✓] 第二台在现有宽范围放行规则之前增加 `8443`、`9998`、`9999` 拒绝规则,防止范围规则重新暴露 Scert 直连入口;没有删除其他服务或其数据。
- [✓] 双机 `3306`、`33060` 仍为回环监听;双机 `nginx -t` 通过,Scert、存储通道、MySQL 和 Nginx 健康状态未因规则加固异常。
- [✓] 外部复核确认管理 HTTPS 正常,Scert 直连端口 `8443`、`9998`、`9999` 无法建立 HTTPS 会话;`odacm.cn` 当前 HTTPS 返回 200。
- [✓] 未关闭 TLS 校验、未创建辅助验收脚本、未清理历史事务或数据库;邮件服务端口按系统账户发信职责保留,和 Scert 管理入口分离。
- [~] 公网入口风险子项已完成待复审;总体仍保持 **P0-03:完成,等待复审**,不得据此宣布生产验收通过。
## 2026年10月1日历史恢复事务现场核查
本次只读核查第一台正式 SQLite 数据库及托管证书目录,不修改数据库状态、不删除锁、不补造恢复证据。
- [✓] 数据库仍保留两条 `recovery_required` 事务,状态和阶段均未改变;没有新增待处理事务。
- [✓] 两条记录的恢复证据均为空对象;记录声明的锁路径当前不存在,证书文件和权限仍在,目录没有临时文件或备份文件残留。
- [!] 由于没有可信锁 owner、恢复前摘要和执行顺序证据,不能证明已完成安全回滚;继续由产品保守地保留人工核查状态,不修改终态。
- [✓] 已清理第一台已结束测试 transient unit 与无有效请求的一次性重置激活器的 systemd failed 标记,journal 仍保留;未删除任何文件。
- [~] 历史恢复证据仍是 P0-10 的阻塞项,不能扩大公网入口加固结果为总体生产验收通过。
## 2026年10月1日加速任务清单(Linux上线前门禁)
本节是当前执行入口,按“先整改、再构建、后清库验收”的顺序推进。任务记录不包含服务器口令、RAM 密钥、数据库密码、令牌或其他认证信息;Windows 环境明确不在本轮范围。
### 需求清单
- 保持公网只开放 Nginx 80/443,8443、3306、33060 等内部端口只能回环监听。
- 完成 P0-10 负向恢复矩阵:配置校验失败、reload 失败、HTTPS 校验失败、进程中断、锁归属不匹配、文件摘要不匹配、多服务器部分失败及重试幂等。
- 对历史 `recovery_required` 事务只使用可信证据核查,不删除锁、不修改终态、不补造证据。
- 完成 SQLite、MySQL、PostgreSQL 三数据库的生产 Web 流程,不以单独 CLI 或迁移测试替代完整流程。
- 完成清库后的首次初始化、Smail 系统账户发信、验证码密码重置、改密后重新登录闭环。
- 构建干净 Linux 候选包,部署双机并复核服务、TLS、任务状态、文件权限和端口范围。
### 当前任务列表
- [✓] T0:双机 Linux 基础部署、严格 TLS、Nginx 80/443 入口及内部端口回环复核。
- [✓] T1:MySQL 5.7.44 隔离实例和正式发行程序 CLI 实库测试。
- [~] T2:P0-10 剩余负向恢复矩阵与历史事务证据核查;不得人工释放未知归属锁。
- [~] T3:三数据库完整 Web 生产流程及跨数据库任务状态复核。
- [~] T4:最终清库后首次初始化、系统通知发信、验证码重置和新密码登录闭环。
- [ ] T5:干净候选包重新部署、清理浏览器缓存并执行最终生产门禁复审。
- [!] T6:Windows 环境不在本轮执行;公网平台或备案限制不能用本机结果替代。
### 当前验收口径
总体状态仍为 **P0-03 完成,待复审**。T0、T1 的局部证据不能替代 T2 至 T5;未完成所有 Linux 门禁前,不标记生产验收通过。
## 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;覆盖官方客户端及 `mysqldump` 互操作、表、视图、触发器、例程、事件、权限、目录可见性、快照和恢复规划等场景。
- [x] MySQL 5.7.44 官方测试包校验值已记录:`798ff0a14cdc1ab259f8a3b6a7f683403e9bbaa85957d82e5370f82b27ba6805`;测试实例由非 root 用户运行,仅回环监听并启用严格 TLS,未修改线上 MySQL 8.0 或 Smail 服务。
- [x] 连接池专项首次失败已定位为测试夹具固定等待 15 秒导致的误报;MySQL 5.7 正常关闭实际约 17 秒,已将隔离实例正常关闭等待上限调整为 30 秒,提交 `a139e6b` 已推送;修复后专项及完整数据库套件均通过。
- [x] 双机内部数据库端口仍仅回环监听,公网仅保留 Nginx 80/443;本轮没有开放额外外部端口、没有创建辅助验收脚本、没有清理或改写历史恢复证据。
- [~] 继续推进:P0-10 其余负向窗口、锁归属及摘要不匹配实机验证,历史 `recovery_required` 事务的可信恢复证据,完整三数据库 Web 流程,以及最终清库后的首次生产初始化和业务验收。
- [!] 仍未完成:Smail 系统账户真实发信、验证码密码重置与改密后重新登录闭环、第一台公网平台限制复核;总体生产验收不得标记为通过。
## 当前有效整改进度(2026年10月1日22:50,公开查询账户枚举修复)
本节更新22:31所记账户枚举阻塞;只关闭该具体漏洞,不扩大为密码重置全流程或总体生产验收通过。
- [✓] 公开密码重置查询不再枚举身份:正式路由改用独立通用提示处理器,只验证输入格式,不查询账户、不返回账户存在性或角色;响应禁止缓存,不创建会话、不发信、不改密码。
- [✓] 测试闭环:新增七类标识一致响应及输入边界回归,旧实现实际失败、修复后通过;后端全量测试、静态检查、构建及重置专项竞态测试通过,前端242项通过。
- [✓] 实机复核:干净源码51ab0a6构建正式Linux包,密码SSH双机安装通过;公网无登录请求的五类标识响应正文完全相同,页面只显示通用提示;第一台本机四类标识严格TLS响应摘要相同。
- [✓] 安全收尾:双机程序哈希一致、服务正常,内部端口仅回环,六次跨机公网探测均超时;管理上游保持严格TLS,临时重置入口404,第一台邮件服务未重启;任务数量和历史待恢复事务未改。
- [~] 原清单继续:P0-10剩余负向窗口、历史恢复证据处置、完整数据库Web流程等仍需推进。
- [!] 系统通知SMTP与真实密码重置闭环、第一台公网平台限制、MySQL5.7及最终清库首次生产验收仍未完成;总体生产验收不放行。
## 当前有效安全复核(2026年10月1日22:31)
- [!] 新增上线阻塞:公开密码重置查询仍泄露账户是否为超级管理员。使用不携带登录凭据的请求实测,已知账户返回 super_admin,未知账户返回 unknown;此前仅移除维护命令和重置入口,不等于消除账户枚举风险。此项尚未修复,不得标为安全验收通过。
- [ ] 整改要求:合法账户标识不论是否存在,均返回相同状态码和通用提示;不得披露账户类型、存在性、维护命令、重置地址或会话凭据,并补充一致响应回归及正式候选实机复核。
- [✓] 只读复核:双机内部端口仅回环监听;管理入口健康;Nginx 上游 TLS 校验开启;未开启的临时重置地址返回 404;最终部署两条事务均为 committed。
- [!] 本轮未清库、未触发密码变更或发信、未开放端口,属于现有候选只读安全复核,不替代首次生产验收。总体生产验收继续不放行。
## 当前有效进度(2026年10月1日22:22,不同证书中断恢复与多目标部分失败)
本节覆盖下方同项待验证状态;仍按原清单推进 Linux,不处理 Windows。本轮保留数据连续负向回归,不计作最终清库首次验收。需求确认:实际运行证书必须恢复,有限次核验不降低 TLS 校验,证据不足继续保留锁。
- [✓] P0-10 中断恢复缺口闭环:不同证书真实 SIGKILL 复现了启动恢复只核验一次、重载尚未生效即误判指纹不符的问题。修复版复用正式部署的有限次、可取消严格 HTTPS 核验;持续不符、校验错误、取消或超时仍失败关闭。
- [x] 修复与发行:提交 `00aeedc` 已推送,新增恢复核验回归,后端全量测试、静态检查、构建及前端 241 项通过;干净源码正式 Linux 包已通过密码 SSH 和正式安装器部署双机,程序哈希一致。
- [✓] 不同证书进程中断:修复版中,两台均实际切换到另一张证书后终止第二台主进程,systemd 自动重启;双机自动恢复中断前文件和实际 TLS,事务自动回滚且无本次残锁。旧候选复现留下的本次两事务也由产品启动恢复处理,未手工改库或删锁。
- [✓] 原任务重试与幂等:原任务 `3517c6d2-095a-419c-a2bc-268bb3c3eab8` 的两次中断失败记录保留,第三次尝试双机成功;成功后重复重试返回 409。
- [✓] 不同证书多目标部分失败:第二台已提供新证书、第一台配置校验失败后,两台恢复原证书;两个事务均自动回滚。接口如实返回导入成功、部署失败,不误报整体成功。
- [✓] 收尾:两台已恢复标准 Nginx 校验和重载命令,最新证书通过正式部署接口成功部署;文件、公钥对应摘要、实际 TLS、严格 HTTPS、无本次残锁均复核。内部端口仅回环监听,六次跨机公网探测均超时,第一台邮件服务正常。
- [~] P0-10 仍非全部完成:其余负向窗口、锁归属或摘要不匹配实机、两条历史缺证据事务继续推进;不能把以上子场景通过扩大为全项通过。
- [!] 系统通知 SMTP 及真实投递闭环、第一台测试域名公网平台限制、MySQL 5.7 与完整三库 Web 等剩余门禁及最终清库首次验收仍未完成。已完成的数据库迁移、独立正式 CLI 备份恢复和 Linux 原生构建证据继续有效。
- [!] 总体生产验收未放行。完整任务、事务、时间及产物哈希见《Linux生产流程测试记录》最新章节。
## 当前有效进度(2026年10月1日21:43,不同证书重载失败自动恢复)
本节覆盖下方同项待验证状态;本轮是保留数据的 Linux 升级及负向回归,不是最终清库首次验收。需求沿用原清单,不修改历史事务来制造成功,不创建辅助验收脚本。
- [✓] 已复现并修复运行证书恢复缺口:旧候选重载实际生效后返回失败,只恢复文件,Nginx 仍提供新证书;新候选把该失败目标纳入完整事务恢复,重新校验、重载旧配置并验证实际 HTTPS 指纹后才释放锁。
- [✓] 新旧证书不同的双机实证:正式功能仅申请一个新证书;修复后重新部署这个证书,两台先实际提供新证书,再自动恢复旧证书。文件摘要、私钥对应的公钥摘要、实际 TLS 指纹及严格 HTTPS 均通过;无本次残锁。Scert 主进程 PID 不变、自动重启计数为零。
- [✓] 原任务重试:恢复标准 Nginx 重载命令后,原部署任务第二次尝试成功,两台实际提供新证书;第一次失败记录保留,第二次事务均已提交,成功后再次重试返回 409。
- [x] 代码及发行:修复提交 `2e6d992` 已推送;新增五个回归场景、后端全量测试、静态检查、构建、前端 241 项通过。正式 Linux amd64 候选由干净源码构建,已通过密码 SSH 和正式安装器部署到双机,程序哈希一致。
- [✓] 安全边界复核:内部 8443、3306、33060 仅回环监听,双机互探公网对应端口六次均超时;管理入口保持 Nginx 80/443 及严格上游证书校验,第一台既有邮件服务正常。
- [~] P0-10 仍继续:上述结论仅覆盖本次重载失败窗口,不覆盖所有负向窗口、不同证书进程崩溃、多目标部分失败及历史证据缺失事务。
- [!] 原阻塞仍保留:系统通知 SMTP 参数与真实发信闭环、第一台测试域名公网平台拦截、两条历史恢复事务、剩余数据库支持与完整 Web 流程、最终清库首次验收。已完成的 MySQL 8.0 迁移和独立正式 CLI 备份恢复、Linux 原生构建不再重复标记为未做;Windows 不在本轮范围。
- [!] 整体生产验收未放行;完整任务及哈希证据见《Linux生产流程测试记录》最新章节。
## 当前有效进度(2026年10月1日21:12,双机密码重置接口安全复核)
本节覆盖下方较早的候选版本与待部署状态。需求沿用原清单;按用户最新要求,本轮只推进 Linux 上线,不处理 Windows,不把 Windows 未验收当成本轮上线阻塞。
- [x] 安全接口整改:发现公开查询仍返回本机命令处理标识,已改为通用联系管理员标识;登录后的状态接口同步收敛。不是仅隐藏页面文字。
- [x] 自动化门禁:前端 241 项测试、后端全量测试、静态检查、构建通过;公开查询回归扩大到整个响应,仍检查不返回重置入口、令牌和会话 Cookie。
- [x] 正式构建:源码提交 `9c58c5b`,工作区干净;正式 Linux amd64 候选构建及路径检查通过,已推送修复。
- [x] 双机安装:同一候选已通过密码 SSH、严格主机身份校验、归档和包内校验、正式安装器部署;两台主程序哈希一致,主服务、目录 socket、Nginx 均运行。
- [x] 页面与接口复核:第二台在新建隔离浏览器上下文中重新查询超级管理员,仅显示通用维护说明,无命令、入口名称或代码块;线上接口不返回本机命令标识、重置链接、令牌或 Cookie。第一台通过校验证书的回环连接验证同一接口与就绪检查。
- [x] 端口边界:双机内部服务仅绑定回环 8443、3306、33060,两服务器互相探测这些公网端口全部超时;第二台 Nginx 上游证书验证保持开启。第一台既有邮件业务保持运行,未修改其业务端口。
- [!] Smail:两服务器系统解析器查询邮件管理域名均返回 NXDOMAIN;尚无可用系统通知 SMTP 参数,真实投递、验证码重置及新密码登录闭环未通过。不猜测主机、凭据,不降低 TLS 校验。
- [~] 剩余 Linux 门禁:部署负向恢复与历史事务核查、数据库支持矩阵、备份恢复、清库首次初始化及完整业务回归继续推进。本轮保留业务数据的安全升级不计作清库验收。
- [!] 总体结论:本次页面及接口信息暴露项已完成实机复核,等待复审;整体生产部署验收仍未放行,不给出缺乏逐项证据的完成百分比。
## 当前有效进度(2026年10月1日,密码重置页面安全信息收敛)
- [x] 已移除公开密码重置页面中的 Linux、Windows、本机管理命令和 `Scert-admin` 入口名称,避免未认证页面暴露可执行维护信息。
- [x] 超级管理员查询接口改为返回通用的服务器本机安全维护说明;不返回重置入口、会话令牌、验证码或命令文本。
- [x] 前端 241 项测试、后端全量测试、`go vet ./...`、`go build ./...`、生产前端构建及 `git diff --check` 通过。
- [x] 修复已提交为 `f8db6ce`,文档更新前检查点为 `df2ff7b`;已推送远程仓库。
- [~] 仍需将最新候选包重新部署到 Linux 实机,清理浏览器缓存后复测密码重置页面,并继续完成 Smail SMTP、超级管理员重置闭环、负向恢复和最终生产门禁。
- [!] 当前结论:本次安全信息泄露项已完成整改,整体生产部署验收仍未通过。
## 当前有效进度(2026年10月1日,可信恢复证据候选已完成双服务器基础回归)
本节为最新状态,优先于下方历史快照。提交 `0e48dc9` 已推送远程仓库;正式 Linux amd64 候选包已构建,SHA-256 为 `9b6748b6f25446adcc454fb9ecf88a31cbf70554bcbfcae3451670f9a81e4afe`。候选包已使用密码 SSH 安装到 `45.136.13.241`,并完成正式页面登录、一个域名绑定两台服务器的连续两次部署回归;两次均返回两台推送成功、配置校验及 reload 成功、站点 HTTPS 校验通过。服务重启后保持 active,管理入口 HTTPS 返回 200。
- [x] 本地质量门禁:`go test ./...`、`go vet ./...`、`go build ./...`、部署/应用/仓库三个包的竞态测试及 `git diff --check` 均通过。
- [x] `45.136.13.241` 候选安装、服务健康检查、正式页面登录及双服务器正常部署回归完成。
- [x] 新增恢复证据持久化、锁归属校验、文件摘要校验、目标证书指纹校验及重启恢复保护,代码已提交并推送。
- [~] P0-10 仍需实机模拟进程中断、锁归属不匹配、文件摘要不匹配、负向 HTTPS 恢复、部分目标失败及重试幂等。
- [~] 两条历史 `recovery_required` 事务缺少可信证据,保留现场等待人工核查;不得删除锁或修改数据库状态伪造验收通过。
- [ ] `8.137.23.95` 独立生产回归、三数据库矩阵、Windows 服务、清库首次初始化、Smail SMTP、超级管理员密码重置、备份恢复、公网 DNS/ACME 和最终生产门禁。
- [!] 当前结论:核心修复和 Linux 双服务器基础部署已通过,完整生产部署验收尚未通过。
## 当前有效进度(2026年10月1日,回滚事务终态整改)
候选构建收尾:源码 `8899f7a` 的干净克隆已通过正式 Linux 构建,清单二十三项大小及校验和、实际归档二十二个文件内容和五个执行入口权限均通过。尚未部署;本条更新下方本批早期的候选未构建状态,不改变生产未放行结论。
本批验证:后端全量测试、静态检查、构建以及部署、应用、仓库三个包的竞态测试均退出零;外部实库条件跳过项不计入验收。正式候选构建与实机复测尚未完成。
本节优先于下方历史快照。原始四十四项范围和生产门禁不缩减;不再使用没有逐项统计依据的完成百分比。
- [x] P0-10 子项:复现并修复恢复核验成功后事务仍记为需要恢复的问题。原判断提前捕获所有失败结果,导致已回滚分支不可达;现在仅在文件恢复、服务重载、站点恢复核验与锁释放全部成功时记录已回滚,原部署任务仍为失败。
- [x] 增加双目标已恢复、恢复核验失败、文件恢复失败、锁释放失败及部分目标连接失败的日志终态回归;不把隔离测试当作实机验收。
- [~] 当前修复尚未部署;旧失败任务及需要恢复的事务保持原样,禁止直接修改数据库或删除锁伪造验收通过。
- [~] P0-10 整项仍缺进程崩溃后的可信恢复、历史现场接管、多目标负向实机及重试幂等证据。
- [x] 口径纠正:运维连接继续使用密码;产品按用户后续要求自动部署公钥并使用托管密钥,不因数据库认证方式为私钥就判为缺陷。
- [x] P0-03 已有源码与产物边界局部复审记录,不再以该项表示全部上线阻塞;不扩大历史局部复审范围。
- [ ] 三数据库完整矩阵、双平台服务、备份恢复、清库首次流程、系统 SMTP 与密码重置及最终生产门禁继续待验收。
## 本轮整改进度(2026-09-30,最新候选已完成双服务器基础部署)
需求确认:继续按明日上线目标推进,但不缩减生产门禁;系统通知使用 Smail `notify:` SMTP 账号时,只允许通过 SMTP 发信,不使用普通 HTTP 发信接口,不记录真实凭据。
- [x] 新增 Smail 系统通知账号识别,统一生成固定的 `notification+system@邮件域名` 发件身份。
- [x] 证书任务通知检测到 `notify:` 系统账号时只走 SMTP,不再执行 HTTP 通道,避免重复发送或普通接口伪造系统发件地址。
- [x] 超级管理员验证码检测到 `notify:` 系统账号时只发送到绑定邮箱并只走 SMTP;SMTP 未启用时明确返回配置错误。
- [x] 增加系统通知只走 SMTP、HTTP-only 拒绝和系统发件身份保持不变的回归测试;后端全量测试、`go vet`、`go build` 和 `git diff --check` 通过。
- [x] 本轮代码已提交并推送,提交为 `07229ad`;正式 Linux amd64 候选包已构建,并完成归档及包内校验。
- [x] 已使用密码 SSH 将候选包正式安装到 `8.137.23.95` 和 `45.136.13.241`;两台服务器的 Scert、存储 socket、Nginx 和管理入口基础健康检查通过。
- [~] Smail 真实 SMTP 验证码、超级管理员密码重置和清库后的首次生产初始化仍需按完整生产流程复测。
- [~] 一个域名多服务器、一个服务器多域名的完整生产推送及双服务器证据仍需补齐。
- [~] P0-10 后置 HTTPS 失败自动恢复、进程崩溃事务接管、多目标部分失败和重试幂等仍需负向实机证据。
- [!] 三数据库矩阵、Windows 服务、公网 DNS/HTTPS/SNI/ACME、备份恢复和最终生产门禁仍未完成。
- [!] 总体验收继续保持 **P0-03:完成,等待复审**,本轮不标记 `[✓]`。
## 当前验收总览(2026-09-30 17:39 UTC,恢复标准 Nginx 重载命令后正式页面复测)
- [x] 已通过正式服务器配置页面将临时测试用的重载命令 `/usr/bin/true` 恢复为标准 Nginx 参数 `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 核查确认目标域名目录中的三个 `.scert-lock` 均为空目录、创建时间早于本次任务,且没有活动 Scert、SSH 或 SFTP 部署进程;仅使用 `rmdir` 清理这三个明确的陈旧锁目录,未删除证书、私钥、Nginx 配置或业务数据。
- [x] 从正式页面重新部署 `scert-multi-20260930.apmmk.cn` 成功,页面显示“1 台推送成功,站点 HTTPS 校验通过”,该域名状态由“错误”恢复为“正常”。
- [x] 远端 `Scert`、`Scert-storage.socket`、`nginx` 均为 active,公网 `/readyz` 返回 200;两个测试域名 HTTPS 均返回 200,目标证书与公网证书 SHA-256 指纹分别一致:`scert-20260930.apmmk.cn` 为 `5DE99CD681FB8A84745CE4ED6091D76A7B86616421B3048D3C42844B8A4460ED`,`scert-multi-20260930.apmmk.cn` 为 `43063C0726D34362B254CE28B66D7EB637E00B165F68EC0D07FCED0DF2C64AD2`。
- [x] 页面运行概览显示进行中任务为 0,最新部署任务为“已完成”;两个目标托管目录均无 `.scert-lock`、`.scert-backup-*` 或 `.scert-tmp-*` 残留。证据目录中的中断测试锁仍按原样保留,未误删。
- [~] 本轮证明陈旧锁人工核查与清理后的正常恢复路径通过;不等同于后置 HTTPS 失败自动恢复或进程崩溃事务自动接管通过,P0-10 仍需负向实机证据。
- [!] 第二台真实服务器、一个域名多服务器、三数据库矩阵、双平台服务、备份恢复及最终清库首次流程仍未通过,整体生产验收继续未放行。
## 当前验收总览(2026-09-30 23:55,SSH 公钥自动部署与密钥回连复测)
- [x] 通过正式服务器编辑流程将现有目标切换为“SSH 密码”保存;Scert 使用密码连接远端、部署托管公钥,并自动验证密钥登录,页面状态更新为“已部署并验证”。
- [x] 托管私钥指纹为 `SHA256:iDWSQY7LgGdy6aYb47C0TMvZfktJxrfjVSGYLFrqhoc`;远端 `/root/.ssh/authorized_keys` 查询到相同指纹,文件权限为目录 700、授权文件 600。
- [x] 自动切换回托管私钥后,再次从正式页面部署第二域名成功,证明后续证书部署使用密钥认证仍可完成文件推送、配置校验、reload 和 HTTPS 校验。
- [~] SSH 密码到公钥的单服务器闭环已通过;仍需在第二台真实服务器上复测,不能以一台服务器的密钥回连结果代替多服务器验收。
- [!] 后置 HTTPS 失败自动恢复、进程崩溃事务接管、三数据库、双平台、备份恢复和清库首次流程仍未通过,整体生产验收不变。
## 当前验收总览(2026-09-30 23:42,3cc8fb6 正式候选双域名部署复测)
- [x] 3cc8fb6 已通过规范源码构建并使用正式安装器部署到 45.136.13.241;服务版本、包校验和及线上运行状态已核对,未创建辅助验收脚本。
- [x] 通过正式页面重新登录超级管理员并部署 `scert-multi-20260930.apmmk.cn`,页面显示“1 台推送成功,站点 HTTPS 校验通过”;服务器结果显示证书推送、配置校验和 reload 成功。
- [x] 远端 `Scert.service`、`Scert-storage.socket`、`nginx` 均为 active,`/readyz` 返回 200;两个测试域名 HTTPS 均返回 200,目标证书与公网证书 SHA-256 指纹一致,目标目录无残留 `.scert-lock`。
- [~] 本轮只证明当前正式候选的正常部署路径;后置 HTTPS 校验失败后的自动恢复、进程崩溃事务自动接管仍需负向实机证据,不能将正常部署结果扩大为完整生产验收通过。
- [!] 今天不能完成完整生产放行:第二台真实服务器、一个域名多服务器、三数据库矩阵、Linux 原生构建、Windows 服务、备份恢复及最终清库首次流程仍无完整证据;整体生产验收继续未通过。
## 当前验收总览(2026-09-30 22:56)
- [✓] P0-03 源码与产物边界局部复审通过,不扩大为其他门禁通过。
- [x] 6efc890 已正式部署,锁冲突诊断页面与任务结果接口实测通过;测试现场已恢复,两域名正常 HTTPS,正常重新部署任务 179bb071-486d-4356-8ba2-e15ce1164eb5 成功。
- [~] P0-10:开始整改站点 HTTPS 校验前过早清理事务旧文件与释放锁的问题;目标为失败自动恢复文件、配置重载及部署前可信站点身份核验。
- [!] 崩溃事务自动恢复、多服务器、数据库矩阵、双平台、备份恢复和最终首次流程仍未通过;整体生产验收未完成。
下方带时间章节均为历史记录,涉及候选版本和阻塞位置时以本节为准。
## 当前验收总览(2026-09-30 22:35,中断恢复边界已实测)
- [✓] P0-03 局部复审结论保持,不把后续事务门禁重新挂到源码目录任务下。
- [x] 主进程在真实部署的远端配置校验阶段被强制终止,systemd 自动重启;任务、尝试和恢复审计一致为失败,没有永久执行中或误报成功。
- [x] 已实证遗留三个部署锁阻止直接重试;人工核查新旧文件一致并隔离保留事务现场后,正式产品接口重新部署成功,两域名正常 HTTPS。此为人工恢复,不是自动事务恢复。
- [x] 新增固定阶段中文诊断及错误码,任务查询兼容历史错误脱敏;中断提示改为先核查关联资源、远端文件、锁及服务状态。22:41 后端全量、静态检查、四包竞态及前端 240 项均通过。
- [~] P0-10 继续进行:诊断代码尚未正式构建部署;进程崩溃后的远端自动恢复、后置 HTTPS 失败的运行态恢复均未完成。
- [!] P0-04、P0-11、P0-12 等完整范围不变;第二台真实服务器、数据库矩阵、双平台服务与最终清库首次流程没有新增通过证据。不承诺当晚生产放行。
以下较早章节保留历史时间,不代表当前阻塞位置。
## 当前验收总览(2026-09-30 22:18,以本节为准)
下方带时间的进度为历史证据,不代表当前阻塞位置。P0-03 已按源码与产物边界范围复审通过,不再使用历史“仍停在 P0-03”作为当前结论。完整整改及生产验收仍未完成,不承诺当晚放行。
- [✓] P0-03 源码与产物边界局部复审保持通过;不扩大为其他 P0 项目通过。
- [x] 最新运行候选已更新为 91e1123:规范干净源码构建,归档和远端主程序校验一致,正式安装器升级,主服务、目录 socket、管理页面登录正常。
- [x] 新版 DNS 权限检查连续四次全部完成写入、读取和清理,记录名均为三十六位小写十六进制后缀;正式页面再次申请生产证书成功取得新证书。
- [x] 同域旧有效证书负向实机验证完成:目标文件为新指纹,公网仍为旧指纹、Nginx worker 未变;任务和尝试均失败,页面显示错误,日志明确六次校验后指纹仍不一致。
- [x] 恢复正常重载命令后,通过正式页面部署已有新证书成功;托管文件、目标文件和公网新指纹一致,HTTPS 返回 200,域名恢复正常,无残留部署锁。
- [~] P0-04、P0-10 等整项继续进行;本次证明失败检测与人工修正后重新部署,不证明后置 HTTPS 失败自动恢复运行态。证书申请失败页面仍只显示通用错误,诊断可读性待改善。
- [x] 单机双域名实机闭环完成:第二域名真实 DNS-01 签发,产品创建独立目录,原域名文件未覆盖;补齐独立 Nginx 站点并等待 DNS 缓存到期后,正式页面部署成功,两站点 HTTPS 和指纹正确。精确解绑、重新绑定第二域名不影响第一域名。
- [~] 继续真实部署中断与重启恢复;不以普通空闲服务重启代替任务执行中断测试。
- [ ] 后续仍需真实多服务器、三数据库、Linux 原生构建、Windows 服务及其他既定门禁。
- [!] 第二台真实服务器仍缺;本轮是保留现场的升级和负向复测,没有清库,不能替代最终清库、清缓存和完整首次生产初始化。
## 最新阻塞整改(2026-09-30 21:48,DNS 探测随机标签)
- [x] fc57b8e 已实机正常部署;重载执行后返回失败时文件回滚,恢复正常命令后再次部署成功,详细边界见 Linux 测试记录。
- [x] 实机发现 DNS 授权探测随机记录名首标签可能以连字符结尾,导致 InvalidRR.Format;相邻请求同一账户一成功一失败,并非已经证明 RAM 权限不足。
- [x] 随机记录名改用十八字节随机数的小写十六进制编码;TXT 仍使用独立三十二字节随机值,精确写入、查询和删除闭环不变。增加格式错误独立脱敏诊断,不引导扩大权限。
- [x] 新回归修复前失败、修复后通过;覆盖根域、子域、泛域、多级子域,每种连续三十二次,检查字符集、随机强度、标签长度、目标范围、清理闭环;DNS 包测试、静态检查和竞态通过。
- [x] 后端全量测试及静态检查退出 0。
- [~] 提交后需规范正式构建和部署,再继续真实权限及 HTTPS 负向验收。
- [!] 不将本次 DNS 失败算作 HTTPS 身份负向通过;单机多域名、多服务器、三数据库和清库首次流程仍有待办。
## 最新实机进度(2026-09-30 21:33,最新候选已部署)
- [x] 部署后 HTTPS 身份与状态修复 fc57b8e 已完成全量本地检查及应用、接口、部署专项竞态;前端 239 项通过。
- [x] 新 Linux 正式包构建成功,干净源码;23 项清单与 22 个包内文件全部核对通过,五个执行入口权限正确。
- [x] 密码 SSH 使用正式安装器升级到 fc57b8e,线上主程序哈希与本地产物一致;主服务、目录 socket、管理入口及重新登录正常。
- [~] 正在进行新版本部署结果、失败恢复及单机多域名实机复测。
- [!] P0-03 保持复审通过;P0-04、P0-10 整项及完整生产门禁继续保留未完成部分。此次保留数据升级不替代最终清库首次初始化。
## 最新整改进度(2026-09-30,部署后 HTTPS 身份与状态一致性)
- [x] 回归已复现两个缺陷:站点仍返回同域名旧有效证书时被判成功;站点校验报错时部署报告仍为 success。
- [x] 部署前从实际证书、完整链及私钥校验结果提取指纹,不信任历史元数据;本地文件损坏时在远端写入前停止。
- [x] HTTPS 必须返回本次待部署证书的相同指纹;旧指纹或空指纹进入有界重试,取消后不接收迟到的成功结果。远端可信链验证没有取消。
- [x] 增加 verification_status 区分站点校验与单台文件推送;校验失败时整体报告失败,保留真实推送结果,不伪称自动回滚。页面同步展示,任务、尝试及接口回归覆盖失败状态。
- [x] 新增本地真实 TLS 握手用例验证旧有效证书切换新证书;前端 239 项测试及生产前端构建通过。
- [x] 后端全量测试、静态检查均通过;前端 239 项测试与生产前端构建通过。
- [~] 专项竞态最终结果待本批收尾记录;提交后需规范构建并部署新候选。
- [ ] 多域名、多服务器、重载失败、后置 HTTPS 失败实机恢复、三数据库及清库首次初始化仍待完成。
- [!] 本轮仅本地开发与隔离验证,不清空业务库、不修改线上现场、不新增生产放行。P0-03 已复审结论不变,P0-10 整项仍进行中。
## 最新验收进度(2026-09-30 21:07,规范源码双平台发布构建)
- [x] 规范独立克隆签出 9e89eda,正式发布入口完成 Windows amd64 和 Linux amd64 双目标构建;不是只运行工具链预检。
- [x] 发布清单 source_dirty=false,换行检查记录后端 547 个、前端 105 个受跟踪文件;33 项产物大小和校验和全部一致。
- [x] 实际压缩包逐项读取:Windows 9 个文件、Linux 22 个文件,名称集合及内容校验和与清单一致;Linux 五个执行入口权限为 0755。构建后源码和锁文件无变化。
- [x] 同一规范克隆后端全量测试、静态检查、发布模块专项及前端 237 项测试通过;没有据此宣称外部数据库或条件跳过用例通过。
- [~] P0-04 整项继续进行:本轮是在 Windows 构建机交叉编译,Linux 原生构建及双平台服务验收尚未完成。
- [ ] 下一步继续多域名实机、重载失败、后置 HTTPS 失败、任务恢复、三数据库及清库首次初始化。
- [!] 新包仅完成本地验证,尚未部署;第二台真实服务器仍未落实。P0-03 保持复审通过,完整生产验收不放行。详细产物身份见《构建版本与数据库支持矩阵》最新章节。
## 最新开发进度(2026-09-30,构建输入换行门禁)
- [✓] P0-03 保持复审通过,证据见下节;不代表全部生产验收通过。
- [x] P0-04 子项:正式工具链在安装依赖前及构建后读取实际源码换行,拒绝 CRLF、混合换行、无受跟踪源码及 Git 检查失败;不会自动改写文件。后端和前端检查结果写入发布清单。
- [x] 工具链 31 项、前端全量 237 项测试通过;实际非规范工作区已被正式入口拒绝;规范独立克隆检查通过,核对后端 547 个、前端 105 个受跟踪文件。
- [~] 新工具链提交后仍需在规范克隆执行完整发布构建;Linux 原生及双平台完整门禁未完成,P0-04 整项仍为进行中。
- [!] 远端继续运行此前已验证的 0bb427d 正式候选,未将新的本地工具链或复审包冒充为已部署。其余生产门禁按下节继续。
## 最新进度(2026-09-30 20:53,回滚实机证据与 P0-03 独立复审)
本节及对应任务正文是当前状态;下方按日期保留的“总体验收仍为 P0-03”属于历史口径。任务复审和整体生产放行分开判断,不能将所有后续门禁都挂在目录整理任务下。
- [✓] P0-03 源码与产物边界复审通过:当前部署源码 0bb427d 的独立克隆正式构建成功;发布模块完整测试通过;23 项发布清单校验通过、22 个包内文件边界检查通过;克隆构建后工作区和锁文件无变化。实际部署包全部校验和再次通过。未删除既有文件。
- [x] 20:07 正式页面部署现有证书时注入配置校验失败;服务日志确认文件回滚,三个原文件的 inode、校验和、权限恢复一致,无残留锁,Nginx 工作进程不变,HTTPS 仍为 200。
- [x] 20:10 页面恢复正常命令后再次部署成功,域名恢复正常,目标文件更新、Nginx 工作进程重建、HTTPS 仍为 200;没有重新签发证书。
- [~] P0-04 新发现:原工作树与独立克隆有 27 个前端文件仅换行字节不同,Git 状态均可为干净,但构建产物哈希不同。下一开发任务为正式构建增加源码换行一致性拒绝检查与回归,不用脚本改写中文源码,也不声称二进制可重复构建已通过。
- [ ] 后续门禁继续包含多域名复用、真实多服务器、重载失败和后置 HTTPS 失败边界、任务恢复、三数据库及清库首次初始化。
- [!] 第二台真实服务器尚未落实,DNS 偶发超时仍需评估。P0-03 局部复审通过不等于全部 P0 通过,不代表 10 月 1 日上线条件已满足。
## 最新进度(2026-09-30 20:06,生产证书与单台服务器部署闭环)
需求沿用用户已确认范围:继续真实生产流程、域名与服务器多对多、失败可诊断可恢复,并同步任务证据。不缩减完整验收范围。总体验收仍为 P0-03 完成待复审。
- [x] 当前正式运行候选为 0bb427d,干净源码构建、完整发布包校验、正式安装器升级均已完成;后端全量测试、静态检查、构建及 DNS 专项竞态检查通过。
- [x] 19:57 正式页面为独立测试子域成功申请生产证书并自动推送既有服务器;任务及持久化部署报告均为成功,报告明确配置校验和重载成功。
- [x] 20:00—20:05 交叉核对:目标目录由产品部署创建,三个文件与版本化托管目录的校验和一致,私钥权限为 600;Nginx 配置检查通过,重载日志存在。
- [x] 服务器和外部 Windows 客户端按正常域名访问 HTTPS 均返回 200,未跳过 TLS 校验;公网证书指纹与托管记录、部署文件一致。两台权威 DNS 均确认本次 ACME 挑战记录已不存在。
- [~] 下一任务为正式页面部署现有证书的失败回滚验证,不重复申请生产证书;之后继续多域名复用和任务恢复。
- [!] DNS 偶发超时仍出现过,补偿修复不等于消除了超时;第二台真实服务器、三数据库矩阵及清库首次初始化验收仍未完成。
- [!] 本轮保留失败现场进行升级复测,不是清库全流程;单台成功路径不代表完整生产放行。下方较早章节保留各自时间,不作为当前状态。
## 最新进度(2026-09-30 19:43,阿里云精确查询与超时补偿整改)
本轮沿用已确认需求,继续真实证书部署闭环。总体验收仍为 P0-03 完成待复审;以下局部进展不代表生产放行。
- [x] 产品自带权限检查已在授权测试子域完成创建、读取、删除闭环;正式页面保存域名返回 201,关联既有服务器返回 200。
- [x] 实机确认首次超时遗留一条授权探测 TXT;精确核对本次名称、值及记录 ID 后已执行清理,不扩大删除范围。
- [x] 定位查询参数错误:EXACT 模式忽略 RRKeyWord、TypeKeyWord;改用 COMBINATION,并补充回归。证据来自当前 SDK 参数定义及云端两种模式的实际返回。
- [x] 创建响应丢失时增加有界补偿:只查本次随机授权 TXT,核对唯一 ID、托管区、名称、类型、值后精确删除;不重试创建、不触碰共享 ACME 记录、不将补偿成功视为授权成功。
- [x] 未发现记录、查询不完整、内容不匹配或清理失败时保留明确待核对提示;尚不能排除云端延迟写入,不声称零遗留。
- [~] 最终全量回归、干净候选构建和远端部署待完成;当前线上仍为上一批 SSH 修复版本。
- [~] 已为新测试子域创建独立 A 记录,原有泛解析未修改;证书签发、Nginx 消费端和公网 HTTPS 闭环仍待执行。
- [ ] 后续仍包括失败回滚、多域名复用服务器、第二台真实服务器、三数据库及清库首次初始化完整验收。
## 最新进度(2026-09-30 19:20,自动 SSH 公钥部署实机通过,整体验收未通过)
**总体验收仍为 P0-03:完成,待复审。** 当前 SSH 阻塞已获得一次真实生产页面复测成功证据,不得扩大为证书推送、多服务器或全部生产门禁通过。下方同日较早的“尚未部署”“竞态运行中”为历史快照。
- [x] 已提交并推送:1a317c2 默认单次协商、7147532 SSH 重载后短暂连接拒绝的有界重试。
- [x] 本批后端全量测试、静态检查、构建、差异检查通过;竞态检查部署包使用缓存,接口 156.792 秒、应用 62.278 秒,退出 0。
- [x] 正式 Linux 候选发布清单为 source_commit=714753236f584a2bc705e271334c697dc7f9adbd、source_dirty=false;通过密码 SCP 上传、包内校验和正式安装器部署。
- [x] 本地与远端主程序 SHA-256 均为 a39c8b0beaf2dc31e3bdc3b2aa774651e6d8e934ab956058518b10f71d9daeb2;管理入口、healthz、readyz 正常,未关闭 TLS 校验。
- [x] 正式页面编辑既有服务器 3cfe6b82-6807-421d-88ab-a2034370375b;2026-09-30 19:18:58 北京时间 PUT 返回 200,耗时 1844 毫秒。
- [x] 接口复读确认 auth_method=private_key、ssh_key_status=deployed、ssh_key_error 为空,部署和测试时间均为 2026-09-30T11:18:58Z。目标机确认先密码认证、随后公钥认证成功,对应公钥存在,sshd 配置校验通过。
- [x] 本轮复测保留既有失败记录以验证修复,未清库、未新建重复服务器;这是针对性升级复测,不是清库首次初始化全流程验收。
- [ ] 下一步:真实证书目录创建、证书与私钥推送、Nginx 校验和重载、失败回滚、一台服务器多域名及任务恢复等完整验证。
- [!] 第二台真实服务器和三数据库生产矩阵仍未完成;不新增整项复审通过,不承诺 9 月 30 日全部完成或 10 月 1 日已经满足上线条件。
### 19:13 开发补充:SSH 重载间隙处理已实现
- [x] 公钥安装后的私钥回连已增加最多五次尝试,间隔为 100、200、400、800 毫秒;只重试底层拨号连接拒绝,不重试认证失败、指纹不匹配或其他网络错误。
- [x] 新增恢复成功、次数耗尽、认证失败、指纹失败、超时、非拨号错误、开始前取消及等待中取消回归;后端全量测试、静态检查和构建通过。
- [~] 本批竞态检查正在运行,正式候选尚未构建部署。开发完成不等于该项实机复审通过;总体验收状态不变。
### 19:10 补充:回连失败现场已定位到 SSH 重载窗口
- [x] 三个包的竞态检查全部通过:部署 9.381 秒、接口 172.202 秒、应用 74.521 秒,命令退出 0。
- [x] 密码 SSH 只读核对精确日志:10:27:40.559700 UTC 收到重载信号,10:27:40.566606 UTC 私钥连接被拒绝,10:27:40.583273 UTC SSH 恢复监听。该次失败位于重载监听间隙,不能只归因于算法协商次数。
- [~] 下一修复项:仅在公钥安装后的私钥回连阶段,对连接拒绝增加有界、可取消的重试;认证失败与指纹不匹配不得重试或放宽。
- [ ] 单次协商优化尚未远端部署;总体验收仍为 P0-03 完成待复审。
## 当前进度口径(2026-09-30 19:08,单次 SSH 协商本地回归)
**总体验收仍为 P0-03:完成,待复审,不代表生产验收通过。** 此前口头“约 70%”未按清单逐项统计,撤回该百分比;以下以实际完成项和未完成门禁为准。
- [x] 默认 SSH 连接改为一次协商全部已过滤的安全主机密钥算法,正常连接只建立一次 TCP 连接;显式指定算法仍保持逐算法兼容行为。
- [x] 已新增正常连接、认证失败停止重连、指纹不匹配回退、未知指纹在认证前拒绝的回归测试;保留严格主机指纹校验。
- [x] 本轮后端全量测试、静态检查、构建、差异检查通过;这些结果不等同于真实数据库矩阵或远端验收。
- [~] 竞态检查正在运行;新候选尚未构建和部署,远端自动密钥回连仍未复测通过。
- [x] 本轮密码 SSH 只读确认远端 Scert 与 SSH 服务均为 active;未清库、未修改远端文件,未创建辅助验收脚本。
- [ ] 下一步:竞态检查、提交候选、构建正式包、部署并复测既有服务器记录,再执行证书推送、校验、重载与回滚。
- [!] 连接次数过多是待验证假设,不能据此宣称 connection refused 的根因已解决。第二台真实服务器与完整生产门禁仍未完成,不能承诺当日全部验收。
## 当前进度口径(2026-09-30 15:26,验收位置与开发进展分开记录)
**总体验收位置仍为 P0-03:完成,待复审,不代表全部开发只做到 P0-03。** 后续条目的源码实现、本地回归和实机验证分别记录;不得用局部进展替代整项复审,也不得因本节没有升级状态而忽略后续已完成的开发子项。
- [x] 本轮只读核对:密码 SSH 登录成功,远端 Scert 服务正在运行;未清库、未重启、未修改远端文件。
- [x] 版本证据:远端 `/scert/scert` 与本地已部署正式候选的 SHA-256 完全一致,为 `24a139c89e0096a80bf019072314f90323b95fd4843d762ea7550028756bed8d`,不能将当前失败简单归因于安装了不同二进制。
- [~] 当前排查:历史服务器新增、更新请求分别在 25 毫秒、19 毫秒返回 502;源码发现公钥转换和内置安装命令与参数校验之间的疑点,尚未通过专项回归确认,不记作已修复。
- [ ] 下一步:补充失败路径回归,修复确认的问题,再重新构建部署并复测现有失败记录。
- [!] 验收限制:自动公钥部署、密钥回连和真实证书推送仍未通过;第二台真实目标服务器仍缺失,不新增复审通过项。
## 最新进度摘要(2026-09-30,远端 HTTPS 与密码 SSH 实机复核)
**总体验收位置继续保持 P0-03:完成,待复审。** 本轮已通过 `https://odacm.cn` 完成超级管理员登录和资源接口核验;远端正式包已运行,初始域名和服务器列表为空。按生产页面流程添加授权测试服务器时,主机指纹校验通过,但 Scert 自动部署 SSH 公钥返回 502,并将服务器保留为失败状态。该阻塞未解决前,不进入真实证书推送,也不把单台服务器记录当作多服务器生产验收证据。
- [x] 已完成:正式 HTTPS 管理入口登录、会话读取、域名列表和服务器列表核验。
- [x] 已完成:密码 SSH 直连目标服务器成功,服务器 ED25519 主机指纹与登记值一致。
- [x] 已记录:通过正式 Web 流程添加服务器时,`ssh_key_status=failed`,自动公钥部署返回 502;没有将底层凭据写入清单。
- [~] 进行中:定位 Scert 自动公钥部署失败原因,修复后重新执行密码 SSH、公钥登录和证书目录部署复核。
- [!] 当前阻塞:现场只有一台可用真实目标服务器,不能用虚构记录替代第二台服务器;真实“一域名多服务器”推送尚未验收。
- [ ] 尚未完成:远端多服务器证书推送、三数据库实机矩阵、HTTPS/DNS/ACME 全流程和最终生产部署门禁。
- [!] 不新增 `[✓]` 复审通过项;总体验收继续保持 **P0-03:完成,待复审**。
## 最新进度摘要(2026-09-30,域名与服务器多对多统一回归)
**总体验收位置继续保持 P0-03:完成,待复审。** 本轮按照“先开发、后测试”要求复核域名与服务器多对多实现;一个域名可关联多台服务器,一个服务器可复用于多个域名,局部修改或清空不会影响其他域名。专项自动化验证已通过,但不等同于真实服务器生产部署验收。
- [x] 已复核后端联合主键、项目归属和绑定替换逻辑,没有增加域名或服务器单边唯一约束。
- [x] 已复核 HTTP 与仓储回归:重复服务器去重、多个域名共享服务器、局部解绑、显式清空、跨项目拒绝、路径冲突和审计失败回滚均有覆盖。
- [x] 已复核管理页面:域名表单支持多选服务器,服务器列表反向显示当前托管的多个域名。
- [x] 本轮专项后端测试通过;前端全量测试 231 项全部通过。
- [~] 三数据库实机、浏览器生产流程、密码 SSH、多服务器真实证书推送及远端部署仍需继续执行。
- [ ] 最终生产部署门禁和验收证据仍未完成。
- [!] 不新增 `[✓]` 复审通过项;总体验收继续保持 **P0-03:完成,待复审**。
## 最新进度摘要(2026-09-30,P0-10 崩溃恢复边界修复)
**总体验收位置仍为 P0-03:完成,待复审。** 本轮继续先开发、后统一测试,修复服务重启恢复任务尝试的历史记录误命中风险;本地验证结果不等同于生产部署验收通过。
- [x] 已完成,等待复审:恢复任务尝试改为依据恢复前仍处于活动状态的父任务筛选,不再依赖恢复完成时间反查。
- [x] 已完成,等待复审:新增历史 `service_restart` 任务时间碰撞回归测试,确认历史活动尝试不会被本次恢复错误修改。
- [x] 本轮验证:后端 `go test ./...`、`go vet ./...`、`git diff --check` 均通过。
- [~] P0-10 的 DNS 验证任务、重试幂等、跨数据库实机矩阵和统一复审仍需继续。
- [ ] 真实生产数据库清理、密码 SSH、远端多服务器部署、HTTPS/DNS/ACME、平台服务和最终生产门禁仍未完成。
- [!] 不新增 `[✓]` 复审通过项;总体验收继续保持 **P0-03:完成,待复审**。
## 最新进度摘要(2026-09-30,P0-10 批量部署结果持久化)
**总体验收位置仍为 P0-03:完成,待复审。** 本轮完成批量部署结果的持久化、项目范围查询和 HTTP 读取接口,并完成本地自动化验证;这些结果不等同于生产部署验收通过。
- [x] 已新增 `task_deployment_results` 数据表及 0016 迁移,SQLite、MySQL、PostgreSQL 三套迁移文件与嵌入目录一致。
- [x] 证书申请、续期、当前证书部署、导入、恢复等统一任务工作流会按任务尝试保存每台服务器的部署状态、消息和备份 ID。
- [x] 已新增 `GET /api/v1/tasks/:id/deployment-results`,按任务项目范围判权,支持读取多服务器结果。
- [x] 失败部署结果在接口层统一脱敏为“证书部署失败”,不返回远端路径、权限错误等底层敏感信息。
- [x] 已补充管理员、项目只读成员、项目外用户、未登录用户、撤权后旧会话以及部分成功状态专项测试。
- [x] 本轮提交 `126cb6d`、`40d2b61`、`79e57cd` 已完成;`go test ./...`、`go vet ./...`、`git diff --check` 均通过。
- [~] P0-10 仍需继续审查 DNS 验证、崩溃恢复、重试幂等、跨数据库实机矩阵和统一复审。
- [ ] P0-12、真实三数据库实机、清库初始化、密码 SSH、远端多服务器部署、HTTPS/DNS/ACME、Linux/Windows 服务及最终生产门禁仍未完成。
- [!] 不新增 `[✓]` 复审通过项;总体验收继续保持 **P0-03:完成,待复审**。
## 最新进度摘要(2026-09-29)
**总体验收位置仍为 P0-03:完成,待复审。** 本轮完成 P0-10 任务并发、幂等、域名删除保护和服务重启恢复边界开发,并已完成本地回归;局部开发结果不代表生产部署验收通过。
- [x] 已补齐幂等重放对 `queued`、`running`、`retry_wait`、`cancelling` 四类活动状态的冲突返回。
- [x] 已补齐管理证书 `management_renewal` 的活动任务保护,避免重复创建并发任务。
- [x] 已补齐域名删除对 `renewal_run` 活动任务的保护,终态任务仍不阻塞合法删除。
- [x] 服务重启恢复只更新本次恢复任务对应的活动尝试,不再污染历史终态任务的尝试记录。
- [x] 新增专项回归测试;后端 `go test ./...`、前端 231 项测试和前端生产构建均通过。
- [~] P0-10 其余长任务链、三数据库实机矩阵和统一复审仍需继续执行。
- [ ] 生产数据库清理、浏览器缓存清理、密码 SSH、远端部署、HTTPS/DNS/ACME、Linux/Windows 服务和最终生产验收尚未执行。
- [!] 不新增 `[✓]` 复审通过项,总体验收继续保持 **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] 任务工作流从认证请求上下文读取创建人,并写入证书任务的 `operator_id`。
- [x] 任务开始和完成审计使用任务自身的创建人;后台调度任务继续保留空操作者边界。
- [x] 创建人和审计归属专项测试通过;尚未执行三数据库、浏览器、密码 SSH、远端部署和生产门禁。
- [~] P0-10 其余任务链、DNS 验证、批量部署、崩溃恢复、重试幂等和 P0-12 仍未完成。
- [!] 不新增 `[✓]` 复审通过项,总体验收继续停在 **P0-03 完成,待复审**。
## 最新进度摘要(2026-09-29 继续开发)
**总体验收位置仍为 P0-03 完成,待复审。** 本轮只推进 P0-10 任务工作流,不把局部代码完成或专项测试通过视为生产验收通过。
- [x] 证书导入、恢复、校验任务入口接入应用层,提交 `b899751`。
- [x] 当前证书部署、导入、恢复、校验入口接入任务取消上下文,任务中心取消可触发执行上下文取消。
- [x] 已补充取消绑定回归用例;专项测试、后端全量 `go test ./...` 和 `git diff --check` 已通过,当前批次等待复审。
- [~] P0-10 继续检查剩余任务状态、审计、尝试记录、取消、重试与崩溃恢复的一致性。
- [ ] P0-12 备份恢复、三数据库实库矩阵、浏览器、密码 SSH、远端部署及最终生产门禁尚未执行。
- [!] 不升级总体验收,不新增 `[✓]` 复审通过项。
## 最新进度摘要(2026-09-29 23:48)
**总体验收位置:P0-03 完成,待复审。** 本节为最新摘要,下方保留历史批次。开发子项完成不等于整项复审或生产验收通过,原始 44 项范围不缩减。
- [x] 上一批任务部分成功处理、HTTP 响应及前端状态展示已提交并推送 `2b9d82d`;上一批后端全量测试会话已成功结束。
- [x] 核对确认域名与服务器多对多实现已存在,继续保留同项目判权、共享路径检查及局部解绑约束。
- [~] P0-10 正在修复新增活动状态与域名删除保护未同步的问题;补充活动状态拒绝及终态放行回归用例。
- [ ] 本批专项验证结果待开发完成后登记,不沿用历史通过结论。
- [~] P0-10 其余任务事务链与 P0-12 备份恢复仍未完成,其他原始待办继续保留。
- [ ] 统一生产构建、三数据库、浏览器清缓存、密码 SSH、远端部署和生产验收仍待后续执行。
## 当前进度(2026 年 9 月 29 日 16:55 更新)
### 当前总体验收位置:P0-03 完成待复审;并行开发批次:P0-07
### 18:22 更新(2026 年 9 月 29 日)
- [x] P0-07 任务列表、任务详情、任务尝试已接入实时项目权限读取;任务取消使用 `task.cancel` 判权并在事务内同步任务尝试状态。
- [x] 证书申请任务入口使用项目可见域名和 `certificate.manage` 判权;撤权、停用账户和跨项目读取由当前专项测试覆盖。
- [x] `114514b` 已提交并推送;后端 `go test ./...` 在当前本地环境全部通过。
- [~] P0-07 仍需继续完成其他资源写入权限、任务执行链、三数据库矩阵、浏览器、SSH、部署和生产验收。
- [!] 总体验收位置仍为 **P0-03 完成待复审**,本轮开发和后端测试通过不构成生产验收通过。
**按总体验收口径当前仍在 P0-03。** P0-01~P0-03 为完成待复审,尚未取得生产部署验收结论;P0-07 的域名授权属于并行开发批次,已经有局部源码和专项测试证据,但不能据此把总体验收位置或 P0-07 整项升级为完成。遵循“先开发、后统一测试”,不能把开发子项或局部测试误写为生产验收通过。
| 编号 | 整项状态 | 已完成的开发或历史验证 | 尚需完成 |
|---|---|---|---|
| P0-01~P0-03 | `[x]` 完成待复审 | 范围、任务规格、源码与产物边界已整理 | 最终复审及相应生产证据 |
| P0-04 | `[~]` 进行中 | 工具链及构建边界已实现,历史候选有 Windows 正式包核验记录 | 当前代码重新构建、Linux 原生及服务运行证据 |
| P0-05 | `[~]` 进行中 | 三库迁移至模式 14,已有部分数据库历史验证 | 当前改动统一回归、PostgreSQL 实库、未关闭兼容性问题 |
| P0-06 | `[~]` 进行中 | 项目生命周期、资源归属、多对多及共享路径预检源码 | 其他实体关联、完整业务调用链及统一验证 |
| **P0-07** | **`[~]` 并行开发** | 成员角色、项目入口、七个资源 GET 隔离、绑定 PUT 授权和事务审计;域名写入授权已提交 `5180c7d`、读取与任务竞态修复已提交 `82448c9` | 统一全量测试、三库矩阵、其他资源和任务权限链、浏览器与生产验收 |
16:55 更新:域名新增、修改、删除已接入项目权限和事务审计;域名更新改用项目可见资源读取;任务创建与删除共用域名行锁;新增审计失败回滚测试。`e36794a` 已成功推送。`go test ./internal/repository` 与 `go test ./internal/httpapi` 均通过;完整后端、前端、数据库矩阵、浏览器、部署和生产验收仍未完成。实际任务步骤见《Scert整改任务执行清单》首节。
### 总项状态
| 状态 | 数量 | 当前含义 |
|---|---:|---|
| `[✓]` 复审通过 | 0 | 尚未通过生产部署验收 |
| `[x]` 完成待复审 | 3 | P0-01、P0-02、P0-03 |
| `[~]` 进行中 | 27 | 子项实现和局部验证不能替代整项验收 |
| `[!]` 阻塞 | 3 | P0-11、P2-08、P2-09 |
| `[ ]` 未开始 | 11 | P1-10 及 P3 的十项 |
### 本轮新增进展与下一步
- [x] 21:54 接续完成多对多表单收尾源码:资料创建成功、关联失败后保留已创建标识及选择;未修改资料时只重试关联,修改资料时更新既有域名。编辑先读取真实关联,失败禁止保存并可重新读取;服务器候选按项目过滤,保存期间防重复及切换。新增组合式状态、管理页接线及模板回归源码,全部待统一测试。
- [ ] 表单层保护不等于跨请求原子性或服务端创建幂等:创建响应丢失时要求刷新确认,不自动重发;跨刷新恢复与整项权限、部署整改仍待完成。
- [x] 生命周期收尾及七个资源读取入口已接入真实项目授权,候选已在 `709c1ef`;绑定写入授权与事务审计检查点 `f38e290` 已提交推送。后续源码仍需统一测试,不能套用此前通过记录。
- [x] 本轮多对多子项源码已补齐:两个域名可共享两台服务器,修改或清空一方不删除服务器或另一方关联;保存需双方同项目及实时权限。共享路径冲突在绑定、服务器修改及部署前检查,页面以悬浮提示说明复用。
- [x] 已新增多对多、路径冲突、失败保留、审计回滚和页面多选回归源码;仅进行源码检查、格式化与差异检查,不执行测试、构建、浏览器或远端部署。详细边界见执行清单首节及支持矩阵第二十六节。
- [ ] 其他资源增删改、签发/导入/部署、DNS/SSH、任务读取和执行/取消/重试、审计读取仍需继续接入项目授权。跨服务器记录指向同一主机、配置并发变更与在途任务的路径占用仍待整体部署整改,不以本批静态路径检查替代完整安全边界。
- [!] 按用户指令先开发再集中测试,原始 44 项大项状态不变;没有新增复审通过或生产验收证据。
- [x] 16:55 已同步本轮 P0-07 域名授权开发、任务引用保护和审计回滚专项结果;总体验收仍停留在 P0-03 完成待复审,不新增复审通过项。
#### 20:47 阶段记录(历史)
- [~] 20:47 补充:首轮仓储/接口/真实应用接线组合测试退出 0,136 个叶子用例通过、5 条实库条件跳过;覆盖创建、更新、删除、权限拒绝、引用保护、非法输入及审计失败回滚。随后新增的会话验证后停用/降权、取消请求审计和跨数据库回滚测试尚未运行,不能套用首轮结果。
- [~] 前端已接入创建、编辑、二次确认删除及权限能力提示;项目页面与生命周期专项 35 项通过、0 失败、0 跳过,退出 0。覆盖重复提交、切换/卸载隔离、冲突刷新、末页删除回首页等;这是组合式逻辑和模板测试,不是真实浏览器验收。
- [ ] 当前候选的完整后端、完整前端、MySQL 双版本、竞态检测和构建尚待执行;本批源码尚未提交。下方 20:36 记录保留为历史状态,不代表当前仍未开始页面开发或从未测试。
#### 20:36 阶段记录(历史)
- [x] 核对当前工作区和执行清单:20:21 已开始项目生命周期与事务审计整改,修改前检查点为 `dcede93`;上批正式包验证记录已随 `61652f0` 提交。
- [~] 项目创建、编辑、删除仓储和成功变更事务审计已开始编写;默认项目及资源/成员引用保护、失败审计与回滚测试源码已新增,尚未执行测试,不记为实现完成或验证通过。
- [~] 创建、编辑、删除 API 及应用接线已有未提交修改;项目目录新增创建、管理和删除能力字段。HTTP 边界、真实应用接线及目录能力测试仍待补齐,权限和事务行为尚待验证。
- [ ] 前端创建、编辑及二次确认删除尚未修改;后端与前端回归、数据库验证及本批正式构建尚未执行。
- [!] 上批成员页面真实浏览器验收仍未完成,具体工具限制见下方 20:15 历史快照;该限制不阻止本批源码整改。
20:36 历史记录:当时仅同步文档,另有 7 个未提交的后端源码/测试文件;这是当时的工作区快照,不是当前待提交数量。当前已继续开发,仍未清理业务库、调用 RAM、修改 DNS 或远端部署。上批测试与正式包证据不能证明新增代码通过,生产验收仍未通过。
### 历史批次进展(2026 年 9 月 28 日 20:15,正式包启动验证)
- [x] 使用已有正式构建脚本从干净提交 `5f9af32` 生成 Windows 服务端与 Web 发布包;清单中的 10 个产物、压缩包内 9 个文件、实际运行目录中的主程序及 4 个 Web 文件均通过大小或 SHA-256 对应校验,精确范围见支持矩阵第二十五节。
- [x] 正式包主程序已在隔离目录实际运行并提供前后端;临时 HTTPS 证书与可信本机日志中的 SHA-256 指纹完全一致,主机名校验通过。仅对这个已核对的临时入口接受浏览器证书例外,不是正式证书信任验收。
- [x] 浏览器已打开真实 Scert 页面:无会话读取初始化配置返回 401,无效一次性令牌兑换返回 401,之后仍不能读取配置;相关响应禁止缓存。仅覆盖初始化入口的未认证拒绝路径。
- [x] 首次初始化后端专项重新执行:128 个叶子用例通过、0 失败、4 条平台条件跳过,进程退出 0;跳过项不能按通过统计。
- [!] 当前浏览器文件工具的工作区范围不包含 Scert,向浏览器传入本机一次性地址文件被拒绝;未绕过该限制,未输出真实令牌,未取得初始化会话。此项是本批工具阻塞,不新增或替代原始 44 项总项状态。
- [ ] 完成合法会话兑换、数据库与 DNS 验证、管理入口证书配置后,再验收项目入口、成员操作、分页、撤权与布局。外部前置步骤尚未执行,不记成已通过或已复现的产品故障。
- [ ] 项目创建编辑删除及事务审计、全部资源和排队任务权限、PostgreSQL 当前实库、Linux 原生及生产门禁继续保留。
20:15 批次没有修改产品源码、清理现有业务库、调用 RAM、修改 DNS、签发业务证书或进行远端部署;其正式包证据见支持矩阵第二十五节。当前进度以本文件顶部及执行清单首节为准,以下保留为历史快照。原始 44 项与验收标准不缩减,生产验收仍未通过。
## 历史进度快照(2026 年 9 月 28 日 19:54,项目入口与成员页面本批回归完成,等待复审)
- [x] 已新增实时授权的可见项目分页接口,以及管理员和普通项目管理员均可使用的成员页面;不暴露全站账户目录,不写死默认项目。
- [x] 前端完整回归 198 项通过、0 失败,包含模板渲染和旧请求隔离;前端构建通过,不等于浏览器或生产验收。
- [x] 最后缓存保护修改后的专项 83 个叶子通过、4 条实库条件跳过;完整后端 1700 个叶子通过、54 条条件跳过,均无失败。静态检查、模块校验、Windows 构建和 Linux 交叉构建均退出 0。
- [x] MySQL 5.7/8.0 三轮目录/成员组合各 195 个叶子通过,0 失败、0 跳过;包含 SQLite 用例,不称纯 MySQL 测试。
- [x] 本批三轮专项竞态 249 个叶子通过、0 失败、12 条外部 MySQL 条件跳过,退出码 0;总清单对应条目及相关文档已同步。精确范围见《构建版本与数据库支持矩阵》第二十四节,不称全仓库或实库竞态通过。
- [ ] 真实浏览器、项目创建编辑、全资源与排队任务权限、PostgreSQL 当前实库、Linux 原生及生产验收仍未完成。
原始 44 项仍为:复审通过 0、完成待复审 3、进行中 27、阻塞 3、未开始 11。页面实现与本地回归属于子项进展,不升级 P0-07 整项状态,生产验收仍未通过。当前待办以本节、P0-07 对应条目及执行清单首节为准;下方各批次保留历史证据,不覆盖本节。
## 历史进度快照(2026 年 9 月 28 日 19:10,成员接口回归通过,等待复审)
本批继续推进成员接口、分页及失败审计;实现与错误分类修复已保存到检查点 `3857dac`,随后增加正式边界测试。已重新执行当前源码专项、双版本 MySQL、完整后端及构建,不用上一批数据库候选结果替代本批证据。本批不清理现有业务库、不进行浏览器或远端部署测试。
### 本批任务状态
- [x] 确认进度同步范围:保留原始 44 项、验收标准和历史证据,按实际实现与验证结果更新,不以测试数量折算完成率。
- [x] 成员列表、授予及撤销接口已接入应用依赖;列表按用户账户分页,每页支持 5、10、15、30 位成员,同一账户的多个角色不拆页。实际应用登录及读取默认项目的接线测试通过,等待复审。
- [x] 列表查询内实时判权、服务端会话身份和失败请求审计已通过专项;补齐会话验证后撤权/停用、取消请求独立审计、审计存储失败、DELETE 额外输入拒绝等边界。成功变更继续使用事务审计。
- [x] 首轮 `focused-first.jsonl` 的审计错误误报 409 已修复;精确区分三类驱动的唯一键冲突与触发器等其他错误。修复后 `focused-boundaries.jsonl` 为 62 个叶子通过、3 条实库条件跳过,退出码 0;失败日志保留。
- [x] MySQL 5.7/8.0 依次完成三轮成员组合,各 171 个叶子通过、0 失败、0 跳过,退出码均为 0;组合含 SQLite 和错误分类用例,不称纯 MySQL 用例。
- [x] 当前源码完整后端 1679 个叶子通过、0 失败、53 条条件跳过;Windows 独立程序历史备份/升级与成员恢复路径、静态检查、模块校验、Windows 构建及 Linux 交叉构建通过,顺序进程退出码 0。跳过与交叉构建不作为实机验收。
- [x] 仓储、HTTP 和实际应用接线三轮竞态共 186 个叶子通过、0 失败、9 条外部 MySQL 条件跳过,退出码 0;这是成员专项竞态,不是全仓库或实库竞态验证。
- [x] 已补充成员接口交接与模型边界,保留 Smail 参考接口文档不混写。详细命令、结果与范围见《构建版本与数据库支持矩阵》第二十三节。
- [ ] 成员管理页面、项目入口、全部业务资源授权及排队任务重判继续后续交付;PostgreSQL 当前实库、Linux 原生、完整发行包和生产验收仍未完成。
### 原始 44 项状态汇总
| 状态 | 数量 | 说明 |
|---|---:|---|
| `[✓]` 复审通过 | 0 | 尚无整项通过最终复审 |
| `[x]` 已完成,等待复审 | 3 | P0-01、P0-02、P0-03 |
| `[~]` 进行中 | 27 | 包含本批继续实施的 P0-07,不把局部源码实现记为整项完成 |
| `[!]` 暂缓或存在阻塞 | 3 | P0-11、P2-08、P2-09 |
| `[ ]` 未开始 | 11 | P1-10 及 P3 的 10 项 |
本节是 19:10 的历史批次记录,表内总项数量仍有效,但本节尚未交付的成员页面与项目入口已在后续批次实现。当前子项状态以本文顶部、P0-07 对应条目及《Scert整改任务执行清单.md》首节为准,整体验收仍未通过。
## 历史进度快照(2026 年 9 月 28 日 18:36,数据库候选回归完成,整体验收未通过)
本节更新下方 13:05 快照。检查点 `0edde01` 已提交推送;当前驱动改为 `modernc.org/sqlite v1.59.0`,配套 `libc v1.75.7`,实测引擎为 SQLite 3.53.4。旧 v1.40.1 的 3.50.4 引擎处于官方 WAL-reset 缺陷影响范围,先前通过只作为中间版本证据,不作为最终候选放行。
- [x] 核实两个资源失败:MySQL 5.7 初始化日志明确记录缓冲池内存分配失败;8.0 测试进程内存分配失败。已按程序路径和隔离数据目录验证身份,终止崩溃后残留的两个测试实例进程;未触碰本机其他服务,未删除文件。
- [x] 最后源码的取消查询 direct/prepared 和 WAL 完整性专项各 10 次通过,共 30 个叶子;服务并发关闭另重复 30 次通过。最终专项证据为 `sqlite-verified.jsonl`,不是初版 `sqlite-final.jsonl`。
- [x] MySQL 5.7/8.0 保留原用例、严格 TLS 和三轮重复,按版本依次执行;各 531 个叶子通过、0 失败、0 跳过,进程退出码均为 0。组合含 SQLite 用例,不称纯 MySQL 用例;表完整性和索引字段顺序检查通过不代表旧异常根因已修复。
- [x] 最终候选完整后端 1635 个叶子通过、0 失败、52 条条件跳过;Windows 独立程序历史备份/升级/成员恢复、静态检查、模块校验和 Windows/Linux 候选构建通过,最终顺序进程退出码为 0。交叉构建不是 Linux 原生验收。
- [x] 最终候选三轮扩大竞态 `race-final.jsonl`:831 个叶子通过、0 失败、15 条条件跳过,进程退出码为 0;跳过的是未配置外部 MySQL 的条件测试,实库证据单列,不复用 v1.40.1 的旧竞态数字。
- [!] 旧 MySQL 5.7 Error 1280 根因仍未关闭,重复通过也不能自动关闭该问题。
原始 44 项:`[✓]` 0、`[x]` 3、`[~]` 27、`[!]` 3、`[ ]` 11。P0-04/P0-05/P0-06/P0-07/P1-09 仍为 `[~]`;本批子任务完成不升级整项状态,不按测试数量折算完成百分比,生产验收未通过。
接下来优先补齐成员管理 Web/API、分页、失败请求审计、业务资源授权和排队任务重判;PostgreSQL 当前实库、Linux 原生、完整发行包与实机服务验收仍未完成。最新证据目录为 `artifacts/runtime-migration-20260928/`,详细命令与边界见《构建版本与数据库支持矩阵》第二十二节;下方按时间保留历史结果,不代表当前待办。
## 历史进度快照(2026 年 9 月 28 日 13:05,运行时与迁移回归批次)
本节与《Scert整改任务执行清单.md》同步。成员基础已提交并推送为 `b3909d8`,事务审计源码已保存到检查点 `83a3ada`;检查点不代表验证完成或正式发布。当前 SQLite 驱动升级、取消查询回归及 MySQL 故障断言强化仍未提交。以下状态依据本次重新读取日志并取回全部四个测试进程退出码的结果,不沿用上一批完整回归结论。
### 原始 44 项状态汇总
| 状态 | 数量 | 含义 |
|---|---:|---|
| `[✓]` 复审通过 | 0 | 尚无整项达到最终复审标准 |
| `[x]` 已完成,等待复审 | 3 | P0-01、P0-02、P0-03 |
| `[~]` 进行中 | 27 | 局部实现或局部验证,不等于整项完成 |
| `[!]` 暂缓或存在阻塞 | 3 | P0-11、P2-08、P2-09 |
| `[ ]` 未开始 | 11 | P1-10 及 P3 的 10 项 |
不按测试通过数量折算整体完成百分比;生产部署验收仍未通过。下方各项原始需求、验收标准及总项状态不缩减。
### 本批任务与证据
- [x] 核对需求与任务范围:保留原始 44 项及验收标准,区分源码实现、隔离回归、实机部署和最终验收;本次仅同步进度,不增加代码改动或重启测试。
- [x] SQLite 取消查询文件占用已由正式测试在旧驱动复现;升级候选 `modernc.org/sqlite v1.40.1` 后,取消查询 direct/prepared 各重复 10 次通过,服务并发关闭重复 30 次通过。修复候选仍待复审,不宣称已完成全部平台验证。
- [x] 当前候选完整后端 `backend.jsonl`:1634 个叶子通过、0 失败、52 项条件跳过;Windows 构建、后续 `go vet ./...` 和 `go mod verify` 成功,顺序进程退出码为 0。条件跳过不计通过。
- [x] 扩大范围的三轮竞态 `race.jsonl`:累计 828 个叶子通过、0 失败、15 项条件跳过,进程退出码为 0。
- [!] MySQL 5.7 三轮组合 `mysql57-after.jsonl`:530 个叶子通过、1 个失败、0 跳过(包含 SQLite 用例);失败为 `TestMySQLRealProjectMembersMigrationRetry` 的隔离 MySQL 实例初始化失败。后两轮该用例通过不能抵消本批失败,进程退出码为 1。
- [!] MySQL 8.0 三轮组合 `mysql80-after.jsonl`:已完成 247 个叶子通过,但数据库包进程报 `fatal error: runtime: cannot allocate memory`,组合进程退出码为 1。中断测试不能计为通过,双版本完整回归仍未完成。
- [~] 已强化 MySQL 迁移故障断言与三条历史索引检查,避免把意外错误当成预期故障。此前 5.7 的 Error 1280 与服务端索引元数据不一致仍未关闭;重复测试未再复现不等于根因修复。
- [ ] 继续定位 MySQL 初始化与测试进程资源失败,复核旧索引异常;完成最终依赖选择、最终版本回归及其他专项文档同步后再提交修复候选。
- [ ] 成员管理 Web/API、分页、失败请求审计、全部业务入口资源判权和排队任务重新判权尚未接入;PostgreSQL 当前实库、Linux 原生验证及生产门禁仍未完成。
最新证据目录:`artifacts/runtime-migration-20260928/`。本次没有浏览器测试、SSH 或生产部署,没有清理业务库。P0-05、P0-06、P0-07、P1-09 总项继续保持 `[~]`。以下 12:48 记录为修复前历史,不代表当前候选的完整后端仍然失败。
### 历史进度:项目成员变更事务审计(12:48 核对)
- [x] 已实现成功授予/撤销项目角色与审计同事务提交;审计失败或未实际写入时回滚成员变更,保留实时操作者判权。MySQL 检查成员表与审计表均为 InnoDB,不自动修改历史库引擎。实现完成待复审,不代表全库兼容性验证通过。
- [x] 已补充正常变更、拒绝操作、审计故障回滚、自我撤权、历史保留、取消上下文、存储边界及并发重复变更测试。最新仓储专项 `targeted-verified.jsonl`:41 个叶子通过、0 失败、3 项条件跳过;跳过项不计通过。
- [x] 最新三次竞态专项 `race-verified.jsonl`:累计 123 个叶子通过、0 失败、9 项条件跳过;随后 `go vet ./...`、`go mod verify` 成功,顺序进程退出码为 0。
- [!] MySQL 5.7 最新专项 `mysql57-verified.jsonl`:176 个叶子通过、1 个失败、0 跳过(包含 SQLite 用例)。失败为 `TestHistoryScopeMySQLMigrationRetry/version`,错误为索引 `idx_audit_project_history` 的 Error 1280;进程退出码为 1,后续 MySQL 8.0 最新验证未启动。根因未确认,不能使用早期日志代替最后修复后的双版本验证。
- [!] 本批中间版本完整后端 `backend.jsonl`:1630 个叶子通过、1 个失败、52 项条件跳过。失败为服务关闭后 SQLite 文件仍被占用;最新独立重复日志 `service-close-repeat.jsonl` 共 10 次,8 次通过、2 次失败,退出码为 1。该前置步骤失败后未执行最新完整回归,不能声称当前源码完整后端已通过;测试名称含 Desktop 不构成跳过公共运行时资源释放问题的理由。
- [ ] 成员管理 Web/API、分页、失败请求审计、全部业务入口资源判权和排队任务重新判权尚未接入;PostgreSQL 当前实库、Linux 原生验证及生产门禁仍未完成。
本批证据目录为 `artifacts/project-member-audit-20260928/`,保留初始失败和中间日志。P0-05、P0-06、P0-07、P1-09 总项继续保持 `[~]`。本次只同步文档,不修改源码、不清库、不执行远端部署;以下旧批次的通过数字仅作历史证据。
### 历史进度:项目成员与实时判权批次
- [x] 第 14 号迁移及六类项目角色已实现;授予/撤销在单条数据库语句内核对操作者,判权每次读取实际账户状态和当前成员关系。用户分组、普通管理员身份及默认项目均不隐式授予权限。
- [x] 两项目、多角色、撤权、账户停用和降权、普通账户私钥限制、成员引用及 SQLite 替换边界通过专项回归;MySQL 双版本与 Windows 独立程序升级/成员备份恢复通过。详细数字和证据见支持矩阵第二十一节。
- [x] 空邮箱误拦截修复后重新验证:完整后端 1623 个叶子通过、51 项条件跳过;三次竞态共 633 个叶子通过、18 项条件跳过;MySQL 双版本专项各 242 个叶子通过(包含 SQLite 用例),静态检查和模块校验通过。最新证据为 `*-verified.jsonl`,没有执行生产部署或清库。
- [ ] 成员管理界面/接口、变更审计、全部业务入口资源判权和排队任务重新判权尚未接入;剩余资源关联、PostgreSQL 当前实库、Linux 原生与生产门禁继续实施。
本批交付的是成员与判权基础,不等于 Web/API 已完成项目隔离。P0-05、P0-06、P0-07 仍为 `[~]`,原始 44 项与验收标准保持不变。下方为历史批次证据。
### 历史进度:任务/审计关联批次
- [x] 已提交:域名、服务器项目归属及同项目绑定约束(模式 11);SQLite 替换操作引用保护(模式 12)。已验证范围见执行清单和支持矩阵第十九节。
- [x] P0-06 本批子项:模式 13、任务/审计项目/系统/未知范围快照、任务与操作者关联、历史保留均已实现并通过本批回归,等待复审。登录错记身份及会话失效后漏记审计也已复现修复。
- [x] 完整后端 1514 个叶子通过,0 失败、49 项条件跳过;三次竞态共 258 个叶子通过;MySQL 双版本专项各 135 个叶子通过且无跳过(包含 SQLite 用例);独立 Windows 产品程序两条历史升级/备份恢复路径通过。精确命令和限制见支持矩阵第二十节。
- [ ] 剩余资源项目关联、项目成员权限、跨项目 Web/API 越权验证及生产部署验收仍未完成。
P0-05、P0-06、P0-07 总项均保持 `[~]`;本批字段与范围校验不等于项目授权完成。原始 44 项及其验收标准不缩减。最新细项见《Scert整改任务执行清单.md》首节;以下旧批次进度只作历史记录,不代表当前实现。
### 历史进度(按批次保留)
> 当前进度(2026 年 9 月 28 日):源码 `7284958` 已完成域名、服务器的四项归属字段、三库第 11 号迁移及同项目部署绑定约束;不是只有项目根实体。下方项目根实体段落属于上一批历史记录。复核进一步复现 SQLite 替换冲突可绕过引用保护,已由 `92c844f` 新增第 12 号迁移修复并通过本批回归,不能只修改旧迁移使已升级库漏修。最新状态见执行清单与支持矩阵第十九节。任务、审计等剩余资源关联、成员权限及生产验收未完成,P0-06/P0-07 均保持 `[~]`,全部 44 项范围不变。
> 本批最终验证补充:项目根实体已通过 SQLite 专项、MySQL 5.7/8.0 实库、3 次竞态检测及完整后端回归;默认和普通项目也已进入独立 Windows 程序的备份恢复验证。下方“待汇总”为启动阶段快照,最新证据以执行清单的“项目根实体最终验证结果”及支持矩阵第十八节为准。项目资源归属、关联约束和权限隔离仍未实现,P0-06/P0-07 保持 `[~]`。
> 2026 年 9 月 28 日补充进度:P0-06 已进入项目根实体实施,新增项目模型、三库第 10 号迁移及仓储,本地专项通过;完整后端与 MySQL 隔离测试待汇总。当前资源尚未增加项目归属,不代表 P0-07 权限隔离完成。详细需求、后续关联和删除约束见《项目资源关联模型.md》,实际验证见《Scert整改任务执行清单.md》。全部 44 项原始要求及各项验收标准不变。
> 适用项目:`D:\Desktop\Scert`
> 产品基准:Certimate + Certd
> 产品范围:Web 管理页面 + Windows/Linux 服务端
> 明确排除:Wails 桌面版
> 整改日期:2026 年 9 月 27 日
> 进度同步:2026 年 9 月 28 日 12:48。最新批次事实与阻塞见本文件顶部及《Scert整改任务执行清单.md》首节;历史批次记录不代表当前验证结果。本文件的需求和验收标准不因状态更新而缩减,四份分级任务规格中的总项状态不变;`[~]` 仅表示已有实现或正在整改,不表示整项完成。
> 当前专项:P0-05 已修复 SQLite 历史模式 1~3 存在任务数据时迁移 4 失败的问题,并验证模式 1~9 的带数据升级、依赖对象保留及失败回滚重试。源码 `fd2810b` 的 SQLite 专项通过 71 个叶子用例,27 个升级/恢复用例连续 3 次竞态检测通过;干净提交构建的独立 Windows 程序完成历史模式备份、升级及恢复后再升级,证据见支持矩阵第十七节。此前 WAL 恢复证据保留在第十六节。旧发行包真实数据迁移、完整发行包安装、真实服务重启、Linux 原生执行、取消边界及其余数据库和生产门禁仍待完成;P0-05 保持 `[~]`,全部 44 项范围不变。
---
## 一、整改目标
将 Scert 整改为一个具备以下能力的 Web 化 SSL 证书运维平台:
1. 证书申请、导入、续期、部署、回滚统一管理。
2. 支持 ACME、Let’s Encrypt、DNS-01、泛域名和 SAN 证书。
3. 支持 DNS 账户、CNAME 委派和 DNS 验证记录管理。
4. 支持多服务器、多部署目标和远程证书部署。
5. 支持任务调度、失败重试、任务日志和执行历史。
6. 支持通知、审计、监控、备份和恢复。
7. 支持用户、角色、项目和资源级权限隔离。
8. 支持 Windows Service 和 Linux systemd 部署。
9. 所有敏感凭据、SSH 主机身份和证书私钥均具备安全保护。
10. 所有生产能力都有独立的实机验收证据。
---
## 二、范围确认清单
| 编号 | 项目 | 状态 | 处理方式 |
|---|---|---:|---|
| S-001 | Web 管理页面 | [x] 已确定 | 保留并完善 |
| S-002 | Windows 服务端 | [x] 已确定 | 保留并进行实机验收 |
| S-003 | Linux 服务端 | [x] 已确定 | 保留并进行 systemd 验收 |
| S-004 | Wails 桌面版 | [ ] 未开始 | 从正式目标中移除,暂不开发 |
| S-005 | CLI 工具 | [ ] 未开始 | 作为可选运维工具保留 |
| S-006 | Certimate 能力 | [x] 已确定 | 重点吸收证书自动化、DNS 和部署能力 |
| S-007 | Certd 能力 | [x] 已确定 | 重点吸收 Web 控制台、任务、通知、审计和监控能力 |
---
## 三、状态标记
```text
[ ] 未开始
[~] 进行中
[x] 已完成,等待复审
[✓] 复审通过
[!] 暂缓或存在阻塞
```
说明:
- 自动化测试通过只能标记为 `[x]`。
- 真实远程部署、DNS、HTTPS、备份恢复通过后,才能标记为 `[✓]`。
- 构建成功、接口返回 HTTP 200、单元测试通过,不等同于生产验收通过。
---
# 四、P0:基础整改和阻塞项
## P0-01 明确产品范围
**状态:** `[x] 已完成,等待复审`
### 整改内容
- 从正式开发目标中移除 Wails 桌面版。
- 将桌面窗口、桌面托盘、桌面端自动更新、桌面端配置管理和桌面端 UI 测试标记为范围外。
- 保留 CLI,但明确 CLI 只用于初始化、运维诊断、数据库迁移、备份恢复、服务安装和卸载。
### 验收标准
- 任务清单中不再将桌面版作为正式交付目标。
- Web 和服务端成为唯一正式交付范围。
- 发布文档、测试文档和安装文档范围一致。
## P0-02 整理项目任务清单
**状态:** `[x] 已完成,等待复审`
将现有任务拆分为:需求确认、代码实现、自动化测试、隔离环境测试、生产部署测试、最终验收。
每项任务至少增加:
```text
任务编号
任务名称
优先级
当前状态
问题说明
涉及文件
依赖任务
整改内容
验证命令
实机验收步骤
验收证据
复审结果
```
相关文档:
```text
doc/Scert开发任务清单.md
doc/全面审查测试与优化记录.md
doc/发布加固与实机验收记录.md
doc/生产部署与运维说明.md
```
## P0-03 整理源码、构建产物和部署产物
**状态:** `[✓] 复审通过`(2026-09-30 20:53,仅本项源码与产物边界)
**复审证据:** 当前部署源码独立克隆、正式 Linux 发布构建、发布模块完整回归、23 项 manifest 校验、22 个包内文件检查、构建后干净索引,以及远端实际发布包全部 SHA256SUMS 核对通过。详见《Linux生产流程测试记录》同日 20:53 章节。未删除既有文件;后续构建可重复性和生产功能门禁仍单独执行。下段旧位置说明为历史记录。
**位置说明:** 本项不是当前开发卡点。当前主线已转到 P0-07 的业务资源写入授权;保留 `[x]` 是因为整项还需最终复审,不表示后续任务未开始。
建立明确目录边界:
```text
backend/ 后端源码
frontend/ 前端源码
deploy/ 部署脚本
doc/ 项目文档
tests/ 测试代码
scripts/ 开发辅助脚本
release/ 发布包
artifacts/ 测试证据
```
以下内容不得进入正式源码提交:
```text
.runtime/
.deploy-stage/
dist/
*.exe
*.tar.gz
临时补丁文件
浏览器运行缓存
数据库文件
真实证书私钥
真实凭据
远程部署临时文件
```
### 验收标准
- 源码、测试产物、部署产物和生产证据分离。
- `.gitignore` 覆盖构建、运行、数据库和敏感文件。
- 不删除现有文件,只进行归类、忽略或迁移。
## P0-04 统一开发和构建版本
**状态:** `[~] 进行中`
**最新进度(2026-09-30 21:07):** 规范源码 9e89eda 已完成正式双目标构建、实际压缩包与清单核对、后端全量测试和静态检查、前端 237 项测试;构建前后换行及依赖输入检查通过,工作区无变化。该证据覆盖 Windows 构建机上的双目标产物,不覆盖 Linux 原生构建、双平台服务和三数据库生产流程,整项不提前关闭。
**本轮补充(2026-09-28 20:15):** 干净提交 `5f9af32` 已经通过 Windows 正式发布构建;本机核对发布清单、压缩包内容及运行副本一致,并实际启动主程序与 Web。证据见支持矩阵第二十五节;没有执行 Windows 服务安装、Linux 正式包原生运行或生产门禁,不能升级整项状态。
**最新进度(2026-09-28):** SQLite 依赖已固定为 v1.59.0/libc v1.75.7,运行时引擎 3.53.4;最终候选完整后端、模块校验及双平台构建通过。最终竞态与完整发行门禁按首节及支持矩阵第二十二节记录,不沿用中间驱动结果放行。
统一记录并固定以下版本:
```text
Go 版本
Node.js 版本
npm 版本
Vue 版本
数据库驱动版本
Go 依赖版本
操作系统版本
编译目标
```
验证命令:
```powershell
go test ./...
go vet ./...
npm.cmd test
npm.cmd run build
```
## P0-05 确认数据库正式支持矩阵
**状态:** `[~] 进行中`
**最新进度(2026-09-28):** 三库代码迁移已至模式 14;最后源码 SQLite 取消查询/WAL 专项、Windows 独立程序备份升级恢复通过,MySQL 5.7/8.0 成员与历史范围组合各三轮通过。旧 MySQL 索引异常根因仍未关闭,PostgreSQL 当前实库、Linux 原生及三库完整生产路径未验收;不能据局部通过升级总项状态。
项目当前涉及 SQLite、MySQL、PostgreSQL,需要明确正式支持范围。
建议定位:
| 数据库 | 定位 |
|---|---|
| SQLite | 单机、开发、轻量部署 |
| MySQL | 正式生产支持,需确认版本 |
| PostgreSQL | 正式生产支持,需确认版本 |
### 整改内容
- 统一三种数据库的迁移脚本。
- 检查字段类型、索引、默认值和事务行为。
- 验证 MySQL 5.7/8.0 兼容性。
- 验证 PostgreSQL 版本兼容性。
- 验证 SQLite 并发和锁行为。
- 为每种数据库提供初始化、升级、回滚和备份恢复流程。
重点目录:
```text
backend/internal/database/
backend/internal/database/migrations/mysql/
backend/internal/database/migrations/postgres/
backend/internal/database/migrations/sqlite/
```
## P0-06 建立统一领域模型
**状态:** `[~] 进行中`
**本轮补充(2026-09-28):** 生命周期仓储、成功事务审计、默认项目与引用保护及前端操作已实现,收尾候选已在 `709c1ef`。模式仍为 14;域名与服务器沿用联合主键的多对多关系,新增共享绑定、去重、局部清空和路径冲突保护源码及回归用例。先开发后统一测试,不能以历史局部结果关闭本项。
**最新进度(2026-09-28):** 已实现域名/服务器项目归属、同项目绑定、任务/审计范围快照与项目成员关系;成员成功变更和审计共用事务。并非下列全部核心实体均已交付;剩余资源关联与业务调用链仍需补齐,具体模型见《项目资源关联模型》第七至九节。
建议统一核心实体:
```text
users 用户
roles 角色
projects 项目
domains 域名
certificates 证书
certificate_versions 证书版本
certificate_orders 证书申请订单
dns_accounts DNS 账户
dns_delegations CNAME 委派
servers 服务器
deployment_targets 部署目标
deployment_records 部署记录
tasks 任务
task_attempts 任务执行记录
renewal_policies 续期策略
notification_channels 通知渠道
notification_records 通知记录
audit_logs 审计日志
backup_records 备份记录
```
### 验收标准
- 证书、任务、部署、通知和审计不再各自孤立。
- 所有核心资源可以关联到项目。
- 所有异步操作可以关联到任务和任务执行记录。
- 所有危险操作可以关联到审计日志。
## P0-07 增加项目级权限和资源隔离
**状态:** `[~] 进行中`
**当前子任务(2026-09-28 22:08):** 多对多表单重试、项目候选筛选及读取失败保护已提交 `6c0ae31`,回归源码待统一运行。当前开始域名新增/修改/删除的路由、实时授权、事务审计及任务引用保护整改;此子项仅完成源码核对,业务修改尚未开始,不提前记为完成。
**本轮补充(2026-09-28):** 项目生命周期前后端、七个资源 GET 的读取隔离,以及域名绑定 PUT 的实时授权、失败审计和成功事务审计已有源码实现;缺依赖拒绝服务,不回退全量或未授权仓储。多对多仍要求同项目,不因共用服务器扩大授权。生命周期收尾、读取隔离及本轮绑定代码尚未统一测试,其他资源写入和任务权限链未闭环,P0-07 保持进行中。
**本轮补充(2026-09-28 20:15):** 正式包已进入浏览器的首次初始化入口,未认证及无效令牌拒绝路径已验证;工具文件访问范围阻止传入本机一次性地址,尚未取得初始化会话,因此成员页面、角色操作和布局都未进行真实浏览器验收。详见本文件顶部与支持矩阵第二十五节,不以启动页面代替项目权限验收。
**历史进度(2026-09-28 19:54):** 成员及可见项目入口当时的前端 198 项通过,后端专项 83 个叶子通过、4 条条件跳过,完整后端 1700 个叶子通过、54 条条件跳过;双版本 MySQL 三轮组合各 195 个叶子通过,三轮专项竞态 249 个叶子通过、12 条条件跳过,静态检查与双平台构建通过。证据见第二十四节,仅适用于该批候选,不覆盖此后的生命周期收尾、读取隔离和多对多修改。
建议角色:
```text
项目管理员
证书管理员
部署管理员
DNS 管理员
审计查看者
只读用户
系统管理员
```
每个资源至少增加:
```text
project_id
owner_id
created_by
updated_by
```
必须防止:
- 用户查看其他项目证书。
- 用户查看其他项目服务器。
- 用户操作其他项目部署目标。
- 用户读取其他项目 DNS 凭据。
- 普通用户查看完整私钥。
- 普通用户删除或回滚其他项目资源。
## P0-08 完善凭据和主密钥生命周期
**状态:** `[~] 进行中`
统一管理 DNS API 凭据、SSH 私钥、SMTP 凭据、HTTP 通知密钥、数据库密码、ACME 账户信息和证书私钥。
增加以下能力:
```text
凭据创建
凭据验证
凭据禁用
凭据轮换
凭据删除
凭据引用检查
主密钥变更
主密钥备份
主密钥恢复
```
### 安全要求
- 页面不能返回完整敏感凭据。
- 日志中不得打印私钥、Token、密码。
- 删除凭据前必须检查引用关系。
- 主密钥丢失时必须明确不可恢复或恢复流程。
- 证书私钥必须进入受保护存储。
## P0-09 强化 SSH 主机身份验证
**状态:** `[~] 进行中`
- 保存 SSH 主机指纹。
- 首次连接要求确认指纹。
- 指纹变化时阻断部署。
- 支持人工更新可信指纹。
- 禁止跳过主机校验。
- 部署失败时记录主机、端口、用户和指纹摘要,但不得记录私钥。
必须阻断:
```text
首次连接未确认指纹
远端主机指纹变化
目标主机与保存指纹不匹配
部署凭据失效
```
## P0-10 统一任务、部署和回滚事务模型
**状态:** `[~] 进行中`
**最新实机进度(2026-10-04 01:04):** 正式包 `e00a757` 已运行第一台;人工回滚、独立不确定核查与断连查询已通过。不同证书版本恢复、重载阶段崩溃后双目标自动回滚、原任务正式重试及失败历史保留本批通过。第二台仅验证证书推送与站点生效。下方“尚未正式部署”“自动恢复仍未完成”等为历史记录,不代表当前子项状态;无可信基线旧事务和剩余业务矩阵仍未关闭,整项保持进行中。
**恢复安全更新(2026-10-02 13:30):** 已复现并修复先改文件后验锁、未知归属锁清理及已验证阶段部分解锁无法重入的问题;补齐认证前身份核验和整组备份预检。三包原生 Linux 回归、go vet 和新用例重复二十次通过;竞争检测因缺少 gcc 未运行成功,修复尚未正式部署。上传碰撞与事务日志的组合仍需核查,历史缺证据事务继续保留,不能标记整项通过。
**中断恢复实测(2026-09-30 22:35):** 真实部署校验中强制终止主进程,systemd 自动重启,任务、尝试及审计正确标记中断失败;远端锁和事务旧文件保留,直接重试被拒绝。人工核查并隔离现场后可通过产品重新部署。已开发固定阶段诊断和先核查后重试提示,专项通过但未部署;远端崩溃事务自动恢复仍未完成,不能标记整项通过。
**最新整改(2026-09-30):** 已复现并修复后置 HTTPS 校验接受旧有效证书、校验失败仍返回成功部署报告的问题;身份来自实际待部署文件。报告以 verification_status 单独记录站点生效校验,整体失败不改写单台真实文件推送事实;任务、尝试和接口保持失败,页面不再汇总为完成。本批本地测试不等于实机恢复通过;该校验仍位于文件部署事务之后,不具备据此宣称自动回滚的依据。
所有长耗时操作统一进入任务中心:
```text
证书申请
证书续期
DNS 验证
证书部署
批量部署
远程备份
证书回滚
证书恢复
```
任务状态统一为:
```text
待执行
执行中
成功
失败
取消中
已取消
等待重试
部分成功
```
每个任务需要包含任务 ID、任务类型、创建人、所属项目、开始时间、结束时间、当前步骤、执行日志、错误原因、重试次数和关联资源。
## P0-11 建立生产验收门禁
**状态:** `[!] 暂缓或存在阻塞`
生产验收必须拆分为:
1. 本地单元测试。
2. 隔离环境测试。
3. 数据库兼容测试。
4. 真实 DNS 测试。
5. 真实 ACME Staging 测试。
6. 真实 ACME Production 测试。
7. 真实远程 SSH/SFTP 测试。
8. 真实 HTTPS/SNI 测试。
9. Windows Service 测试。
10. Linux systemd 测试。
11. 备份恢复测试。
12. 升级回滚测试。
不能使用以下方式代替生产验收:
```text
-k
--insecure
强制 IP TLS
跳过 SSH 主机身份验证
仅使用 HTTP 200
仅使用构建成功
仅使用单元测试通过
```
## P0-12 完成备份和恢复方案
**状态:** `[~] 进行中`
### 需要备份
```text
数据库
证书元数据
证书版本
证书私钥
DNS 账户配置
服务器配置
任务配置
通知配置
主密钥配置
```
### 需要支持
```text
手动备份
自动备份
备份列表
备份校验
备份下载
备份恢复
恢复前确认
恢复失败回滚
恢复审计
```
---
# 五、P1:Certimate + Certd 核心产品能力
## P1-01 建设统一证书中心
**状态:** `[~] 进行中`
页面建议:
```text
frontend/src/views/Certificates/
├── Certificates.vue
├── Certificates.js
├── Certificates.css
├── CertificateDetail.vue
├── CertificateDetail.js
├── CertificateDetail.css
└── components/
```
### 功能要求
- 证书列表。
- 按域名、项目、状态、到期时间筛选。
- 显示证书状态和剩余有效期。
- 查看证书链和 SAN 域名。
- 查看签发机构。
- 查看证书版本。
- 手动续期。
- 手动部署。
- 回滚版本。
- 导入已有证书。
- 删除无引用证书。
## P1-02 完善证书详情和版本管理
**状态:** `[~] 进行中`
**2026年10月2日核对:** 当前文件存储只列出当前版本,真实恢复实现直接拒绝历史恢复,前端也未形成完整历史版本操作链;模拟工作流的恢复测试不代表此功能已经实现。保持本项未完成,不删除原始需求。
证书详情至少包含:
```text
证书名称
主域名
SAN 域名
所属项目
签发机构
签发时间
到期时间
剩余天数
证书状态
申请方式
DNS 验证方式
当前版本
历史版本
部署状态
关联任务
关联服务器
```
证书状态建议:
```text
待申请
申请中
有效
即将到期
已过期
申请失败
部署失败
已吊销
已禁用
```
## P1-03 完善 ACME 和 DNS 管理
**状态:** `[~] 进行中`
支持:
- Let’s Encrypt Production。
- Let’s Encrypt Staging。
- DNS-01。
- HTTP-01。
- 单域名。
- 泛域名。
- SAN 证书。
- 多 DNS Provider。
- DNS 账户验证。
- DNS 账户禁用和轮换。
- CNAME 委派。
- TXT 记录添加、读取和清理。
页面建议:
```text
frontend/src/views/DNSAccounts/
frontend/src/views/DNSDelegations/
```
## P1-04 建设任务中心
**状态:** `[~] 进行中`
页面建议:
```text
frontend/src/views/Tasks/
├── Tasks.vue
├── Tasks.js
├── Tasks.css
├── TaskDetail.vue
├── TaskDetail.js
├── TaskDetail.css
└── components/
```
功能要求:
- 任务列表和任务详情。
- 实时查看任务进度。
- 查看任务日志和执行步骤。
- 失败重试。
- 取消任务。
- 查看历史任务。
- 按项目、类型、状态筛选。
- 查看关联证书、服务器和部署记录。
## P1-05 统一续期策略
**状态:** `[~] 进行中`
**2026年10月2日21:30 子项进度:** 手动全局检查已后台化,保留管理与业务原续期调度及取消语义;新增系统任务权限隔离、幂等和真实摘要,前端回归及构建、原生 Linux 全后端与静态检查、相关专项二十次重复均通过,等待部署复审。此子项不代表固定日期、标签、项目、证书类型等全部策略均已实现,整项继续进行中。
续期策略支持:
```text
按剩余天数续期
按固定日期续期
按证书标签续期
按项目续期
按证书类型续期
续期失败自动重试
续期成功自动部署
续期后自动通知
```
必须防止:
- 同一个证书重复申请。
- 同一个证书并发续期。
- 续期任务重复部署。
- 失败后无限重试。
- 续期成功但部署状态未更新。
## P1-06 建设服务器和部署目标中心
**状态:** `[~] 进行中`
页面建议:
```text
frontend/src/views/Servers/
├── Servers.vue
├── Servers.js
├── Servers.css
├── ServerDetail.vue
├── ServerDetail.js
├── ServerDetail.css
└── components/
```
功能要求:
- 服务器列表。
- SSH 连接测试。
- 主机指纹管理。
- 服务器标签。
- 所属项目。
- 服务器分组。
- 部署路径配置。
- reload 命令配置。
- 部署后健康检查。
- 服务器启用和禁用。
## P1-07 建设多服务器部署策略
**状态:** `[~] 进行中`
支持:
```text
单服务器部署
多服务器并行部署
多服务器串行部署
按标签批量部署
部署失败停止
部署失败继续
失败后自动回滚
部分成功状态
部署后 HTTPS 检查
部署前备份
```
部署事务建议:
```text
准备阶段
连接验证
远程备份
上传临时文件
权限校验
原子替换
执行 reload
HTTPS 验证
标记成功
失败回滚
```
## P1-08 建设通知中心
**状态:** `[~] 进行中`
页面建议:
```text
frontend/src/views/Notifications/
├── Notifications.vue
├── Notifications.js
├── Notifications.css
├── NotificationChannel.vue
└── components/
```
支持 HTTP Webhook、SMTP 邮件,以及任务成功、任务失败、证书即将过期、证书已过期、部署失败、服务异常和备份失败通知。
要求:
- 通知渠道可测试。
- 通知失败可重试。
- 通知内容不得包含私钥和敏感凭据。
- 通知发送记录可审计。
## P1-09 建设审计中心
**状态:** `[~] 进行中`
**最新进度(2026-09-28):** 已增加任务/项目范围和实际操作者快照,成员成功授予/撤销与审计同事务,审计失败回滚成员变化;失败请求审计、完整接口接入及本节列出的全部危险操作覆盖仍未完成。不能把成功审计专项通过标为整个审计中心完成。
页面建议:
```text
frontend/src/views/AuditLogs/
├── AuditLogs.vue
├── AuditLogs.js
└── AuditLogs.css
```
必须记录:
```text
登录、退出、密码修改
用户创建、用户删除、角色变化
项目变化
证书申请、证书导入、证书删除、证书回滚
部署、回滚
凭据创建、修改、删除
服务器指纹变化
备份、恢复
系统设置修改
```
审计字段:
```text
操作人
操作时间
操作类型
资源类型
资源 ID
项目 ID
客户端 IP
操作结果
失败原因
请求追踪 ID
```
## P1-10 建设证书监控仪表盘
**状态:** `[ ] 未开始`
Dashboard 展示:
```text
证书总数
有效证书
即将过期证书
已过期证书
申请失败证书
部署失败证书
今日任务数
失败任务数
服务器数量
异常服务器数量
最近审计事件
最近通知事件
```
到期时间建议:
```text
超过 30 天:正常
7 至 30 天:提醒
1 至 7 天:警告
已过期:严重
```
## P1-11 建设备份恢复页面
**状态:** `[~] 进行中`
页面建议:
```text
frontend/src/views/Backups/
├── Backups.vue
├── Backups.js
├── Backups.css
└── RestoreDialog/
```
高风险操作必须:
- 二次确认。
- 输入确认文字。
- 显示影响范围。
- 恢复前自动备份。
- 恢复过程进入任务中心。
- 恢复结果写入审计日志。
- 恢复失败自动回滚。
## P1-12 统一 API 契约和权限矩阵
**状态:** `[~] 进行中`
整理所有接口:
```text
接口路径
请求方法
是否需要登录
允许角色
项目权限
资源权限
是否写审计日志
是否需要幂等键
是否可能返回敏感信息
错误码
```
重点文件:
```text
backend/internal/httpapi/server.go
backend/internal/httpapi/middleware.go
backend/internal/httpapi/auth.go
backend/internal/httpapi/certificate_api.go
backend/internal/httpapi/task_api.go
backend/internal/httpapi/renewal_api.go
backend/internal/httpapi/users_api.go
backend/internal/httpapi/user_groups.go
backend/internal/httpapi/settings_api.go
backend/internal/httpapi/ssh_key.go
```
---
# 六、P2:Web 体验和运维优化
## P2-01 统一 Web 页面结构
**状态:** `[~] 进行中`
建议目录:
```text
frontend/src/views/
├── Dashboard/
├── Certificates/
├── Tasks/
├── DNSAccounts/
├── DNSDelegations/
├── Servers/
├── Notifications/
├── AuditLogs/
├── Backups/
├── UserManagement/
├── Settings/
├── SetupWizard/
└── Login/
```
每个页面建议拆分为页面 `.vue`、`.js`、`.css` 和 `components/`。
## P2-02 统一中文显示和错误信息
**状态:** `[~] 进行中`
- 不允许出现 HTML 实体编码。
- 不允许出现英文状态值直接展示。
- 不允许出现空白错误提示。
- 不允许把后端堆栈直接展示给用户。
- 所有危险操作使用中文确认提示。
- 所有任务状态使用统一中文文案。
例如:
```text
pending 待执行
running 执行中
success 成功
failed 失败
retrying 等待重试
cancelled 已取消
```
## P2-03 所有长操作任务化
**状态:** `[~] 进行中`
**2026年10月2日21:30 子项进度:** 申请、当前证书部署、申请/部署重试、生产证书导入及本地证书校验已接入 HTTP 异步任务;导入具有上传生命周期和保存标志,校验具有独立元数据及最近尝试详情,均复核执行前权限。手动全局续期本批已实现,前后端自动回归、构建及相关专项二十次重复通过。尚未统一生产部署;历史恢复及其余列出的长操作不因本批推进而关闭,整项继续进行中。
以下操作不能长期阻塞 HTTP 请求:
```text
证书申请
证书续期
DNS 验证
批量部署
远程备份
数据库恢复
批量删除
批量导入
```
统一返回 `task_id`,前端通过任务详情或轮询查看状态。
## P2-04 增加幂等和重复操作保护
**状态:** `[~] 进行中`
增加:
```text
幂等键
操作锁
任务去重
证书申请锁
部署锁
恢复锁
重复提交检测
```
重点防止重复申请、重复部署、刷新页面重复提交、定时任务重复续期和多实例并发处理同一证书。
## P2-05 完善日志、指标和追踪
**状态:** `[~] 进行中`
日志增加请求 ID、任务 ID、用户 ID、项目 ID,并对敏感字段脱敏。
建议指标:
```text
证书申请成功率
证书续期成功率
部署成功率
任务失败率
任务执行耗时
DNS 验证耗时
远程连接失败次数
通知失败次数
数据库错误次数
```
## P2-06 完善接口和前端测试
**状态:** `[~] 进行中`
后端验证:
```powershell
go test ./...
go vet ./...
```
前端验证:
```powershell
npm.cmd test
npm.cmd run build
```
补充权限、越权、证书流程、重复提交、部署回滚、数据库迁移、凭据脱敏、登录、初始化向导、任务查询、部署确认、错误重试和权限显示测试。
## P2-07 完善升级、降级和卸载流程
**状态:** `[~] 进行中`
需要提供:
```text
升级前备份
数据库迁移
配置迁移
静态文件升级
服务重启
升级失败回滚
版本检查
卸载确认
卸载保留数据
卸载删除数据
```
## P2-08 完成 Windows Service 实机验收
**状态:** `[!] 暂缓或存在阻塞`
验证安装、启动、停止、重启、开机启动、异常恢复、日志目录、配置目录、数据目录、卸载和升级。
相关文件:
```text
deploy/install-windows.ps1
```
## P2-09 完成 Linux systemd 实机验收
**状态:** `[!] 暂缓或存在阻塞`
验证安装、启动、停止、重启、开机启动、异常恢复、运行用户、日志输出、配置目录、数据目录、升级和卸载。
相关文件:
```text
deploy/install-linux.sh
deploy/systemd/
```
## P2-10 完善安全基线
**状态:** `[~] 进行中`
检查:
- 默认账户是否必须修改密码。
- 默认密码是否禁止继续使用。
- 登录失败是否限流。
- 会话是否支持失效。
- 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 | 移动端适配 | [ ] 未开始 |
---
# 八、推荐整改顺序
## 第一阶段:基础和安全
```text
P0-01 产品范围
P0-02 任务清单
P0-03 工作区整理
P0-04 版本统一
P0-05 数据库支持矩阵
P0-06 领域模型
P0-07 权限隔离
P0-08 凭据生命周期
P0-09 SSH 指纹
P0-10 任务事务模型
```
## 第二阶段:核心业务
```text
P1-01 证书中心
P1-02 证书详情
P1-03 DNS 管理
P1-04 任务中心
P1-05 续期策略
P1-06 服务器中心
P1-07 多服务器部署
P1-08 通知中心
P1-09 审计中心
```
## 第三阶段:运维和验收
```text
P1-10 监控仪表盘
P1-11 备份恢复
P1-12 API 权限矩阵
P2-03 长操作任务化
P2-04 幂等保护
P2-05 可观测性
P2-07 升级回滚
P2-08 Windows Service 验收
P2-09 Linux systemd 验收
P0-11 生产验收门禁
```
---
# 九、第一版完成标准
以下条件全部满足,才能认为 Scert 第一版整改完成:
```text
[ ] Web 页面覆盖证书、任务、服务器、DNS、通知、审计和备份
[ ] Wails 桌面版不再作为正式交付目标
[ ] 证书申请、续期、部署、回滚均进入任务中心
[ ] 证书、任务、部署和审计可以相互关联
[ ] 资源具备项目级权限隔离
[ ] DNS、SSH、SMTP 等凭据安全存储
[ ] SSH 主机指纹得到验证
[ ] 证书部署失败可以回滚
[ ] 任务支持失败重试和重复提交保护
[ ] 数据库迁移在正式支持数据库上通过
[ ] 备份和恢复在隔离环境通过
[ ] Windows Service 实机通过
[ ] Linux systemd 实机通过
[ ] HTTPS、SNI 和证书链验证通过
[ ] 真实 DNS 和 ACME 流程通过
[ ] 所有危险操作写入审计日志
[ ] 所有敏感信息不会出现在日志和页面中
[ ] 自动化测试通过
[ ] 生产验收证据完整
```
---
## 十、执行约束
1. 未经授权不删除现有文件。
2. 不将真实密钥、证书私钥、Token 和密码提交到 Git。
3. 不使用 `-k`、`--insecure`、强制 IP TLS 或跳过 SSH 主机身份验证。
4. 每次修改前先检查当前分支、工作区和未提交变更。
5. 每完成一个任务,补充验证命令和验收证据。
6. 代码标识符使用英文,界面、注释、文档和用户提示使用中文。
7. 每次测试区分本地、隔离环境、测试环境和生产验收结果。
## 本轮开发进度(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?????** ?????????????????????????????????????????????????
- P0-07 ????????SSH?DNS??????????????????????????????????????? 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 完成待复审**。
- `[x]` DNS 账户项目归属已加入配置、接口和管理页面。
- `[x]` DNS 凭据使用和项目归属修改已加入实时项目权限校验。
- `[x]` 无权限修改配置的拒绝回归测试已补齐,确认原配置不被改变。
- `[x]` 后端专项测试、静态检查、前端测试和生产构建通过。
- `[~]` P0-07 其他任务/证书/部署权限链继续开发。
- `[!]` 三数据库、浏览器、远端服务器和生产部署验收仍未开始。
## 本轮开发进度(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] 失败或取消的 certificate_issue 任务已增加手动重试闭环:新增 task.retry 权限和 POST /api/v1/tasks/:id/retry 接口;重试前重新校验项目、证书、部署及 DNS 凭据权限。
- [x] 重试在事务内更新实际操作者、任务状态和尝试编号,创建新的运行中尝试,并复用首次证书申请的执行、错误脱敏和审计流程;并发重复重试仅允许一个请求成功。
- [x] 已补充仓储、HTTP、权限、并发和任务状态回归测试;前端运行概览增加“重试任务”入口,按钮与“取消任务”按状态互斥显示。
- [x] 当前候选验证通过:后端 go test ./...、go vet ./...,前端 230 项测试、前端生产构建和 git diff --check 均通过。
- [x] 本轮提交 35260bc、aa587d3 已提交;本轮最后一次推送成功。
- [~] P0-07 仍为并行开发,任务重试子项完成待复审;三数据库矩阵、浏览器、SSH、远端部署、生产部署和完整权限联动仍未完成。
- [!] 当前总体验收位置仍为 **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] 前端全量测试 231 项通过,后端 `go test ./...` 与 `go vet ./...` 通过,前端生产构建通过。
- [x] 全局系统设置、DNS 在线检查、阿里云 DNS 检查和手动批量续期的超级管理员边界已完成回归;普通管理员只读和拒绝路径已覆盖。
- [x] 本轮测试前提修正已提交 `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-10 任务取消入口)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅补齐任务取消入口与任务状态模型的开发缺口,不代表 P0-10 整项复审通过,也不代表生产部署验收通过。
- [x] 已完成,等待复审:任务取消 HTTP 入口与仓储层状态范围统一,支持 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。
- [x] 已完成,等待复审:新增 `retry_wait`、`cancelling` 任务及任务尝试的取消回归测试,确认任务和当前任务尝试均转为 `cancelled`。
- [x] 已完成,等待复审:管理证书续期和自动续期任务仍由工作流控制,继续拒绝通过通用任务接口直接取消。
- [x] 已完成,等待复审:定向 HTTP 测试、后端全量 `go test ./...`、`go vet ./...` 和 `git diff --check` 均通过。
- [~] 进行中:P0-10 其余任务入口、三数据库实机矩阵、崩溃恢复复核和统一复审仍需继续执行。
- [ ] 未开始:P0-12 备份恢复、最终浏览器清缓存、密码 SSH、远端部署和生产门禁仍未完成。
- [!] 总体验收不得升级:当前仍为 **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-03 完成,待复审**。本轮完成开发阶段的证书任务并发保护、DNS 验证阶段进度记录,以及域名与服务器双向多对多部署关联的回归核验;不代表生产部署验收通过。
- [x] 已完成,等待复审:同一域名的同类活动证书任务增加仓储层并发保护,重复创建返回冲突,避免并发任务绕过入口检查。
- [x] 已完成,等待复审:DNS 凭据权限验证、逐域名验证和证书申请阶段会同步任务阶段及中文进度信息。
- [x] 已完成,等待复审:一个域名可关联多个部署服务器,一个服务器可关联多个域名;关联读取、解除单个关联、项目权限和共享路径冲突已有回归覆盖。
- [x] 已完成,等待复审:后端多对多专项测试通过;前端 231 项测试全部通过,生产构建通过。
- [~] 进行中:P0-10 其余长任务取消、重试、崩溃恢复、实机数据库矩阵和统一复审仍需继续执行。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署和最终生产门禁仍未执行。
- [!] 总体验收不得升级:当前仍为 **P0-03 完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 最新验证摘要(2026-09-29)
总体验收位置继续保持 **P0-03:完成,待复审**。本轮复核域名与服务器双向多对多部署关系,并完成本地自动化回归;不代表生产部署验收通过。
- [x] 已完成,等待复审:后端全量 `go test ./...` 通过。
- [x] 已完成,等待复审:前端 231 项测试全部通过。
- [x] 已完成,等待复审:前端生产构建通过,`git diff --check` 通过。
- [x] 已完成,等待复审:一个域名可关联多个服务器,一个服务器可关联多个域名;关联读取、单个解除、权限边界和共享路径冲突回归用例通过。
- [~] 进行中:三数据库实机矩阵、浏览器清缓存、密码 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 任务取消入口)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅补齐任务取消入口与状态模型的一致性,不代表整项复审通过或生产部署验收通过。
- [x] 已完成,等待复审:任务取消入口支持 `queued`、`running`、`retry_wait`、`cancelling` 四种活动状态。
- [x] 已完成,等待复审:新增 `retry_wait`、`cancelling` 任务及任务尝试取消回归,确认任务和活动尝试均进入 `cancelled`。
- [x] 已完成,等待复审:管理证书续期和自动续期任务仍由工作流控制,通用任务接口继续拒绝直接取消。
- [x] 已完成,等待复审:定向测试、后端全量 `go test ./...`、`go vet ./...` 和 `git diff --check` 均通过。
- [~] 进行中:P0-10 其余任务入口、跨数据库实机矩阵、崩溃恢复复核和统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复、最终浏览器清缓存、密码 SSH、远端部署和生产门禁仍未完成。
- [!] 总体验收不得升级,当前仍为 **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:完成,待复审**;本轮仅补齐证书导入、恢复、校验入口的任务中心回归约束,不代表 P0-10 统一复审或生产部署验收通过。
- [x] 已完成,等待复审:`certificate_import`、`certificate_restore`、`certificate_validate` 入口均验证任务类型、任务尝试和终态审计记录。
- [x] 已完成,等待复审:证书任务工作流在创建任务前拒绝空域名、空任务类型或阶段、零次执行和空执行器,避免无效任务落库。
- [x] 已完成,等待复审:`go test ./internal/app ./internal/httpapi ./internal/repository`、`go vet ./internal/app ./internal/httpapi ./internal/repository` 和 `git diff --check` 均通过;代码提交并推送 `9741721`。
- [~] 进行中:P0-10 其他任务入口、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复及最终生产门禁仍未完成。
- [!] 总体验收不得升级,当前仍为 **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:完成,待复审**;本轮仅修复证书申请任务启动阶段的取消竞态,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:任务执行入口先注册可取消上下文和任务取消回调,取消发生在启动状态更新或启动审计期间时,不再继续调用证书申请执行器。
- [x] 已完成,等待复审:启动取消后的接口返回 HTTP 409,父任务和任务尝试均保持 `cancelled`,不会被后续启动错误覆盖为 `failed`。
- [x] 已完成,等待复审:新增 `TestTaskAPICancellationDuringStartupDoesNotExecuteCertificate` HTTP 回归测试。
- [x] 已完成:`go test ./...`、`go vet ./...`、定向任务测试和 `git diff --check` 均通过;代码提交为 `415d504`。
- [~] 进行中:P0-10 其他任务入口、DNS 验证、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署、真实 DNS/ACME 和最终生产门禁仍未完成。
- [!] 总体验收不得升级:当前仍为 **P0-03:完成,待复审**,没有新增 `[✓]` 复审通过项;`415d504` 推送时遇到 `Authentication failed`,不作为测试失败依据。
## 本轮开发进度(2026-09-30,P0-10 DNS 验证取消与临时凭据回收)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅补齐 DNS 在线验证的请求取消边界,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:DNS 验证开始前检查请求上下文,已取消请求不会调用 DNS 服务商测试器,也不会写入临时凭据。
- [x] 已完成,等待复审:DNS 测试成功但请求在凭据写入后取消时,回收临时凭据且不发布验证令牌,避免遗留可用的临时密钥。
- [x] 已完成:新增两条 DNS 生命周期回归测试;后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过。
- [~] 进行中:P0-10 DNS 清理失败、令牌消费、任务链、跨数据库实机矩阵、崩溃恢复、重试幂等和统一复审仍需继续。
- [ ] 未开始:P0-12 备份恢复、浏览器清缓存、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁仍未完成。
- [!] 总体验收不得升级:仍为 **P0-03:完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 本轮开发进度(2026-09-30,P0-10 DNS 临时凭据清理失败可重试)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅修复 DNS 临时凭据删除失败后的重试边界,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:单个 DNS 验证会话清理失败时保留令牌和临时凭据,后续可再次调用清理,不再形成不可恢复的残留状态。
- [x] 已完成,等待复审:批量清理对删除失败的会话逐项恢复,成功删除的会话不恢复;受保护正式凭据仍只保留正式配置,不保留验证令牌。
- [x] 已完成:新增单个和批量清理失败重试回归测试;后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过。
- [~] 进行中:DNS 过期清理、初始化回滚、令牌消费、其他 P0-10 任务链、跨数据库实机矩阵和统一复审。
- [ ] 未开始:P0-12 备份恢复、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁。
- [!] 总体验收不得升级:仍为 **P0-03:完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 本轮开发进度(2026-09-30,P0-10 DNS 过期凭据清理重试)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅补齐 DNS 验证令牌过期后的临时凭据清理重试,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:过期验证会话对应的临时凭据删除失败时恢复原会话,保留后续清理入口,不再静默丢失。
- [x] 已完成,等待复审:清理重试成功后过期会话和临时凭据同时移除,令牌仍保持过期不可用。
- [x] 已完成:新增过期清理失败与重试回归测试;后端 `go test ./...`、`go vet ./...` 和 `git diff --check` 通过。
- [~] 进行中:DNS 初始化回滚、令牌消费、其他 P0-10 任务链、跨数据库实机矩阵和统一复审。
- [ ] 未开始:P0-12 备份恢复、密码 SSH、远端部署、真实 HTTPS/DNS/ACME 和最终生产门禁。
- [!] 总体验收不得升级:仍为 **P0-03:完成,待复审**,本轮没有新增 `[✓]` 复审通过项。
## 本轮开发进度(2026-09-30,P0-10 DNS 清理状态与容量边界)
总体验收位置继续保持 **P0-03:完成,待复审**;本轮仅补齐 DNS 临时凭据清理状态和并发容量边界,不代表 P0-10 统一复审通过或生产部署验收通过。
- [x] 已完成,等待复审:保存失败或请求取消后的临时凭据删除失败时,记录待清理引用,并在后续验证、令牌解析或清理操作前自动重试。
- [x] 已完成,等待复审:过期清理失败的会话和待清理状态均计入验证会话容量,避免并发新建验证超过容量上限。
- [x] 已完成:新增保存失败重试、取消后重试和容量边界回归测试;`go test ./...`、`go test -race ./internal/setup`、`go vet ./...` 和 `git diff --check` 均通过。
- [~] 进行中:DNS 初始化回滚、令牌消费、其他 P0-10 任务链、跨数据库实机矩阵和统一复审。
- [ ] 未开始:P0-12、真实生产数据库清理与初始化、密码 SSH、远端多服务器部署、真实 HTTPS/DNS/ACME、Linux/Windows 服务运行验证和最终生产门禁。
- [!] 不得标记 `[✓]`;总体验收仍为 **P0-03:完成,待复审**。
## 本轮开发进度(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 候选服务健康检查)
本轮使用正式候选版本对两台 Linux 服务器进行只读健康复核。结果证明候选服务已安装并能正常提供内部管理接口,但还没有证明完整业务部署、证书推送、失败恢复和公网 DNS/ACME 流程通过,因此总体验收仍保持 **P0-03:完成,待复审**。
- [x] 第一台 `8.137.23.95`(主机名 `ikun1`)的 `Scert`、`nginx`、`Scert-storage.socket` 均为 `active`,`https://127.0.0.1:8443/readyz` 返回 HTTP `200`。
- [x] 第二台 `45.136.13.241`(主机名 `yc`)的 `Scert`、`nginx`、`Scert-storage.socket` 均为 `active`,`https://127.0.0.1:8443/readyz` 返回 HTTP `200`。
- [x] 两台服务器均监听 Nginx `80/443`;Scert 内部 HTTPS 端口为 `8443`,未发现候选安装覆盖 Nginx 端口的情况。
- [x] 通过 `https://odacm.cn/` 读取到正式 Web 首页并返回 HTTP `200`;该结果只证明当前网络路径可读取页面,不证明域名公网 DNS 已指向本次两台测试服务器。
- [!] 当前 `odacm.cn` 的本机 DNS 解析结果为 `198.18.0.109`,与两台测试服务器地址不一致,不能据此记录公网 DNS、HTTPS/SNI 或 ACME 验收通过。
- [~] 继续进行:通过管理页面完成一个域名绑定多个服务器、一个服务器绑定多个域名、证书推送、Nginx 校验/重载、失败回滚及重试幂等的真实业务复核。
- [ ] 尚未完成:三数据库生产矩阵、Windows 服务实机、清库后首次初始化、真实公网 DNS/ACME、完整备份恢复和最终生产门禁。
- [!] 本轮不新增 `[✓]`;自动化测试和健康检查不能替代完整生产部署验收。
## 代码整改进度追加(2026-09-30,多服务器 HTTPS 逐台校验)
- [x] 已完成:证书部署工作流改为对每个关联服务器分别执行 HTTPS 基线校验、部署后证书指纹校验和恢复校验。
- [x] 已完成:生产应用接入 `RemoteVerifierForServer`,使用目标服务器地址建立连接,同时保留域名 SNI、证书链和域名校验。
- [x] 已完成:移除远端 HTTPS 校验中的 `InsecureSkipVerify`,改为使用受信任根证书进行严格 TLS 握手校验。
- [x] 已完成:新增指定地址连接且保留域名 SNI 的回归测试;`go test ./...`、`go vet ./...`、`git diff --check` 已通过。
- [x] 已完成:本轮代码提交为 `840d48d`、`1164d50`、`5ef8e54`,均已尝试推送远程仓库。
- [~] 进行中:重新构建并部署最新候选包,逐台复核两台服务器的真实 Nginx 站点、证书指纹和失败恢复。
- [ ] 未开始:三数据库生产矩阵、Windows 服务、公网 DNS/ACME、完整备份恢复及最终生产门禁。
- [!] 总体验收仍为 **P0-03:完成,待复审**,本轮不得新增 `[✓]`。
## 最新整改进度(2026-10-01)
- [x] 已修复部署锁获取阶段的事务终态缺陷:取得部署锁失败、写入锁归属失败、保存锁阶段失败时,均会主动执行清理并写入最终事务状态。
- [x] 已增加部署锁冲突回归测试,覆盖无锁持有和部分锁持有两种场景,验证已有锁不会被误删,本次锁会被清理,事务不会继续停留在 `pending`。
- [x] `go test ./...` 已通过;本轮修复提交为 `1fad8db`,回归测试提交为 `d315179`。
- [~] 尚未将包含本轮修复的最新候选包重新部署到两台 Linux 服务器,暂不能将实机恢复验收标记为通过。
- [!] 总体验收位置仍保持 **P0-03:完成,待复审**;三数据库、Windows 服务、公网 DNS/ACME、SMTP、备份恢复及完整生产门禁仍未完成。
下一步:构建最新 Linux amd64 候选包,使用密码 SSH 部署到 `8.137.23.95` 和 `45.136.13.241`,复核事务恢复、锁释放、双服务器证书推送、Nginx 校验及 HTTPS 访问。
## 最新实机复核(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 已按用户要求排除;原整改范围及其他上线门禁不缩减。详细现场证据见《Linux生产流程测试记录》同时间章节。
- [✓] P0-10 子项复审通过:真实部署期间,在两个目标事务均处于 reload_attempted/pending 时强制终止 Scert 主进程,systemd 自动重新拉起,两个事务均由启动恢复流程转为 rolled_back。没有直接修改数据库状态、删除锁或关闭 TLS 校验。
- [✓] P0-10 子项复审通过:恢复临时重载命令后,通过正式接口重试原中断任务 72f4222a-3706-419c-847c-0fcb55b436f2,双机部署及 HTTPS 校验成功。原任务保留,尝试次数由 1 增至 2;成功后再次重试返回 409。
- [✓] 恢复收尾:第一台重载命令已通过正式 API 恢复为 nginx -s reload;双机 Nginx 配置校验通过,证书目录无残留锁及临时文件。中断事务两条均 rolled_back,重试事务两条均 committed,审计关联原任务与实际操作者。
- [✓] 网络边界复核:双机 Scert 均仅监听 127.0.0.1:8443,Nginx 对外监听 80/443;第二台管理入口 HTTP 跳转 HTTPS,就绪检查正常。没有新增公网业务端口。
- [!] 测试环境边界:第一台测试站点本机严格 HTTPS 为 200,但第二台及本地电脑访问其公网 HTTPS 均握手失败;公网 HTTP 返回 403、Non-compliance ICP Filing 页面及阿里云拦截地址。此域名公网访问不能标记通过,不绕过拦截;第一台访问第二台的严格 HTTPS 为 200,证书指纹正确。
- [~] P0-10 整项仍进行中:本轮使用同一正式证书重部署,只证明该崩溃窗口下的恢复与重试,不证明不同新旧证书切换、锁归属或摘要不匹配、负向 HTTPS 恢复等其余场景全部通过。历史两条缺可信证据事务继续保留 recovery_required。
- [ ] 最终清库首次生产流程、Smail 系统 SMTP 与超级管理员密码重置、三数据库完整矩阵、备份恢复及升级回滚等仍须按原清单闭环。
结论:本轮关闭“真实进程崩溃恢复并复用原任务重试”子项,整体生产验收仍未通过,不给缺乏逐项统计依据的完成百分比。当前不再用 P0-03 单项状态代指全部生产阻塞。测试服务器和域名只是测试资源,不作为产品验收限制。
## 最新有效数据库整改进度(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 配置缺失、历史事务核查及其他未完成门禁继续保留。
### Linux 原生构建与 Nginx 反代实机复核(2026-10-01 19:27,北京时间)
本节记录本轮使用正式 Linux 原生包的双机升级结果。对外入口遵循“只开放 Nginx 80/443,Scert 与数据库仅回环监听”的要求;本节不提升整体生产验收结论。
- [x] 已完成,等待复审:第二台服务器使用 Go 1.26.6、Node.js 24.19.0 和 npm 11.17.0 完成 Linux amd64 原生构建;源码提交为 `be6e2059f4ce949f7e1b6c0dacb3ff0bdea9ea52`,`source_dirty=false`,构建清单和包内哈希校验一致。
- [x] 已完成,等待复审:正式归档 `Scert-20261001-V0.1.0-linux-amd64.tar.gz` SHA-256 为 `08ba7769bf9225b88ea84f104720fb166b583a494737627523179c0527e83130`;同一归档已通过官方安装器部署到两台服务器。
- [x] 已完成,等待复审:第二台部署后 `Scert.service`、证书目录 socket 和 Nginx 均为 active;`https://odacm.cn/readyz` 返回 `{"service":"scert","status":"ready"}`,首页正常,HTTP 自动跳转 HTTPS。
- [x] 已完成,等待复审:第一台部署后 `Scert.service`、证书目录 socket 和 Nginx 均为 active;Scert 仅监听 `127.0.0.1:8443`,MySQL 仅监听 `127.0.0.1:3306`,第二台 MySQL X Protocol 仅监听 `127.0.0.1:33060`。
- [x] 已完成,等待复审:通过绕过本机代理的直连检查,双机 `8443`、`3306`、`33060` 均无法从公网建立连接;项目 Web 入口仅通过 Nginx `80/443` 提供。此前未绕过代理的端口探测结果为代理误报,不作为验收证据。
- [x] 已完成,等待复审:升级过程中未停止 Nginx,未新增外部业务端口;安装器停服保护、安装事务和服务恢复均按正式流程执行。
- [!] 暂缓或存在阻塞:第一台现有 Nginx 站点使用既有业务域名和证书,公网 DNS `odacm.cn` 当前指向第二台;因此本轮不把第一台伪造为 `odacm.cn` 公网入口,也未替换第一台现有证书或站点配置。
- [!] 暂缓或存在阻塞:整体生产验收仍受 SMTP 实际发信、密码重置、完整 Web 矩阵、历史恢复事务核查、MySQL 5.7、DNS/ACME 和最终清库首次部署等门禁限制。
## 2026年10月1日安全边界与反代复核
本轮只记录非敏感实机证据,不记录任何认证信息。生产入口继续遵循“公网只使用 Nginx `80/443`,Scert 和数据库只走回环地址”的约束。
- [✓] 双机 Scert 均绑定 `127.0.0.1:8443`,数据库只绑定回环地址,Nginx 配置测试通过。
- [✓] 第二台 `odacm.cn` 的 HTTP 自动跳转和 HTTPS `/readyz` 已在服务器本机通过严格 TLS 复核;第一台保留现有业务域名,不伪造为 `odacm.cn`。
- [✓] 第二台邮件 Web 服务仍由现有 Nginx 站点反代,未把邮件服务端口作为 Scert 管理入口;本轮未停用、删除或改写 Smail/PMail 数据。
- [!] 历史恢复事务证据不足仍由产品保守策略拦截,不能人工改终态;总体生产验收不放行。
- [~] 安全入口子项完成待复审;三数据库 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 SSH 密码认证候选包实机复核补充
本轮使用正式构建流程生成候选包 `Scert-20261002-V0.1.0-linux-amd64.tar.gz`,来源提交为 `4620501`,构建清单标记 `source_dirty=false`。仅使用密码 SSH 登录 `45.136.13.241`,未使用、生成、读取、上传或部署任何 SSH 私钥、公钥或 `authorized_keys`,未创建辅助验收脚本。
- [x] 候选包 SHA-256 校验通过,安装器完整校验清单通过。
- [x] `Scert`、`Scert-storage.socket`、`nginx` 安装后均为 `active`。
- [x] Scert 仅监听 `127.0.0.1:8443`;MySQL 仅监听回环地址;对外管理入口仅为 Nginx `80/443`。
- [x] Nginx 配置测试通过,未关闭上游 TLS 校验。
- [x] `odacm.cn` 严格 HTTPS `/readyz` 返回 `{"service":"scert","status":"ready"}`;HTTP 访问返回 `301` 并跳转到 HTTPS。
- [x] SSH 服务端复核为 `pubkeyauthentication=no`、`passwordauthentication=yes`、`authenticationmethods=password`。
- [!] 本轮未清空生产数据库,未执行 Smail 真实发信、密码重置完整闭环、三数据库 Web 首次初始化和 P0-10 全部负向矩阵,因此不能替代整体验收。
当前状态仍为 **P0-03:完成,等待复审**。
### 服务重启后复核补充
- [x] 重启 `Scert` 后服务保持 `active`,等待启动初始化完成后,回环和公网域名严格 HTTPS `/readyz` 均恢复为 `200`。
- [!] 重启后前约数秒 Nginx 可能先于 Scert 上游恢复,期间一次请求返回 `502`;等待 Scert 完成 HTTPS 监听后恢复正常。本现象未通过关闭 TLS 校验或开放内部端口规避,需在最终生产门禁中决定是否需要无感切换改造。
- [!] 服务日志仍报告两条历史 `recovery_required` 事务缺少可信恢复证据,系统按设计保留现场并拒绝自动接管;本轮未伪造证据、删除锁或修改历史事务。
## 2026-10-01 双机密码认证候选包部署复核
本轮只使用密码 SSH 完成双机升级,不使用、不生成、不读取、不上传或部署 SSH 私钥、公钥及 `authorized_keys`,也没有创建辅助验收脚本。TLS 证书业务中的证书私钥仍仅用于证书部署,不属于 SSH 登录凭据。
- [x] 正式 Linux amd64 候选包 `Scert-20261002-V0.1.0-linux-amd64.tar.gz` 已通过密码方式上传至 `8.137.23.95` 和 `45.136.13.241`;包 SHA-256 为 `4090D6D614C359A4A6C7FF92634189AA136099324DD53B2D4557038954DCD33E`,两台包内 `SHA256SUMS` 均通过。
- [x] 两台服务器均通过官方 `install-linux.sh` 停服升级,未强制覆盖运行中的服务;升级前发布文件由安装器保留,未额外创建远端备份。
- [x] 两台 `Scert`、`Scert-storage.socket` 和 Nginx 均为 active;Scert 仅监听 `127.0.0.1:8443`,数据库仅绑定回环地址,公网项目入口保持 Nginx `80/443`。
- [x] 两台 `nginx -t` 均通过;第二台 `https://odacm.cn/readyz` 使用正常 TLS 校验返回 ready,未关闭 TLS 校验。第一台沿用独立的内部证书域名,使用 `odacm.cn` 探测出现证书名称不匹配,不能据此宣称第一台公网域名验收通过。
- [x] 两台 SSH 服务端均复核为 `pubkeyauthentication no`、`passwordauthentication yes`、`authenticationmethods password`,SSH 私钥登录能力不允许出现。
- [!] 第二台启动日志继续报告两条历史 `recovery_required` 事务缺少可信恢复证据;现场已保留,未删除锁、伪造证据或自动接管。
- [!] 第一台存在与 Scert 无关的既有 `php-fpm-82.service` failed 状态,不能混入 Scert 验收结论,需单独处理或明确排除。
本轮完成的是候选包部署和入口安全边界复核,不代表生产整体验收通过。清库后的三数据库 Web 首次初始化、Smail 系统账户真实发信、密码重置完整闭环、P0-10 负向矩阵、历史恢复证据核查及重启瞬间短暂 502 观察项仍未闭环。总体状态保持:**P0-03:完成,等待复审**。
## 2026-10-01 当前日期候选包复核补充
- [x] 已按当前日期重新生成 `Scert-20261001-V0.1.0-linux-amd64.tar.gz`,避免使用未来日期命名的候选包;SHA-256 为 `56426C1BBCECA68B32D122E813A950D2EE345349F89C3178080BD313F6F77E8E`。
- [x] 当前候选包来源提交为 `79bae3bf2b52720591279f78f5cbc340f82c4f36`,`source_dirty=false`,Linux amd64、trimpath 和发布路径检查通过。
- [x] 双机已重新部署当前日期候选包;两台 `/scert/scert` SHA-256 均为 `3422abf0a5fb2c0254fb382118424733534fd00548eba4930a0e90857cd874b8`,`scert-admin` SHA-256 均为 `ee52d429a88b3942147e1acf67da3653f61e076c11d67bf3dd20b254b4321722`。
- [x] 当前生产路径验证仍只允许密码 SSH;SSH 私钥 API 测试返回 404,前端生产测试确认不挂载 SSH 私钥入口。历史 `sshkey` 目录、迁移字段和未挂载样式未删除,不代表能力重新启用。
- [x] 当前候选包第二台 Scert 重启后第 0、1 秒 Nginx 返回 502,第 2 秒恢复 200;服务、端口边界和 TLS 校验策略均未被放宽。
- [!] 短暂 502 仍是生产门禁阻塞项;历史 `recovery_required` 事务和清库后的完整业务验收也未闭环。
总体状态继续保持:**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 安全边界复核
本节只记录非敏感部署证据,不记录服务器口令、RAM 密钥、数据库密码、令牌、私钥、公钥或 `authorized_keys`。本轮没有创建辅助验收脚本,没有额外远端备份,Windows 不在本轮范围。
- [x] 使用最新干净提交 `cc3ac06` 生成 Linux amd64 候选包 `Scert-20261002-V0.1.0-linux-amd64.tar.gz`;`source_dirty=false`、`trimpath=true`、`local_path_check=passed`,包内 21 个文件的 `SHA256SUMS` 全部通过,归档 SHA-256 为 `e4623636c5021a99998ce04f4680ebd3d107c02fb4a118a17875fc84c7faeefa`。
- [x] 通过密码 SSH 和已登记主机指纹将同一候选包部署到 `8.137.23.95` 与 `45.136.13.241`;两台 `/scert/scert` SHA-256 均为 `f6fcad3a8d6d0cd47e90e0e0cc6b2ff9c9657082a63835aae0e1d72ab3500fb9`。
- [x] 两台 Scert、存储 socket、Nginx 均 active,Nginx 配置测试通过;Scert 仍只监听 `127.0.0.1:8443`,MySQL 3306/33060 仍为回环监听,公网入口只使用 Nginx 80/443。
- [x] 从第一台服务器跨机探测第二台 8443、3306、33060 均超时;本机 Mihomo 虚拟网卡造成的 TCP 探测假阳性不作为验收依据。
- [x] 第二台使用 `odacm.cn` 严格 TLS 校验访问 `/readyz` 返回 `200` 和 `{"service":"scert","status":"ready"}`;HTTP 入口返回 301 并跳转 HTTPS。
- [x] `/api/v1/ssh-keys` 返回 404;生产 Web 包未发现 SSH 私钥、公钥、`authorized_keys`、密钥生成或密钥登录管理入口。服务器部署全程未使用、生成、上传或部署 SSH 密钥材料。
- [x] 后端全量测试、`go vet` 和前端 241 项测试通过,工作区干净。
- [!] 第一台现有管理证书的 SAN 不包含 `odacm.cn`,严格 TLS 校验按预期拒绝;未使用 `-k` 绕过,也未关闭 Nginx 上游 TLS 校验。第一台域名证书更换仍是生产门禁阻塞项。
- [~] 启动早期 502 仍需按生产门禁继续评估:第二台本次安装后约第 2 秒探测出现 502,等待后恢复为严格 HTTPS 200;未开放 8443,也未绕过 Nginx。
当前总体状态仍为 **P0-03:完成,等待复审**,不能据此宣布生产整体验收通过。P0-10 负向恢复、三数据库清库后的完整 Web 流程、Smail 系统账户发信及密码重置闭环仍未完成。
## 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日12:35 新增安全整改进度
- [x] 已核实两台 Scert 实际均为回环监听,第二台 Nginx 上游严格 TLS 校验保持开启。
- [~] 补齐 Linux 非 systemd 启动场景:默认监听及空值回退使用回环地址,实际非回环配置拒绝启动;关联回归及正式包部署尚未完成。
- [!] 原生正式构建被安全检查拦截,未部署未完成校验的产物;最新详细状态见《Scert整改任务执行清单》同日入口。
- [!] 维持生产未放行状态,不把本次端口检查或启动通知整改计为 P0-10、邮件及三数据库首次流程通过。
## 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 最新执行状态:恢复核查底层已通过 Linux 专项
本节是当前进度补充,后续历史章节不能覆盖本节。范围仍为 Linux 双机上线,Windows 不在本轮范围。
- [x] 第二台磁盘清理后于 17:08 实测:29 GB 总量、3.2 GB 已用、26 GB 可用、使用率 12%,inode 使用率 3%;Scert、nginx、mysql、scert-nginx、pmail 均为 active。
- [x] P0-10 恢复核查子项 R1 已完成编码并通过原生 Linux 专项、部署包全量竞态测试和静态检查,等待完整流程复审。详见《部署事务人工核查任务清单》。
- [ ] 恢复核查本机 IPC 和终端入口、独立人工处置及审计、幂等和并发门禁尚未完成;现有无历史证据事务仍不得自动转为成功。
- [ ] 本轮新代码尚未打包上线;三数据库首次 Web、真实邮件与重置、双机正式域名正负向、DNS/ACME 和回滚验收继续保留。
- [~] 后端全量回归正在执行,专项测试不能代替全量结果或生产验收。
历史章节中的第一台管理证书 SAN 结论本轮未重新验证,不能作为当前证书状态。总体生产验收仍未通过,不因磁盘空间恢复或专项测试通过而关闭 P0 门禁。
### 17:35 后端全量回归进度
前两次全量尝试分别因依赖代理不可达及 SSH 响应异常而中止,没有通过结论。服务 active 和本机严格 TLS 就绪检查已复核,当前以限制内存和 CPU 的 Linux 单元重新执行全量回归,等待终态。未修改生产配置或历史恢复记录,未关闭任何生产门禁。
## 2026年10月3日18:06 最新进度
本节优先于后续历史记录。Linux 上线范围不变,总体生产验收仍未通过。
- [x] 第二台磁盘清理结果于 17:41 复核:根分区可用约 26 GB、使用率 12%,五个既有业务服务均运行。
- [~] P0-10 / R2:已接入待恢复事务摘要分页、本机受保护协议及终端只读核查菜单;首批 Linux 三包回归通过,HTTP 边界、最新增量和竞态验证仍在推进。
- [!] 上一轮受限后端全量回归因二十分钟上限终止,未通过;不得用专项结果替代全量结论。
- [ ] 人工处置与审计、最新候选包双机部署、三数据库首次 Web、Smail 系统发信与重置、DNS/ACME 正负向和严格公共 HTTPS 验收继续保留。
详细状态见《部署事务人工核查任务清单》18:06 章节。本轮未增加公网监听、未改生产事务终态,也未放宽 TLS 或本机密码重置安全边界。
## 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` 承担 Scert 主部署测试,第二台 `45.136.13.241` 仅承担证书推送、重载和回滚测试;不处理 Windows,不创建辅助验收脚本,不做远端备份,不清理业务数据库。
### 任务清单
- [✓] 代码整改与本地回归:公网密码重置阻断、超管本机受保护重置入口、邮件权限边界、DNS 账户归属与部署事务人工核查能力已完成对应代码及本地回归。
- [✓] 第一台基础运行:最新候选包已部署;Scert、存储 Socket、Nginx active;Scert `127.0.0.1:8443`、数据库回环监听;公网仅 Nginx `80/443`。
- [✓] 第一台正式证书:`odacm.cn` 证书已核验,SAN 包含 `DNS:odacm.cn`,有效期为 2026-10-02 至 2026-12-31;严格 TLS `/readyz` 已通过。
- [✓] 历史事务只读核查:两条 `recovery_required` 事务均已通过正式 `Scert-admin` 菜单完成只读采样;目标文件、临时文件和备份文件均缺失,归属锁存在且匹配;未删除锁、未改写终态、未伪造历史证据。
- [!] 第一台系统发信:当前 `/scert/conf/scert.json` 实际 `smtp_enabled=false`,SMTP 主机和用户名为空;不能把第二台页面上的配置视为第一台配置,需在明确指向第一台的管理入口由用户填写 SMTP 密码后复核。
- [!] 超级管理员本机重置:因第一台 SMTP 未启用,真实验证码发送和新密码登录闭环尚未通过;未修改现有密码。
- [✓] 人工处置安全边界:无可信历史恢复基线的事务继续拒绝自动接管;两条历史事务保持待人工处置状态,不能标记为部署成功。
- [~] 三数据库首次 Web 流程、DNS/ACME 正负向矩阵、第二台证书推送/重载/不同版本回滚、公共域名最终入口仍待完成。
- [~] 最终候选包重新部署、浏览器缓存清理后的页面验收、测试记录和本清单最终复审待完成。
### 当前验收结论
当前整体生产验收仍为 **未通过**。第一台基础运行、严格 HTTPS、历史事务只读核查和人工处置安全边界已有实机证据;第一台真实系统发信、超管本机重置和最终业务矩阵仍是门禁项。下一步不重复第二台主程序测试,优先完成第一台 SMTP 配置和本机重置闭环,再执行剩余最终矩阵。
## 2026年10月4日15:36 历史事务仅记录处置完成
- [✓] 第一条无可信恢复基线事务 `20261003-142919.192475924-417b9bcc5b09` 已通过正式本机菜单 3 选择“仅记录核查”,处置编号 `f23507a439fb63e2c829ac9c01020af560ce46dd96b248da851991516195212d`。
- [✓] 第二条无可信恢复基线事务 `20261003-142924.300953335-fac63bc92b1f` 已通过正式本机菜单 3 选择“仅记录核查”,处置编号 `0f65a3d3c4fe8cb881e61e6e39f86747767a8e21421b9d6ca02ea46bf7ad208b`。
- [✓] 菜单 4 已分别查询两个处置编号,均返回“核查结论已记录”;原事务终态保持不变,锁未删除,未执行提交、回滚或远端写操作。
- [!] 该结果证明安全处置边界生效,不代表两条历史部署成功;它们仍按缺少可信基线处理。
## 2026年10月4日15:45 最新源码回归结果
- [✓] 后端 `go test ./...`:全部通过。
- [✓] 后端 `go vet ./...`:通过。
- [✓] 前端 `npm.cmd test -- --run`:338 项通过,0 失败,0 跳过。
- [✓] 前端 `npm.cmd run build`:Vite 生产构建通过,生成最新 Linux 候选所需静态资源。
- [✓] `git diff --check` 和工作区检查通过;本轮仅追加验收记录,没有新增源码改动。
- [!] 上述源码回归不能替代第一台 SMTP 实际启用、真实邮件送达、超管本机重置和最终生产矩阵;总体验收继续保持未通过。
## 2026年10月4日15:52 SMTP 配置落点复核
- [✓] 第二台 `45.136.13.241` 的非敏感配置显示 `smtp_enabled=true`、主机 `smtp.cdis.cn:587`、STARTTLS、用户名 `notify:xuans@cdis.cn`,收件人仍为超级管理员绑定邮箱;凭据内容未读取。
- [!] 第一台 `8.137.23.95` 的非敏感配置仍显示 `smtp_enabled=false`、SMTP 主机和用户名为空;因此此前通过域名页面填写的配置实际落在第二台,不能作为第一台发信证据。
- [✓] 从第一台到 `smtp.cdis.cn:587` 的 STARTTLS 握手成功且证书校验通过;这只证明网络和 TLS 可达,不证明 SMTP 认证或真实投递成功。
- [!] 当前唯一需要用户参与的配置动作是:让管理页面真正连接第一台,在不读取或转交密码的前提下重新填写 SMTP 密码并保存;保存后再进行验证码和收件箱闭环验收。
## 2026年10月4日 第二台部署包清理与推送测试边界复核
本节记录第二台 `45.136.13.241` 的部署痕迹清理结果。第二台不再安装当前 Scert 项目候选包,仅保留为后续 SSL 证书推送、Nginx 重载、故障注入和回滚测试目标。
- [✓] 使用已核对的 SSH 主机指纹进行只读核验,未使用或生成 SSH 密钥材料。
- [✓] 已删除本轮残留部署事务目录 `/scert/.install-VSIoJ4Cj`;清理前确认没有安装器、解包或发布进程运行。
- [✓] 复核 `/scert`、`/var/tmp`、`/tmp`,未发现本项目候选归档、解包目录、恢复临时目录或其他本轮部署包残留。
- [✓] `/scert/data/scert.db`、`/scert/backups`、`/ssl/scert` 和 `/etc/nginx` 均保留;本次未删除业务数据库、证书、备份或 Nginx 配置。
- [✓] Nginx 配置语法检查通过并保持运行;第二台 `Scert-storage.socket` 保持运行。
- [!] 第二台旧版 `Scert.service` 仍因数据库版本 22 高于旧程序支持的版本 21 而启动失败;未删除迁移记录、未伪造数据库版本、未重新安装当前候选包。
- [~] 第二台 SSL 推送、Nginx 重载、故障注入、失败回滚和恢复后证书指纹核验仍待执行;不得把本次部署包清理记录当作推送测试通过。
当前结论:第二台已清除本轮项目部署包及事务残留,但业务数据和证书现场保持不变;总体生产验收仍未通过。
## 2026年10月4日 当前接手加速整改与上线任务清单
本轮继续只处理 Linux 与 Web,不处理 Windows。第一台 `8.137.23.95` 用于主部署测试,第二台 `45.136.13.241` 只用于 SSL 推送、Nginx 重载、故障回滚和恢复验证,不安装当前 Scert 项目候选包。
### 本轮状态
- [✓] 已阅读本清单、任务执行清单和 Linux 生产流程记录,按当前工作区及真实服务器状态重新划分上线门禁。
- [✓] 仓库 `main` 工作区干净;后端 `go test -p 1 -count=1 -timeout=12m ./...`、`go vet ./...`、前端 338 项测试、前端生产构建和 `git diff --check` 均通过。
- [✓] 第一台服务复核通过:`Scert.service`、`Scert-storage.socket`、`nginx.service` active,Scert 仅监听 `127.0.0.1:8443`,MySQL 仅监听回环地址,`/readyz` 返回 ready。
- [✓] 第二台已清空 Scert 自有 `/scert/data`、`/scert/backups`、`/scert/log` 内容,并复核 `/scert`、`/var/tmp`、`/tmp` 未留下本项目部署压缩包、解包目录、安装事务目录或恢复临时目录。
- [✓] 第二台 Nginx 配置检查通过并保持运行,`Scert-storage.socket` active;未删除 `/ssl/scert`、`/etc/nginx` 或其他共享业务现场。
- [!] 第一台 `scert.json` 的 SMTP 仍为关闭状态,真实系统邮件、验证码送达、受保护本机重置和新密码登录仍不能宣称通过。
- [ ] 通过正式 Web/API 证书部署流程完成第二台 SSL 推送、`nginx -t`、Nginx reload、故障回滚、恢复后证书指纹核验和幂等重试。
- [ ] 完成 SQLite、MySQL、PostgreSQL 三数据库首次 Web 初始化、重启后重新登录持久化及清缓存复测。
- [ ] 完成 DNS/ACME 正负向矩阵、公共域名严格 HTTPS/SNI、证书历史恢复和最终入口复核。
- [!] 历史 `recovery_required` 事务继续按产品本机人工处置边界保留,不自动接管、不删除锁、不伪造成功。
- [!] 总体生产验收仍未通过;构建、单元测试、回环 `/readyz` 和局部 Nginx 检查均不能替代真实业务门禁。
### 下一步执行顺序
1. `[~]` 准备正式证书部署入口,先选择状态为 `valid` 的普通业务域名,不使用管理域名作为正向测试对象。
2. `[ ]` 从第一台真实 Web/API 会话触发证书部署,记录任务、尝试、双机结果和证书指纹。
3. `[ ]` 在第二台注入可控配置校验或 reload 失败,验证产品停止策略、失败回滚和站点恢复。
4. `[ ]` 重复同一部署验证幂等性、锁释放和不产生部署包/临时目录残留。
5. `[!]` 等待用户在明确指向第一台的入口填写系统通知密码;不代填、不读取、不保存密码,随后完成验证码和本机重置闭环。
6. `[ ]` 完成三数据库、DNS/ACME、公共 HTTPS 和最终复审后,才允许关闭生产门禁。
## 2026年10月4日 19:22 实机复核与上线推进
### 任务状态
- [✓] 第一台 `8.137.23.95` 实时复核:`Scert.service`、`Scert-storage.socket`、`nginx.service` 均为 active;通过严格 SNI 的本机 Nginx 入口访问 `/readyz` 返回 `status=ready`。
- [✓] 第二台 `45.136.13.241` 实时复核:`/scert`、`/var/tmp`、`/tmp` 范围内未发现本项目部署包、解包目录或安装临时目录;Nginx 配置语法检查通过。
- [✓] 第二台保留业务数据库目录、证书目录和 Nginx 配置;未重新安装当前 Scert 候选包,未改变其仅作为 SSL 推送测试目标的边界。
- [~] 当前 Linux 候选包 manifest 已验证 `source_dirty=false`、`targets=linux-amd64`、`trimpath=true`、`local_path_check=passed`;尚未用于第二台安装。
- [!] 第一台系统通知 SMTP 仍未启用;真实发信、验证码送达、本机密码重置和新密码登录等待在第一台管理入口输入 SMTP 凭据后继续。
- [~] 正式证书推送、第二台 Nginx reload、失败回滚、恢复指纹和幂等重试仍待取得第一台有效管理会话后执行。
- [!] Windows 不在本轮范围;总体生产门禁继续保持未通过。
### 复核边界
- 未使用不安全 TLS 选项、强制 IP TLS、伪造 Cookie/Token 或数据库直改方式替代正式产品流程。
- 未删除第二台业务数据库、证书或 Nginx 配置;未删除本地候选包,避免影响第一台后续部署。
## 2026年10月4日 19:35 候选包与本机事务复核
- [✓] 第一台 `/scert/scert` 实际运行文件 SHA-256 与本地 `production-candidate-20261004-f5c425f` 包内主程序一致;确认当前运行的是已记录的 Linux 候选包。
- [✓] 第一台前台 `Scert-admin` 菜单完成只读事务核查;两条历史事务仍为需要恢复,锁与现场保持不变,未删除锁、未改写终态。
- [!] 真实 SMTP、验证码送达、本机重置和正式证书推送仍需有效管理会话;不使用 SSH 密码、历史页面状态或数据库直改替代正式流程。
## 2026年10月4日 第二台项目现场清理
- [✓] 已通过登记主机指纹登录第二台 `45.136.13.241`,确认主机地址和目标路径后执行定向清理。
- [✓] 已移除第二台 Scert 安装目录、Scert systemd 单元、Nginx 激活辅助程序及项目证书测试数据;未保留本项目部署包、解包目录或安装事务文件。
- [✓] 已清理项目专用 Nginx 测试配置和测试证书目录;保留 PMail、共享 MySQL、Nginx、`/ssl/vcer.cn` 及空的 `/ssl/scert` SSL 推送目标。
- [✓] 清理后 `nginx -t` 和 Nginx reload 通过,Nginx、PMail、MySQL 均为 active;无 Scert 进程,无 `8443` 监听,MySQL 仍仅监听回环地址。
- [✓] 在 `/tmp`、`/var/tmp`、`/root`、`/home`、`/opt`、`/ssl` 范围复核,未发现 `Scert-*.tar.gz`、`production-candidate*`、`.install-*` 或 `.restore-from-*` 残留。
本节只记录第二台现场清理,不代表正式 SSL 推送、失败回滚、恢复指纹或总体生产验收已经通过;后续正式推送测试必须以干净的第二台 Nginx/SSL 目标重新执行。
## 2026年10月4日 第二台清理整改状态更新
- [✓] 第二台 `45.136.13.241` 的 Scert 项目证书数据、安装日志、项目专用测试配置和测试证书目录已定向清理。
- [✓] 第二台未留下本项目部署包、解包目录、安装事务目录或 Scert 运行进程;Nginx 配置检查和 reload 通过。
- [✓] PMail、共享 MySQL、现有 Nginx、`/ssl/vcer.cn` 及 SSH 登录安全边界未被删除或改写。
- [ ] 正式 SSL 推送、故障注入、回滚、恢复指纹、幂等重试和最终公共 HTTPS 验收仍未完成。
当前状态:第二台清理项已完成并等待复审;整体 Linux/Web 生产上线门禁继续保持未通过。
## 2026年10月4日 22:18 第二台清理结果更正
- [✓] 第二台部署包归档扫描为 0,`/ssl/scert` 为空,Scert 服务、进程和监听均不存在。
- [✓] Nginx 配置检查成功,Nginx、MySQL、PMail 保持 active;共享业务数据和 `/ssl/vcer.cn` 未清理。
- [!] 失败部署事务的 3 个 `.scert-lock` 恢复锁目录继续保留,等待正式人工处置;不删除锁、不改写事务终态。
- [!] SSH 认证配置继续保留,未改变第二台当前登录安全边界。
本节更正并取代此前“限定范围无项目命名文件”的宽泛表述。当前已确认的是“无部署包、无运行实例、无推送测试站点”,不是“所有带 Scert 名称的受保护文件均已删除”。
## 2026年10月4日 22:24 第一台上线复核更新
- [✓] 第一台 `8.137.23.95` 的 Scert、存储 Socket、Nginx、MySQL 均 active;应用和数据库保持回环监听,公网仅开放 Nginx `80/443`。
- [✓] 公共浏览器严格 HTTPS/SNI 访问 `https://odacm.cn/readyz` 返回 ready;当前管理域名证书为 Let's Encrypt `odacm.cn`,有效期至 2026年12月31日。
- [!] 第一台 SMTP 仍关闭,邮件通知、验证码和本机密码重置闭环未通过;必须通过第一台真实管理入口输入凭据,不得数据库直改或绕过认证。
- [ ] 正式 SSL 推送、第二台回滚矩阵、三数据库首次 Web、DNS/ACME 和最终生产验收待执行。
当前状态:第一台 Linux 基础服务和严格 HTTPS 健康检查通过,但上线门禁仍未关闭。
## 2026年10月4日 22:55 接手加速复核
### 任务进度
- [✓] 已重新阅读本清单并确认本轮只处理 Linux/Web;第一台 `8.137.23.95` 用于部署测试,第二台 `45.136.13.241` 只用于 SSL 推送测试,不安装本项目。
- [✓] 当前工作区保持干净;后端 `go test -count=1 ./...`、`go vet ./...`、前端 338 项测试和前端生产构建均通过。
- [✓] 第一台只读实机复核通过:`Scert.service`、`Scert-storage.socket`、Nginx、MySQL 均 active;当前配置仍为 `smtp_enabled=false`,SMTP 主机和用户名为空。
- [!] 使用已登记主机身份进行的只读 Web 登录尝试返回“账号或密码错误”;未修改账号、密码或数据库,不能绕过正式管理流程。
- [✓] 第二台项目数据和部署包清理状态保持通过;PMail、共享 MySQL、现有 Nginx、业务证书和受保护恢复锁未删除。
- [~] 等待有效第一台超级管理员 Web 会话或用户在页面中输入 SMTP 系统通知凭据后,继续真实发信、验证码和本机重置闭环。
- [ ] 正式 SSL 推送、第二台 Nginx 校验与重载、受控失败回滚、恢复指纹和幂等重试。
- [ ] 三数据库清库后的首次 Web 流程、DNS/ACME 正负向矩阵、公共 HTTPS/SNI 和最终生产复审。
当前结论:源码回归通过,但第一台 SMTP 与有效管理会话仍是上线硬门禁;不得将健康检查、构建成功或第二台清理结果写成生产上线通过。
## 2026年10月4日 23:36 第一台候选升级与第二台清理复核
- [✓] 当前 `8c40a01` Linux amd64 候选归档在本地和第一台的 SHA-256 均为 `40e3fcf4f7ca1140f5c93ac9efb2c89a8ac414142a0ed8d74925b59bfac8e882`,包内 `SHA256SUMS` 全部通过。
- [✓] 候选包仅上传到第一台 `8.137.23.95`;官方安装器在存储 Socket 未停止时按安全门禁拒绝,停止 `Scert-storage.socket` 后重新执行成功,未绕过安装器检查。
- [✓] 第一台升级后 `Scert.service`、`Scert-storage.socket`、Nginx、MySQL 均 active;核心二进制摘要与候选包一致,严格 HTTPS `/readyz` 返回 ready,Scert 和 MySQL 仍为回环监听。
- [✓] 第一台本轮上传归档和解包目录已在验证后清理;安装器保留的历史 `.install-*` 回滚目录未擅自删除。
- [✓] 第二台 `45.136.13.241` 只读复核确认无 `/scert`、Scert 辅助程序、Scert 运行端口和限定范围部署包;`/ssl/scert` 为空,Nginx 配置检查通过,PMail、MySQL、Nginx 保持运行。
- [!] 第二台 3 个受保护 `.scert-lock` 恢复锁继续保留,不属于部署包,不能手工删除或改写。
- [!] 第一台当前通知配置实际仍为 `notification.smtp_enabled=false`,真实发信、验证码和本机密码重置仍受有效管理会话及 SMTP 凭据阻塞。
- [ ] 正式 SSL 推送、Nginx 重载、受控失败回滚、恢复指纹、幂等重试、三数据库首次 Web、DNS/ACME 和最终公共 HTTPS 复审。
当前结论:第一台当前候选升级和两台运行边界复核通过;第二台没有遗留本项目部署包,但总体生产上线门禁仍未关闭。
## 2026年10月4日 23:53 Smail 系统通知授权进度
- [✓] 已通过 `https://web.cdis.cn/` 的现有超级管理员会话打开“系统通知发信”设置,确认 `xuans` 账号为目标系统通知账号。
- [✓] 已按 Smail 正式页面开启 `xuans` 的 SMTP 系统通知授权;页面确认服务器为 `smtp.cdis.cn`,STARTTLS 端口为 `587`,用户名为 `notify:xuans@cdis.cn`,发件身份由 Smail 固定生成。
- [✓] 已通过正式页面生成新的独立系统通知发信凭据;凭据只在当前浏览器临时显示后已隐藏,未写入仓库、文档、日志或普通配置。
- [~] 第一台 Scert 登录页仍未取得有效超级管理员会话,新的 Smail 凭据尚未填入第一台;不通过 SSH 配置文件、数据库直改或猜测管理密码绕过正式 Web 流程。
- [ ] 第一台 SMTP 保存复核、真实发信、验证码、本机重置和新密码登录。
- [ ] 正式 SSL 推送及第二台回滚矩阵、三数据库首次 Web、DNS/ACME 和最终生产复审。
当前结论:Smail 系统通知授权已建立,但第一台 Scert 仍需有效 Web 管理会话才能完成正式配置;总体上线门禁继续未关闭。
## 2026年10月4日 Linux 加速整改与第二台清理复核
### 本轮任务状态
- [✓] 已重新阅读本清单并保持范围为 Linux/Web;第一台 `8.137.23.95` 继续用于部署测试,第二台 `45.136.13.241` 仅用于 SSL 推送测试,不安装 Scert。
- [✓] 后端 `go test -count=1 ./...`、`go vet ./...`、前端 338 项测试和前端生产构建全部通过。
- [✓] 第二台 `/scert`、Scert 辅助目录、Scert 进程、`8443/8080/9000` 监听、限定范围部署包和归档均不存在;空的 `/ssl/scert` 已移除。
- [✓] 第二台项目专用 SSH 测试配置已移除:`99-scert-password-only.conf`、`99-scert-pubkey.conf`;删除后 `sshd -t` 通过,未重载 SSH。
- [✓] 第二台 Nginx 配置检查通过,PMail、共享 MySQL、现有 Nginx 和业务证书未操作;`/ssl/acceptance-0928.odacm.cn/single/` 下受保护 `.scert-lock` 目录及其 `owner` 文件仍保留,未删除、改名或改写。
- [!] 第一台通过正式 `Scert-admin` 本机交互尝试重置时,因 `notification.smtp_enabled=false` 且 SMTP 主机、用户名为空,重置请求被服务拒绝;没有修改数据库、密码或配置。
- [!] 第一台 Web 使用当前 SSH 密码登录仍返回“账号或密码错误”,密码框已清空;不能据此替代有效超级管理员会话。
- [ ] 第一台正式 SMTP 保存、真实系统发信、验证码、本机重置和新密码登录。
- [ ] 正式 SSL 推送、Nginx 重载、受控失败回滚、恢复指纹和幂等重试。
- [ ] 三数据库清库后的首次 Web、DNS/ACME 正负向矩阵、公共 HTTPS/SNI 和最终生产复审。
### 当前结论
本轮源码回归、Linux 生产构建和第二台清理均有实测证据;第一台 SMTP 与有效管理会话仍未完成,整体生产上线门禁继续保持未关闭。第二台受保护恢复锁不属于部署包,继续保留并等待正式人工处置流程。
## 2026年10月4日 当前实机复核:第一台 SMTP 非敏感参数与 Smail 可用性
- [✓] 第一台 `8.137.23.95` 已通过项目自带官方 CLI 写入非敏感 SMTP 参数:`smtp.cdis.cn:587`、`STARTTLS`、系统通知用户名,明文认证保持关闭。
- [✓] 第一台执行 `scert config validate` 通过;未读取或写入 SMTP 密码、授权码或其他敏感凭据。
- [!] 第一台 `notification.smtp_enabled` 仍保持关闭,因加密 SMTP 凭据引用尚未配置;不能把非敏感参数写入视为真实发信已通过。
- [!] `https://web.cdis.cn/` 当前严格 HTTPS 返回 `502 Bad Gateway`,系统通知页面和授权码接口暂时不可用;未通过数据库直改、配置文件直写或绕过正式流程继续操作。
- [~] 待 Smail 上游恢复后,继续完成第一台 SMTP 凭据录入、真实发信、验证码、本机重置和新密码登录;随后执行第二台正式 SSL 推送及回滚矩阵。
当前结论:本次只推进了第一台非敏感 SMTP 配置并保留安全边界,整体生产上线门禁继续未关闭。
## 2026年10月5日 Smail 恢复后的 Linux 上线任务重排
本节为当前最新执行入口,保留前文 502 历史记录,不覆盖历史证据。范围继续限定为 Linux/Web:第一台 `8.137.23.95` 用于部署测试,第二台 `45.136.13.241` 只用于 SSL 推送测试,不在第二台安装本项目。
### 需求清单与当前状态
- [✓] Smail 正式入口 `https://web.cdis.cn/` 已恢复;清理缓存后重新加载显示 Smail 收件箱,当前账号为 `xuans` 超级管理员。
- [✓] Smail“设置-系统通知发信”页面可用;`xuans` 账号状态显示“已开启”,正式页面可读取非敏感 SMTP 参数。
- [✓] 第一台非敏感 SMTP 参数已由官方 CLI 写入并通过校验:`smtp.cdis.cn:587`、STARTTLS、系统通知用户名,明文认证保持关闭。
- [!] 第一台 SMTP 加密凭据引用仍为空,`smtp_enabled=false`;真实发信和本机重置尚未开始。
- [✓] 第二台项目数据和部署包清理保持通过;不重新安装 Scert,只保留 SSL 推送测试目标。
- [ ] 第一台正式保存 SMTP 敏感凭据,真实发送测试通知并确认收件箱到达。
- [ ] 通过第一台本机受保护 `Scert-admin` 完成验证码、本机重置、新密码登录和旧会话失效验证。
- [ ] 通过正式 Web/API 完成第二台 SSL 推送、`nginx -t`、reload、受控失败回滚、恢复指纹和幂等重试。
- [ ] 完成 SQLite、MySQL、PostgreSQL 清库后的首次 Web 初始化、重启后重新登录持久化和清缓存复测。
- [ ] 完成 DNS/ACME 正负向矩阵、公共 HTTPS/SNI、证书历史恢复和最终入口复审。
- [!] 总体生产上线门禁仍未关闭;不以页面 200、构建成功或第二台清理结果代替完整上线验收。
### 本轮执行顺序
1. `[✓]` 复核 Smail 页面恢复和系统通知授权状态;保留 502 作为历史记录。
2. `[~]` 在第一台 root 受控终端执行 `scert config set-secret --key notification.smtp_password`,敏感值只交互式输入,不写入参数、日志、文档或仓库。
3. `[ ]` 只读复核第一台凭据引用和 `config validate`,随后发送真实系统通知并确认收件箱到达。
4. `[ ]` 启动第一台 `Scert-admin` 本机受保护通道,完成验证码和密码重置闭环;不开放公网重置接口。
5. `[ ]` 取得有效第一台管理会话后,在第二台建立最小 SSL 推送目标,完成成功、失败回滚、恢复和幂等矩阵。
6. `[ ]` 完成三数据库首次 Web、DNS/ACME、公共 HTTPS/SNI 和最终清缓存复审。
### 当前结论
Smail 已从历史 502 状态恢复,系统通知授权页面可用;当前唯一直接业务硬门禁仍是第一台 SMTP 敏感凭据和有效 Scert 管理会话。第二台不安装本项目,受保护恢复锁继续保留,不得手工删除或改写。整体上线仍未通过。
## 2026年10月4日实时复核纠偏
本节依据第一台 `8.137.23.95` 和浏览器当前状态追加,前文历史记录保留;如与本节冲突,以本次实时复核为准。
### 当前已确认
- [✓] 第一台 `/scert/scert config validate` 通过,公开 `https://odacm.cn/readyz` 返回 `{"service":"scert","status":"ready"}`。
- [✓] 第一台 Scert 仅监听 `127.0.0.1:8443`,公网 `80/443` 由 Nginx 接收;`nginx -t` 通过。
- [✓] 第一台非敏感 SMTP 参数为 `smtp.cdis.cn:587`、STARTTLS、`notify:xuans@cdis.cn`,明文认证关闭。
- [✓] Smail `https://web.cdis.cn/` 当前可打开,账号 `xuans` 的系统通知授权状态显示“已开启”;本次未查看或复制授权码。
- [✓] 第二台项目数据和部署包已清理,正式 SSL 推送和回滚矩阵仍未执行。
### 当前硬阻塞
- [!] 第一台 `smtp.cdis.cn` 当前 DNS A 记录为 `47.108.78.12`;从第一台测试 `25/465/587` 均为连接被拒绝,STARTTLS 握手未建立。
- [!] 第一台当前 `smtp_enabled=false`,加密凭据引用为空;在 SMTP 服务可达前不得录入或猜测密码,不得宣称真实发信通过。
- [!] `odacm.cn` 当前登录页仍无有效 Scert 管理会话,未进行密码猜测、数据库直改或公网重置。
### 任务状态
- [✓] 第一台服务边界、HTTPS/readyz、Nginx 和 SMTP 网络层复核。
- [!] 确认 Smail/SMTP 实际提交服务的正确主机和监听端口,并恢复可达性。
- [ ] 受控录入 SMTP 敏感凭据、发送真实系统通知并确认收件箱到达。
- [ ] 完成第一台本机受保护重置、验证码、新密码登录和旧会话失效验证。
- [ ] 完成第二台正式 SSL 推送、Nginx reload、失败回滚、恢复指纹和幂等重试。
- [!] 总体 Linux 生产上线门禁继续未关闭。
## 2026年10月4日 最新候选升级与 SMTP 网络复核
本节依据当前提交、第一台 `8.137.23.95` 实机和 SMTP TLS 探测追加,之前的历史记录继续保留;范围仍限定为 Linux/Web,第二台 `45.136.13.241` 不安装本项目。
### 任务状态
- [✓] 当前代码提交 `9cd8ce3` 已完成 `gofmt`、`go test ./...`、`go vet ./...`、`git diff --check`,并已提交推送。
- [✓] 已生成 Linux-only 候选包 `release/production-candidate-20261004-9cd8ce3/Scert-20261004-V0.1.0`;manifest 标记 `source_dirty=false`、`trimpath=true`、`local_path_check=passed`,归档 SHA-256 为 `e7ad6fd9308c832aeb92763885ef5130cef5b5977c25f628a3d821b094fd7b5e`。
- [✓] 候选包已上传并按正式安装器部署到第一台;安装器先因运行服务 active 按门禁拒绝,停止 `Scert.service` 和 `Scert-storage.socket` 后按正式流程重试成功,未绕过安装器。
- [✓] 第一台 `/scert/scert` 与候选包主程序摘要一致;`config validate`、`nginx -t`、`Scert.service`、`Scert-storage.socket` 及严格 HTTPS `/readyz` 复核通过。
- [✓] SMTP 网络层已恢复:`smtp.cdis.cn` 解析为 `47.108.78.12`,587 STARTTLS 和 465 TLS 握手成功且证书校验通过;25 端口仍关闭。
- [!] 第一台配置中的 `notification.smtp_credential_ref` 仍为空且 `smtp_enabled=false`;尚未进行认证发信、收件箱到达、验证码或密码重置,不得把 TLS 握手当作邮件送达。
- [ ] 需要通过 Smail 正式授权流程取得正确 SMTP 凭据后,交互式录入第一台并完成真实通知投递。
- [ ] 取得有效 Scert 管理会话后,继续第二台正式 SSL 推送、`nginx -t`、reload、受控失败回滚、恢复指纹和幂等重试。
- [✓] 第二台清理结果保持通过;本轮未向第二台上传或安装本项目包。
- [!] 总体生产上线门禁仍未关闭。
### 当前执行顺序
1. `[~]` 取得并交互式录入正确 SMTP 敏感凭据;敏感值不写入参数、环境变量、日志、文档或仓库。
2. `[ ]` 只读核对 `config validate` 和凭据引用,发送真实系统通知并确认收件箱到达。
3. `[ ]` 完成本机 `Scert-admin` 验证码、重置、新密码登录及旧会话失效。
4. `[ ]` 在有效管理会话下执行第二台 SSL 推送及成功、失败、恢复、幂等矩阵。
5. `[ ]` 完成三数据库清库后的首次 Web、重启登录持久化、DNS/ACME 和最终公共 HTTPS/SNI 复审。
当前结论:第一台最新代码已完成 Linux 实机升级,SMTP 网络层已恢复,但认证凭据和有效管理会话仍是直接业务门禁;第二台继续保持不安装本项目。
## 2026年10月4日 前端全量回归补充
- [✓] 当前候选对应前端测试 `npm.cmd test` 已完成:338 项通过,0 失败、0 跳过、0 todo。
- [✓] 测试覆盖发布工具链、登录态恢复、部署结果、证书任务、首次向导、SMTP 校验、权限和用户管理等当前前端回归范围。
- [!] 前端全量回归仅证明本地行为,不替代第一台真实通知、受保护重置、第二台 SSL 推送回滚和公网验收。
## 2026年10月4日 当前现场复核:第二台清理通过与第一台业务门禁
本节以本次严格主机校验后的实机和浏览器证据为准;不覆盖历史记录。范围继续限定为 Linux/Web,Windows 不纳入本轮。
### 当前任务状态
- [✓] 第二台 `45.136.13.241` 无 Scert 进程、systemd 单元、专用监听、项目目录、安装临时目录、部署压缩包或归档;根文件系统限定范围未发现 Scert、Certimate、Certd 项目产物。
- [✓] 第二台 `nginx -t` 通过;既有业务证书、PMail、共享 MySQL、现有 Nginx 配置和受保护 `.scert-lock` 恢复目录未修改。
- [✓] 第一台 `8.137.23.95` 的 `Scert.service`、`Scert-storage.socket`、Nginx 均为 active,Scert 仅监听 `127.0.0.1:8443`,严格 HTTPS `/readyz` 返回 ready。
- [✓] 第一台 `/scert/scert config validate` 通过;脱敏通知状态为 `smtp.cdis.cn:587`、STARTTLS、系统通知用户名已配置。
- [!] 第一台 `smtp_enabled=false`,`smtp_credential_ref` 为空;未读取、记录或猜测 SMTP 密码。
- [!] 当前浏览器打开 `https://web.cdis.cn/` 显示 Smail 登录页,未形成可用于正式授权核对的管理会话;不能把历史页面状态当作当前凭据证据。
- [!] 第一台最近一次 `Scert-admin` 受保护操作因请求无效或已失效退出,未修改密码、数据库或配置。
- [!] 正式 SMTP 投递、验证码、本机重置、新密码登录、第二台 SSL 推送回滚矩阵和最终公网验收仍未完成。
### 下一步安全动作
1. 由有权限的操作人员登录 Smail 正式页面,或在第一台 root 受控终端执行 `/scert/scert config set-secret --key notification.smtp_password` 并在提示符中输入 SMTP 密码;敏感值不得发送到聊天、参数、环境变量、日志、文档或仓库。
2. 录入后只读执行 `config validate` 和凭据引用核对,再发送真实系统通知并确认收件箱到达。
3. SMTP 真实投递通过后,继续本机验证码、受保护重置、新密码登录和旧会话失效验证;取得有效管理会话后再执行第二台 SSL 推送及回滚。
当前结论:第二台清理目标已完成;整体 Linux 上线门禁仍未关闭,直接业务阻塞为第一台 SMTP 敏感凭据和有效管理会话。
## 2026年10月5日 Linux整改推进与上线任务清单
### 本轮已完成
- [✓] 提交并推送 `0788b6e`《完成Linux敏感输入安全整改》:SMTP 敏感值不得通过命令行参数传入,Linux 仅允许交互式终端隐藏输入,拒绝管道输入,并在退出时恢复终端状态。
- [✓] 后端 `go test -count=1 ./...` 通过,`go vet ./...` 通过。
- [✓] 前端 `npm.cmd test -- --run` 通过:338 项通过、0 失败、0 跳过、0 todo。
- [✓] 前端 `npm.cmd run build` 生产构建通过。
- [✓] Linux amd64 `scert` 与 `scert-admin` 交叉构建通过,CLI 测试编译通过。
- [✓] 第二台 `45.136.13.241` 继续保持无本项目部署包、无本项目实例和无专用监听;受保护 SSL 恢复锁未删除或改写。
### 当前上线任务状态
- [~] 第一台 `8.137.23.95`:待有权限人员在 root 受控终端交互录入 SMTP 敏感凭据;不得通过聊天、参数、环境变量、日志、文档或仓库传递。
- [ ] 第一台:只读执行 `config validate`,发送真实系统通知并确认收件箱到达。
- [ ] 第一台:完成验证码、本机受保护重置、新密码登录和旧会话失效验证。
- [ ] 第二台:取得有效管理会话后执行正式 SSL 推送、`nginx -t`、reload、受控失败回滚、恢复指纹和幂等重试。
- [ ] 完成三数据库清库后的首次 Web 初始化、重启登录持久化、DNS/ACME 正负向和最终公共 HTTPS/SNI 复审。
- [!] 以上实机证据未齐备前,Linux 总体生产上线门禁保持未通过;本地测试、构建、TLS 握手、页面可访问和 `/readyz` 均不替代生产验收。
### 当前结论
代码整改和本地回归已完成并推送。直接业务门禁仍是第一台 SMTP 敏感凭据、真实通知及受保护管理会话;第二台只承担 SSL 推送测试,不安装本项目。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日 第二台实时清理复核与 Linux 上线任务重排
### 需求清单
- [✓] 仅处理 Linux;第一台 `8.137.23.95` 用于部署测试,第二台 `45.136.13.241` 仅用于 SSL 推送测试。
- [✓] 第二台不安装、不保留本项目部署包,不影响 PMail、共享 MySQL、现有 Nginx、业务证书和受保护恢复锁。
- [✓] 清理后必须复核进程、服务、监听、项目目录和归档文件。
- [ ] 第一台真实通知、验证码、本机受保护重置、新密码登录和旧会话失效闭环。
- [ ] 第二台正式 SSL 推送、Nginx 重载、失败回滚、恢复指纹和幂等重试。
- [!] Linux 总体上线门禁在上述实机证据齐备前保持未通过。
### 第二台实时处理结果
- [✓] 通过已登记 SSH 主机指纹和受控 root 会话完成实时复核,未重新上传或安装 Scert。
- [✓] 删除残留的 `/run/scert-nginx`、`/run/scert-storage` 运行时目录及对应 systemd 传播目录;删除前确认无加载单元、无专用监听、无打开句柄。
- [✓] `/root`、`/tmp`、`/var/tmp`、`/opt`、`/srv`、`/etc`、`/usr/local`、`/var/lib`、`/var/log`、`/run` 和 `/ssl` 限定范围未发现本项目部署归档;`.tar`、`.tar.gz`、`.tgz`、`.zip` 扫描为空。
- [✓] 清理后无 Scert/Certimate/Certd 安装或加载单元,无 `8443`、`8080`、`9000` 专用监听;误匹配的当前检查命令不作为进程证据。
- [✓] `/ssl/vcer.cn`、三个受保护 `.scert-lock` 恢复目录、PMail、共享 MySQL 和现有 Nginx 均保留且未修改;`nginx -t` 通过。
### 当前任务列表
- [✓] 第二台项目数据及部署包清理完成,后续只允许通过正式 Web/API 流程建立最小 SSL 推送目标。
- [~] 第一台受控访问和 SMTP 敏感凭据交互录入。
- [ ] 第一台真实通知投递、收件箱到达、验证码和本机重置闭环。
- [ ] 第二台 SSL 推送与受控失败回滚矩阵。
- [!] 总体 Linux 生产验收。
本节不记录密码、授权码、Cookie、令牌或私钥内容;Windows 环境不在本轮范围。
## 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/Web 范围继续执行;Windows 环境不纳入本轮。
- [✓] 后端 `go test -p 1 -count=1 -timeout=12m ./...` 全部通过。
- [✓] 前端 `npm.cmd test -- --run` 通过:338 项通过,0 失败、0 取消、0 跳过、0 todo。
- [✓] 前端 `npm.cmd run build` 生产构建通过,`git diff --check` 通过。
- [✓] 第二台 `45.136.13.241` 继续保持清理完成;本轮未上传、未安装本项目,不修改 PMail、共享 MySQL、现有 Nginx 和受保护恢复锁。
- [!] 第一台 `8.137.23.95` 的严格主机校验 SSH 公钥认证仍不可用;单次受控密码认证返回拒绝,未继续猜测密码。
- [!] 当前浏览器邮件设置仍显示“凭据尚未配置”,不能把 SMTP 非敏感参数或 TLS 握手当作真实发信成功。
- [ ] 第一台真实通知、收件箱到达、验证码、本机受保护重置、新密码登录和旧会话失效仍未完成。
- [ ] 第二台正式 SSL 推送、`nginx -t`、重载、受控失败回滚、恢复指纹和幂等重试仍未完成。
- [!] Linux 总体生产上线门禁继续未通过。
### 本轮验收边界
本轮只证明当前源码回归和构建通过,以及第二台清理状态保持通过;不证明第一台 SMTP 认证、密码重置、第二台 SSL 推送回滚或公网最终 HTTPS/SNI 验收。任何密码、验证码、SMTP 凭据、Cookie、令牌和私钥均未写入文档、日志、参数或仓库。
## 2026年10月5日 最新 Linux 发布候选
- [✓] 基于提交 `3b41713` 重新生成 Linux-only 发布候选,目标为 `linux-amd64`,不处理 Windows。
- [✓] 发布清单确认 `source_dirty=false`、`local_path_check=passed`、交付范围为 Web 和服务端。
- [✓] 归档 SHA-256:`ed5c73f7a2b30ba6b46700b0785cf3324b6c11c38dcf70885a0b0aca00af39c6`,与 `manifest.json` 一致。
- [~] 候选包尚未部署到第一台;当前受控 SSH 认证和正式邮件凭据仍未满足部署验收条件。
- [!] 不把本地发布成功扩展为生产上线成功,Linux 总体生产门禁继续未通过。
## 2026年10月5日 第一台 Linux 候选包升级实测
### 本轮任务状态
- [✓] 通过严格主机指纹和受控 root 终端连接第一台 `8.137.23.95`,未使用不安全 SSH 或 TLS 绕过。
- [✓] 发布包上传到第一台临时目录后,远端归档 SHA-256 与本地清单一致;包内 `SHA256SUMS` 逐项校验通过。
- [✓] 升级前按官方流程创建停服备份 `/scert/backups/scert-20261005-102823.324971777`,包含配置、主密钥、加密凭据、SQLite 数据库和 manifest,目录权限为 `0700`。
- [✓] 使用 `install-linux.sh --source-dir` 完成第一台 Linux 安装升级;安装器未启动额外服务,未删除配置、数据库、证书或历史备份。
- [✓] 安装后二进制 SHA-256 与发布包内二进制一致;`config validate` 通过。
- [✓] `Scert.service`、`Scert-storage.socket` 已恢复运行;Scert 仅监听 `127.0.0.1:8443`,公网入口仍由 Nginx 提供。
- [✓] Nginx `nginx -t` 通过;严格 SNI HTTPS 访问 `/readyz` 返回 `200` 和 `{"service":"scert","status":"ready"}`。
- [!] 启动时发现历史中断部署事务仍需 `Scert-admin` 本机人工核查,系统已保留现场;未自动删锁、改写事务终态或伪造恢复成功。
- [ ] SMTP 敏感凭据、真实通知投递、验证码、本机受保护重置、新密码登录及旧会话失效仍未完成。
- [ ] 第二台 `45.136.13.241` 正式 SSL 推送、Nginx reload、可控失败回滚、恢复指纹和幂等重试仍未完成。
### 当前结论
第一台 Linux 服务已完成本轮候选包升级并通过服务、端口、配置和严格 HTTPS 就绪检查;历史部署事务、邮件闭环和第二台推送验收仍是生产上线门禁,不能据此宣布整体上线完成。
## 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 当前代码候选包升级复核
### 本轮任务状态
- [✓] 后端全量测试、`go vet` 和前端 338 项回归均通过;当前 Linux 候选源码提交为 `9cf01ad1ab45a5c42464cad4502fd66cd99a95ca`。
- [✓] 按正式发布脚本仅生成 `linux-amd64` 候选包;清单标记 `source_dirty=false`、`local_path_check=passed`,归档 SHA-256 为 `ff8773849ca404bb1b73e272aaa5a7de4ee9a395955c2cd20e29b40df68559b9`。
- [✓] 候选包 Linux 目录 22 项清单逐项校验通过,未包含 Windows、桌面端、动态库、证书私钥或其他敏感文件类型。
- [✓] 第一台 `8.137.23.95` 已按已登记 SSH 主机指纹上传并核对远端归档摘要;远端解包后的 `SHA256SUMS` 全部通过。
- [✓] 升级前按官方流程创建备份 `/scert/backups/scert-20261005-140005.579855102`,随后使用 `install-linux.sh --source-dir` 完成升级;没有操作第二台或删除第一台历史备份。
- [✓] 升级后二进制摘要与发布包一致;`config validate`、`nginx -t`、服务状态、监听边界和严格 HTTPS `/readyz` 均通过。
- [!] `scert-nginx` 仍为独立显式激活组件,普通安装器不安装,符合当前部署边界;第二台正式 SSL 推送尚未开始。
- [ ] SMTP 敏感凭据、真实通知投递、收件箱到达、验证码、本机受保护重置和旧会话失效仍未完成。
- [!] 历史中断事务仍需 `Scert-admin` 本机人工核查;禁止自动删锁、数据库直改或伪造恢复成功。
### 当前结论
第一台已运行当前代码的 Linux 候选包并通过升级后就绪复核;这只关闭第一台部署包和服务就绪检查,不关闭邮件、受保护重置、第二台 SSL 推送回滚及最终生产门禁。Windows 环境继续不在本轮范围。
## 2026年10月5日 22:22 Linux 双机只读复核与 Smail 等待状态
### 最新复核证据
- [✓] 浏览器独立页面仍打开 `https://web.cdis.cn/#/login?redirect=/`,当前显示 Smail 登录页,没有有效管理会话;未代填账号、密码或 SMTP 凭据。
- [✓] 第一台 `8.137.23.95` 通过已登记 SSH 主机指纹完成只读复核;`Scert.service` 和 `Scert-storage.socket` 为 active,`Scert-admin.service` 为 inactive,严格 HTTPS `/readyz` 返回 `{"service":"scert","status":"ready"}`。
- [✓] 第二台 `45.136.13.241` 通过只读复核确认 Scert 服务、存储 socket、管理服务和运行进程均不存在;限定目录未发现本项目部署包残留,`/ssl/scert` 不存在;未修改 PMail、MySQL、Nginx、业务证书或 SSH 边界。
- [~] 等待用户完成 Smail 系统通知邮件配置;完成后继续真实投递、收件箱到达和验证码闭环。
- [!] 邮件、受保护重置、第二台 SSL 正式推送与回滚尚未完成,Linux 总体生产门禁继续保持未关闭。
## 2026年10月5日 Linux 上线冲刺续接状态
### 本轮任务清单
- [✓] 已重新阅读本清单并确认本轮只处理 Linux/Web;第一台 `8.137.23.95` 仅用于本项目部署测试,第二台 `45.136.13.241` 仅用于 SSL 推送测试,不安装本项目。
- [✓] 当前工作区 `main` 干净并与远程同步;本轮基线为提交 `63c2643`,已完成修改前推送复核。
- [✓] 后端 `go test -p 1 -count=1 -timeout=15m ./...`、`go vet ./...`、前端 `npm.cmd test -- --run`(338 项)均通过,`git diff --check` 通过。
- [✓] 已按正式发布脚本仅生成 `linux-amd64` 候选包:`release\production-candidate-20261005-63c2643-linux\Scert-20261005-V0.1.0`;`manifest.json` 标记 `source_dirty=false`、`local_path_check=passed`、`desktop_requested=false`。
- [~] 候选包待按正式备份和安装器流程升级第一台;升级前必须重新核对 SSH 主机指纹、服务状态和当前备份边界。
- [✓] 第二台项目部署包和运行实例清理状态沿用上一轮实机复核结果;本轮未上传、未安装、未删除第二台业务数据。
- [~] Scert-admin 受保护交互终端保持前台等待人工输入验证码;验证码不由助手代填、不写入文档或日志。
- [~] 用户已反馈 Smail 发信配置完成,仍需通过第一台真实配置读取、测试邮件、收件箱到达和验证码送达闭环确认。
- [ ] 完成第一台本机重置、新密码登录及旧会话失效验证。
- [ ] 完成第二台正式 SSL 推送、Nginx 校验与重载、受控失败回滚、恢复指纹和幂等重试。
- [ ] 完成三数据库首次 Web、DNS/ACME 正负向矩阵及最终公共 HTTPS/SNI 验收。
- [!] Linux 总体生产上线门禁暂未关闭;本地测试、发布包生成和 `/readyz` 均不能替代真实邮件、重置和 SSL 推送验收。
### 本轮发布证据
- 发布包归档:`Scert-20261005-V0.1.0-linux-amd64.tar.gz`。
- 发布包 SHA-256:`195df566297830bf86ffa15a96df546f37a037ea6da97f88f4a100e7b493c528`。
- 发布目标仅为 `linux-amd64`,交付范围为 Web 与服务端;没有构建 Windows 或桌面端。
- 本轮未向第二台上传任何发布包,不以第二台 SSL 推送前置清理结果冒充正式推送验收。
### 下一步执行顺序
1. 保持 Scert-admin 前台终端,等待人工验证码输入完成并只读取流程结果。
2. 使用已核验的第一台受控入口,按备份、上传摘要校验、停止必要单元、安装器升级、恢复服务、严格 HTTPS 验证顺序部署候选包。
3. 读取第一台正式通知配置并发送受控测试邮件,确认收件箱到达后再进行验证码重置闭环。
4. 仅在有效管理会话和证书目标权限均确认后,执行第二台 SSL 推送测试;第二台不安装 Scert。
5. 对失败场景执行产品提供的回滚和恢复核查,不手工删除锁、不直改数据库、不伪造成功。
## 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] 验证码邮件改为中文卡片样式,突出验证码、两分钟有效期及非本人操作警告;保持绑定邮箱单独投递,不改变认证流程。
- [x] 失败、错误及未知任务不再因服务器成功数量而误报“已完成”。
- [x] 将恢复安全提醒独立于摘要截断和部署明细开关,明确“勿直接重试或删除锁”;覆盖真实恢复状态、结构化失败码及历史错误文本。
- [x] 域名缺失时优先显示证书域名,不再使用内部记录编号;修复正文样式属性引号,补充编码和视口声明。
- [✓] 通知包回归、后端全量测试及静态检查通过,前端338项回归通过。验证在本机构建环境执行,未以此替代 Linux 实机或邮件客户端验收。
- [✓] 代码提交 `b55688c` 已推送;从干净源码构建 Linux amd64 候选包,24项发布清单文件及归档摘要逐项核对通过。
- [!] 第一台一次严格主机校验 SSH 密码认证被拒绝,未执行远程命令或升级;未重复猜测密码。本机访问 `odacm.cn` 的严格 TLS 握手失败,本机解析为 `198.18.0.27`,不能据此判断服务器服务已停止。
- [ ] 新包第一台升级、真实邮件收件及样式复审、本机重置、新密码登录和旧会话失效仍待完成。
- [ ] 第二台仅 SSL 正式推送与回滚、三数据库首次 Web、DNS/ACME 和公共 HTTPS/SNI 验收仍待完成。本轮未操作第二台。
### 发布候选
- 路径:`release/production-candidate-20261006-b55688c-linux/Scert-20261006-V0.1.0-linux-amd64.tar.gz`。
- SHA-256:`92d6b339e1f673d80a725b8290fd3ff9b6be49435545099710b86a555e450aca`。
- 来源:`b55688c0554757c75b3656333151d3fd65152013`,`source_dirty=false`,仅 `linux-amd64`;本包尚未部署。
保持 Linux 总体上线门禁未关闭;不清空生产数据库,不删除恢复锁,不中断用户可能正在进行的验证码交互。
### 同日浏览器入口补充核查
- [✓] 已打开正式 Scert 登录页,浏览器同源、禁用缓存请求 `/readyz` 返回200及 `{"service":"scert","status":"ready"}`;浏览器访问路径可用。
- [!] 本机命令行 TLS 与浏览器结果不同,前述命令行失败不代表远端服务停止;SSH认证失败、新包未部署及其他生产门禁状态不变。
## 2026年10月6日最新远端边界复核
- [✓] 第一台仍运行已发布网页与 Scert 服务,正确域名 SNI 下的 readiness 检查通过。
- [✓] 第二台仅承担 SSL 推送测试边界;本轮限定范围内没有本项目部署包、安装目录或 Scert 服务残留,且没有上传新包。
- [✓] 第二台现有 PMail 与 `xuans.vcer.cn` 站点保持原状,未执行删除、证书覆盖、Nginx 重载或数据库操作。
- [!] 第二台历史 `.scert-lock` 目录继续保留,必须先取得可信恢复基线和正式处置证据,不能为了“清理”而删除锁或伪造旧指纹。
## 2026年10月6日 当前 Linux 候选包部署与邮件模板状态
### 当前有效基线
- 当前源码提交:`b2d9eb6878d538414c9af7a0a54fe130cec29e22`,工作区干净,构建目标为 `linux-amd64`。
- 发布归档:`release/production-candidate-20261006-b2d9eb6-linux/Scert-20261006-V0.1.0-linux-amd64.tar.gz`。
- 归档 SHA-256:`2b5b5260a485f6a6e965c6eae5c4c29dce2100711126ff3bff20185eb1519311`;包内清单与 `SHA256SUMS` 已逐项校验。
- Manifest 已确认 `source_dirty=false`、`delivery_scope=web, server`、`desktop_requested=false`;归档不包含桌面端、Wails 或源码。
- 邮件模板已统一为中文紫色卡片样式:包含 UTF-8 与视口声明、640px 白色卡片、紫色标题栏、内容区、浅灰页脚、验证码醒目显示、失效时间、安全提示及失败摘要;动态内容保持 HTML 转义,纯文本正文同步保留。
### 第一台生产测试服务器 `8.137.23.95`
- [✓] 已使用已登记 SSH 主机密钥完成严格登录和升级;未关闭主机密钥校验,未使用不安全 TLS/SSH 绕过。
- [✓] 已通过官方 Linux 安装流程安装当前候选包,`Scert.service`、`Scert-storage.socket`、`nginx` 均为 active。
- [✓] 正确 SNI 下访问 `/readyz` 返回 `{"service":"scert","status":"ready"}`;Web CSS 已通过 HTTPS 正常返回。
- [✓] 远端 `scert`、`scert-admin`、`scert-storage` 二进制摘要与当前本地候选包一致。
- [!] 历史恢复事务仍缺少可信旧文件指纹或完整基线;不得自动重试、删除锁、伪造恢复成功或修改历史终态。
### 第二台 SSL 推送测试服务器 `45.136.13.241`
- [✓] 仅保留 SSL 推送测试边界;未上传、未安装、未运行 Scert,也未留下本项目部署包、安装目录或 systemd 单元。
- [✓] 现有 Nginx、MySQL、PMail 及 `xuans.vcer.cn` 站点未被覆盖、重载或修改。
- [!] 历史 `.scert-lock` 与恢复事务仍保留;必须先建立可信恢复基线并经过正式处置流程,不能为“清理”而删除锁或直接重试。
### 尚未关闭的生产门禁
- [ ] 浏览器登录后的账号名和中文权限显示仍需现场复核。
- [ ] SMTP 真实收件、全部邮件客户端样式及真实任务通知仍需验收;配置存在不等于收件成功。
- [ ] 可输入终端中的受保护验证码重置、新密码登录及旧会话失效仍需验收。
- [ ] 第二台隔离 SSL 正式推送、失败回滚和幂等重试仍未执行。
- [ ] 三数据库首次 Web 流程、DNS/ACME 正负向验证及最终公网 HTTPS/SNI 仍未完成。
本章节为当前有效状态补充,不删除或覆盖历史记录;Linux 总体生产门禁保持未关闭。
## 2026年10月6日 Web 登录与角色显示实机验收
- [✓] 正式 HTTPS 页面 `https://odacm.cn/login` 登录 `xuans` 成功,进入管理后台。
- [✓] 管理后台右侧明确显示当前登录账号 `xuans` 和中文权限 `超级管理员`,不再是空白或英文角色值。
- [✓] 用户管理页核验到 `xuans`(超级管理员)、`管理`(管理员)和 `普通用户`(普通用户)三个账号均为正常状态。
- [✓] `管理` 登录成功,右侧显示中文权限 `管理员`;登录后仅出现管理角色可用的管理台范围。
- [✓] `普通用户` 登录成功,进入用户中心,右侧显示中文权限 `普通用户`,并未进入超级管理员管理台。
- [✓] 系统设置的邮件通知页显示 SMTP 已启用,使用 `smtp.cdis.cn:587`、STARTTLS,系统通知凭据已配置,收件人为 `likb_blue@163.com`;密码未回显。
- [ ] 上述配置仍不能替代真实收件箱到达、邮件客户端渲染和验证码流程验收,仍需保留对应门禁。
本节证据来自正式 HTTPS 页面实时操作;不记录密码、验证码、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`。
- [!] 当前验收环境访问 `https://web.cdis.cn/` 和 `/login` 返回 `502 Bad Gateway`;使用公开 IP 保持 `web.cdis.cn` SNI 访问仍为 502。
- [ ] 因邮件 Web 入口当前不可达,真实收件箱到达和客户端样式暂不能验收;SMTP 配置存在不等于邮件已到达。
本条仅记录入口证据,不使用不安全 TLS 绕过,不修改 Smail、第二台服务器或 Scert 配置。
## 2026年10月6日 SMTP 传输层只读探测
- [✓] 公共 DNS 查询确认 `smtp.cdis.cn` 解析到 `47.108.78.12`。
- [✓] 当前验收环境对 TCP `587` 端口的连通性探测成功。
- [ ] STARTTLS 协商、SMTP 认证、真实发送、收件箱到达和邮件客户端渲染仍未完成;端口可达不等于发信成功。
## 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、不上传或保留本项目部署包。
- [✓] 正式页面右侧已显示当前登录账号 `xuans` 和权限 `超级管理员`;用户管理页的管理员、超级管理员和普通用户记录均可见且状态正常。
- [✓] 系统设置的邮件通知页读取到 SMTP 已启用,主机为 `smtp.cdis.cn`,端口 `587`,连接模式为 STARTTLS,系统通知用户名和收件人已配置;凭据状态显示已配置,密码未读取、未记录。
- [✓] `web.cdis.cn` 严格 HTTPS 访问返回 `200`;`smtp.cdis.cn:465` 隐式 TLS 和 `smtp.cdis.cn:587` STARTTLS 均完成严格 TLS 握手,未使用 `-k`、`--insecure` 或强制 IP TLS。
- [✓] Smail 远端 `smail.service` 当前为 active,25、80、443、465、587 监听正常;浏览器页面已在服务恢复后重新加载。
- [!] Smail 日志在本轮之前仍存在一次来自第一台的 SMTP 客户端认证失败记录;“凭据已配置”不等于真实发信成功,必须以验证码邮件到达和收件内容为最终证据。
- [~] 已打开并保持可见的第一台 SSH 管理终端;等待管理员在终端执行 `systemctl start Scert-admin`,选择密码重置流程并在同一终端输入验证码。验证码和新密码不写入聊天、文档、命令参数或日志。
- [ ] 完成真实系统通知邮件投递、收件箱到达、中文 HTML 卡片和纯文本正文复核。
- [ ] 完成受保护验证码重置、新密码登录和旧会话失效验证。
- [ ] 在第二台隔离测试站点完成正式 SSL 推送、严格 HTTPS 校验、失败回滚、恢复指纹和幂等重试;不删除历史部署锁。
- [ ] 完成三数据库首次 Web 流程、重启持久化、DNS/ACME 正负向验证及最终公网 HTTPS/SNI 验收。
- [!] Linux 总体生产上线门禁仍未关闭;未完成的项目不得按“配置存在”或“端口可达”标记为上线成功。
### 本轮执行边界
- 本轮未修改源码、未重新构建、未重启 Scert、未清理数据库,未删除证书、备份、部署锁或业务文件。
- 第二台继续保持“仅 SSL 推送测试”边界;已有无本项目部署包和安装目录的实机证据继续有效,正式推送前仍须重新核对目标站点基线。
- 后续若需要修正邮件凭据,只允许由用户在正式配置页输入,助手不读取、猜测或记录 SMTP 密码。
### 13时45分第二台现场复核补充
- [✓] 第二台 `45.136.13.241` 当前 `nginx`、`mysql`、`pmail` active;`nginx -t` 通过,公网仅由既有 Nginx 提供 80/443,MySQL 仍为回环监听。
- [✓] 第二台 `Scert`、`Scert-storage.socket`、`Scert-admin` 均 inactive;`/scert`、`/opt/scert`、`/var/lib/scert`、`/tmp/scert`、`/root/scert` 均不存在,限定临时目录未发现本项目归档或部署包。
- [✓] 既有站点仍为 `xuans.vcer.cn`,证书路径仍为 `/ssl/vcer.cn/fullchain.crt`;本次未修改 Nginx、业务证书、数据库或业务文件。
- [!] 第二台尚未执行正式 SSL 推送;正式推送前必须建立可核验的目标站点基线,并保留可控失败和恢复证据。
### 13时47分邮件模板回归复核
- [✓] 在当前工作区执行 `go test ./internal/notification -count=1`,通知模板、验证码邮件、失败摘要、HTML 转义和安全提示回归通过。
- [✓] 当前代码仍同时生成纯文本正文和 HTML 正文;失败通知突出“证书续期未完成”、失败服务器、证书域名不匹配和人工核查提示,不把底层 TLS 长错误直接作为用户摘要。
- [!] 本地回归不等于公网 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 推送和其余生产门禁仍待完成。