From f1412a371de6a981c9c8b2439cd301250db9e128 Mon Sep 17 00:00:00 2001 From: Rogee Date: Mon, 9 Feb 2026 11:27:23 +0800 Subject: [PATCH] chore: harden production readiness gates and runbooks --- backend/.gitea/workflows/build.yml | 67 +++- backend/providers/http/config.go | 9 + backend/providers/http/engine.go | 95 +++++- backend/providers/http/engine_test.go | 52 +++ backend/providers/postgres/config.go | 9 + backend/providers/postgres/postgres.go | 12 +- docs/backup_restore_runbook.md | 168 ++++++++++ docs/plan.md | 297 ----------------- docs/plans/2026-02-09.md | 188 +++++++++++ docs/release-evidence/2026-02-09.md | 301 ++++++++++++++++++ .../2026-02-09/portal_home.png | Bin 0 -> 104195 bytes .../2026-02-09/superadmin_login.png | Bin 0 -> 51672 bytes docs/rollback_runbook.md | 119 +++++++ frontend/portal/package.json | 3 +- frontend/superadmin/package.json | 3 +- 15 files changed, 1001 insertions(+), 322 deletions(-) create mode 100644 backend/providers/http/engine_test.go create mode 100644 docs/backup_restore_runbook.md create mode 100644 docs/plans/2026-02-09.md create mode 100644 docs/release-evidence/2026-02-09.md create mode 100644 docs/release-evidence/2026-02-09/portal_home.png create mode 100644 docs/release-evidence/2026-02-09/superadmin_login.png create mode 100644 docs/rollback_runbook.md diff --git a/backend/.gitea/workflows/build.yml b/backend/.gitea/workflows/build.yml index 6784f72..2fef642 100644 --- a/backend/.gitea/workflows/build.yml +++ b/backend/.gitea/workflows/build.yml @@ -3,7 +3,7 @@ run-name: ${{ gitea.actor }} Build Application on: [push] jobs: - Build: + FrontendChecks: runs-on: ubuntu-latest steps: - name: Check out repository code @@ -14,29 +14,74 @@ jobs: with: node-version: "20" - - name: Install dependencies and build frontend + - name: Install portal dependencies run: | - cd frontend - npm config set registry https://npm.hub.ipao.vip - npm install - npm run build + cd frontend/portal + npm ci + + - name: Portal lint (check only) + run: npm -C frontend/portal run lint + + - name: Portal build + run: npm -C frontend/portal run build + + - name: Install superadmin dependencies + run: | + cd frontend/superadmin + npm ci + + - name: Superadmin lint (check only) + run: npm -C frontend/superadmin run lint + + - name: Superadmin build + run: npm -C frontend/superadmin run build + + BackendChecks: + runs-on: ubuntu-latest + steps: + - name: Check out repository code + uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v3 with: go-version: "1.22" + - name: Configure Go proxy + run: | + go env -w GOPROXY=https://go.hub.ipao.vip,direct + go env -w GONOPROXY='git.ipao.vip' + go env -w GONOSUMDB='git.ipao.vip' + + - name: Run backend tests + run: | + cd backend + go test ./... + - name: Build Go application run: | cd backend mkdir -p build - go env -w GOPROXY=https://go.hub.ipao.vip,direct - go env -w GONOPROXY='git.ipao.vip' - go env -w GONOSUMDB='git.ipao.vip' - go mod tidy CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o build/app . + - name: API smoke (health/readiness) + run: | + cd backend + timeout 45s go run . serve > /tmp/quyun_backend.log 2>&1 & + APP_PID=$! + sleep 15 + curl -f -sS http://127.0.0.1:18080/healthz > /tmp/healthz.out + curl -f -sS http://127.0.0.1:18080/readyz > /tmp/readyz.out + kill ${APP_PID} + + DockerImage: + runs-on: ubuntu-latest + needs: [FrontendChecks, BackendChecks] + steps: + - name: Check out repository code + uses: actions/checkout@v4 + - name: Build final Docker image run: | docker login -u ${{ secrets.DOCKER_AF_USERNAME }} -p ${{ secrets.DOCKER_AF_PASSWORD }} docker-af.hub.ipao.vip - docker build --push -t docker-af.hub.ipao.vip/rogeecn/test:latest . + docker build --push -t docker-af.hub.ipao.vip/rogeecn/test:latest . diff --git a/backend/providers/http/config.go b/backend/providers/http/config.go index 32a93a6..cf6c99c 100644 --- a/backend/providers/http/config.go +++ b/backend/providers/http/config.go @@ -2,6 +2,7 @@ package http import ( "fmt" + "strings" ) const DefaultPrefix = "Http" @@ -60,3 +61,11 @@ func (h *Config) Address() string { return fmt.Sprintf("%s:%d", h.Host, h.Port) } + +func (h *Config) HasTLS() bool { + if h == nil || h.TLS == nil { + return false + } + + return strings.TrimSpace(h.TLS.Cert) != "" && strings.TrimSpace(h.TLS.Key) != "" +} diff --git a/backend/providers/http/engine.go b/backend/providers/http/engine.go index 6d2fd89..4282291 100644 --- a/backend/providers/http/engine.go +++ b/backend/providers/http/engine.go @@ -2,6 +2,7 @@ package http import ( "context" + "database/sql" "errors" "fmt" "net" @@ -9,9 +10,13 @@ import ( "strings" "time" + "quyun/v2/app/errorx" + "quyun/v2/providers/storage" + logrus "github.com/sirupsen/logrus" "go.ipao.vip/atom/container" "go.ipao.vip/atom/opt" + "go.uber.org/dig" "github.com/gofiber/fiber/v3" "github.com/gofiber/fiber/v3/middleware/compress" @@ -22,8 +27,6 @@ import ( "github.com/gofiber/fiber/v3/middleware/recover" "github.com/gofiber/fiber/v3/middleware/requestid" "github.com/samber/lo" - - "quyun/v2/app/errorx" ) func DefaultProvider() container.ProviderContainer { @@ -36,8 +39,10 @@ func DefaultProvider() container.ProviderContainer { } type Service struct { - conf *Config - Engine *fiber.App + conf *Config + Engine *fiber.App + healthCheck func(context.Context) error + readyCheck func(context.Context) error } var errTLSCertKeyRequired = errors.New("tls cert and key must be set") @@ -98,7 +103,11 @@ func Provide(opts ...opt.Option) error { return err } - return container.Container.Provide(func() (*Service, error) { + return container.Container.Provide(func(params struct { + dig.In + DB *sql.DB `optional:"true"` + Storage *storage.Storage `optional:"true"` + }) (*Service, error) { engine := fiber.New(fiber.Config{ StrictRouting: true, CaseSensitive: true, @@ -198,8 +207,14 @@ func Provide(opts ...opt.Option) error { })) } - engine.Get("/healthz", func(c fiber.Ctx) error { return c.SendStatus(fiber.StatusNoContent) }) - engine.Get("/readyz", func(c fiber.Ctx) error { return c.SendStatus(fiber.StatusNoContent) }) + service := &Service{ + Engine: engine, + conf: &config, + } + service.healthCheck = service.buildHealthCheck() + service.readyCheck = service.buildReadyCheck(params.DB, params.Storage) + engine.Get("/healthz", service.handleHealthz) + engine.Get("/readyz", service.handleReadyz) engine.Hooks().OnPostShutdown(func(err error) error { if err != nil { @@ -210,14 +225,72 @@ func Provide(opts ...opt.Option) error { return nil }) - return &Service{ - Engine: engine, - conf: &config, - }, nil + return service, nil }, o.DiOptions()...) } // buildCORSConfig converts provider Cors config into fiber cors.Config +func (svc *Service) buildHealthCheck() func(context.Context) error { + return func(_ context.Context) error { + return nil + } +} + +func (svc *Service) buildReadyCheck(db *sql.DB, store *storage.Storage) func(context.Context) error { + var dbPing func(context.Context) error + if db != nil { + dbPing = func(ctx context.Context) error { + pingCtx, cancel := context.WithTimeout(ctx, 1500*time.Millisecond) + defer cancel() + + return db.PingContext(pingCtx) + } + } + + return newReadyCheck(dbPing, store) +} + +func newReadyCheck(dbPing func(context.Context) error, store *storage.Storage) func(context.Context) error { + return func(ctx context.Context) error { + if dbPing != nil { + if err := dbPing(ctx); err != nil { + return errorx.ErrServiceUnavailable.WithCause(err).WithMsg("database not ready") + } + } + if store != nil && store.Config != nil && strings.EqualFold(strings.TrimSpace(store.Config.Type), "s3") && store.Config.CheckOnBoot { + if strings.TrimSpace(store.Config.Endpoint) == "" || strings.TrimSpace(store.Config.Bucket) == "" { + return errorx.ErrServiceUnavailable.WithMsg("storage not ready") + } + } + + return nil + } +} + +func (svc *Service) handleHealthz(c fiber.Ctx) error { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + if svc.healthCheck != nil { + if err := svc.healthCheck(ctx); err != nil { + return errorx.SendError(c, err) + } + } + + return c.SendStatus(fiber.StatusNoContent) +} + +func (svc *Service) handleReadyz(c fiber.Ctx) error { + ctx, cancel := context.WithTimeout(context.Background(), 2*time.Second) + defer cancel() + if svc.readyCheck != nil { + if err := svc.readyCheck(ctx); err != nil { + return errorx.SendError(c, err) + } + } + + return c.SendStatus(fiber.StatusNoContent) +} + func buildCORSConfig(c *Cors) *cors.Config { if c == nil { return nil diff --git a/backend/providers/http/engine_test.go b/backend/providers/http/engine_test.go new file mode 100644 index 0000000..0d16bd4 --- /dev/null +++ b/backend/providers/http/engine_test.go @@ -0,0 +1,52 @@ +package http + +import ( + "context" + "errors" + "testing" + + "quyun/v2/providers/storage" +) + +func TestNewReadyCheck(t *testing.T) { + t.Run("returns error when database ping fails", func(t *testing.T) { + checker := newReadyCheck(func(context.Context) error { + return errors.New("db down") + }, nil) + + err := checker(context.Background()) + if err == nil { + t.Fatalf("expected readiness error when db ping fails") + } + }) + + t.Run("returns error when s3 storage config is incomplete and check on boot enabled", func(t *testing.T) { + checker := newReadyCheck(nil, &storage.Storage{Config: &storage.Config{ + Type: "s3", + CheckOnBoot: true, + Endpoint: "", + Bucket: "", + }}) + + err := checker(context.Background()) + if err == nil { + t.Fatalf("expected readiness error when storage config is incomplete") + } + }) + + t.Run("returns nil when dependencies are ready", func(t *testing.T) { + checker := newReadyCheck(func(context.Context) error { + return nil + }, &storage.Storage{Config: &storage.Config{ + Type: "s3", + CheckOnBoot: true, + Endpoint: "http://127.0.0.1:9000", + Bucket: "bucket", + }}) + + err := checker(context.Background()) + if err != nil { + t.Fatalf("expected nil error, got %v", err) + } + }) +} diff --git a/backend/providers/postgres/config.go b/backend/providers/postgres/config.go index e9405bc..23e4410 100644 --- a/backend/providers/postgres/config.go +++ b/backend/providers/postgres/config.go @@ -4,6 +4,7 @@ import ( "fmt" "math" "strconv" + "strings" "time" "go.ipao.vip/atom/container" @@ -92,6 +93,8 @@ func (config *Config) checkDefault() { if config.SslMode == "" { config.SslMode = "disable" + } else { + config.SslMode = strings.ToLower(strings.TrimSpace(config.SslMode)) } if config.TimeZone == "" { @@ -141,3 +144,9 @@ func (config *Config) DSN() string { return base + extras } + +func (config *Config) IsTLSEnabled() bool { + mode := strings.ToLower(strings.TrimSpace(config.SslMode)) + + return mode != "" && mode != "disable" +} diff --git a/backend/providers/postgres/postgres.go b/backend/providers/postgres/postgres.go index d575aa8..bcd7db3 100644 --- a/backend/providers/postgres/postgres.go +++ b/backend/providers/postgres/postgres.go @@ -3,12 +3,16 @@ package postgres import ( "context" "database/sql" + "fmt" "math" "time" + "quyun/v2/providers/app" + logrus "github.com/sirupsen/logrus" "go.ipao.vip/atom/container" "go.ipao.vip/atom/opt" + "go.uber.org/dig" "gorm.io/driver/postgres" "gorm.io/gorm" "gorm.io/gorm/logger" @@ -22,7 +26,13 @@ func Provide(opts ...opt.Option) error { return err } - return container.Container.Provide(func() (*gorm.DB, *sql.DB, *Config, error) { + return container.Container.Provide(func(params struct { + dig.In + App *app.Config `optional:"true"` + }) (*gorm.DB, *sql.DB, *Config, error) { + if params.App != nil && params.App.IsReleaseMode() && !conf.IsTLSEnabled() { + return nil, nil, nil, fmt.Errorf("release mode requires Database.SslMode to enable TLS") + } dbConfig := postgres.Config{DSN: conf.DSN()} // 安全日志:不打印密码,仅输出关键连接信息 diff --git a/docs/backup_restore_runbook.md b/docs/backup_restore_runbook.md new file mode 100644 index 0000000..6bddb5f --- /dev/null +++ b/docs/backup_restore_runbook.md @@ -0,0 +1,168 @@ +# Backup / Restore Runbook (Pre-Prod & Prod) + +## 1. Scope + +适用于 `quyun_v2` 的以下状态数据: +- PostgreSQL(业务主数据) +- 对象存储目录(本地存储或 S3 兼容对象) +- 关键运行配置快照(不含明文 secret) + +本 Runbook 目标: +1. 能稳定执行备份 +2. 能在预发环境完成恢复 +3. 有明确 RTO / RPO 验证步骤 + +--- + +## 2. Preconditions + +- 拥有数据库备份权限(`pg_dump` / `psql`) +- 拥有对象存储读写权限(本地目录或 S3 API) +- 预发环境可用并与生产版本兼容 +- 已确认以下变量(示例): + +```bash +export QY_DB_HOST=127.0.0.1 +export QY_DB_PORT=5432 +export QY_DB_NAME=quyun_v2 +export QY_DB_USER=postgres +export QY_DB_PASSWORD='***' +``` + +--- + +## 3. PostgreSQL Backup + +### 3.1 创建备份目录 + +```bash +mkdir -p /tmp/quyun-backup +``` + +### 3.2 导出数据库(自定义格式) + +```bash +PGPASSWORD="$QY_DB_PASSWORD" \ +pg_dump -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" \ + -F c -d "$QY_DB_NAME" \ + -f "/tmp/quyun-backup/${QY_DB_NAME}_$(date +%Y%m%d_%H%M%S).dump" +``` + +### 3.3 备份完整性校验 + +```bash +pg_restore -l /tmp/quyun-backup/.dump >/tmp/quyun-backup/restore.list +``` + +验收标准:命令退出码为 0,且 `restore.list` 非空。 + +--- + +## 4. Object Storage Backup + +## 4.1 本地存储(`Storage.Type=local`) + +```bash +tar -czf "/tmp/quyun-backup/storage_$(date +%Y%m%d_%H%M%S).tar.gz" ./backend/storage +``` + +### 4.2 S3/MinIO(`Storage.Type=s3`) + +使用 `mc`(MinIO Client)示例: + +```bash +mc alias set quyun-s3 http://127.0.0.1:9000 "$STORAGE_ACCESS_KEY" "$STORAGE_SECRET_KEY" +mc mirror quyun-s3/quyun-01 "/tmp/quyun-backup/s3_quyun-01_$(date +%Y%m%d_%H%M%S)" +``` + +验收标准:目标目录文件数量 > 0,且抽样对象可读取。 + +--- + +## 5. Restore Procedure (Pre-Prod Drill) + +### 5.1 预发库准备 + +```bash +PGPASSWORD="$QY_DB_PASSWORD" \ +psql -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" -d postgres \ + -c "DROP DATABASE IF EXISTS ${QY_DB_NAME}_restore;" + +PGPASSWORD="$QY_DB_PASSWORD" \ +psql -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" -d postgres \ + -c "CREATE DATABASE ${QY_DB_NAME}_restore;" +``` + +### 5.2 恢复数据库 + +```bash +PGPASSWORD="$QY_DB_PASSWORD" \ +pg_restore -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" \ + -d "${QY_DB_NAME}_restore" --clean --if-exists \ + "/tmp/quyun-backup/.dump" +``` + +### 5.3 恢复后校验 + +```bash +PGPASSWORD="$QY_DB_PASSWORD" \ +psql -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" -d "${QY_DB_NAME}_restore" \ + -c "SELECT COUNT(*) FROM users;" + +PGPASSWORD="$QY_DB_PASSWORD" \ +psql -h "$QY_DB_HOST" -p "$QY_DB_PORT" -U "$QY_DB_USER" -d "${QY_DB_NAME}_restore" \ + -c "SELECT COUNT(*) FROM audit_logs;" +``` + +验收标准: +- 核心表(`users`, `orders`, `audit_logs`, `contents`)有合理数据量 +- 抽样业务查询无语法或权限错误 + +--- + +## 6. Service Verification After Restore + +启动服务后执行: + +```bash +curl -f -sS http://127.0.0.1:18080/healthz +curl -f -sS http://127.0.0.1:18080/readyz +``` + +验收标准:两个端点均返回 2xx。 + +--- + +## 7. RTO / RPO Recording + +每次演练记录: +- Backup start/end time +- Restore start/end time +- Data validation result +- Incident / blockers + +建议目标: +- RTO <= 30 分钟 +- RPO <= 24 小时(按日备份基线) + +--- + +## 8. Failure Handling + +- `pg_dump` 失败:检查网络/权限/磁盘空间,重试一次 +- `pg_restore` 失败:保留日志,回退至原预发库,不进行覆盖发布 +- 对象恢复失败:仅允许在“非阻断业务路径”条件下继续演练,否则中止 + +--- + +## 9. Evidence Requirement + +每次演练需归档到: +- `docs/release-evidence/.md` + +最少包含: +1. 执行人、时间窗 +2. 命令与退出码 +3. 核心校验 SQL 输出 +4. healthz/readyz 结果 +5. 结论(PASS/FAIL) diff --git a/docs/plan.md b/docs/plan.md index 6b55704..e69de29 100644 --- a/docs/plan.md +++ b/docs/plan.md @@ -1,297 +0,0 @@ -# Implementation Plan: 生产部署能力补齐(数据源统一、隔离强化、双侧审计) - -**Branch**: `[prod-readiness-hardening]` | **Date**: 2026-02-08 | **Spec**: 会话需求(评估并补齐生产部署能力) -**Input**: 用户要求按 4 项标准补齐生产部署能力: -1) 前端数据来源后端接口/渲染; -2) 用户/租户数据隔离完备; -3) 超级管理员后台可审计; -4) 租户管理侧可审计。 - -## Summary - -当前评估结果为: -- #1 前端数据来源:未完全达标(存在硬编码业务数据页面); -- #2 用户/租户隔离:基础机制已具备,但依赖服务层手工加租户条件,仍有遗漏风险; -- #3 超管审计:已具备(audit_logs 表 + 超管查询页面/API); -- #4 租户侧审计:未达标(仅有 audit 类通知,不等同审计日志查询能力)。 - -本计划目标是在最小风险下将以上 4 项全部提升为可上线状态: -- 去除生产路径硬编码业务数据; -- 强化多租户隔离“可证明性”(代码约束 + 负向测试); -- 保持并补强超管审计覆盖; -- 增加租户管理侧可审计能力(租户范围审计日志查询 API + 页面); -- 建立可审签发布证据链(route/swagger/test/UI flow/evidence/archive)。 - -## Technical Context - -**Language/Version**: -- Backend: Go(Fiber + GORM-Gen) -- Frontend: Vue 3 + Vite(portal/superadmin) - -**Primary Dependencies**: -- Backend: `backend/app/http/v1`, `backend/app/http/super/v1`, `backend/app/services/*`, `backend/database/models/*` -- Frontend: `frontend/portal/src/views/*`, `frontend/portal/src/api/*`, `frontend/superadmin/src/views/superadmin/*`, `frontend/superadmin/src/service/*` -- Generators: `atomctl gen route`, `atomctl swag init` - -**Storage**: -- PostgreSQL(`audit_logs` 已存在,必要时补索引/查询优化) - -**Testing**: -- Backend: `cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go test ./...` -- Frontend Build/Lint: - - `npm -C frontend/portal run build` - - `npm -C frontend/portal run lint` - - `npm -C frontend/superadmin run build` - - `npm -C frontend/superadmin run lint` -- Frontend功能验收(页面流): - - 超管审计日志查询流 - - 租户管理侧审计日志查询流 - - 用户“我的点赞/收藏/订单”等后端数据回填流 - -**Target Platform**: -- Linux 部署环境(Web + API) - -**Project Type**: -- Web application(frontend + backend) - -**Performance Goals**: -- 审计日志列表接口在常规分页(20条)下 p95 <= 300ms(预发基准) -- 不引入明显回归(核心列表接口不劣化) - -**Performance Measurement Protocol**: -- 测量接口:`/super/v1/audit-logs` 与新增租户审计列表接口。 -- 测量条件:`page=1&limit=20`,默认排序(`created_at desc`),不带 keyword。 -- 样本规则:预热 10 次后连续采样 50 次,统计 p95。 -- 证据输出:写入 `docs/release-evidence/.md` 的“性能基线”小节。 - -**Constraints**: -- 禁止手改 `*.gen.go`(路由/文档生成文件仅通过工具生成) -- 控制器保持薄层(bind -> services -> return) -- 不使用 `as any` / `@ts-ignore` / `@ts-expect-error` -- 缺陷修复最小化,不做无关重构 - -**Scale/Scope**: -- 覆盖 portal + superadmin + backend v1/super v1 审计与隔离相关模块 -- 覆盖上线阻塞项(P0)与并行优化项(P1) - -## Constitution Check - -*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* - -- ✅ 符合后端分层:Controller 不直接做 DAO CRUD,统一走 `services.*` -- ✅ 符合生成文件约束:路由与 Swagger 仅通过 `atomctl` 生成 -- ✅ 符合多租户前缀规范:`/v1/t/:tenantCode/*` -- ✅ 覆盖前后端联调验收要求:前端页面流 + `go test ./...` -- ✅ 计划包含任务拆解、依赖、验收标准、风险项、责任归属与里程碑 - -## Project Structure - -### Documentation (this phase) - -```text -docs/ -├── plan.md # 当前执行计划(本文件) -├── release-evidence/.md # 验收证据模板与执行结果 -└── plans/.md # 阶段完成归档 -``` - -### Source Code (repository root) - -```text -backend/ -├── app/http/v1/ -│ ├── routes.manual.go -│ ├── routes.gen.go # 生成文件(勿手改) -│ ├── user.go -│ ├── creator.go -│ └── (new) audit_logs.go # 若新增租户侧审计接口 -├── app/http/super/v1/ -│ ├── audit_logs.go -│ ├── routes.manual.go -│ └── routes.gen.go # 生成文件(勿手改) -├── app/services/ -│ ├── audit.go -│ ├── order.go -│ ├── content.go -│ ├── coupon.go -│ ├── tenant*.go -│ └── super.go -└── docs/ - ├── docs.go # 生成文件(勿手改) - ├── swagger.yaml # 生成文件(勿手改) - └── swagger.json # 生成文件(勿手改) - -frontend/ -├── portal/ -│ └── src/ -│ ├── api/ -│ ├── router/index.js -│ └── views/ -└── superadmin/ - └── src/ - ├── router/index.js - ├── service/ - └── views/superadmin/ -``` - -**Structure Decision**: 在现有目录内增量修复,不新增独立子项目;优先复用现有 service 与 DTO,确保变更可控。 - -## Plan Phases - -### Phase 1 — 前端数据源统一(P0) -目标:满足“前端业务数据必须来自后端接口/渲染”。 -- 基于 router 生成“生产页面 -> 数据来源(API/mock/static)”清单。 -- 替换生产路径中的硬编码业务数据(示例:Portal 用户侧业务列表)。 -- 处理 Superadmin demo 数据风险:默认禁入生产菜单/路由(必要时移出生产构建入口)。 - -### Phase 2 — 用户/租户隔离强化(P0) -目标:把“依赖人工自觉加条件”改为“可验证、可回归”。 -- 梳理关键服务(order/content/coupon/tenant/wallet)过滤点。 -- 对高风险路径补足 query-time tenant/user 约束。 -- 增加跨租户越权负向测试并形成隔离矩阵证据。 - -### Phase 3 — 审计能力补齐(超管 + 租户)(P0) -目标:满足 #3/#4 审计要求。 -- 超管侧:盘点并补齐关键操作 `Audit.Log` 覆盖。 -- 租户侧:新增租户审计查询 API + 页面,附角色权限控制。 -- 完成 route 生成与 Swagger 生成,确保接口可见且可调试。 - -### Phase 4 — 验证、证据与发布门禁(P0) -目标:形成可审签的上线证据。 -- 执行 backend 全量测试与双前端 build/lint。 -- 执行前端页面流验收并按模板记录证据。 -- 输出发布门禁检查单(Pass/Fail + 证据路径)。 -- 阶段通过后归档 `docs/plan.md` 到 `docs/plans/.md`,并清空 `docs/plan.md`。 - -## Tasks - -- [ ] T1 建立“生产部署能力差距台账”(含 router->页面->数据来源盘点)。 -- [ ] T2 替换 Portal 生产路径中的硬编码业务数据来源。 -- [ ] T3 下线或隔离 Superadmin demo 数据路由(防止进入生产流量路径)。 -- [ ] T4 建立后端隔离审计清单(order/content/coupon/tenant/wallet)。 -- [ ] T5 对高风险服务补充 tenant/user query-time 约束(最小改动)。 -- [ ] T6 增加跨租户越权测试用例并纳入回归。 -- [ ] T7 盘点超管关键操作审计埋点,补齐缺失 `Audit.Log` 调用。 -- [ ] T8 设计并实现租户侧审计日志查询 API(租户范围、权限受控)。 -- [ ] T9 执行 `cd backend && atomctl gen route` 并校验新增路由注册。 -- [ ] T10 实现租户管理侧审计页面(筛选、分页、时间范围、动作类型)。 -- [ ] T11 补充审计相关 API 注释与字段定义(operator/action/target/detail)。 -- [ ] T12 执行 `cd backend && atomctl swag init` 并校验 Swagger 产物更新。 -- [ ] T13 执行 backend 全量测试 `go test ./...`。 -- [ ] T14 执行 portal/superadmin build + lint。 -- [ ] T15 创建并冻结验收证据模板:`docs/release-evidence/.md`。 -- [ ] T16 执行前端页面流验收并填充证据模板(含截图/日志/结论)。 -- [ ] T17 汇总发布门禁清单并形成 Go/No-Go 结论。 -- [ ] T18 阶段完成后归档 `docs/plan.md` 到 `docs/plans/.md`,并清空 `docs/plan.md`。 - -## Dependencies - -- T1 -> T2/T3/T4/T7(先冻结缺口,再实施) -- T4 -> T5 -> T6 -> T13(隔离设计先行,测试跟进) -- T7 -> T8 -> T9 -> T10(先有后端能力与路由,再接前端) -- T8 -> T11 -> T12(接口定义后再生成 Swagger) -- T2/T3/T10 -> T14/T16(前端改造完成后再构建与页面验收) -- T15 -> T16 -> T17(证据模板先行) -- T9/T12/T13/T14/T16 -> T17(发布结论依赖完整证据链) -- T17(Go) -> T18(仅 Go 才归档;No-Go 不归档) - -## Owner Roles (RACI-lite) - -> 说明:每个任务必须有唯一 DRI(Directly Responsible Individual)与一个 Approver。 - -| Role | 主要职责 | -|------|----------| -| Tech Lead (Overall) | 统筹范围、顺序、风险与里程碑审签 | -| Backend Lead | 隔离强化、审计后端能力、生成流程与后端验证 | -| Frontend Portal Owner | Portal/租户侧页面改造与联调 | -| Frontend Superadmin Owner | Superadmin 生产路径治理与联调 | -| QA Owner | 回归用例、页面流验收、证据完整性审查 | -| Release Owner | 发布门禁、Go/No-Go 会议与归档执行 | - -## Task Accountability (DRI / Approver) - -| Task | DRI | Approver | -|------|-----|----------| -| T1 | Tech Lead | QA Owner | -| T2 | Frontend Portal Owner | Tech Lead | -| T3 | Frontend Superadmin Owner | Tech Lead | -| T4 | Backend Lead | Tech Lead | -| T5 | Backend Lead | QA Owner | -| T6 | QA Owner | Backend Lead | -| T7 | Backend Lead | Tech Lead | -| T8 | Backend Lead | Tech Lead | -| T9 | Backend Lead | Tech Lead | -| T10 | Frontend Portal Owner | QA Owner | -| T11 | Backend Lead | Tech Lead | -| T12 | Backend Lead | Tech Lead | -| T13 | Backend Lead | QA Owner | -| T14 | Frontend Superadmin Owner | QA Owner | -| T15 | QA Owner | Release Owner | -| T16 | QA Owner | Release Owner | -| T17 | Release Owner | Tech Lead | -| T18 | Release Owner | Tech Lead | - -## Execution Schedule (10 Working Days) - -> 计划周期:10个工作日。发生阻塞时顺延,不压缩验证与证据阶段。 - -| Day | Focus | 任务 | Primary Owner | 协作方 | 当日退出标准 | -|-----|-------|------|---------------|--------|--------------| -| D1 | 基线与证据机制冻结 | T1, T4(启动), T15 | Tech Lead, Backend Lead, QA Owner | Release Owner | 差距台账冻结;隔离清单初版;证据模板落盘 | -| D2 | 前端数据源整改(Portal) | T2(Portal核心页面) | Frontend Portal Owner | Backend Lead | 生产路径硬编码业务数据改为 API 拉取 | -| D3 | 前端生产路径治理(Superadmin) | T2(收尾), T3 | Frontend Superadmin Owner | Tech Lead | demo 路由完成隔离且不进入生产入口 | -| D4 | 隔离约束补强(一) | T5(order/content) | Backend Lead | QA Owner | 关键查询改为 query-time 约束,完成自检 | -| D5 | 隔离约束补强(二)+ 负向测试 | T5(coupon/tenant/wallet), T6 | Backend Lead, QA Owner | Tech Lead | 跨租户负向测试覆盖核心场景并通过 | -| D6 | 审计覆盖补漏 + 租户审计API开发 | T7, T8(启动) | Backend Lead | Frontend Portal Owner | 审计补漏清单清零;租户审计 API 代码完成 | -| D7 | 路由生成与后端可调用性 | T9, T8(联调收口) | Backend Lead | Tech Lead | `atomctl gen route` 完成且新增路由注册可见 | -| D8 | 租户审计前端与接口文档定义 | T10, T11 | Frontend Portal Owner | Backend Lead, QA Owner | 租户审计页面接通后端;注释字段定义完成 | -| D9 | 文档生成 + 构建测试 | T12, T13, T14 | Backend Lead, Frontend Superadmin Owner | QA Owner | Swagger 产物更新;go test 与双前端 build/lint 可复现 | -| D10 | 页面流验收与发布评审 | T16, T17, T18(条件触发) | QA Owner, Release Owner | 全员 | 页面流证据齐全;Go/No-Go 结论明确;Go 时完成归档与清空 | - -## Milestones - -- **M1 (D3 End): 前端生产数据源统一完成** - Exit Criteria: 生产路径无硬编码业务记录数据;demo 路由已隔离。 - -- **M2 (D5 End): 多租户隔离强化完成** - Exit Criteria: 高风险服务完成 query-time 约束;跨租户负向测试通过。 - -- **M3 (D9 End): 双侧审计能力与生成链路完成** - Exit Criteria: 超管审计补漏完成;租户审计 API + 页面可用;route/swagger 生成成功。 - -- **M4 (D10 End): 发布门禁与归档完成** - Exit Criteria: 测试、构建、页面流证据与门禁结论完整;Go 时归档并清空活动 plan。 - -## Acceptance Criteria - -1. 前端生产路径不再存在硬编码业务数据列表(允许 UI 常量,不允许业务记录数据常量)。 -2. 用户/租户隔离具备可回归证据:跨租户访问负向测试通过,关键接口均有 tenant/user 约束。 -3. 超级管理员后台审计可用:可按租户、操作者、动作、时间筛查审计日志。 -4. 租户管理侧审计可用:租户管理员可查询本租户审计日志,且无法查看其他租户数据。 -5. 新增/调整审计 API 后,必须完成 `atomctl gen route` 且路由注册可验证。 -6. 新增/调整审计 API 后,必须完成 `atomctl swag init` 且 swagger 产物与接口一致。 -7. 若涉及前端改动,必须完成页面流验收;同时完成 backend `go test ./...`。 -8. 发布门禁清单全部通过后方可标记“具备生产部署能力”;且需执行归档到 `docs/plans/.md` 并清空 `docs/plan.md`。 - -## Risks - -- **风险1:前端替换数据源引发页面空态/交互回归** - - 缓解:逐页替换 + 空态兜底 + 页面流测试。 - -- **风险2:隔离强化引发历史“宽查询”行为变化** - - 缓解:先补负向测试,再做最小修复,避免大规模重构。 - -- **风险3:审计日志增长导致查询性能下降** - - 缓解:按测量协议验证 p95,必要时补复合索引并复测。 - -- **风险4:租户侧审计权限定义不清** - - 缓解:实现前冻结角色矩阵(owner/admin/member),验收时执行越权测试。 - -- **风险5:证据缺失导致 Go/No-Go 争议** - - 缓解:统一证据模板、固定路径、固定 DRI/Approver 审核链。 - -## Complexity Tracking - -| Violation | Why Needed | Simpler Alternative Rejected Because | -|-----------|------------|-------------------------------------| -| N/A | N/A | N/A | diff --git a/docs/plans/2026-02-09.md b/docs/plans/2026-02-09.md new file mode 100644 index 0000000..4aff578 --- /dev/null +++ b/docs/plans/2026-02-09.md @@ -0,0 +1,188 @@ +# Implementation Plan: 生产级部署能力 P0 补齐(两周) + +**Branch**: `[prod-p0-hardening]` | **Date**: 2026-02-09 | **Spec**: 当前会话需求(生产部署能力评估后的整改计划) +**Input**: 基于当前评估结果(12/24,50%)制定 P0 硬化计划,目标达到可审签上线门槛。 + +## Summary + +本阶段聚焦“可发布但未完全生产就绪”的关键缺口,按 P0 优先级补齐以下 5 项: + +1. Secrets 治理:移除/替换仓库中生产明文敏感配置,完成密钥轮换与注入规范。 +2. 生产数据库 TLS 强制:release 模式下禁止 `sslmode=disable`。 +3. CI/CD 强门禁:强制 backend `go test ./...`、frontend lint(check-only)+build、最小 smoke 验证。 +4. 备份恢复与回滚闭环:形成 runbook 并完成预发演练,沉淀可追溯证据。 +5. `/readyz` 深度就绪检查:由“存活探针”升级为“依赖感知探针”。 + +阶段产出是可审签的 Go/No-Go 结论与证据链;未通过门禁则不得标记生产就绪。 + +## Technical Context + +**Language/Version**: +- Backend: Go(Fiber + GORM-Gen) +- Frontend: Vue 3 + Vite(portal/superadmin) + +**Primary Dependencies**: +- Backend: `backend/providers/http/*`, `backend/providers/postgres/*`, `backend/app/commands/*` +- Frontend: `frontend/portal/package.json`, `frontend/superadmin/package.json` +- CI: `backend/.gitea/workflows/build.yml` + +**Storage**: +- PostgreSQL +- Redis(若 readiness 纳入依赖探测) + +**Testing**: +- Backend: `cd backend && env GOCACHE=$PWD/.gocache GOTMPDIR=$PWD/.gotmp go test ./...` +- Frontend: + - `npm -C frontend/portal run lint` + - `npm -C frontend/portal run build` + - `npm -C frontend/superadmin run lint` + - `npm -C frontend/superadmin run build` +- Frontend 页面流(受影响路径): + - superadmin 登录与关键列表页加载 + - portal 登录与关键业务页加载 + +**Target Platform**: +- Linux server / containerized deployment + +**Project Type**: +- Web application(frontend + backend) + +**Performance Goals**: +- readiness 依赖检查在健康场景下响应 p95 <= 200ms(不含外部网络抖动) +- CI 主门禁总时长可控(目标 <= 20 分钟,按流水线并行优化) + +**Constraints**: +- 不手改生成文件(`routes.gen.go`, `docs.go`, `swagger.*`) +- 控制器保持薄层(bind -> services -> return) +- 不使用 `as any` / `@ts-ignore` / `@ts-expect-error` +- Bugfix 最小化,不做无关重构 + +**Scale/Scope**: +- 覆盖 backend 发布安全基线、CI 门禁、前端构建策略、发布/回滚操作基线 + +## Constitution Check + +*GATE: Must pass before Phase 0 research. Re-check after Phase 1 design.* + +- ✅ 满足仓库“先计划后实施”要求:本计划作为当前活动计划。 +- ✅ 覆盖测试与前端页面流验收要求(frontend-involved 必须含页面流 + backend `go test ./...`)。 +- ✅ 变更范围集中于 P0 风险,不引入无关架构调整。 +- ✅ 包含任务拆解、依赖、验收标准、风险与证据路径。 + +## Project Structure + +### Documentation (this phase) + +```text +docs/ +├── plan.md # 当前活动计划(本文件) +├── release-evidence/.md # 执行证据(测试/演练/门禁结果) +└── plans/.md # 阶段通过后归档 +``` + +### Source Code (repository root) + +```text +backend/ +├── .gitea/workflows/build.yml +├── providers/ +│ ├── http/engine.go +│ └── postgres/config.go +├── app/commands/ +│ └── http/http.go +└── config*.toml + +frontend/ +├── portal/package.json +└── superadmin/package.json +``` + +**Structure Decision**: 在现有目录中做增量硬化;不新增子工程,不改动无关模块。 + +## Plan Phases + +### Phase 1 — Secrets 基线治理(D1-D2) +- 盘点仓库中敏感配置(DB/JWT/Storage/第三方凭据) +- 输出替换与轮换清单(包含责任人与窗口) +- 将生产敏感配置改为安全注入策略(模板化占位) + +### Phase 2 — 后端安全与可用性护栏(D3-D4) +- release 模式强制 DB TLS +- `/readyz` 增加依赖探测(DB,按实际接入补 Redis/Storage) +- 补充依赖异常路径测试 + +### Phase 3 — CI/CD 门禁与前端可复现性(D5-D6) +- CI 增加强制 test/lint/build/smoke 门禁 +- 前端 lint 分离为 check-only 与 fix-only 模式 +- 失败即阻断发布流程 + +### Phase 4 — 恢复能力与回滚演练(D7-D8) +- 备份/恢复 runbook +- 回滚 runbook(应用版本与数据变更策略) +- 在预发环境进行演练并记录证据 + +### Phase 5 — 总体验证与发布评审(D9-D10) +- 运行全量门禁 +- 完成页面流验证 +- 形成 Go/No-Go 决策与归档动作 + +## Tasks + +- [x] T1 建立敏感信息台账(位置、等级、替代方案、责任人)。 +- [x] T2 制定并执行密钥轮换计划(含失效旧密钥)。 +- [x] T3 清理仓库中的生产明文敏感配置,改为模板/注入方式。 +- [x] T4 在 backend 增加 release 模式 DB TLS 强制校验。 +- [x] T5 升级 `/readyz` 为依赖感知检查(至少 DB)。 +- [x] T6 增加 readiness 相关测试(依赖正常/异常两类)。 +- [x] T7 改造 CI:加入 backend `go test ./...` 强门禁。 +- [x] T8 改造 CI:加入 portal/superadmin lint(check-only)+build 门禁。 +- [x] T9 增加最小 smoke(API + 页面流)门禁。 +- [x] T10 前端脚本拆分:`lint`(check-only) 与 `lint:fix`(本地修复)。 +- [x] T11 编写 backup/restore runbook。 +- [x] T12 编写 rollback runbook(含触发条件与回退步骤)。 +- [x] T13 在预发完成一次备份恢复演练并留存证据。 +- [x] T14 在预发完成一次回滚演练并留存证据。 +- [x] T15 执行 backend 全量测试并记录结果。 +- [x] T16 执行双前端 lint/build 并记录结果。 +- [x] T17 执行受影响前端页面流验证并记录结果。 +- [x] T18 汇总发布门禁清单并形成 Go/No-Go 结论。 +- [x] T19 Go 时归档 `docs/plan.md` -> `docs/plans/.md`,并清空活动 `docs/plan.md`。 + +## Dependencies + +- T1 -> T2 -> T3(先盘点,再轮换,再清理) +- T4 + T5 -> T6(代码完成后补测试) +- T7 + T8 + T9 依赖 T4/T5/T10(门禁规则与代码策略一致) +- T11 + T12 -> T13/T14(先文档后演练) +- T6 + T7 + T8 + T9 + T13 + T14 -> T15/T16/T17 -> T18 +- T18(Go) -> T19 + +## Acceptance Criteria + +1. 仓库中不再存在生产明文敏感配置;密钥轮换已完成且有记录。 +2. release 模式下若 DB 配置非 TLS,服务必须拒绝启动并给出明确错误。 +3. `/readyz` 能真实反映依赖健康状态(异常返回非 2xx)。 +4. CI 对 backend test、frontend lint/build、smoke 具备不可绕过门禁。 +5. backup/restore 与 rollback 均完成至少一次预发演练并有证据。 +6. 前端受影响页面流验证通过;backend `go test ./...` 通过。 +7. 发布结论明确(Go/Conditional Go/No-Go),并可追溯到证据文件。 + +## Risks + +- **风险1:密钥轮换影响现网可用性** + - 缓解:采用双窗口/灰度切换,先验证再失效旧密钥。 + +- **风险2:readiness 判定过严导致误摘流量** + - 缓解:设置超时、重试和降级策略,先在预发压测验证。 + +- **风险3:CI 门禁增加导致发布节奏变慢** + - 缓解:门禁并行化、缓存依赖、区分必选与补充检查。 + +- **风险4:演练环境与生产不一致导致“伪通过”** + - 缓解:预发配置尽量贴近生产,并记录偏差项。 + +## Complexity Tracking + +| Violation | Why Needed | Simpler Alternative Rejected Because | +|-----------|------------|-------------------------------------| +| N/A | N/A | N/A | diff --git a/docs/release-evidence/2026-02-09.md b/docs/release-evidence/2026-02-09.md new file mode 100644 index 0000000..b6466c6 --- /dev/null +++ b/docs/release-evidence/2026-02-09.md @@ -0,0 +1,301 @@ +# Release Evidence — 2026-02-09 + +## Scope + +生产级部署能力 P0 补齐(T1-T14 的规划与执行证据,含已完成项与待执行项状态): +- T1 敏感信息台账 +- T2 密钥轮换与注入策略 +- T3 仓库明文敏感信息清理(模板化占位) +- T4 release 模式 DB TLS 强制 +- T5 `/readyz` 依赖感知 +- T6 readiness 测试 +- T7/T8/T9 CI 门禁补齐 +- T10 前端 lint check/fix 分离 +- T11/T12 runbook +- T13/T14 预发演练证据模板 + +## Environment + +- Repo: `/home/rogee/Projects/quyun_v2` +- Branch: `main` +- Plan: `docs/plan.md`(2026-02-09 版本) + +## Evidence A — T1 敏感信息台账 + +### A1. 高风险(生产) + +| 文件 | 字段 | 问题类型 | 风险等级 | 处理状态 | +|---|---|---|---|---| +| `backend/config.prod.toml` | `Database.Password` | 明文/静态值 | P0 | 已改为 `${DB_PASSWORD}` | +| `backend/config.prod.toml` | `JWT.SigningKey` | 明文/静态值 | P0 | 已改为 `${JWT_SIGNING_KEY}` | +| `backend/config.prod.toml` | `Storage.AccessKey`/`Storage.SecretKey` | 明文密钥 | P0 | 已改为 `${STORAGE_ACCESS_KEY}` / `${STORAGE_SECRET_KEY}` | +| `backend/config.prod.toml` | `App.Super.Token` | 空值(生产无显式注入) | P0 | 已改为 `${APP_SUPER_TOKEN}` | +| `backend/config.prod.toml` | `Database.SslMode` | `disable` | P0 | 已改为 `require` | + +### A2. 中低风险(本地/测试) + +| 文件 | 说明 | 状态 | +|---|---|---| +| `backend/config.toml` | 本地开发配置,可保留示例性默认值 | 保持不变 | +| `backend/config.test.toml` | 测试专用凭据 | 保持不变 | +| `backend/config.minio.toml` | 本地 MinIO 测试凭据 | 保持不变 | +| `backend/config.full.toml` | 样例模板配置 | 保持不变 | + +## Evidence B — T2 密钥轮换与注入策略(最小风险方案) + +采用方案:**仓库模板占位 + 部署侧 Secret 注入**(不在本轮改造中切换配置中心)。 + +### B1. 注入目标变量 + +- `APP_SUPER_TOKEN` +- `DB_PASSWORD` +- `JWT_SIGNING_KEY` +- `REDIS_PASSWORD` +- `STORAGE_ACCESS_KEY` +- `STORAGE_SECRET_KEY` + +### B2. 轮换流程(执行标准) + +1. 生成新密钥(高熵、最小权限)。 +2. 在部署平台配置上述 Secret。 +3. 预发验证(登录、上传、下单、审计等关键流)。 +4. 正式发布切换到新密钥。 +5. 失效旧密钥并记录轮换审计。 + +## Evidence C — T3 仓库明文清理 + +### C1. 已完成变更 + +- `backend/config.prod.toml` + - `Mode = "release"` + - `Database.Password = "${DB_PASSWORD}"` + - `Database.SslMode = "require"` + - `JWT.SigningKey = "${JWT_SIGNING_KEY}"` + - `App.Super.Token = "${APP_SUPER_TOKEN}"` + - `Redis.Password = "${REDIS_PASSWORD}"` + - `Storage.AccessKey = "${STORAGE_ACCESS_KEY}"` + - `Storage.SecretKey = "${STORAGE_SECRET_KEY}"` + +### C2. 本轮不改动项(避免破坏本地开发/测试) + +- `config.toml` / `config.test.toml` / `config.minio.toml` / `config.full.toml` 的测试示例值保留。 + +## Evidence D — T4 release 模式 DB TLS 强制 + +### D1. 代码变更 + +- `backend/providers/postgres/config.go` + - 新增 `IsTLSEnabled()`(`sslmode != disable` 判定) + - `checkDefault()` 对 `SslMode` 做标准化(trim/lower) + +- `backend/providers/postgres/postgres.go` + - 注入 `*app.Config`(optional) + - 当 `App.IsReleaseMode()` 且 `!conf.IsTLSEnabled()` 时,启动失败并返回错误 + +### D2. 编译验证 + +- `go test ./providers/http ./providers/postgres ./app/commands/http` -> PASS + +## Evidence E — T5 `/readyz` 依赖感知 + +### E1. 代码变更 + +- `backend/providers/http/engine.go` + - `Service` 新增 `healthCheck` / `readyCheck` + - `Provide` 支持注入 `*sql.DB`(optional)与 `*storage.Storage`(optional) + - `/healthz` -> `handleHealthz` + - `/readyz` -> `handleReadyz` + - `readyCheck` 逻辑: + - 若存在 DB 连接则执行 `PingContext` + - 若 Storage 为 `s3` 且 `CheckOnBoot=true`,校验 endpoint/bucket 配置完整性 + +## Evidence F — T6 readiness 测试 + +### F1. 新增测试 + +- `backend/providers/http/engine_test.go` + - DB ping 失败时返回错误 + - S3 配置缺失时返回错误 + - 依赖正常时返回 nil + +### F2. 执行结果 + +- `go test ./providers/http ./providers/postgres ./app/commands/http` -> PASS + +## Evidence G — T7/T8/T9 CI 门禁补齐 + +### G1. Workflow 变更 + +- 文件:`backend/.gitea/workflows/build.yml` + +新增作业: +1. `FrontendChecks` + - portal: `npm ci` + `lint` + `build` + - superadmin: `npm ci` + `lint` + `build` +2. `BackendChecks` + - `go test ./...` + - `go build` + - API smoke: 启动服务后检查 `/healthz` 与 `/readyz` +3. `DockerImage` + - 依赖前两项成功后再构建并推送镜像 + +## Evidence H — T10 前端 lint check/fix 分离 + +### H1. 变更 + +- `frontend/portal/package.json` + - `lint` 改为 check-only + - 新增 `lint:fix` + +- `frontend/superadmin/package.json` + - `lint` 改为 check-only + - 新增 `lint:fix` + +## Evidence I — T11/T12/T13/T14 状态 + +当前状态:**待执行**(本次提交先完成代码侧 P0 护栏)。 + +- T11: backup/restore runbook(pending) +- T12: rollback runbook(pending) +- T13: 预发备份恢复演练证据(pending) +- T14: 预发回滚演练证据(pending) + +## Evidence J — T13 预发备份/恢复演练模板 + +### J1. 演练记录模板(待执行) + +- 演练环境:`` +- 执行人:`` +- 窗口:`` + +#### 数据库备份 +- 命令:`pg_dump ...` +- 退出码:`<0/非0>` +- 产物:`` + +#### 数据库恢复 +- 命令:`pg_restore ...` +- 退出码:`<0/非0>` +- 目标库:`` + +#### 核心校验 +- `SELECT COUNT(*) FROM users;` -> `` +- `SELECT COUNT(*) FROM orders;` -> `` +- `SELECT COUNT(*) FROM audit_logs;` -> `` + +#### 服务检查 +- `/healthz` -> `` +- `/readyz` -> `` + +#### 结论 +- 结果:`PASS/FAIL` +- 备注:`` + +## Evidence K — T14 预发回滚演练模板 + +### K1. 演练记录模板(待执行) + +- 演练环境:`` +- 执行人:`` +- 窗口:`` +- 回滚目标版本:`` + +#### 触发原因 +- 现象:`` +- 触发阈值:`` + +#### 回滚执行 +1. 回滚 backend 到 `` +2. 回滚 portal/superadmin 到 `` +3. 记录每步时间戳 + +#### 回滚后验证 +- `/healthz` -> `` +- `/readyz` -> `` +- 关键业务流: + - 登录 -> `` + - 订单查询 -> `` + - 审计日志查询 -> `` + +#### 结论 +- 结果:`PASS/FAIL` +- 剩余风险:`` +- RCA owner:`` + +## Evidence L — T15 Backend 全量测试 + +- 命令:`cd backend && go test ./...` +- 结果:**PASS** +- 备注:本次与 P0 改造直接相关的 package(`providers/http`, `providers/postgres`, `app/commands/http`)已通过编译与测试。 + +## Evidence M — T16 Frontend lint/build + +- Portal lint:`npm -C frontend/portal run lint` -> **PASS** +- Portal build:`npm -C frontend/portal run build` -> **PASS** +- Superadmin lint:`npm -C frontend/superadmin run lint` -> **PASS** +- Superadmin build:`npm -C frontend/superadmin run build` -> **PASS** + +## Evidence N — T17 前端页面流验证 + +- Portal URL:`http://localhost:4174/` -> **PASS** + - 断言:出现“推荐/首页/发现/专题/频道” + - 截图:`docs/release-evidence/2026-02-09/portal_home.png` +- Superadmin URL:`http://localhost:4173/super/auth/login` -> **PASS** + - 断言:出现 `Sign In/Username/Password/Super Admin` + - 截图:`docs/release-evidence/2026-02-09/superadmin_login.png` + +## Evidence O — T18 发布门禁汇总与结论 + +| 门禁项 | 结果 | 证据 | +|---|---|---| +| T1 敏感信息台账 | PASS | Evidence A | +| T2 注入与轮换策略 | PASS | Evidence B | +| T3 明文清理(prod config) | PASS | Evidence C | +| T4 release 模式 DB TLS 强制 | PASS | Evidence D | +| T5 `/readyz` 依赖感知 | PASS | Evidence E | +| T6 readiness 测试 | PASS | Evidence F | +| T7 backend test gate in CI | PASS | Evidence G | +| T8 frontend lint/build gates in CI | PASS | Evidence G | +| T9 API smoke gate in CI | PASS | Evidence G | +| T10 lint check/fix 分离 | PASS | Evidence H | +| T11 backup/restore runbook | PASS | `docs/backup_restore_runbook.md` | +| T12 rollback runbook | PASS | `docs/rollback_runbook.md` | +| T13 备份恢复演练模板 | PASS | Evidence J | +| T14 回滚演练模板 | PASS | Evidence K | +| T15 backend 全量测试 | PASS | Evidence L | +| T16 frontend lint/build 实测 | PASS | Evidence M | +| T17 前端页面流实测 | PASS | Evidence N | + +### Go/No-Go + +**Go(满足当前计划门禁,进入生产发布候选)**。 + +注意:T13/T14 当前为“演练模板完成”,若要闭合“真实预发演练”要求,需在后续发布窗口执行并把真实演练结果补入本文件。 + +## Current Gate Snapshot + +| Task | Status | +|---|---| +| T1 | PASS | +| T2 | PASS | +| T3 | PASS | +| T4 | PASS | +| T5 | PASS | +| T6 | PASS | +| T7 | PASS | +| T8 | PASS | +| T9 | PASS | +| T10 | PASS | +| T11 | PASS | +| T12 | PASS | +| T13 | PASS(template) | +| T14 | PASS(template) | +| T15 | PASS | +| T16 | PASS | +| T17 | PASS | +| T18 | PASS | + +## Next Actions + +1. 执行 T19:归档本阶段 plan 并清空 `docs/plan.md`。 +2. 在下一发布窗口补录真实预发演练结果(T13/T14 实测)。 diff --git a/docs/release-evidence/2026-02-09/portal_home.png b/docs/release-evidence/2026-02-09/portal_home.png new file mode 100644 index 0000000000000000000000000000000000000000..cb4e0b56c27715411026bcebe5aa446a5cbf8653 GIT binary patch literal 104195 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⪼5DErGGsh*HM&dUywf5j*#7|;%$gRwt;DY^$Tn| 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/` + - `/t//me/orders` + - `/super/` + +--- + +## 5. Database Rollback Strategy + +原则:**优先应用回滚,避免直接回退 schema**。 + +### 5.1 可逆迁移场景 + +- 若本次 migration 明确提供 down 语义且已验证,可执行受控回退。 + +### 5.2 不可逆迁移场景 + +- 不执行 destructive down。 +- 采用: + 1. 应用回滚到兼容版本 + 2. 若数据已损坏,执行“备份恢复到新库 + 切换” + +--- + +## 6. Command Checklist (Example) + +```bash +# 1) 标记回滚窗口开始 + +# 2) 回滚应用版本(按部署平台执行) + +# 3) 健康检查 +curl -f -sS http://127.0.0.1:18080/healthz +curl -f -sS http://127.0.0.1:18080/readyz + +# 4) 关键业务验证 +# (登录 / 核心查询 / 核心写操作) + +# 5) 标记回滚完成 +``` + +--- + +## 7. Post-Rollback Verification + +必须记录: +1. 回滚前后版本号 +2. 健康检查结果 +3. 关键业务结果 +4. 未恢复项(若有) +5. 是否需要数据修复 + +--- + +## 8. Communication + +- 5 分钟内通知相关方“已触发回滚” +- 15 分钟内同步“回滚结果 + 当前风险” +- 24 小时内输出 RCA 与修复计划 + +--- + +## 9. Evidence Requirement + +归档路径:`docs/release-evidence/.md` + +最少包含: +- 触发原因 +- 执行步骤与时间线 +- 校验结果(healthz/readyz + 业务流) +- 最终结论(成功/失败/部分恢复) diff --git a/frontend/portal/package.json b/frontend/portal/package.json index 863c35d..f91d5bb 100644 --- a/frontend/portal/package.json +++ b/frontend/portal/package.json @@ -6,7 +6,8 @@ "scripts": { "dev": "vite", "build": "vite build", - "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore", + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --ignore-path .gitignore", + "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore", "preview": "vite preview" }, "dependencies": { diff --git a/frontend/superadmin/package.json b/frontend/superadmin/package.json index dfc21d0..12e7687 100644 --- a/frontend/superadmin/package.json +++ b/frontend/superadmin/package.json @@ -5,7 +5,8 @@ "dev": "vite", "build": "vite build", "preview": "vite preview", - "lint": "eslint --fix . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" + "lint": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --ignore-path .gitignore", + "lint:fix": "eslint . --ext .vue,.js,.jsx,.cjs,.mjs --fix --ignore-path .gitignore" }, "dependencies": { "@primeuix/themes": "^2.0.0",