feat: add encrypted server backup verification
This commit is contained in:
@@ -1,6 +1,6 @@
|
||||
# 开发状态与门禁记录
|
||||
|
||||
> 更新日期:2026-08-25
|
||||
> 更新日期:2026-08-26
|
||||
> 当前接口契约版本:0.64.0
|
||||
> 当前主里程碑:M8目标环境联调、试点与上线验收(外部条件待提供)
|
||||
|
||||
@@ -180,6 +180,7 @@
|
||||
| 媒体清单容量 | 10批×1000分片准确落库和关联;批量SQL优化后平均0.12秒、p95/最大0.16秒,API容器内存峰值15.8MiB |
|
||||
| 隐私删除并发 | 100个并发受理全部成功、HTTP失败率0%、提交p95 385.15ms;11.58秒内600个子任务、100个墓碑和100个主体冻结全部对账 |
|
||||
| PostgreSQL隔离恢复 | 实际`pg_dump`/`pg_restore`到随机隔离库,迁移`22|false`、66张表、190个外键和关键计数一致;本地约5.14秒,临时库/备份已清理 |
|
||||
| 阿里云单机加密备份与恢复 | 目标服务器已安装每日systemd备份任务,覆盖PostgreSQL、认证Redis RDB、MinIO全部桶和暂停后的Keycloak数据目录;归档使用AES-256-CBC/PBKDF2加密、逐文件SHA-256并保留14天。首次实际归档成功,数据库从V38备份恢复到随机隔离库后`38|false|2|3|73|215`六项证据一致,归档内Redis RDB格式有效、Keycloak 3个文件一致、临时恢复库为0;同机备份尚不作为跨故障域生产恢复证据 |
|
||||
| 进程与Redis恢复 | API/Callbacks/Worker重启恢复;停机期间Outbox仅执行一次;Redis 14个热状态键清空后由签名设备请求重建,PostgreSQL权威计数不变 |
|
||||
| 供应商故障恢复 | V23持久化按租户/供应商的可用状态;连续临时失败暂停新启动但停止任务继续尝试;演练确认暂停后新外呼0、停止尝试2次、历史接口200、CRITICAL告警出现,恢复后全部收敛;V23单版本回退/重升通过 |
|
||||
| 安全专项 | Go 1.26.6容器`govulncheck`可达漏洞0、npm高危审计0、最终镜像HIGH/CRITICAL已修复漏洞0、Gitleaks无泄漏;HTTP认证/授权/注入式输入/1MiB正文/回调签名/Nonce重放/安全头/日志过滤烟测通过 |
|
||||
|
||||
@@ -90,6 +90,6 @@
|
||||
| P0414 | 首期需求、验收用例、缺陷和风险形成对应关系 | 本文完成首期功能到代码、接口、数据和验证的基线;V30问题清单由V36补充严重级别、根因、修复版本、回归证据及未关闭HIGH/CRITICAL发布阻断汇总;OpenAPI 0.50.0—0.55.0可按候选构建导出六项技术门禁及脱敏阻断告警定位快照,绑定候选版本/构建摘要后按业务时区归档日/周运行证据。`cmd/release-evidence`现使用v3清单,把同一候选的快照、接口、迁移、部署、SBOM和十类外部状态形成逐文件摘要;远程CI供应链、真机固件、真实终端RTC、真实Agent模型、真实告警网关、云KMS/HSM轮换、生产等价恢复、生产基础设施和Safari兼容分别要求结构化报告,并把14项CI检查/镜像/SBOM、设备固件场景、语音方式与恢复场景、生成/Embedding/内容安全质量、路由演练、轮换模式、恢复类型、基础设施控制项及Safari矩阵覆盖与缺口写入清单。OpenAPI 0.64.0、V38及九个离线校验器把云端状态与远程构建、外部设备、RTC/语音供应商、模型提供器、网关、密钥提供器、目标环境和浏览器证据绑定;`content_safety_tls`把策略服务网络/证书状态纳入指标、告警、运营页面和候选快照。缺检查、缺制品、缺场景、缺演练、缺质量类别、缺控制项、`PENDING`和本地模拟证据均不会被误报为外部验收完成,整体发布仍必须基于真实联调、灰度和审批记录确认。 |
|
||||
| P0445 | 需求编号关联代码、测试、接口或配置变更 | 本文逐项建立关联;后续功能变更必须同步更新本矩阵和`development-status.md`。 |
|
||||
|
||||
当前仍不能在本地宣告完成的部分集中为:真实火山RTC与豆包三模式联调、真实方舟内容与Embedding质量、真实听筒的长者交流体验、量产设备/KMS注入、生产对象存储与备份、真机异常恢复、真实账单和生产级内容安全。它们属于阶段8外部验收,不应通过增加本地低价值测试伪造完成证据。
|
||||
当前仍不能宣告完成的部分集中为:真实火山RTC与豆包三模式联调、真实方舟内容与Embedding质量、真实听筒的长者交流体验、量产设备/KMS注入、跨故障域生产对象存储与备份、真机异常恢复、真实账单和生产级内容安全。阿里云单机环境已经形成加密全组件归档、数据库隔离恢复和Redis RDB校验,但同机归档不能替代托管PITR、异地副本和生产恢复演练。这些剩余项属于阶段8外部验收,不应通过增加本地低价值测试伪造完成证据。
|
||||
|
||||
下一批本地开发应优先从矩阵中出现“进行中”的条目选择;若没有本地功能缺口,则只继续完善能够直接降低阶段8联调风险的模拟器、诊断和交付工具,不以覆盖率数字替代业务功能。
|
||||
|
||||
@@ -0,0 +1,101 @@
|
||||
# 单机云端备份与隔离恢复手册
|
||||
|
||||
## 1. 适用范围
|
||||
|
||||
本手册适用于`deploy/server/compose.override.yaml`部署的单机公网演示环境。目标是在不暴露数据库、Redis、对象存储和身份服务端口的前提下,形成可自动执行、可校验、可追溯的加密备份,并证明PostgreSQL备份能够恢复到独立数据库。
|
||||
|
||||
该能力不是跨可用区生产灾备。单机磁盘故障仍可能同时损失在线数据和本机备份,因此加密归档和口令必须另行复制到不同故障域。
|
||||
|
||||
## 2. 备份范围
|
||||
|
||||
| 组件 | 备份方式 | 当前恢复验证 |
|
||||
|---|---|---|
|
||||
| PostgreSQL | `pg_dump`自定义格式,不包含所有者和ACL | 实际恢复到随机隔离数据库,并核对迁移、客户组织、账号、表和外键计数 |
|
||||
| Redis | 认证执行`SAVE`后复制RDB | `redis-check-rdb`验证归档内RDB格式,不覆盖在线Redis |
|
||||
| MinIO | 使用容器内`mc mirror`复制全部桶和对象 | 逐文件SHA-256和对象文件数量一致性检查 |
|
||||
| Keycloak | 暂停容器后复制`/opt/keycloak/data`,随后立即恢复 | 逐文件SHA-256和文件数量检查;当前开发模式H2数据不作为生产OIDC方案 |
|
||||
|
||||
备份归档使用`AES-256-CBC + PBKDF2`加密,迭代次数为200000。每个归档旁边保存加密文件自身的SHA-256;归档内部另有逐文件`SHA256SUMS`和不含凭据的`manifest.properties`。
|
||||
|
||||
## 3. 自动执行流程
|
||||
|
||||
```text
|
||||
获取独占锁
|
||||
→ PostgreSQL逻辑转储和证据快照
|
||||
→ Redis认证SAVE及RDB校验
|
||||
→ MinIO全桶对象镜像
|
||||
→ 短暂暂停Keycloak并复制一致性数据目录
|
||||
→ 逐文件SHA-256
|
||||
→ 压缩、加密、生成归档摘要
|
||||
→ PostgreSQL随机隔离库实际恢复
|
||||
→ Redis RDB及文件清单复核
|
||||
→ 删除临时数据库和临时明文
|
||||
→ 按保留期清理旧加密归档
|
||||
```
|
||||
|
||||
任何步骤失败都会令systemd服务失败;未完成的明文暂存目录由退出陷阱删除。备份使用`flock`避免重叠执行,Keycloak无论成功或异常退出都会尝试解除暂停。
|
||||
|
||||
## 4. 安装与运行
|
||||
|
||||
```bash
|
||||
cd /opt/data-terminal-cloud/current
|
||||
chmod 0755 deploy/server/backup.sh deploy/server/verify-backup.sh deploy/server/install-backup.sh
|
||||
deploy/server/install-backup.sh
|
||||
systemctl start platform-backup.service
|
||||
systemctl show platform-backup.service -p Result -p ExecMainStatus
|
||||
systemctl list-timers platform-backup.timer --no-pager
|
||||
```
|
||||
|
||||
默认每天02:40执行,并附加最长45分钟随机延迟,避免固定时刻资源竞争;默认保留14天。定时任务设置`Persistent=true`,服务器在计划时刻关机时会在恢复后补跑。
|
||||
|
||||
可通过环境变量覆盖:
|
||||
|
||||
| 变量 | 默认值 | 说明 |
|
||||
|---|---|---|
|
||||
| `PLATFORM_ROOT` | `/opt/data-terminal-cloud/current` | 当前发布目录 |
|
||||
| `BACKUP_ROOT` | `/var/backups/data-terminal-cloud` | 加密归档目录,必须为安全的绝对路径 |
|
||||
| `BACKUP_PASSPHRASE_FILE` | `/etc/data-terminal-cloud/backup-passphrase` | 仅root可读的独立随机口令 |
|
||||
| `BACKUP_RETENTION_DAYS` | `14` | 本机备份保留天数 |
|
||||
| `VERIFY_AFTER_BACKUP` | `false`;systemd中为`true` | 备份后是否立即执行隔离恢复校验 |
|
||||
|
||||
## 5. 手工校验与故障定位
|
||||
|
||||
校验最新备份:
|
||||
|
||||
```bash
|
||||
/opt/data-terminal-cloud/current/deploy/server/verify-backup.sh
|
||||
```
|
||||
|
||||
校验指定备份:
|
||||
|
||||
```bash
|
||||
/opt/data-terminal-cloud/current/deploy/server/verify-backup.sh \
|
||||
/var/backups/data-terminal-cloud/platform-YYYYmmddTHHMMSSZ.tar.gz.enc
|
||||
```
|
||||
|
||||
查看任务结果:
|
||||
|
||||
```bash
|
||||
systemctl show platform-backup.service -p Result -p ExecMainStatus -p ActiveState
|
||||
journalctl -u platform-backup.service -n 100 --no-pager
|
||||
find /var/backups/data-terminal-cloud -maxdepth 1 -type f -name 'platform-*.enc' -ls
|
||||
```
|
||||
|
||||
一次性服务成功结束后显示`inactive (dead)`是正常状态,应结合`Result=success`和`ExecMainStatus=0`判断。校验脚本不会停止在线业务、覆盖在线数据库或载入Redis快照;随机恢复数据库在成功和失败路径都会清理。
|
||||
|
||||
## 6. 安全与恢复边界
|
||||
|
||||
- 备份口令不写入仓库、归档、日志或Compose环境文件;默认权限为`0600 root:root`。
|
||||
- 备份目录默认权限为`0700`,归档和摘要为`0600`。
|
||||
- 明文转储只存在于同一受控暂存目录,归档加密后立即删除。
|
||||
- 当前归档留在同一云服务器只提供误操作恢复能力,不提供主机或地域故障保护。
|
||||
- 生产环境应使用托管PostgreSQL持续备份/PITR、版本化对象存储、外部OIDC、跨故障域副本、KMS托管密钥和受控恢复演练。
|
||||
- 不能仅凭定时任务成功声称满足某个RPO/RTO;必须结合备份频率、异地复制、真实数据量和受控恢复耗时单独验收。
|
||||
|
||||
## 7. 上线前检查
|
||||
|
||||
1. 把加密归档复制到不同故障域,并独立验证复制后的SHA-256。
|
||||
2. 把口令保存到云KMS、密码库或离线托管介质,不与归档放在同一位置。
|
||||
3. 配置备份失败和长时间未成功告警。
|
||||
4. 在预生产环境执行PostgreSQL、Redis、对象存储和OIDC的完整恢复演练。
|
||||
5. 记录实际备份大小、持续时间、恢复时间和业务抽查结果,再确定RPO/RTO。
|
||||
Reference in New Issue
Block a user