加固备份恢复本地基线(07-26-internal-ops-recovery-baseline)

这个提交包含在:
2026-07-26 20:41:22 +08:00
父节点 b3df123330
当前提交 706941eb5c
共修改 16 个文件,包含 792 行新增和 61 行删除
+8 -6
查看文件
@@ -33,8 +33,9 @@
- [ ] 全量回归(建议):`cd server && RUN_AUDIT_REGRESSION=1 RUN_OCR_REGRESSION=1 ./scripts/regression-all.sh`
- [ ] 备份(DB + 文件存储):
- [ ] `set -a && source deploy/trialrun/.env && set +a`
- [ ] `./scripts/backup-db.sh`(记录输出文件名)
- [ ] `./scripts/backup-storage.sh`(记录输出文件名)
- [ ] `DB_TOOL_MODE=docker DB_CONTAINER=hyb-oa-trialrun-db ./scripts/backup-all.sh`
- [ ] 同一批次包含 `database.dump`、`storage.tar.gz`、`manifest.json`,两份 SHA-256 校验通过
- [ ] 完整批次已复制到获批异机/异盘,并记录保留周期
## B. 发布(Deploy)
- [ ] 本地工作树 clean,目标 commit 已进入 upstream;部署日志中的 commit 与 `/ready.data.buildSha` 一致
@@ -71,8 +72,8 @@
- [ ] **EXTERNAL_GATED**:若回滚目标仍包含旧认证挑战逻辑,人工确认边缘继续关闭 `/api/auth/forgot-password`、`/api/auth/reset-password`、`/api/auth/email-login/code`、`/api/auth/email-login/verify`;脚本不会自动改边缘,未确认不得回滚开放,直到安全版本恢复
- [ ] 停止 server:`docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env stop server`
- [ ] 恢复 DB:`./scripts/restore-db.sh <db.dump>`
- [ ] 恢复存储:`./scripts/restore-storage.sh <storage.tar.gz> deploy/trialrun/data/storage`
- [ ] 恢复 DB/存储属于获批事故操作;当前脚本仅允许 `RESTORE_SCOPE=shadow`,不得绕过后直接指向真实目标
- [ ] 已先在独立数据库和空附件目录完成同批次影子恢复,数据库名精确确认且 manifest/SHA-256 匹配
- [ ] 回到上个版本:`git checkout <previous-tag>`
- [ ] 重启并探活:
- [ ] `docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env up -d --build server`
@@ -111,8 +112,9 @@
- [ ] 管理员账号仍可进入工作区设置、人员、组织、流程定义、系统设置、功能开关和审计日志。
- [ ] 已确认不删除备用模块数据;恢复某模块只通过工作区设置或功能开关完成。
- [ ] 已生成 `week-01.md` 到 `week-04.md` 的观测计划,至少完成第 1 周导出。
- [ ] 已完成 DB + 文件存储备份,并记录输出文件名。
- [ ] 已在同机或临时环境完成一次恢复演练,恢复后 `/ready` 通过。
- [ ] 已完成 DB + 文件存储同批次备份,manifest/SHA-256 通过并复制到异机/异盘。
- [ ] 已运行 `./scripts/qa/run-backup-restore-drill.sh` 完成本地合成数据演练。
- [ ] 已在获批临时环境完成真实格式影子恢复,恢复后 `/ready` 通过。
- [ ] 已核对管理员账号清单和 smoke 账号,自动化不使用真实业务账号。
- [ ] 已执行 `cd server && npm audit --omit=dev --audit-level=high` 并完成高危/严重漏洞评审;若仍失败,不进入公网正式试点。
- [ ] 已执行 `bash scripts/qa/run-release-gate.sh r66-trialrun`;若数据库或公网账号条件不足,已记录手工替代步骤。
+43 -23
查看文件
@@ -164,8 +164,8 @@ npx playwright test tests/e2e/manual/live-invoice-ocr.spec.ts --workers=1 --repo
2. 执行 `docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env up -d server`。
3. 在 Issue/发布记录中写明降级原因、预计恢复时间和影响范围。
## 1.5 备份与恢复演练(强烈建议至少做一次)
> 备份建议做到“DB + 文件存储(票据上传目录)”双份齐全。
## 1.5 备份与恢复演练(正式启用前必须完成)
> 数据库和文件存储必须使用同一批次成对备份;只有两份产物、完整性检查和 manifest 全部成功,才算一个可用恢复点。
### 1.5.1 备份
```bash
@@ -174,47 +174,66 @@ set -a
source deploy/trialrun/.env
set +a
./scripts/backup-db.sh
./scripts/backup-storage.sh
DB_TOOL_MODE=docker \
DB_CONTAINER=hyb-oa-trialrun-db \
./scripts/backup-all.sh
```
输出默认在:
- `deploy/trialrun/backups/`
输出默认在 `deploy/trialrun/backups/hyb-oa-backup-<run-id>/`,其中包含:
- `database.dump`
- `storage.tar.gz`
- `manifest.json`(相对文件名、大小和 SHA-256,不含连接串或源目录)
整批复制到获批的异机/异盘位置并记录保留周期;不能只复制 DB 或附件中的一份。
### 1.5.2 本地隔离恢复演练
开发机具备 Docker、PostgreSQL 客户端和 Node.js 时,使用合成数据运行:
### 1.5.2 恢复(到同一台机器或新机器)
1) 先停止 server:
```bash
docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env stop server
./scripts/qa/run-backup-restore-drill.sh
```
2) 恢复 DB:
该命令创建一次性 PostgreSQL 容器和临时附件目录,验证 DB/附件往返、manifest 校验和、错误数据库确认、损坏备份、非空目标目录和危险 tar 路径,结束后只清理本次创建的明确目标。它不读取 `deploy/trialrun/.env`,也不接触真实数据。
手工影子恢复必须使用独立数据库和空附件目录,并显式确认实际数据库名:
```bash
set -a
source deploy/trialrun/.env
set +a
./scripts/restore-db.sh deploy/trialrun/backups/<hyb-oa-db-*.dump>
RESTORE_SCOPE=shadow \
RESTORE_CONFIRM_DATABASE=<shadow_database_name> \
DB_TOOL_MODE=docker \
DB_CONTAINER=<shadow_postgres_container> \
DATABASE_URL=<shadow_database_url> \
POSTGRES_DB=<shadow_database_name> \
POSTGRES_USER=<shadow_database_user> \
POSTGRES_PASSWORD=<shadow_database_password> \
./scripts/restore-db.sh deploy/trialrun/backups/<batch>/database.dump
```
3) 恢复文件存储:
```bash
./scripts/restore-storage.sh deploy/trialrun/backups/<hyb-oa-storage-*.tar.gz> deploy/trialrun/data/storage
RESTORE_SCOPE=shadow \
./scripts/restore-storage.sh \
deploy/trialrun/backups/<batch>/storage.tar.gz \
<empty_shadow_storage_directory>
```
4) 重启并验收:
```bash
docker-compose -f deploy/trialrun/docker-compose.yml --env-file deploy/trialrun/.env up -d server
curl -fsS http://127.0.0.1:3000/ready
```
`restore-db.sh` 和 `restore-storage.sh` 默认只接受 `shadow`。影子库名必须包含独立的 `shadow`、`drill` 或 `restore_test` 标记;数据库确认不匹配、库名不安全、附件目录非空、目标为默认试运行附件目录或归档路径危险时均在写入前退出。
### 1.5.3 R66 小团队上线前演练记录
### 1.5.3 真实事故恢复
真实库/附件恢复不是普通脚本路径。必须另建或更新获批 Trellis task,记录停机窗口、恢复批次、实际目标、两名负责人、当前备份、回滚点和验证清单。当前恢复脚本不会接受 `production` 模式,不得通过修改环境变量或脚本临时绕过。恢复后必须验证 `/ready`、运行 commit、核心权限和 DB/附件关联完整性。
### 1.5.4 小团队上线前演练记录
上线前至少记录一次演练结果:
- 演练日期:
- 执行人:
- DB 备份文件:
- 文件存储备份文件:
- manifest 与 SHA-256 校验:
- 恢复目标机器或目录:
- 本地合成数据 RTO:
- 恢复后 `/ready` 结果:
- 上个可回滚 tag:
- 回滚负责人:
@@ -223,6 +242,7 @@ curl -fsS http://127.0.0.1:3000/ready
- 提供或确认真实 `deploy/trialrun/.env`,特别是 `JWT_SECRET`、`APP_ORIGIN`、`COOKIE_SECURE`、`OPENAPI_DOCS_ENABLED`。
- 确认备份文件保存位置和保留周期。
- 确认完整批次已经复制到异机/异盘,而不是仍只保存在应用主机。
- 准备独立 smoke 账号,避免使用老板、管理员或真实员工账号跑自动化。
## 2. 升级流程(试运行)