补齐四十四项整改规格并加固仓库产物边界
This commit is contained in:
parent
61b8cac7a3
commit
fab98d1069
54
.gitignore
vendored
54
.gitignore
vendored
@ -23,3 +23,57 @@ artifacts/*
|
||||
*.key
|
||||
*.p12
|
||||
*.pfx
|
||||
|
||||
# 通用构建与发布产物;公开测试证书不是私钥,不能整体忽略 PEM。
|
||||
*.exe
|
||||
*.dll
|
||||
*.so
|
||||
*.dylib
|
||||
*.tar.gz
|
||||
*.tgz
|
||||
*.zip
|
||||
node_modules/
|
||||
dist/
|
||||
coverage/
|
||||
.vite/
|
||||
|
||||
# 临时补丁、编辑器恢复文件与浏览器运行缓存。
|
||||
*.patch
|
||||
*.orig
|
||||
*.rej
|
||||
*.tmp
|
||||
*.swp
|
||||
__pycache__/
|
||||
*.pyc
|
||||
.cache/
|
||||
.pytest_cache/
|
||||
.playwright/
|
||||
playwright-report/
|
||||
test-results/
|
||||
browser-profile/
|
||||
chrome-profile/
|
||||
|
||||
# 数据库旁路文件与导出;正式迁移 SQL 必须继续纳入源码。
|
||||
*.db-wal
|
||||
*.db-shm
|
||||
*.db-journal
|
||||
*.sqlite-wal
|
||||
*.sqlite-shm
|
||||
*.sqlite-journal
|
||||
*.sqlite3-wal
|
||||
*.sqlite3-shm
|
||||
*.sqlite3-journal
|
||||
*.dump
|
||||
|
||||
# 本地环境凭据与常见 SSH 私钥;示例文件只允许使用占位值。
|
||||
.env
|
||||
.env.*
|
||||
!.env.example
|
||||
!.env.sample
|
||||
id_rsa
|
||||
id_dsa
|
||||
id_ecdsa
|
||||
id_ed25519
|
||||
*.private.pem
|
||||
*-key.pem
|
||||
*_key.pem
|
||||
|
||||
14
artifacts/README.md
Normal file
14
artifacts/README.md
Normal file
@ -0,0 +1,14 @@
|
||||
# 测试证据目录
|
||||
|
||||
此目录承载按任务、源码提交和日期分组的本地测试输出。除本说明外,内容均不纳入源码提交。
|
||||
|
||||
证据至少包含:任务编号、验证层级、源码提交、候选包 SHA256、工具版本、环境标识、执行命令、起止时间、退出码、观察结果及尚未覆盖的项目。
|
||||
|
||||
- 自动化、隔离环境、生产实机和复审证据分别归档,不以单一“通过”替代不同层级。
|
||||
- 对外可复核结论写入 `doc/` 中文记录,并指明证据定位;未上传的本地路径不视为他人已取得证据。
|
||||
- 原始日志和截图写入前必须脱敏。禁止保存密码、AccessKeySecret、Token、Cookie、SSH/证书私钥、生产数据库导出或含凭据的请求体。
|
||||
- 数据库备份和主密钥备份应由产品的受保护存储保存,不是本目录的测试附件。
|
||||
- 验收完成不自动删除历史证据;清理需另外取得授权。
|
||||
- 临时辅助脚本不能充当验收依据。优先使用正式产品入口、仓库已有测试与原生命令。
|
||||
|
||||
目录边界见 `doc/仓库目录与产物边界说明.md`。
|
||||
159
backend/internal/releasearchive/source_boundary_test.go
Normal file
159
backend/internal/releasearchive/source_boundary_test.go
Normal file
@ -0,0 +1,159 @@
|
||||
package releasearchive
|
||||
|
||||
import (
|
||||
"bytes"
|
||||
"os"
|
||||
"os/exec"
|
||||
"path/filepath"
|
||||
"strings"
|
||||
"testing"
|
||||
)
|
||||
|
||||
func TestRepositoryIgnoreBoundaries(t *testing.T) {
|
||||
root, sandbox := repositoryIgnoreFixture(t)
|
||||
ignored := []string{
|
||||
"scert.exe", "nested/scert.exe", "nested/lib.dll", "nested/lib.so", "nested/lib.dylib",
|
||||
"Scert.tar.gz", "nested/release.tgz", "nested/release.zip",
|
||||
".runtime/config.json", "nested/.runtime/state.json", ".deploy-stage/config.json",
|
||||
"build/release/manifest.json", "release/candidate/manifest.json", "artifacts/task/result.json",
|
||||
"backend/bin/scert", "backend/build/scert", "frontend/node_modules/pkg/index.js",
|
||||
"desktop/frontend/node_modules/pkg/index.js", "nested/dist/index.html", "frontend/dist-release-review/index.html",
|
||||
"desktop/frontend/dist/index.html", "desktop/bin/ScertDesktop", "desktop/build/app", "desktop/frontend/wailsjs/runtime.js",
|
||||
"nested/coverage/report.json", "nested/.vite/cache.json", "nested/app.log",
|
||||
"fix.patch", "nested/fix.patch", "nested/file.orig", "nested/file.rej", "nested/file.tmp", "nested/file.swp",
|
||||
"nested/__pycache__/test.pyc", "nested/.pytest_cache/state", "nested/.cache/state",
|
||||
"nested/.playwright/state", "nested/playwright-report/index.html", "nested/test-results/result.json",
|
||||
"browser-profile/Default/Cookies", "chrome-profile/Default/Cookies",
|
||||
"nested/data.db", "nested/data.sqlite", "nested/data.sqlite3", "nested/data.dump",
|
||||
"nested/data.db-wal", "nested/data.db-shm", "nested/data.db-journal",
|
||||
"nested/data.sqlite-wal", "nested/data.sqlite-shm", "nested/data.sqlite-journal",
|
||||
"nested/data.sqlite3-wal", "nested/data.sqlite3-shm", "nested/data.sqlite3-journal",
|
||||
".env", "nested/.env.production", "nested/tls.key", "nested/cert.p12", "nested/cert.pfx",
|
||||
"nested/id_rsa", "nested/id_dsa", "nested/id_ecdsa", "nested/id_ed25519",
|
||||
"nested/tls.private.pem", "nested/tls-key.pem", "nested/tls_key.pem",
|
||||
}
|
||||
kept := []string{
|
||||
".gitignore", "backend/go.mod", "backend/go.sum", "backend/cmd/scert/main.go",
|
||||
"backend/internal/database/migrations/sqlite/0001_initial.sql",
|
||||
"backend/internal/certificate/trust/staging-x1.pem", "backend/internal/certificate/trust/staging-x2.pem",
|
||||
"backend/internal/certificate/trust/staging-ye.pem", "backend/internal/certificate/trust/staging-yr.pem",
|
||||
"backend/internal/releasearchive/source_boundary_test.go", "frontend/package-lock.json",
|
||||
"frontend/src/views/Login/Login.vue", "frontend/src/views/Login/Login.test.js",
|
||||
"deploy/install-linux.sh", "deploy/install-windows.ps1", "deploy/tests/install-linux-test.py",
|
||||
"desktop/main.go", "build/README.md", "build/build-release.ps1",
|
||||
"release/README.md", "artifacts/README.md", "tests/README.md", "scripts/README.md",
|
||||
"tests/example_test.go", "scripts/example.go", ".env.example", "nested/.env.sample",
|
||||
}
|
||||
// 忽略规则不能自动移出已跟踪产物,必须另外核对当前索引。
|
||||
command := repositoryGitCommand(root, "ls-files", "-z")
|
||||
output, err := command.Output()
|
||||
if err != nil {
|
||||
t.Fatalf("读取当前源码索引失败:%v", err)
|
||||
}
|
||||
var tracked []string
|
||||
for _, path := range bytes.Split(output, []byte{0}) {
|
||||
if len(path) != 0 {
|
||||
tracked = append(tracked, string(path))
|
||||
}
|
||||
}
|
||||
paths := append(append(append([]string{}, ignored...), kept...), tracked...)
|
||||
actual := repositoryIgnoredPaths(t, sandbox, paths)
|
||||
for _, path := range ignored {
|
||||
t.Run("ignored/"+path, func(t *testing.T) {
|
||||
if !actual[path] {
|
||||
t.Errorf("产物或敏感文件未被忽略:%s", path)
|
||||
}
|
||||
})
|
||||
}
|
||||
for _, path := range kept {
|
||||
t.Run("kept/"+path, func(t *testing.T) {
|
||||
if actual[path] {
|
||||
t.Errorf("正式源码或说明被误忽略:%s", path)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
for _, path := range tracked {
|
||||
if actual[path] {
|
||||
t.Errorf("当前索引仍包含应排除文件:%s", path)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func repositoryIgnoreFixture(t *testing.T) (string, string) {
|
||||
t.Helper()
|
||||
if _, err := exec.LookPath("git"); err != nil {
|
||||
t.Fatal("源码边界测试需要 Git,不能跳过后视为通过")
|
||||
}
|
||||
root, err := filepath.Abs(filepath.Join("..", "..", ".."))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
data, err := os.ReadFile(filepath.Join(root, ".gitignore"))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
sandbox := t.TempDir()
|
||||
command := repositoryGitCommand(sandbox, "init", "--quiet")
|
||||
if output, err := command.CombinedOutput(); err != nil {
|
||||
t.Fatalf("初始化隔离 Git 仓库失败:%v\n%s", err, output)
|
||||
}
|
||||
if err := os.WriteFile(filepath.Join(sandbox, ".gitignore"), data, 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
// 子目录例外也参与核对,防止后续规则重新放行根级禁止的产物。
|
||||
output, err := repositoryGitCommand(root, "ls-files", "-z", "--", "*.gitignore").Output()
|
||||
if err != nil {
|
||||
t.Fatalf("读取子目录忽略规则失败:%v", err)
|
||||
}
|
||||
for _, path := range bytes.Split(output, []byte{0}) {
|
||||
if len(path) == 0 || string(path) == ".gitignore" {
|
||||
continue
|
||||
}
|
||||
data, err := os.ReadFile(filepath.Join(root, string(path)))
|
||||
if err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
destination := filepath.Join(sandbox, string(path))
|
||||
if err := os.MkdirAll(filepath.Dir(destination), 0o700); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if err := os.WriteFile(destination, data, 0o600); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
}
|
||||
return root, sandbox
|
||||
}
|
||||
|
||||
func repositoryIgnoredPaths(t *testing.T, sandbox string, paths []string) map[string]bool {
|
||||
t.Helper()
|
||||
// 使用空字节分隔批量路径,既兼容空格和中文,也避免逐文件启动 Git。
|
||||
command := repositoryGitCommand(sandbox, "check-ignore", "--no-index", "--stdin", "-z")
|
||||
command.Stdin = strings.NewReader(strings.Join(paths, "\x00") + "\x00")
|
||||
output, err := command.CombinedOutput()
|
||||
if err != nil {
|
||||
if exit, ok := err.(*exec.ExitError); !ok || exit.ExitCode() != 1 {
|
||||
t.Fatalf("检查忽略规则失败:%v\n%s", err, output)
|
||||
}
|
||||
}
|
||||
result := make(map[string]bool)
|
||||
for _, path := range bytes.Split(output, []byte{0}) {
|
||||
if len(path) != 0 {
|
||||
result[string(path)] = true
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
func repositoryGitCommand(directory string, arguments ...string) *exec.Cmd {
|
||||
command := exec.Command("git", append([]string{"-c", "core.excludesFile=" + os.DevNull, "-c", "init.templateDir="}, arguments...)...)
|
||||
command.Dir = directory
|
||||
// 不继承调用者指定的仓库、索引、配置或全局排除文件。
|
||||
for _, value := range os.Environ() {
|
||||
if !strings.HasPrefix(strings.ToUpper(value), "GIT_") {
|
||||
command.Env = append(command.Env, value)
|
||||
}
|
||||
}
|
||||
command.Env = append(command.Env, "GIT_CONFIG_NOSYSTEM=1", "GIT_CONFIG_GLOBAL="+os.DevNull)
|
||||
return command
|
||||
}
|
||||
@ -1,5 +1,7 @@
|
||||
# Scert 开发任务清单
|
||||
|
||||
> 2026-09-27 任务规格:完整 44 项及六阶段验收规范见《整改任务规格与验收约定》和《Scert整改任务执行清单》。以下历史勾选不替代当前整改状态,不把旧测试结果当成新增需求已经实现。
|
||||
|
||||
> 2026-09-27 范围调整:本文件保留早期开发历史,当前执行以《Scert整改合并优化清单》和《Scert整改任务执行清单》为准。正式交付仅为 Web 和 Windows/Linux 服务端;本文件中的 Wails 桌面窗口、托盘、桌面更新、桌面配置和桌面 UI 测试均退出正式开发及验收范围,不再作为未完成交付项。CLI 限定为初始化及服务运维,不另建业务管理界面。
|
||||
|
||||
> 同日 CLI 调整:下文 `domain`、`server`、`ssh-key`、`renew`、`deploy` 等业务命令及其测试结果仅为历史记录,当前正式入口已停用,请使用 Web;详见《命令行运维范围说明》。
|
||||
|
||||
@ -15,6 +15,8 @@
|
||||
5. 不将密码、RAM 密钥、Token、私钥、真实证书或 Cookie 写入代码、文档、日志和 Git。
|
||||
6. 每个任务完成后先标记为 `[x]`,复审和对应范围的验收证据齐全后才能标记为 `[✓]`。
|
||||
|
||||
逐项规格入口:《整改任务规格与验收约定.md》。P0/P1/P2/P3 分别见《基础整改任务规格.md》《核心能力任务规格.md》《运维验收任务规格.md》《增强能力任务规格.md》,共 44 项;每项具备全部原定字段及独立六阶段状态。汇总状态与规格同步更新,原始清单保留为需求基准。
|
||||
|
||||
## 二、当前基线证据
|
||||
|
||||
| 项目 | 当前事实 | 证据或命令 | 结论 |
|
||||
@ -34,8 +36,8 @@
|
||||
| 编号 | 状态 | 任务 | 当前问题 | 下一步交付 | 验证证据 |
|
||||
|---|---:|---|---|---|---|
|
||||
| P0-01 | [x] | 明确产品范围 | 正式发布仅含 Web/服务端,桌面源码保留;CLI 已收敛且实际 Windows 产物验证通过 | 等待最终复审;Windows/Linux 实机安装仍归对应验收项 | 双平台归档及 SHA256、独立克隆、命令树及实际退出码 |
|
||||
| P0-02 | [~] | 建立完整任务清单 | 已覆盖 44 项,逐项依赖、涉及文件和具体实机步骤仍需补充 | 持续维护状态、证据和复审结果 | 本文件提交记录 |
|
||||
| P0-03 | [~] | 整理源码、构建产物和部署产物 | 独立克隆无桌面二进制和 dist,正式构建通过;根级归档及通用临时文件忽略规则仍需补齐 | 补齐全仓库忽略边界、发布及证据目录说明,保留本地历史文件 | `git ls-files`、`git check-ignore`、独立克隆发布验证 |
|
||||
| P0-02 | [~] | 建立完整任务清单 | 44 项逐项规格已补齐,字段、六阶段和汇总状态结构核对通过 | 完成引用及独立克隆复核后标记待复审,持续维护证据 | 四份规格及统一验收约定、结构核对结果 |
|
||||
| P0-03 | [~] | 整理源码、构建产物和部署产物 | 全仓库规则和目录说明已补齐;隔离 Git 忽略测试通过,子目录规则补充待再测 | 当前提交独立克隆复核,保留现有文件 | 正式 Go 边界回归、索引审查、独立克隆 |
|
||||
| P0-04 | [~] | 统一开发和构建版本 | 模块实际使用 Go `1.26.6`,不存在此前误报的版本阻塞;历史文档仍需统一 | 统一模块、构建说明、锁文件和验收机版本记录 | 版本矩阵、构建日志 |
|
||||
| P0-05 | [!] | 确认数据库正式支持矩阵 | 三种数据库均有代码,但 README、文档和实机证据口径不完全一致 | 明确 SQLite、MySQL、PostgreSQL 的正式级别、版本和迁移回滚要求 | 三数据库迁移、备份恢复和连接测试 |
|
||||
| P0-06 | [~] | 建立统一领域模型 | 已有域名、证书、任务、服务器等实体,项目和部署关联仍需审查 | 补齐资源关系图、外键/归属和任务关联 | 模型文档、迁移检查、接口测试 |
|
||||
@ -105,8 +107,8 @@
|
||||
|
||||
## 八、下一轮优先顺序
|
||||
|
||||
1. 补齐 P0-02 中全部 44 项的依赖、涉及文件、验证命令、实机步骤和复审字段,不能只有汇总表。
|
||||
2. 完成 P0-03 全仓库忽略边界和发布/证据目录说明;正式范围和独立克隆构建已验证,桌面源码及本地文件保留。
|
||||
1. 对已补齐的 P0-02 全部 44 项规格完成引用与独立克隆复核,保持状态、依赖及证据一致。
|
||||
2. 对 P0-03 全仓库及子目录忽略规则完成正式回归和当前提交独立克隆复核,保留桌面源码及本地历史产物。
|
||||
3. 继续 P0-04 版本/安装策略统一及 P0-05 三数据库迁移恢复的实际验证。
|
||||
4. 继续定位 SSH 公钥自动部署实机失败阶段,完成密码回退和密钥登录双路径验收。
|
||||
5. 将生产验收门禁与当前远程部署、DNS、HTTPS 和 ACME 证据逐项对应。
|
||||
|
||||
51
doc/仓库目录与产物边界说明.md
Normal file
51
doc/仓库目录与产物边界说明.md
Normal file
@ -0,0 +1,51 @@
|
||||
# 仓库目录与产物边界说明
|
||||
|
||||
## 一、源码和产物分离
|
||||
|
||||
| 目录 | 用途 | Git 边界 |
|
||||
|---|---|---|
|
||||
| `backend/` | Go 服务端、运维入口、就近单元测试 | 源码、模块锁和迁移纳入;运行数据、二进制排除 |
|
||||
| `frontend/` | Web 页面、页面旁测试和依赖锁 | 源码和锁文件纳入;依赖、构建及覆盖率输出排除 |
|
||||
| `desktop/` | 范围外历史源码 | 保留源码;二进制和 dist 排除,不进入正式发布 |
|
||||
| `deploy/` | 安装、卸载、服务模板和正式部署测试 | 脚本、模板及测试纳入;远程临时数据排除 |
|
||||
| `build/` | 发布构建入口及本地构建工作目录 | 仅构建脚本和说明纳入,其余产物排除 |
|
||||
| `doc/` | 中文需求、设计、操作说明和脱敏验收结论 | 文档纳入,不嵌入凭据和数据库内容 |
|
||||
| `tests/` | 正式跨模块测试 | 测试源码纳入;不强制迁移模块旁既有测试 |
|
||||
| `scripts/` | 经审查的开发辅助工具 | 当前仅说明;禁止新增临时脚本替代验收 |
|
||||
| `release/` | 可分发候选包 | 仅说明纳入,包和 manifest 留本地或发布存储 |
|
||||
| `artifacts/` | 脱敏测试输出与证据 | 仅说明纳入,完整结果单独留存 |
|
||||
| `.runtime/`、`.deploy-stage/` | 本机运行与部署暂存 | 全部排除 |
|
||||
|
||||
已有发布目录仍可位于 `build/`。`release/` 是分发边界,不要求复制或删除历史包。本次整理不物理删除现有文件。
|
||||
|
||||
## 二、忽略规则与例外
|
||||
|
||||
仓库 `.gitignore` 覆盖各层级的可执行文件、归档、依赖、dist、日志、临时补丁、浏览器常用缓存目录、数据库和旁路文件、环境凭据及常见私钥名。自定义浏览器用户目录必须置于 `.runtime/`,远端下载文件必须置于 `.deploy-stage/`,避免凭文件名猜测遗漏。
|
||||
|
||||
不可整体忽略 `*.pem` 或 `*.sql`:`backend/internal/certificate/trust/` 的 PEM 是 ACME Staging 公共 CA 证书,数据库迁移 SQL 是正式源码。它们继续纳入 Git。测试使用的合成密钥应在隔离临时目录生成;真实私钥只允许存于产品受保护存储。
|
||||
|
||||
忽略规则只降低误提交风险,不是安全扫描器:任意文件名都可能包含秘密;已跟踪文件也不会因为新增规则自动取消跟踪。因此提交前仍须检查索引、差异和文件内容,禁止以 `git add -f` 绕过边界提交产物。生产配置不得用 `.env.example` 的例外名存放。
|
||||
|
||||
## 三、核对方法
|
||||
|
||||
在项目根目录执行以下只读检查:
|
||||
|
||||
```powershell
|
||||
git status --short --untracked-files=all
|
||||
git ls-files
|
||||
git check-ignore -v --no-index -- .runtime/probe.json release/probe.zip artifacts/probe.json
|
||||
git diff --check
|
||||
git diff --cached --stat
|
||||
```
|
||||
|
||||
正式回归测试在 `backend/` 执行:
|
||||
|
||||
```powershell
|
||||
go test -count=1 ./internal/releasearchive -run 'TestRepositoryIgnore'
|
||||
```
|
||||
|
||||
测试复制仓库 `.gitignore` 到临时 Git 仓库,禁用用户级和系统级 Git 配置,逐项验证应忽略和应保留的路径,并比较实际受跟踪文件清单。不使用开发机专属排除规则作为证据。测试自身创建的隔离临时目录由测试框架管理,不删除工作区已有文件。
|
||||
|
||||
## 四、复审边界
|
||||
|
||||
P0-03 的源码边界可通过 Git 和隔离回归复核;不得据此标记 SSH、证书签发、系统服务或恢复验收通过。独立克隆构建证据沿用对应源码提交记录,应用代码或发布逻辑变化后须重新构建验证。
|
||||
@ -1,5 +1,7 @@
|
||||
# 全面审查、测试与优化记录
|
||||
|
||||
> 2026-09-27 证据索引:当前 44 项整改的逐项范围、命令、实机步骤和复审字段见《整改任务规格与验收约定》及四份分级规格;实际进展以《Scert整改任务执行清单》为准。本文历史结果须按当时源码与环境解释。
|
||||
|
||||
> 2026-09-27 范围调整:以下为历史审查证据。当前正式测试范围仅为 Web 和 Windows/Linux 服务端;历史桌面模块测试记录保留,但不再作为交付目标或生产门禁。当前任务状态见《Scert整改任务执行清单》。
|
||||
|
||||
## 一、范围与需求确认
|
||||
|
||||
@ -1,5 +1,7 @@
|
||||
# 发布加固与实机验收记录
|
||||
|
||||
> 2026-09-27 历史边界:本文描述下列日期对应的验收批次,不是当前候选的最新事实。当前完整整改索引见《Scert整改任务执行清单》,12 层生产门禁及逐项证据要求见《整改任务规格与验收约定》和《基础整改任务规格》P0-11;未复验的历史主机、包及结果不得直接沿用为通过。
|
||||
|
||||
日期:2026 年 9 月 15 日,时间均为北京时间。
|
||||
|
||||
## 一、结论与授权边界
|
||||
|
||||
171
doc/基础整改任务规格.md
Normal file
171
doc/基础整改任务规格.md
Normal file
@ -0,0 +1,171 @@
|
||||
# 基础整改任务规格
|
||||
|
||||
本文件覆盖原始清单 P0 的全部 12 项。命令编号、六阶段定义和实机前置条件见《整改任务规格与验收约定.md》。文件路径相对仓库根目录;“拟新增”明确表示尚未存在,不作为现成功能证据。
|
||||
|
||||
## P0-01 明确产品范围
|
||||
|
||||
- 任务编号:P0-01;任务名称:明确产品范围;优先级:P0。
|
||||
- 当前状态:`[x] 已完成,等待复审`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[x]`;自动化测试 `[x]`;隔离环境测试 `[x]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:桌面源码和旧 CLI 业务入口曾与正式范围混淆。
|
||||
- 涉及文件:`build/build-release.ps1`、`backend/internal/cli/root.go`、`backend/internal/releasearchive/`、根及各模块 README、《命令行运维范围说明.md》。
|
||||
- 依赖任务:无;双平台安装证据由 P2-08、P2-09 补齐,不倒置为范围整改的代码依赖。
|
||||
- 整改内容:只正式交付 Web/服务端;桌面窗口、托盘、更新、配置与 UI 测试全部范围外,保留历史源码;CLI 仅作初始化、诊断、迁移、备份恢复和服务管理,拒绝旧业务入口。
|
||||
- 验证命令:V01、V05、V04;核对 manifest、归档内容、校验和以及实际程序帮助/拒绝入口退出码。
|
||||
- 实机验收步骤:解包当前候选,确认没有桌面程序;分别在 Windows/Linux 运行帮助和运维入口;旧业务命令必须非零退出且不读凭据或生成运行数据;安装分别关联服务验收项。
|
||||
- 验收证据:执行清单已记录 `885478a` 的干净双平台包、独立克隆与 Windows 实际 CLI 结果;Linux 实机尚缺,不能用归档权限替代。
|
||||
- 复审结果:待最终复审,未生产放行。
|
||||
|
||||
## P0-02 整理项目任务清单
|
||||
|
||||
- 任务编号:P0-02;任务名称:整理项目任务清单;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:旧汇总表虽覆盖 44 项,缺逐项依赖、文件、命令、实机步骤和复审字段。
|
||||
- 涉及文件:《Scert整改任务执行清单.md》、本文件、其余三级任务规格、《整改任务规格与验收约定.md》;关联《Scert开发任务清单.md》《全面审查测试与优化记录.md》《发布加固与实机验收记录.md》《生产部署与运维说明.md》。
|
||||
- 依赖任务:P0-01;其余 43 项的业务完成不是本项文档补齐的前提。
|
||||
- 整改内容:逐项补足 12 个原定字段及六阶段,原始清单保留;区分历史事实、规划和当前实证;维护汇总状态与规格一致。
|
||||
- 验证命令:V01;按约定进行 44 项编号、必需字段、依赖、文件、状态和六阶段结构核对,并人工对照原始范围。
|
||||
- 实机验收步骤:生产执行时按规格逐项登记提交、包哈希、环境与实际操作;抽查任何“通过”能回溯到对应证据。文档治理本身不触碰服务器或数据库。
|
||||
- 验收证据:新增逐项规格,结构与范围复核尚待本轮结果;不将文档齐全称为 44 项业务完成。
|
||||
- 复审结果:待结构核对和范围复核。
|
||||
|
||||
## P0-03 整理源码、构建产物和部署产物
|
||||
|
||||
- 任务编号:P0-03;任务名称:整理源码、构建产物和部署产物;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:既有忽略规则未覆盖根级二进制、通用归档、补丁和数据库旁路文件;开发机排除配置不能代表新克隆。
|
||||
- 涉及文件:`.gitignore`、`backend/internal/releasearchive/source_boundary_test.go`、`release/README.md`、`artifacts/README.md`、`tests/README.md`、`scripts/README.md`、《仓库目录与产物边界说明.md》。
|
||||
- 依赖任务:P0-01。
|
||||
- 整改内容:建立八类目录及构建/运行边界,不删除现有文件;忽略产物和敏感文件但保留源码、迁移、部署测试及公开 CA;检测已跟踪违禁产物。
|
||||
- 验证命令:V01、V05;`go test -count=1 ./internal/releasearchive -run TestRepositoryIgnore`,在 `backend/` 执行。
|
||||
- 实机验收步骤:独立克隆只取源码,安装依赖并正式构建;确认工作区无新增产物入索引;部署只取发布白名单,不能携带浏览器缓存、数据库或本机凭据。
|
||||
- 验收证据:上一轮已有干净克隆构建;本轮隔离 Git 忽略测试已运行,完整回归与提交核对待记录。
|
||||
- 复审结果:待全量边界复核,不代表生产能力通过。
|
||||
|
||||
## P0-04 统一开发和构建版本
|
||||
|
||||
- 任务编号:P0-04;任务名称:统一开发和构建版本;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有模块和锁文件版本,但文档、安装脚本批准策略、操作系统与构建机记录需统一。
|
||||
- 涉及文件:`backend/go.mod`、`backend/go.sum`、`frontend/package.json`、`frontend/package-lock.json`、`build/build-release.ps1`、《构建版本与数据库支持矩阵.md》。
|
||||
- 依赖任务:P0-01、P0-03。
|
||||
- 整改内容:记录并固定 Go、Node、npm、Vue、驱动和依赖版本、系统版本、编译目标;检查锁文件安装及构建环境差异。模块内实际 Go 版本优先,不按根目录工具版本降级模块。
|
||||
- 验证命令:V02、V03、V04;模块内 `go version`、`go env GOVERSION GOTOOLCHAIN`;`node --version`、`npm.cmd --version`。
|
||||
- 实机验收步骤:全新构建环境按固定版本安装依赖;验证锁文件不漂移;在双平台验收机记录系统版本和运行包版本,比较 manifest。
|
||||
- 验收证据:已有 Go 1.26.6 与前端锁文件基线、独立克隆构建;安装脚本策略和完整系统矩阵尚缺。
|
||||
- 复审结果:未完成,不以一次构建通过代表可重复发布。
|
||||
|
||||
## P0-05 确认数据库正式支持矩阵
|
||||
|
||||
- 任务编号:P0-05;任务名称:确认数据库正式支持矩阵;优先级:P0。
|
||||
- 当前状态:`[!] 暂缓或存在阻塞`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
|
||||
- 问题说明:三种驱动和迁移存在,不等于正式支持级别及全部版本已经证实;实机证据不足。
|
||||
- 涉及文件:`backend/internal/database/`、其 `migrations/mysql/`、`migrations/postgres/`、`migrations/sqlite/`、`backend/internal/cli/`、《构建版本与数据库支持矩阵.md》。
|
||||
- 依赖任务:P0-04。
|
||||
- 整改内容:明确 SQLite、MySQL、PostgreSQL 支持版本;验证 MySQL 5.7/8.0、PostgreSQL 目标版本、SQLite 锁并发;逐库检查类型、索引、默认值、事务及初始化、升级、回滚、备份恢复。不能悄然去掉难测版本。
|
||||
- 验证命令:V06、V02;真实数据库测试按正式集成测试的参数运行并保存非跳过结果,不在命令行嵌入密码。
|
||||
- 实机验收步骤:逐版本创建专用测试库;从空库初始化及历史版本迁移,注入失败检查事务;使用官方备份工具恢复并核对行数、资源关联和加密凭据;验证 TLS 和断线重连;只清理明确测试库。
|
||||
- 验收证据:历史记录有部分数据库恢复测试;本次完整支持矩阵和当前候选实机记录未齐,不继承为全通过。
|
||||
- 复审结果:支持版本及实机覆盖待确认,其他任务可继续。
|
||||
|
||||
## P0-06 建立统一领域模型
|
||||
|
||||
- 任务编号:P0-06;任务名称:建立统一领域模型;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有用户、域名、任务和服务器模型,项目、证书订单/版本及跨业务关联未闭环。
|
||||
- 涉及文件:`backend/internal/domain/`、`backend/internal/database/migrations/`、`backend/internal/repository/`、`backend/internal/httpapi/`;拟新增领域关系说明及必要实体迁移。
|
||||
- 依赖任务:P0-05 的支持矩阵;设计审查可先于实机完成。
|
||||
- 整改内容:覆盖 users、roles、projects、domains、certificates、certificate_versions、certificate_orders、dns_accounts、dns_delegations、servers、deployment_targets、deployment_records、tasks、task_attempts、renewal_policies、notification_channels、notification_records、audit_logs、backup_records;定义外键、归属、引用删除策略、任务和审计关联。
|
||||
- 验证命令:V06、V07;补关联完整性、迁移回填和删除约束测试。
|
||||
- 实机验收步骤:迁移含历史资源的专用库,核对项目归属不丢失;从一次申请追踪订单、版本、任务、部署、通知和审计;删除仍被引用的资源必须拒绝。
|
||||
- 验收证据:现有模型只能证明部分实体存在;完整关系图、迁移回填与三库关联验证待补。
|
||||
- 复审结果:未完成,禁止用相似名称替代缺失关联。
|
||||
|
||||
## P0-07 增加项目级权限和资源隔离
|
||||
|
||||
- 任务编号:P0-07;任务名称:增加项目级权限和资源隔离;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:当前用户分组不等于项目及资源隔离,项目级授权仍需实现和审查。
|
||||
- 涉及文件:`backend/internal/auth/`、`backend/internal/admin/`、`backend/internal/httpapi/`、`backend/internal/repository/`、`frontend/src/views/UserManagement/`;拟新增项目管理模块及迁移。
|
||||
- 依赖任务:P0-06。
|
||||
- 整改内容:资源增加项目、所有者、创建人及更新人;制定系统管理员、项目管理员、证书/DNS/部署管理员、审计与只读角色矩阵;列表、详情、写操作、导出与后台任务均检查项目归属,普通用户不能读完整私钥。
|
||||
- 验证命令:V07、V06、V03;补跨项目 ID 枚举、伪造归属、任务访问与私钥导出拒绝测试。
|
||||
- 实机验收步骤:建立两项目和最小权限成员;分别测试证书、服务器、目标、DNS、任务、审计的跨项目读写、删除与回滚;撤权后现有会话及排队任务必须重新判权。
|
||||
- 验收证据:已有分组/角色测试不能证明项目隔离;项目矩阵和真实越权用例待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P0-08 完善凭据和主密钥生命周期
|
||||
|
||||
- 任务编号:P0-08;任务名称:完善凭据和主密钥生命周期;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:加密存储已有基础,引用检查、禁用、轮换、主密钥变更和恢复链路证据不完整。
|
||||
- 涉及文件:`backend/internal/secretstore/`、`backend/internal/sshkey/`、`backend/internal/config/`、`backend/internal/certificate/`、`backend/internal/database/credentials.go`、`backend/internal/httpapi/`。
|
||||
- 依赖任务:P0-06、P0-07。
|
||||
- 整改内容:统一 DNS、SSH、SMTP、HTTP、数据库、ACME 和证书私钥的创建、验证、禁用、轮换、删除与引用检查;实现主密钥变更、备份恢复和丢失边界;页面与日志永不返回完整秘密。
|
||||
- 验证命令:V08、V07、V10;增加轮换中断、密钥丢失、被引用删除、禁用后使用及日志脱敏测试。
|
||||
- 实机验收步骤:专用测试凭据轮换后确认新值生效、旧值失效;中断主密钥变更验证原子性;从受保护备份恢复;缺主密钥必须明确拒绝而非静默生成并丢失数据;检查输出与存储权限。
|
||||
- 验收证据:已有 secretstore 与密钥测试;完整生命周期和恢复演练尚缺。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P0-09 强化 SSH 主机身份验证
|
||||
|
||||
- 任务编号:P0-09;任务名称:强化 SSH 主机身份验证;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[~]`;最终验收 `[ ]`。
|
||||
- 问题说明:指纹校验已有测试,首次确认、变更更新以及自动公钥安装实机失败尚需定位。
|
||||
- 涉及文件:`backend/internal/deployment/`、`backend/internal/sshkey/`、`backend/internal/httpapi/`、`frontend/src/views/Dashboard/ServerModal.vue`、`frontend/src/views/Dashboard/SSHKeyModal.vue`。
|
||||
- 依赖任务:P0-07、P0-08。
|
||||
- 整改内容:保存并确认指纹、变更阻断、人工更新留审计;未确认、目标不符、失效凭据全部阻断;命令依据具体服务器展示,支持密码安装公钥并用密钥验证登录,失败日志仅含安全摘要。
|
||||
- 验证命令:V09、V07、V03;补首次未确认、指纹变化及各公钥部署阶段失败测试。
|
||||
- 实机验收步骤:使用已确认主机指纹密码登录,按 password_connect、authorized_key_install、private_key_connect、private_key_command、private_key_exit 分阶段定位;验证 authorized_keys 权限和密钥登录;隔离 SSH 目标更换指纹后必须阻断,人工更新后再试。
|
||||
- 验收证据:历史 SSH 身份只作连接线索,当前候选公钥自动部署成功、失败与恢复的完整证据待补。
|
||||
- 复审结果:未完成,不跳过指纹换取成功。
|
||||
|
||||
## P0-10 统一任务、部署和回滚事务模型
|
||||
|
||||
- 任务编号:P0-10;任务名称:统一任务、部署和回滚事务模型;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:部署事务不等于全部长操作都具备统一任务、执行尝试、取消和部分成功状态。
|
||||
- 涉及文件:`backend/internal/domain/`、`backend/internal/repository/task_repository.go`、`backend/internal/deployment/`、`backend/internal/certificate/`、`backend/internal/httpapi/`;拟新增统一任务服务与必要迁移。
|
||||
- 依赖任务:P0-06、P0-07、P0-09。
|
||||
- 整改内容:申请、续期、DNS 验证、部署、批量部署、远程备份、回滚、恢复全部关联任务;统一待执行、执行中、成功、失败、取消中、已取消、等待重试、部分成功;记录项目、创建人、时间、步骤、日志、错误、次数和资源。
|
||||
- 验证命令:V06、V09、V10、V07;补状态转换、崩溃恢复、任务尝试和事务边界测试。
|
||||
- 实机验收步骤:执行长任务期间刷新、断网、取消和重启;验证状态及执行历史可恢复;批量目标一成一败时显示部分成功;回滚后证书版本、部署与任务结论一致。
|
||||
- 验收证据:已有部署事务测试;统一八状态和全操作关联尚未验收。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P0-11 建立生产验收门禁
|
||||
|
||||
- 任务编号:P0-11;任务名称:建立生产验收门禁;优先级:P0。
|
||||
- 当前状态:`[!] 暂缓或存在阻塞`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
|
||||
- 问题说明:局部测试与历史部署不能证明当前候选具备全链路生产能力。
|
||||
- 涉及文件:《发布加固与实机验收记录.md》《生产部署与运维说明.md》《全面审查测试与优化记录.md》、`build/`、`deploy/`、`artifacts/`。
|
||||
- 依赖任务:P0-01 至 P0-10、P0-12、P1-01 至 P1-12、P2-01 至 P2-10 的对应交付;P3 留在完整目标中但不阻断第一阶段。
|
||||
- 整改内容:分别建立单元、隔离、数据库、真实 DNS、ACME Staging、ACME Production、SSH/SFTP、HTTPS/SNI、Windows Service、Linux systemd、备份恢复、升级回滚 12 层门禁,每层独立结论。
|
||||
- 验证命令:V01 至 V12 按层执行;实机命令取正式安装/运维说明并登记实际退出码,不能用空参数或跳过结果填通过。
|
||||
- 实机验收步骤:从当前干净候选完成首次安装、初始化、真实签发、分发、正常 DNS 公网 TLS、重启、恢复和升级回滚;双平台及三库分别记录;任何缺口保留未通过。
|
||||
- 验收证据:既有自动化及发布证据不覆盖全部 12 层;当前缺口由执行清单持续跟踪。
|
||||
- 复审结果:禁止生产放行,任务规划和局部整改仍可继续。
|
||||
|
||||
## P0-12 完成备份和恢复方案
|
||||
|
||||
- 任务编号:P0-12;任务名称:完成备份和恢复方案;优先级:P0。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有 CLI/数据库恢复不是包含私钥、配置、主密钥与审计的完整产品备份方案。
|
||||
- 涉及文件:`backend/internal/cli/backup_restore.go`、`backend/internal/database/`、`backend/internal/secretstore/`、`backend/internal/certificate/`、`backend/internal/httpapi/`;拟新增备份记录及调度服务。
|
||||
- 依赖任务:P0-05、P0-06、P0-08、P0-10。
|
||||
- 整改内容:覆盖数据库、证书元数据/版本/私钥、DNS/服务器/任务/通知/主密钥配置;支持手动、自动、列表、校验、下载、确认恢复、失败回滚与审计;定义一致性和受保护存储,不把秘密放测试证据目录。
|
||||
- 验证命令:V06、V08、V10、V07;补备份损坏、版本不兼容、错密钥、部分恢复及审计测试。
|
||||
- 实机验收步骤:每数据库创建完整资源并备份,向空环境恢复、解密并实际部署证书;损坏备份必须在修改前拒绝;恢复中断后可回到原状态;核对恢复前备份、下载授权、定时记录和审计。远端测试不做无关整机备份,产品备份能力不能因此省略。
|
||||
- 验收证据:部分数据库恢复历史证据存在;全部资源、自动备份和失败回滚闭环待补。
|
||||
- 复审结果:未完成。
|
||||
143
doc/增强能力任务规格.md
Normal file
143
doc/增强能力任务规格.md
Normal file
@ -0,0 +1,143 @@
|
||||
# 增强能力任务规格
|
||||
|
||||
P3 的 10 项是原始清单的后续增强,不阻断第一阶段交付,但未从整体目标移除。当前全部未开始;以下为可执行规格,不宣称已有对应模块。命令和实机约定见《整改任务规格与验收约定.md》。设计建议不替代实施前的需求确认。
|
||||
|
||||
## P3-01 多租户支持
|
||||
|
||||
- 任务编号:P3-01;任务名称:多租户支持;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:项目和用户分组不自动构成租户边界,租户管理、迁移与限额策略待明确。
|
||||
- 涉及文件:`backend/internal/auth/`、`backend/internal/database/`、`backend/internal/repository/`、`backend/internal/httpapi/`;拟新增租户服务、迁移与 Web 页面。
|
||||
- 依赖任务:P0-06、P0-07、P0-08、P1-12。
|
||||
- 整改内容:定义租户与项目/成员关系、租户管理员边界、资源归属和停用语义;租户间证书、凭据、任务、备份、审计隔离,明确历史数据归属,不能只做前端筛选。
|
||||
- 验证命令:V06、V07、V08、V03;新增租户隔离、迁移、停用和后台任务继承身份测试后才可视为覆盖。
|
||||
- 实机验收步骤:两个租户创建同名资源并执行签发部署;通过猜测 ID、导出、下载、恢复和任务查询尝试跨租户操作,全部拒绝;停用一租户不影响另一租户。
|
||||
- 验收证据:尚无本项实现或实机证据。
|
||||
- 复审结果:未开始,租户生命周期细节先确认再实现。
|
||||
|
||||
## P3-02 API Token 管理
|
||||
|
||||
- 任务编号:P3-02;任务名称:API Token 管理;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有会话或初始化 Token 不能当作用户可管理的业务 API Token。
|
||||
- 涉及文件:`backend/internal/auth/`、`backend/internal/httpapi/`、`backend/internal/database/`;拟新增 API Token 管理、迁移及用户管理子页面。
|
||||
- 依赖任务:P0-07、P0-08、P1-09、P1-12。
|
||||
- 整改内容:明确创建、仅首次展示、作用域、项目范围、到期、撤销、轮换、最近使用和审计;只存不可逆校验材料,访问权限不能超过所属用户。
|
||||
- 验证命令:V07、V08、V06、V03;补过期/撤销、跨项目、越权 scope、日志泄露和用户禁用联动测试。
|
||||
- 实机验收步骤:从 Web 创建最小权限 Token,仅调用允许接口;撤销、过期和用户撤权后立即拒绝;页面再次打开无法读回明文;审计能定位调用者,不记录 Token 内容。
|
||||
- 验收证据:尚无本项专用业务 Token 验收证据。
|
||||
- 复审结果:未开始,不能复用初始化 Token 混充完成。
|
||||
|
||||
## P3-03 Webhook 事件订阅
|
||||
|
||||
- 任务编号:P3-03;任务名称:Webhook 事件订阅;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:P1 通知渠道发送不等于具备业务事件订阅、签名和投递管理。
|
||||
- 涉及文件:`backend/internal/notification/`、`backend/internal/httpapi/`、`backend/internal/repository/`;拟新增订阅模型、事件投递服务及 Web 管理页面。
|
||||
- 依赖任务:P0-07、P0-08、P0-10、P1-08、P1-09。
|
||||
- 整改内容:确认事件目录,支持按项目/事件订阅、签名验证、密钥轮换、唯一事件 ID、有限重试、投递记录及停用;限制目标地址和重定向,防 SSRF 与跨项目数据泄漏。
|
||||
- 验证命令:V11、V07、V08、V03;新增签名、重放、重试上限、目的地址校验和订阅隔离测试。
|
||||
- 实机验收步骤:在获授权接收端订阅签发/部署事件,核验实际签名和事件 ID;故意返回失败观察重试;接收方去重;停用及轮换后旧签名失效,不向未授权地址投递。
|
||||
- 验收证据:尚无本项订阅和投递实机记录。
|
||||
- 复审结果:未开始。
|
||||
|
||||
## P3-04 更多 DNS Provider 插件
|
||||
|
||||
- 任务编号:P3-04;任务名称:更多 DNS Provider 插件;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:新增 Provider 名单、凭据字段与真实账号授权待确认,不能用同一 Provider 模拟多插件完成。
|
||||
- 涉及文件:`backend/internal/dnsprovider/`、`backend/internal/dnsverification/`、`backend/internal/certificate/`、`frontend/src/views/DNSAccounts/`;拟新增选定 Provider 适配器与正式测试。
|
||||
- 依赖任务:P0-08、P1-03。
|
||||
- 整改内容:定义稳定 Provider 能力接口与发现方式;新增明确选定的 Provider,支持账户验证、权限错误、限流、精确 TXT 清理及凭据轮换;公开支持矩阵和不支持能力。
|
||||
- 验证命令:V10、V07、V03;每个适配器分别验证协议夹具、故障、并发和契约,真实用例不以跳过计通过。
|
||||
- 实机验收步骤:每个新增 Provider 用专用授权区域做 TXT 添加读取清理和 DNS-01 签发;检查失败清理不误删既有记录;验证限权账号和轮换后的行为。
|
||||
- 验收证据:尚无新增 Provider 的确认名单和逐个实机证据。
|
||||
- 复审结果:未开始,不缩减成只扩展下拉框。
|
||||
|
||||
## P3-05 证书标签和批量操作
|
||||
|
||||
- 任务编号:P3-05;任务名称:证书标签和批量操作;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:原清单仅列增强名称,需明确标签归属、批量动作和跨分页选择语义。
|
||||
- 涉及文件:`backend/internal/domain/`、`backend/internal/repository/`、`backend/internal/httpapi/`;拟新增标签迁移及 Certificates 页面批量交互。
|
||||
- 依赖任务:P0-07、P0-10、P1-01、P2-04。
|
||||
- 整改内容:项目内标签创建、编辑、解绑、筛选;支持确认后的批量续期/部署/删除等动作,逐资源授权与结果、任务化、幂等及部分成功;标签数据为 P1-05 策略提供输入。
|
||||
- 验证命令:V06、V07、V10、V09、V03;补标签唯一性、跨项目混选、重复 ID、并发删除和分页选中测试。
|
||||
- 实机验收步骤:跨分页选择多个专用证书,按标签批量操作;混入失效、无权限或被引用资源应逐项准确报告;刷新可追踪任务,重复提交不重复申请,成功/失败数量可核对。
|
||||
- 验收证据:尚无标签模型与完整批量流程验收。
|
||||
- 复审结果:未开始,具体批量动作须在实现前确定。
|
||||
|
||||
## P3-06 多实例高可用
|
||||
|
||||
- 任务编号:P3-06;任务名称:多实例高可用;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:单机服务重启和本地文件锁不能证明多实例可用性、共享密钥或状态一致。
|
||||
- 涉及文件:`backend/internal/servicehost/`、`backend/internal/repository/`、`backend/internal/secretstore/`、`backend/internal/httpapi/`、`deploy/`;拟新增高可用部署与故障恢复说明。
|
||||
- 依赖任务:P0-05、P0-08、P0-10、P2-04。
|
||||
- 整改内容:确定支持的共享数据库/存储、会话与主密钥分发、调度协调、健康检查、流量切换和滚动升级;防脑裂及重复签发,不宣称 SQLite 文件共享就是高可用。
|
||||
- 验证命令:V02、V06、V08、V12;新增多实例竞争、租约失效、网络分区及恢复的一致性正式测试。
|
||||
- 实机验收步骤:至少两独立实例提供同一测试项目服务,停止一个实例或断开其网络;验证会话、任务、证书及凭据仍可用,恢复节点不能重复执行;滚动升级与回滚后版本兼容。
|
||||
- 验收证据:尚无多实例拓扑及故障切换证据。
|
||||
- 复审结果:未开始,架构及可用性目标须先确认。
|
||||
|
||||
## P3-07 分布式任务队列
|
||||
|
||||
- 任务编号:P3-07;任务名称:分布式任务队列;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:本地任务记录不等于可跨工作者领取、确认、重试和恢复的分布式队列。
|
||||
- 涉及文件:`backend/internal/repository/task_repository.go`、`backend/internal/database/`、`backend/internal/certificate/`、`backend/internal/deployment/`;拟新增队列适配、工作者管理和配置。
|
||||
- 依赖任务:P0-10、P2-04;与 P3-06 共享协调设计,不要求先做出高可用再定义队列语义。
|
||||
- 整改内容:明确存储/消息组件选型,持久化领取、租约、确认、超时重试、死信、取消和任务尝试;重复投递不能重复产生远端副作用,保留项目权限与审计上下文。
|
||||
- 验证命令:V06、V07、V09、V10;新增多工作者、重复消息、乱序确认、崩溃重领、死信与幂等测试。
|
||||
- 实机验收步骤:至少两个工作者领取任务,处理途中终止一个;任务重领后结果一致且不重复签发/部署;队列中断恢复后无任务丢失,重试耗尽可追溯,取消能正确传播。
|
||||
- 验收证据:尚无分布式队列和恢复实机记录。
|
||||
- 复审结果:未开始,不能用单进程 goroutine 队列替代。
|
||||
|
||||
## P3-08 Prometheus 指标接口
|
||||
|
||||
- 任务编号:P3-08;任务名称:Prometheus 指标接口;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:日志计数和仪表盘不等于 Prometheus 可采集接口,指标访问边界未定。
|
||||
- 涉及文件:`backend/internal/httpapi/`、`backend/internal/logging/`、`backend/internal/config/`;拟新增指标注册与采集端点、配置及测试。
|
||||
- 依赖任务:P2-05、P2-10。
|
||||
- 整改内容:导出定义清晰的计数器、耗时分布和健康指标;控制标签基数,不用域名/用户/密钥等敏感或无界字段做标签;明确监听、鉴权和访问限制,不能默认公网暴露。
|
||||
- 验证命令:V07、V11、V02;新增指标格式、并发更新、重复注册、访问控制和标签泄密测试。
|
||||
- 实机验收步骤:真实 Prometheus 从授权网络采集当前候选,触发成功/失败任务核对指标增量与耗时;重启后序列语义合理;未授权公网请求被拒绝,无秘密和高基数标签。
|
||||
- 验收证据:尚无指标端点和真实采集证据。
|
||||
- 复审结果:未开始。
|
||||
|
||||
## P3-09 OpenAPI 自动生成
|
||||
|
||||
- 任务编号:P3-09;任务名称:OpenAPI 自动生成;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:手写接口文档不能证明自动生成、路由覆盖和契约同步。
|
||||
- 涉及文件:《后端接口说明文档.md》、`backend/internal/httpapi/`、`build/`;拟新增生成入口与 `doc/openapi/` 代码文档。
|
||||
- 依赖任务:P1-12、P2-06。
|
||||
- 整改内容:选定唯一契约源和固定生成器版本,覆盖真实路由、请求/响应、错误、权限、安全方案、分页和任务;示例使用占位值;生成结果可重复,变更检查能发现缺失/过期路由。
|
||||
- 验证命令:V07、V02、V03;生成器选定后登记正式生成/校验命令,不提前捏造可运行命令;用实际路由与生成文档双向比对。
|
||||
- 实机验收步骤:从干净克隆生成契约,校验前后无意外漂移;在运行候选上按文档调用典型成功/失败路径;确认登录要求、任务 ID 和权限错误与实际一致,不暴露内部恢复 IPC。
|
||||
- 验收证据:尚无自动生成器及完整契约校验记录。
|
||||
- 复审结果:未开始。
|
||||
|
||||
## P3-10 移动端适配
|
||||
|
||||
- 任务编号:P3-10;任务名称:移动端适配;优先级:P3。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[~]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:桌面响应式样式不等于手机/平板完整操作体验和真实设备验收。
|
||||
- 涉及文件:`frontend/src/views/` 各页面 Vue/JS/CSS 与公共组件;拟新增移动布局及必要正式测试。
|
||||
- 依赖任务:P2-01、P2-02、P2-06。
|
||||
- 整改内容:定义手机/平板视口、导航、表格/卡片转换、分页、触控目标、软键盘及危险确认;保留桌面布局与完整功能,不通过隐藏必需字段实现一页显示;悬浮说明提供可触控访问方式。
|
||||
- 验证命令:V03;使用用户指定 Mobile Preview - Phone & Tablet Simulator 插件检查移动端,不启动桌面浏览器 MCP 代替。
|
||||
- 实机验收步骤:插件覆盖手机/平板横竖屏及软键盘,再用真实设备从正常公网 TLS 登录;完成列表筛选、证书详情、任务、服务器和危险确认;长域名/邮箱不裁切,操作无横向溢出和遮挡。
|
||||
- 验收证据:尚无移动插件及真实设备验收记录。
|
||||
- 复审结果:未开始,不以桌面缩窗截图代替。
|
||||
64
doc/整改任务规格与验收约定.md
Normal file
64
doc/整改任务规格与验收约定.md
Normal file
@ -0,0 +1,64 @@
|
||||
# 整改任务规格与验收约定
|
||||
|
||||
## 一、需求确认和完整范围
|
||||
|
||||
以《Scert整改合并优化清单.md》为原始需求,保留 P0 的 12 项、P1 的 12 项、P2 的 10 项和 P3 的 10 项,共 44 项,不因已有实现或测试容易程度缩减范围。用户已要求按此清单执行;本规格将要求转成可执行检查,不额外认定尚未确认的数据库版本和新功能设计已经获准。
|
||||
|
||||
正式产品是 Web 与 Windows/Linux 服务端,桌面版范围外。P3 不阻断第一阶段交付,但仍属于完整整改目标。原文“建议”的实体名、目录名、角色名和阈值不等于已经实现;采用不同实现时必须说明如何满足同一能力,不能用用户分组替代项目隔离。
|
||||
|
||||
任务索引和实际进展以《Scert整改任务执行清单.md》为准,逐项规格拆分如下:
|
||||
|
||||
- 《基础整改任务规格.md》:P0-01 至 P0-12。
|
||||
- 《核心能力任务规格.md》:P1-01 至 P1-12。
|
||||
- 《运维验收任务规格.md》:P2-01 至 P2-10。
|
||||
- 《增强能力任务规格.md》:P3-01 至 P3-10。
|
||||
|
||||
每项记录编号、名称、优先级、当前状态、六阶段状态、问题、涉及文件、依赖、整改内容、验证命令、实机步骤、验收证据和复审结果。状态变更必须同步汇总表、规格和证据;历史记录不覆盖、不伪造。
|
||||
|
||||
## 二、六阶段与状态
|
||||
|
||||
六阶段固定为需求确认、代码实现、自动化测试、隔离环境测试、生产部署测试、最终验收。各阶段独立使用 `[ ]`、`[~]`、`[x]`、`[✓]`、`[!]`。
|
||||
|
||||
- 需求已列明可标 `[x]`,但不代表代码完成。
|
||||
- 已有测试不能自动证明新规格全部覆盖;在覆盖审查前仍标 `[~]` 或 `[ ]`。
|
||||
- 文档治理项的“代码实现”指文档与规则交付;生产部署阶段可标“未独立执行,关联生产门禁”,不能伪造实机步骤已通过。
|
||||
- `[!]` 表示某阶段暂缺前提,不表示整项目无法推进。
|
||||
- 自动化或构建层通过最多支持对应范围 `[x]`;最终 `[✓]` 必须附复审人、日期、源码提交和匹配范围的实机证据。
|
||||
|
||||
## 三、验证命令约定
|
||||
|
||||
下列是可执行的基础命令,不代表单条命令已经覆盖整项需求。各规格引用命令编号并列出需补的用例;目录未实现的功能,必须先编写正式测试,再执行基础命令。生产网络和真实数据库集成测试需要独立环境参数,缺参导致跳过不算通过。
|
||||
|
||||
| 编号 | 工作目录 | 命令 | 用途 |
|
||||
|---|---|---|---|
|
||||
| V01 | 仓库根目录 | `git status --short --untracked-files=all`;`git diff --check`;`git ls-files` | 工作区与索引边界 |
|
||||
| V02 | `backend/` | `go test -p 1 -count=1 -timeout=3m ./...`;`go vet -p=1 ./...`;`go mod verify` | 全量基础回归 |
|
||||
| V03 | `frontend/` | `npm.cmd ci --no-audit --no-fund`;`npm.cmd test`;`npm.cmd run build` | 锁文件安装、前端回归与生产构建 |
|
||||
| V04 | 仓库根目录 | `powershell -NoProfile -ExecutionPolicy Bypass -File .\build\build-release.ps1 -OutputDirectory .\release\<新的唯一候选目录>` | 双平台构建;执行时替换尖括号占位值,不覆盖现有包 |
|
||||
| V05 | `backend/` | `go test -count=1 ./internal/releasearchive ./internal/cli` | 发布边界和运维入口 |
|
||||
| V06 | `backend/` | `go test -count=1 ./internal/database ./internal/repository ./internal/cli` | 数据库、归属及备份恢复基础测试 |
|
||||
| V07 | `backend/` | `go test -count=1 ./internal/auth ./internal/admin ./internal/httpapi` | 认证、权限及接口 |
|
||||
| V08 | `backend/` | `go test -count=1 ./internal/secretstore ./internal/sshkey ./internal/config ./internal/localreset` | 凭据、密钥和本机恢复 |
|
||||
| V09 | `backend/` | `go test -count=1 ./internal/deployment ./internal/sshkey` | SSH、部署、回滚 |
|
||||
| V10 | `backend/` | `go test -count=1 ./internal/certificate ./internal/dnsprovider ./internal/dnsverification` | ACME、DNS、续期 |
|
||||
| V11 | `backend/` | `go test -count=1 ./internal/notification ./internal/logging ./internal/httpapi` | 通知、日志和接口 |
|
||||
| V12 | `backend/` | `go test -count=1 ./internal/servicehost ./internal/bootstrap ./internal/setup ./internal/certstorage ./internal/nginxactivation` | 服务和初始化;平台专用用例须在对应系统重跑 |
|
||||
|
||||
任务规格结构核对:逐项比对原始清单的编号和名称、依赖编号、涉及文件是否存在或明确标“拟新增”、12 个必需字段与六阶段状态是否齐全。结构核对不是业务测试,也不需要新增辅助脚本。
|
||||
|
||||
## 四、统一实机前置条件
|
||||
|
||||
1. 修改前核对工作区并推送中文检查点。测试前从明确源码提交构建最新候选包,核对 SHA256、平台和版本。
|
||||
2. 首次流程使用明确的可清理测试数据库;涉及多个数据库时逐个建立隔离实例或专用库,再按授权清理测试数据。不把测试清理要求推广为删除共享主机的其他库、服务或业务记录。
|
||||
3. 桌面 Web 测试前检查后端、前端和专用浏览器 MCP 的状态、端口与所属项目;清理该测试上下文缓存并重开页面。移动端按用户要求使用 Mobile Preview 插件,不改用桌面 MCP 冒充移动验收。
|
||||
4. 服务器信息与凭据仅用于连接。连接须校验用户确认的 SSH 指纹,公网访问使用正常 DNS 和完整 TLS/SNI 校验。禁止关闭 TLS、跳过指纹或用强制 IP TLS 作为正式证据。
|
||||
5. 涉及 DNS、邮件、ACME、远程文件、服务启停和恢复时,先确认目标归属和影响范围;仅清理本轮创建的测试记录。真实秘密不进日志、截图、文档、Git 或测试产物。
|
||||
6. 使用产品的 Web/服务端/正式运维入口及已有测试,不新增临时辅助脚本替代验收。已有 Go、前端和安装器正式测试继续保留。
|
||||
|
||||
## 五、验收证据格式
|
||||
|
||||
每项证据必须能定位:任务编号与用例、源码提交、候选包 SHA256、目标平台和数据库版本、脱敏环境标识、操作入口、起止时间、退出码、断言、结果、清理结果及覆盖缺口。自动化、隔离、真实生产链路和复审分别记录。
|
||||
|
||||
本地证据放 `artifacts/`;可提交的脱敏结论放 `doc/`。历史结果必须注明当时提交,不把旧输出当作当前版本已测试。没有凭据本身、测试服务器 IP 或域名之外的过程证据时,视为未验收。
|
||||
|
||||
完整发布仍需 P0-11 的 12 层门禁,不能以本规格文档齐全、HTTP 200、构建成功或测试数量替代。
|
||||
171
doc/核心能力任务规格.md
Normal file
171
doc/核心能力任务规格.md
Normal file
@ -0,0 +1,171 @@
|
||||
# 核心能力任务规格
|
||||
|
||||
覆盖 P1 全部 12 项,遵循《整改任务规格与验收约定.md》。当前不少业务集中于 Dashboard,不得把建议目录当作已经存在的独立页面;新页面均按 Vue、JS、CSS 就近拆分。
|
||||
|
||||
## P1-01 建设统一证书中心
|
||||
|
||||
- 任务编号:P1-01;任务名称:建设统一证书中心;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有域名及证书操作,不等于统一证书中心与项目筛选、引用保护已完成。
|
||||
- 涉及文件:`backend/internal/certificate/`、`backend/internal/httpapi/certificate_api.go`、`frontend/src/views/Dashboard/`;拟新增 `frontend/src/views/Certificates/`。
|
||||
- 依赖任务:P0-06、P0-07、P0-10。
|
||||
- 整改内容:列表按域名、项目、状态、到期时间筛选;展示状态、剩余有效期、证书链、SAN、签发机构和版本;支持手动续期、部署、回滚、导入与删除无引用证书;分页提供 5、10、15、30 条。
|
||||
- 验证命令:V10、V07、V03;补筛选分页、空状态、过期时间边界、引用删除和操作权限测试。
|
||||
- 实机验收步骤:导入和签发多域名证书,跨项目切换筛选与分页;逐项续期、部署、回滚;被引用证书不能删除;刷新后状态与实际服务一致,错误提示不泄密。
|
||||
- 验收证据:现有 Dashboard 和证书 API 测试仅作基础;独立中心、完整操作及桌面布局待验收。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-02 完善证书详情和版本管理
|
||||
|
||||
- 任务编号:P1-02;任务名称:完善证书详情和版本管理;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:证书文件版本不等于详情包含完整业务信息,版本切换与部署关联须复核。
|
||||
- 涉及文件:`backend/internal/certificate/lifecycle.go`、`backend/internal/certificate/lifecycle_version_test.go`、`backend/internal/httpapi/certificate_api.go`、`backend/internal/httpapi/certificate_restore_api.go`;拟新增 `frontend/src/views/Certificates/CertificateDetail.vue` 及同名 JS/CSS。
|
||||
- 依赖任务:P0-06、P0-07、P1-01。
|
||||
- 整改内容:展示名称、主域名、SAN、项目、机构、签发/到期时间、剩余天数、状态、申请及 DNS 验证方式、当前/历史版本、部署状态、任务和服务器;区分待申请、申请中、有效、将到期、过期、申请失败、部署失败、吊销、禁用。
|
||||
- 验证命令:V10、V09、V07、V03;补多版本切换、状态映射、时间边界和禁止私钥泄漏测试。
|
||||
- 实机验收步骤:产生至少两版证书,检查详情及版本指纹;将某版部署并回滚,核对线上证书与详情当前/已部署版本;失败及禁用状态不能伪装有效部署。
|
||||
- 验收证据:已有版本回归不代表所有详情字段和生命周期状态已实现;真实多版本闭环待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-03 完善 ACME 和 DNS 管理
|
||||
|
||||
- 任务编号:P1-03;任务名称:完善 ACME 和 DNS 管理;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[~]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有 ACME、DNS 账户与 TXT 测试,不能证明 HTTP-01、CNAME 委派、全部 SAN 和正式签发均通过。
|
||||
- 涉及文件:`backend/internal/certificate/`、`backend/internal/dnsprovider/`、`backend/internal/dnsverification/`、`backend/internal/httpapi/dns_accounts_api.go`、`frontend/src/views/DNSAccounts/`;拟新增 `frontend/src/views/DNSDelegations/`。
|
||||
- 依赖任务:P0-07、P0-08、P0-10。
|
||||
- 整改内容:保留 Production/Staging、DNS-01/HTTP-01、单域名/泛域名/SAN、多 Provider、账户验证/禁用/轮换、CNAME 委派、TXT 添加读取清理;显示账户归属,配置页面一页可用。泛域名通过 DNS-01,不把协议限制算成功。
|
||||
- 验证命令:V10、V07、V03;补委派链、错误权限、并发 TXT、清理失败、签发与账户隔离测试。
|
||||
- 实机验收步骤:先做受限 DNS TXT 创建读取精确清理,再以另一授权域名做 Staging 与 Production 签发;分别验证 HTTP-01、DNS-01、泛域名和 SAN;测试委派目标、账户禁用与轮换;失败不删除他人记录,不将 Staging 证书用于正式入口。
|
||||
- 验收证据:历史 RAM TXT 测试仅证明该次账户权限;当前完整签发矩阵和公网信任证据尚缺。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-04 建设任务中心
|
||||
|
||||
- 任务编号:P1-04;任务名称:建设任务中心;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有任务仓储和日志缺完整统一视图、步骤历史、取消及重试交互验证。
|
||||
- 涉及文件:`backend/internal/repository/task_repository.go`、`backend/internal/httpapi/`、`frontend/src/views/Dashboard/`;拟新增 `frontend/src/views/Tasks/`。
|
||||
- 依赖任务:P0-07、P0-10。
|
||||
- 整改内容:列表、详情、实时进度、日志、执行步骤、失败重试、取消、历史、项目/类型/状态筛选及关联证书/服务器/部署;任务与尝试分开展示,刷新后能恢复。
|
||||
- 验证命令:V06、V07、V03;补八状态、日志增量、重试关联、取消竞态与权限测试。
|
||||
- 实机验收步骤:运行真实长任务并刷新、断网重连;从列表进入详情查看步骤及资源;失败重试生成可追溯尝试;取消中到已取消过程一致,不能把远端已生效操作假称未执行。
|
||||
- 验收证据:任务基础存在,完整中心及取消语义待验证。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-05 统一续期策略
|
||||
|
||||
- 任务编号:P1-05;任务名称:统一续期策略;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有续期代码不能证明按日期、标签、项目、类型的策略及调度幂等完整。
|
||||
- 涉及文件:`backend/internal/certificate/renewal.go`、`backend/internal/certificate/renewal_executor.go`、`backend/internal/repository/`、`backend/internal/httpapi/`;拟新增续期策略配置视图和迁移。
|
||||
- 依赖任务:P0-10、P1-02、P1-03;标签策略依赖 P3-05 的标签数据,不能因此省略。
|
||||
- 整改内容:支持剩余天数、固定日期、标签、项目、证书类型策略;有限失败重试、成功自动部署和通知;防重复申请、并发续期、重复部署、无限重试及部署状态滞后。
|
||||
- 验证命令:V10、V06、V09;以可控时钟补阈值、时区、重启、并发调度和重试上限用例。
|
||||
- 实机验收步骤:在专用证书配置短测试计划,跨重启观察任务仅执行一次;注入 DNS/部署失败后保留旧证书并有限重试;成功后核对版本、线上证书、部署状态和通知。
|
||||
- 验收证据:已有续期自动化基础,策略矩阵和真实调度闭环尚缺。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-06 建设服务器和部署目标中心
|
||||
|
||||
- 任务编号:P1-06;任务名称:建设服务器和部署目标中心;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[~]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有服务器弹窗和密钥展示,部署目标、项目归属、标签、健康检查与启停边界仍需统一。
|
||||
- 涉及文件:`backend/internal/deployment/`、`backend/internal/repository/server_repository.go`、`backend/internal/httpapi/`、`frontend/src/views/Dashboard/ServerModal.vue`;拟新增 `frontend/src/views/Servers/`。
|
||||
- 依赖任务:P0-07、P0-08、P0-09、P0-10。
|
||||
- 整改内容:服务器列表/详情、连接测试、指纹、标签、项目、分组、部署路径、reload、健康检查和启禁用;服务器配置与密钥命令合并流程,命令按主机生成,配置后自动安装公钥并验证密钥登录。
|
||||
- 验证命令:V09、V07、V03;补目标路径验证、目录创建权限、禁用后任务拒绝、凭据脱敏和命令注入测试。
|
||||
- 实机验收步骤:用密码添加专用服务器并确认指纹,自动部署公钥后测试密钥登录;输入不存在的授权目录由产品安全创建;禁用后不能新部署;健康检查和 reload 失败提供可定位结果,不影响同机其他服务。
|
||||
- 验收证据:历史服务器配置测试不代表自动密钥流程修复;本候选完整目标中心待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-07 建设多服务器部署策略
|
||||
|
||||
- 任务编号:P1-07;任务名称:建设多服务器部署策略;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:单目标事务测试不能替代多目标并行/串行、失败策略和部分成功处理。
|
||||
- 涉及文件:`backend/internal/deployment/`、`backend/internal/httpapi/`、`backend/internal/repository/`、`frontend/src/views/Dashboard/DeploymentFeedback.js`、`frontend/src/views/Dashboard/DeploymentResult.vue`。
|
||||
- 依赖任务:P0-09、P0-10、P1-02、P1-06;按标签批量需要标签能力。
|
||||
- 整改内容:单机、多机并行/串行、标签批量、失败停止/继续、自动回滚、部分成功、部署前备份与部署后 HTTPS;准备、连接、远程备份、临时上传、权限、原子替换、reload、HTTPS、成功或回滚逐步记录。
|
||||
- 验证命令:V09、V06、V07、V03;补逐阶段故障、取消、网络中断、文件权限和证书/私钥匹配测试。
|
||||
- 实机验收步骤:至少两部署目标分别串行并行推送;一个目标制造可恢复 reload/HTTPS 失败,验证停止/继续策略及回滚后旧站点有效;普通 DNS 访问核对新证书 SNI,记录每目标和总体状态。只验证证书推送,不操作远端 Git;不备份无关主机数据。
|
||||
- 验收证据:已有部署回滚单元测试;多机策略和真实 HTTPS/回滚仍缺完整证据。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-08 建设通知中心
|
||||
|
||||
- 任务编号:P1-08;任务名称:建设通知中心;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有 Smail 系统账户方向,不能证明通知渠道、触发覆盖、可重试及可审计完整。
|
||||
- 涉及文件:`backend/internal/notification/`、`backend/internal/config/notification_sender.go`、`backend/internal/httpapi/`、`frontend/src/views/Dashboard/MailNotificationSettings.vue`;拟新增 `frontend/src/views/Notifications/`。
|
||||
- 依赖任务:P0-07、P0-08、P0-10。
|
||||
- 整改内容:HTTP Webhook、SMTP;任务成功/失败、将到期/过期、部署失败、服务异常和备份失败通知;渠道测试、有限重试、发送记录与脱敏。邮件默认沿用 Smail 系统账户,不恢复重复自定义邮箱入口。
|
||||
- 验证命令:V11、V08、V03;补 HTTP/SMTP 超时、拒绝、重试、重复发送和敏感内容过滤测试。
|
||||
- 实机验收步骤:以产品系统账户发信并核对实际收件,不只看发送 API;测试授权 Webhook 实际接收;注入暂时失败验证次数/退避与记录;检查所有事件类型。Smail 调用失败才只读查阅其项目定位接口,不扩大本任务修改范围。
|
||||
- 验收证据:既有通知测试不等于真实收信;事件矩阵和失败恢复待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-09 建设审计中心
|
||||
|
||||
- 任务编号:P1-09;任务名称:建设审计中心;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:审计仓储存在,所有危险操作及失败路径是否关联请求、任务和项目仍未闭环。
|
||||
- 涉及文件:`backend/internal/repository/audit_repository.go`、`backend/internal/repository/audit_reader.go`、`backend/internal/httpapi/`;拟新增 `frontend/src/views/AuditLogs/`。
|
||||
- 依赖任务:P0-06、P0-07、P0-10。
|
||||
- 整改内容:记录登录/退出/密码、用户/角色/项目、证书申请/导入/删除/回滚、部署、凭据、指纹、备份恢复和系统设置;包含操作人、时间、类型、资源类型/ID、项目、客户端 IP、结果、失败原因、请求追踪 ID。
|
||||
- 验证命令:V06、V07、V11、V03;逐类测试成功和拒绝路径、不可伪造字段、跨项目查询和脱敏。
|
||||
- 实机验收步骤:按危险操作清单逐项执行并关联审计;制造权限拒绝及远端失败;用只读审计角色查询,跨项目访问拒绝;追踪 ID 能回溯相关任务但不暴露秘密。
|
||||
- 验收证据:已有审计仓储测试;完整操作覆盖和页面联查待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-10 建设证书监控仪表盘
|
||||
|
||||
- 任务编号:P1-10;任务名称:建设证书监控仪表盘;优先级:P1。
|
||||
- 当前状态:`[ ] 未开始`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[ ]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有运行概览不等于完整证书监控面板,统计口径与数据归属未统一复审。
|
||||
- 涉及文件:`frontend/src/views/Dashboard/RuntimeOverview.vue`、同目录 JS/CSS、`backend/internal/httpapi/`、`backend/internal/repository/`。
|
||||
- 依赖任务:P0-07、P1-01、P1-04、P1-06、P1-08、P1-09。
|
||||
- 整改内容:总数、有效/将到期/过期/申请失败/部署失败、今日/失败任务、服务器/异常服务器、最近审计/通知;首页保留用户、域名、状态、到期与部署服务器,概览不能变成日志页;制定互斥到期阈值,明确原建议在第 7 天重叠的边界。
|
||||
- 验证命令:V07、V06、V03;补按项目聚合、零数据、时区、1/7/30 天边界与失败分类测试。
|
||||
- 实机验收步骤:构造不同状态的专用证书及服务器,逐项核对统计与列表;点击统计能到正确筛选;不同权限用户数据隔离;常用桌面视口一页显示主要信息且无重叠。
|
||||
- 验收证据:未建立本项完整统计和布局验收证据。
|
||||
- 复审结果:未开始实现,不把现有概览误标完成。
|
||||
|
||||
## P1-11 建设备份恢复页面
|
||||
|
||||
- 任务编号:P1-11;任务名称:建设备份恢复页面;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[ ]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:CLI 恢复基础不能替代 Web 备份列表、风险提示和二次确认。
|
||||
- 涉及文件:`backend/internal/cli/backup_restore.go`、`backend/internal/httpapi/`;拟新增 `frontend/src/views/Backups/` 及 `RestoreDialog/`。
|
||||
- 依赖任务:P0-07、P0-10、P0-12、P1-04、P1-09。
|
||||
- 整改内容:备份列表、校验、下载、恢复;显示影响范围、二次确认及输入确认文字;恢复前自动备份,过程入任务中心,结果入审计,失败自动回滚。
|
||||
- 验证命令:V06、V07、V03;补无权限下载、确认字不符、重复提交、任务刷新和失败提示测试。
|
||||
- 实机验收步骤:在可清理环境从页面备份并恢复,观察自动安全备份、任务与审计;损坏包和错误主密钥必须阻断;中途失败回滚后数据一致;普通用户不可访问下载或恢复入口。
|
||||
- 验收证据:现有后端恢复基础未证明本页面和高风险交互完成。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P1-12 统一 API 契约和权限矩阵
|
||||
|
||||
- 任务编号:P1-12;任务名称:统一 API 契约和权限矩阵;优先级:P1。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有接口说明与实际路由、项目权限和长操作返回值需逐项对齐。
|
||||
- 涉及文件:《后端接口说明文档.md》、`backend/internal/httpapi/`、`backend/internal/bootstrap/router.go`、`frontend/src/views/`。
|
||||
- 依赖任务:P0-07、P0-10;随 P1 其他模块增量维护,不等待所有页面写完才定义契约。
|
||||
- 整改内容:每个路由记录路径、方法、登录要求、角色、项目权限、资源权限、审计、幂等、敏感字段及错误码;统一请求/响应、分页、任务 ID 和失败语义,文档不能虚构路由。
|
||||
- 验证命令:V07、V02、V03;路由清单与文档双向比对,补字段、状态码、授权及敏感响应契约测试。
|
||||
- 实机验收步骤:以各角色从真实 Web 操作关键流程,记录实际请求与脱敏响应;越权、无效字段、超时和冲突符合契约;接口升级后旧会话及刷新不破坏任务追踪。
|
||||
- 验收证据:已有接口文档和回归;全路由对照、项目权限矩阵及生产联调未齐。
|
||||
- 复审结果:未完成。
|
||||
@ -1,5 +1,7 @@
|
||||
# Scert 生产部署与运维说明
|
||||
|
||||
> 2026-09-27 验收入口:部署当前候选前,先按《整改任务规格与验收约定》及《Scert整改任务执行清单》核对版本、环境、授权与 12 层生产门禁。下文历史拓扑不是当前服务器状态,不因旧批次通过而跳过本次实机检查。源码、候选包与证据边界见《仓库目录与产物边界说明》。
|
||||
|
||||
> 2026-09-27 正式范围:仅交付 Web 和 Windows/Linux 服务端。Wails 历史源码不参与发布,桌面窗口、托盘、更新、桌面配置及 UI 测试不作为生产门禁。CLI 仅作为服务端运维工具;本文件的 Linux 部署步骤不代表 Windows Service 已验收。
|
||||
|
||||
> 2026-09-15 云主机验收拓扑已更新:`47.108.78.12` 为管理机,`8.137.23.95` 仅为推送测试机。下文局域网地址是历史测试示例,不能用于本轮部署。最新包、实机证据、禁止修改范围及生产阻塞见 [发布加固与实机验收记录](发布加固与实机验收记录.md)。
|
||||
|
||||
143
doc/运维验收任务规格.md
Normal file
143
doc/运维验收任务规格.md
Normal file
@ -0,0 +1,143 @@
|
||||
# 运维验收任务规格
|
||||
|
||||
覆盖 P2 全部 10 项,使用《整改任务规格与验收约定.md》的命令、证据和环境约定。实机步骤为待执行规格,不表示已完成。
|
||||
|
||||
## P2-01 统一 Web 页面结构
|
||||
|
||||
- 任务编号:P2-01;任务名称:统一 Web 页面结构;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:部分文件按页面拆分,Dashboard 仍承担多业务,全部页面一页可用与布局一致性待检查。
|
||||
- 涉及文件:`frontend/src/views/`;拟新增 Certificates、Tasks、DNSDelegations、Servers、Notifications、AuditLogs、Backups、Settings 页面目录,保留现有 Dashboard、DNSAccounts、UserManagement、SetupWizard、Login 等。
|
||||
- 依赖任务:P0-01、P1 各页面契约。
|
||||
- 整改内容:每页面 Vue/JS/CSS 和组件就近存放、换行编写;按板块显示、说明用悬浮提示、列表分页;系统设置置于系统管理、修改密码置于用户管理。默认组优先不折叠,其他组折叠;普通用户不显示分组,管理员默认同组且可多组,普通用户只单组,超级管理员可见全部。初始化表单保留用户要求的字段布局和自定义端口。
|
||||
- 验证命令:V03、V07;补导航、权限显示、分页、输入校验、键盘操作和无数据布局测试。
|
||||
- 实机验收步骤:检查专用 MCP 和前后端运行状态后逐页在常用桌面分辨率验收;输入长邮箱/域名验证完整显示;关键表单一页可操作,不靠极小字号或裁切内容;初始化步骤、权限切换和刷新均正常。
|
||||
- 验收证据:已有前端测试和局部拆分;全部页面截图、权限与布局复核尚缺。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-02 统一中文显示和错误信息
|
||||
|
||||
- 任务编号:P2-02;任务名称:统一中文显示和错误信息;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:CLI 已修复重复英文错误,所有 Web/API 状态、危险确认和失败提示仍需统一。
|
||||
- 涉及文件:`frontend/src/views/`、`backend/internal/httpapi/error_sanitization.go`、`backend/internal/cli/`、`backend/internal/logging/`。
|
||||
- 依赖任务:P0-10、P1-12、P2-01。
|
||||
- 整改内容:不显示 HTML 实体编码、原始英文枚举、空错误或后端堆栈;危险操作中文确认,八类任务状态和证书状态一致;必要协议和技术标识可保留英文。
|
||||
- 验证命令:V03、V07、V05、V11;检查渲染文本和实际 CLI 输出,不用终端脚本替换中文;补空错误、未知状态、转义文本及重复错误测试。
|
||||
- 实机验收步骤:触发表单、权限、网络、DNS、SSH 和恢复错误;查看页面、任务详情、通知和日志的人类可读说明;没有实体乱码、堆栈或凭据回显,错误能定位下一步。
|
||||
- 验收证据:`885478a` 有 CLI 实际中文单条错误证据;其他路径尚未整体验收。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-03 所有长操作任务化
|
||||
|
||||
- 任务编号:P2-03;任务名称:所有长操作任务化;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:部分部署已有任务,其他耗时接口可能仍阻塞请求或无法跨刷新恢复。
|
||||
- 涉及文件:`backend/internal/httpapi/`、`backend/internal/repository/task_repository.go`、`backend/internal/certificate/`、`backend/internal/deployment/`;拟新增 Tasks 页面和统一执行服务。
|
||||
- 依赖任务:P0-10、P1-04、P1-12。
|
||||
- 整改内容:申请、续期、DNS 验证、批量部署、远程备份、数据库恢复、批量删除和批量导入全部快速返回 task_id;页面通过查询/轮询展示进度,不依赖单一长连接成功。
|
||||
- 验证命令:V07、V06、V09、V10、V03;补响应时限、任务持久化、断连、刷新与服务重启测试。
|
||||
- 实机验收步骤:对每类操作触发可观察长任务,提交后立即关闭页面再登录查询;断网不能重复创建任务;重启后执行状态可恢复或明确失败,不永远停在运行中;取消和重试可追溯。
|
||||
- 验收证据:已有任务基础不足以证明列出的全部操作任务化。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-04 增加幂等和重复操作保护
|
||||
|
||||
- 任务编号:P2-04;任务名称:增加幂等和重复操作保护;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:局部进程锁与事务不能保证跨请求、调度重启、多实例的统一幂等。
|
||||
- 涉及文件:`backend/internal/processlock/`、`backend/internal/repository/`、`backend/internal/httpapi/`、`backend/internal/certificate/`、`backend/internal/deployment/`;拟新增幂等持久化及迁移。
|
||||
- 依赖任务:P0-05、P0-10、P1-12。
|
||||
- 整改内容:幂等键、操作锁、任务去重、申请锁、部署锁、恢复锁和重复提交检测;相同键不同载荷拒绝,范围按项目/资源定义;防重复申请/部署/续期与多实例同证书竞争。
|
||||
- 验证命令:V02、V06、V07、V09、V10;补并发、锁过期、工作者崩溃、幂等结果重放及载荷冲突测试。
|
||||
- 实机验收步骤:双页面同时提交同一证书操作并刷新;调度与人工续期并发;两个隔离实例指向专用数据库竞争任务,核对只有一个有效执行;持锁实例退出后合法接管且无重复远端副作用。
|
||||
- 验收证据:部分锁/事务测试存在,统一持久化幂等和多实例实测缺失。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-05 完善日志、指标和追踪
|
||||
|
||||
- 任务编号:P2-05;任务名称:完善日志、指标和追踪;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有日志和任务记录还不能证明请求、任务、用户、项目全链路关联及指标口径一致。
|
||||
- 涉及文件:`backend/internal/logging/`、`backend/internal/httpapi/middleware.go`、`backend/internal/repository/`、`backend/internal/certificate/`、`backend/internal/deployment/`、`backend/internal/notification/`。
|
||||
- 依赖任务:P0-07、P0-10、P1-09。
|
||||
- 整改内容:请求 ID、任务 ID、用户 ID、项目 ID 与敏感字段脱敏;统计签发/续期/部署成功率、任务失败率/耗时、DNS 耗时、远程连接/通知/数据库错误次数,明确定义分母与重试统计方式。
|
||||
- 验证命令:V11、V07、V09、V10;补跨后台任务上下文、恶意追踪头、结构化脱敏和指标增量测试。
|
||||
- 实机验收步骤:一次真实申请到部署/通知用追踪 ID 串联;制造各类失败比对日志与计数;并发时不串用户/项目;抽查文件、控制台和任务页面无秘密内容。
|
||||
- 验收证据:日志基础存在,完整字段、指标和真实跨步骤追踪待补。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-06 完善接口和前端测试
|
||||
|
||||
- 任务编号:P2-06;任务名称:完善接口和前端测试;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:现有全量通过与测试数量不能证明新增全部需求、失败路径和权限边界均覆盖。
|
||||
- 涉及文件:`backend/internal/**/*_test.go`、`frontend/src/views/**/*.test.js`、`frontend/src/test-support/`、`deploy/tests/`、`tests/`。
|
||||
- 依赖任务:P1-12;随 P0/P1/P2 每项增量补测试,不等待所有实现结束。
|
||||
- 整改内容:补权限/越权、证书流程、重复提交、回滚、迁移、脱敏、登录、初始化、任务查询、部署确认、错误重试和权限显示;真实环境层与夹具层分开记录,跳过用例明确列出。
|
||||
- 验证命令:V02、V03;对每个新增模块检查测试断言实际覆盖业务,而非只检查成功状态码。
|
||||
- 实机验收步骤:从干净候选执行首次初始化至真实签发部署;覆盖管理员/普通用户、错误和重试;双平台及三数据库回归登记差异;浏览器缓存和测试数据按约定隔离清理。
|
||||
- 验收证据:`885478a` 有后端全量与前端 150 项通过记录;新增整改范围仍需追加覆盖与当前候选复验。
|
||||
- 复审结果:未完成,不能用旧全绿封闭新需求。
|
||||
|
||||
## P2-07 完善升级、降级和卸载流程
|
||||
|
||||
- 任务编号:P2-07;任务名称:完善升级、降级和卸载流程;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:已有安装器及说明,跨版本配置/数据迁移、失败恢复和卸载保留策略缺实机闭环。
|
||||
- 涉及文件:`deploy/`、`backend/internal/database/`、`backend/internal/config/`、`backend/internal/servicehost/`、`build/`、《生产部署与运维说明.md》。
|
||||
- 依赖任务:P0-04、P0-05、P0-12。
|
||||
- 整改内容:升级前备份、数据库/配置迁移、静态文件替换、重启、失败回滚、版本检查、卸载确认、保留数据及明确授权删除数据;降级不兼容时先阻断并提供可验证恢复方案。
|
||||
- 验证命令:V05、V06、V12、V04;执行已有安装器正式测试,补迁移中断、校验失败和版本拒绝测试。
|
||||
- 实机验收步骤:每平台从已知旧版装载测试资源升级,确认 UI 与二进制版本一致;制造迁移/启动失败恢复旧版与数据;测试支持降级及不支持降级的拒绝;分别卸载保留数据和授权删除数据,不动共享服务。
|
||||
- 验收证据:安装器基础存在,当前跨版本故障演练未齐。
|
||||
- 复审结果:未完成。
|
||||
|
||||
## P2-08 完成 Windows Service 实机验收
|
||||
|
||||
- 任务编号:P2-08;任务名称:完成 Windows Service 实机验收;优先级:P2。
|
||||
- 当前状态:`[!] 暂缓或存在阻塞`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[ ]`;生产部署测试 `[!]`;最终验收 `[ ]`。
|
||||
- 问题说明:当前只有构建和局部 Windows 程序执行证据,缺完整 Service 控制与故障恢复记录。
|
||||
- 涉及文件:`deploy/install-windows.ps1`、`deploy/` 中卸载与服务文件、`backend/internal/servicehost/`、`backend/internal/localreset/`。
|
||||
- 依赖任务:P0-04、P0-12、P2-07。
|
||||
- 整改内容:验证安装、启动、停止、重启、开机启动、异常恢复、日志/配置/数据目录、升级和卸载;服务权限最小化,超级管理员重置仅受保护本机 IPC。
|
||||
- 验证命令:V12 在 Windows 执行,V04 构建 Windows 候选;正式安装参数以安装器帮助和部署说明为准,记录实际服务查询命令。
|
||||
- 实机验收步骤:在明确专用 Windows 测试机以正式安装器安装;记录 SCM 状态和路径权限,逐项启停与重启机器;异常退出后核对恢复;进行升级与卸载保留数据,再安装能恢复业务;网络不可访问本机密码重置接口。
|
||||
- 验收证据:没有当前候选完整服务实机证据;不能把 Windows ZIP 或 help 退出 0 当 Service 通过。
|
||||
- 复审结果:待具备专用环境并完成实机步骤,不阻断可先做的代码审查。
|
||||
|
||||
## P2-09 完成 Linux systemd 实机验收
|
||||
|
||||
- 任务编号:P2-09;任务名称:完成 Linux systemd 实机验收;优先级:P2。
|
||||
- 当前状态:`[!] 暂缓或存在阻塞`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[!]`;最终验收 `[ ]`。
|
||||
- 问题说明:有历史远端部署与 unit,当前候选服务完整流程还未复验。
|
||||
- 涉及文件:`deploy/install-linux.sh`、`deploy/systemd/`、`backend/internal/servicehost/`、`backend/internal/certstorage/`、`backend/internal/nginxactivation/`、`backend/internal/localreset/`。
|
||||
- 依赖任务:P0-04、P0-09、P0-12、P2-07。
|
||||
- 整改内容:安装、启停/重启、开机启动、异常恢复、运行用户、日志、配置/数据目录、升级卸载;辅助程序权限和目录创建受限,不关闭 TLS 或扩大目录写权限。
|
||||
- 验证命令:V12 在 Linux 执行,V04 构建 Linux 候选;部署后使用正式 `systemctl`、`journalctl` 查询对应服务,不凭 archive mode 认定服务可用。
|
||||
- 实机验收步骤:密码登录并校验已确认指纹,先核对同机服务归属;安装当前包并走清空专用测试库后的初始化;验证自定义证书目录安全创建、Nginx 信任正式证书;启停、重启机器、异常退出和升级回滚;只卸载 Scert 测试资源。
|
||||
- 验收证据:已有 Linux 归档 0755 检查,不是本候选 systemd 实机证明;远端当前状态必须重查。
|
||||
- 复审结果:完整实机门禁未通过。
|
||||
|
||||
## P2-10 完善安全基线
|
||||
|
||||
- 任务编号:P2-10;任务名称:完善安全基线;优先级:P2。
|
||||
- 当前状态:`[~] 进行中`。
|
||||
- 六阶段:需求确认 `[x]`;代码实现 `[~]`;自动化测试 `[~]`;隔离环境测试 `[~]`;生产部署测试 `[ ]`;最终验收 `[ ]`。
|
||||
- 问题说明:SSH、凭据和数据库局部安全测试存在,统一认证、会话、Web 与操作系统边界尚未全覆盖。
|
||||
- 涉及文件:`backend/internal/auth/`、`backend/internal/passwordpolicy/`、`backend/internal/httpapi/`、`backend/internal/bootstrap/`、`backend/internal/localreset/`、`backend/internal/deployment/`、`backend/internal/secretstore/`、`deploy/`。
|
||||
- 依赖任务:P0-07、P0-08、P0-09、P1-12。
|
||||
- 整改内容:禁止默认密码继续使用、必要时强制改密;登录限流、会话失效、安全 Cookie、CSRF、越权、路径穿越、命令注入、上传类型/大小限制、隐藏敏感版本、日志脱敏;手动证书路径仍验证并导入托管存储,超级管理员重置仅本机受保护 IPC。
|
||||
- 验证命令:V02、V07、V08、V09、V12、V03;补每项负向安全断言和跨平台权限测试。
|
||||
- 实机验收步骤:从公网正常 TLS 测试登录、退出、撤权与改密后会话;用专用账号做 CSRF/越权与恶意路径/命令输入,确认无副作用;尝试超限上传;核对私钥文件权限、服务暴露端口、日志及恢复 IPC ACL。
|
||||
- 验收证据:局部测试不替代安全基线全表;当前版本完整复核尚缺。
|
||||
- 复审结果:未完成。
|
||||
12
release/README.md
Normal file
12
release/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# 发布包目录
|
||||
|
||||
此目录用于存放准备分发的 Web 与 Windows/Linux 服务端候选包。除本说明外,内容均由仓库级忽略规则排除,不纳入源码提交。
|
||||
|
||||
- 正式入口为 `build/build-release.ps1`,可通过 `-OutputDirectory` 指定本目录下新的唯一子目录。
|
||||
- 构建中间文件默认仍位于 `build/`;既有输出不删除、不覆盖,也不必为统一目录而移动历史文件。
|
||||
- 每份候选包应具有源码提交、版本、目标平台、`manifest.json` 和 SHA256 校验记录。正式候选要求 `source_dirty=false`。
|
||||
- 不打包 `.runtime/`、数据库、用户配置、凭据、私钥、浏览器缓存、历史桌面产物或验收证据。
|
||||
- 包内证书、配置示例只能来自明确的发布白名单,不得从正在运行的服务器复制配置作为模板。
|
||||
- 发布前按 `doc/Scert整改任务执行清单.md` 对应版本完成门禁。包能构建、解压或启动不等于生产验收通过。
|
||||
|
||||
目录边界与现有文件保留规则见 `doc/仓库目录与产物边界说明.md`。
|
||||
10
scripts/README.md
Normal file
10
scripts/README.md
Normal file
@ -0,0 +1,10 @@
|
||||
# 开发辅助目录
|
||||
|
||||
本目录为后续确有需要的正式开发辅助工具预留,当前不添加临时验收脚本。
|
||||
|
||||
- 发布脚本保留于 `build/`,安装、卸载、服务定义和部署测试保留于 `deploy/`。
|
||||
- 不复制业务实现,不以辅助脚本绕过 Web、服务端、权限、指纹、TLS 或恢复保护。
|
||||
- 不放置真实凭据、本地专用路径、数据库导出和远程临时文件。
|
||||
- 任何新增工具须有明确用途、中文说明和测试;辅助工具的成功不能作为产品生产验收结论。
|
||||
|
||||
现有文件不因目录整理而删除。详见 `doc/仓库目录与产物边界说明.md`。
|
||||
12
tests/README.md
Normal file
12
tests/README.md
Normal file
@ -0,0 +1,12 @@
|
||||
# 跨模块测试目录
|
||||
|
||||
本目录供后续正式跨模块和端到端测试使用,目前不代表已经建立独立测试套件。测试代码可纳入 Git,运行结果、截图、缓存和数据库不可纳入 Git。
|
||||
|
||||
现有正式测试保留原位,不为目录整理而删除或迁移:
|
||||
|
||||
- 后端:`backend/internal/` 下的 `*_test.go`,在 `backend/` 执行 `go test ./...` 和 `go vet ./...`。
|
||||
- 前端:页面旁的 `*.test.js`,在 `frontend/` 执行 `npm.cmd test`。
|
||||
- 安装器:`deploy/tests/install-linux-test.py` 是已有正式安装器测试,不属于临时辅助脚本。
|
||||
- 产物边界:`backend/internal/releasearchive/source_boundary_test.go`,在隔离 Git 仓库验证实际忽略行为,不依赖开发机 `.git/info/exclude`。
|
||||
|
||||
生产验收仍须使用对应候选包在真实环境运行。测试夹具不能代替真实 DNS、ACME、SSH、HTTPS、服务管理或恢复演练。
|
||||
Loading…
Reference in New Issue
Block a user