加固备份恢复本地基线(07-26-internal-ops-recovery-baseline)
这个提交包含在:
+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. 升级流程(试运行)
|
||||
|
||||
在新工单中引用
屏蔽一个用户