备份与恢复

AuraBoot 把状态分散持久化在三个相互独立的存储中。一份完整的备份必须覆盖三者,并且在信任它之前,必须在非生产环境上做过恢复演练。

存储承载内容
PostgreSQL租户数据、动态表(mt_<modelCode>)、审计日志、BPM 状态
Plugin DSLModel / page / command / permission JSON(配置真源)
MinIO(S3 兼容)上传的文件、导出的报表、附件

只覆盖 PostgreSQL 的备份会丢掉插件升级与上传的文件。只覆盖 DSL 的备份则会丢掉每一条租户记录。

何时使用

  • 生产升级之前(见 升级)。
  • 在共享环境上重新执行 reset-and-init.sh 之前。
  • 周期性的灾难恢复计划。
  • 执行破坏性操作之前,比如 schema 迁移或大批量数据导入。

工作原理

PostgreSQL 通过 pg_dump 对主节点做转储。该转储是逻辑转储(SQL 或自定义格式),因此可以跨小版本恢复。Plugin DSL 的配置真源是磁盘上的插件目录(model / page / command / permission JSON),直接归档插件源目录即可保存为带版本号的快照。MinIO 通过 mc mirror 对配置的 bucket 做镜像。

三份产物共享一个备份 id,从而支持时点恢复:在同一时间窗口里取得的 PostgreSQL 转储、DSL 归档和对象镜像可以一起回放。

配置与命令

# 1. PostgreSQL 转储(自定义格式,并行 job)
PGPASSWORD="$PG_PASSWORD" pg_dump \
  -h "$PG_HOST" -p "$PG_PORT" -U "$PG_USER" \
  -d aura_boot \
  -Fc -j 4 \
  -f "/backups/auraboot-$(date +%Y%m%d-%H%M%S).dump"

# 2. Plugin DSL 归档(直接打包磁盘上的插件源目录)
tar -czf "/backups/auraboot-dsl-$(date +%Y%m%d-%H%M%S).tar.gz" \
  -C "$AURA_PLUGINS_DIR" .

# 3. MinIO bucket 镜像
mc mirror --overwrite --remove \
  auraboot-prod/aura-files \
  /backups/minio/$(date +%Y%m%d-%H%M%S)/

在干净的目标环境上恢复:

# 1. 重建数据库(与 reset-and-init.sh 的契约一致)
yes y | ./scripts/reset-db.sh

# 2. 恢复 PostgreSQL 转储
PGPASSWORD="$PG_PASSWORD" pg_restore \
  -h "$PG_HOST" -p "$PG_PORT" -U "$PG_USER" \
  -d aura_boot -j 4 --clean --if-exists \
  /backups/auraboot-20260528-020000.dump

# 3. 回放 DSL(解压插件源目录后,按目录同步导入)
tar -xzf /backups/auraboot-dsl-20260528-020000.tar.gz -C /restore/plugins
curl -sS -X POST -H "Authorization: Bearer $AURA_TOKEN" \
  -H "Content-Type: application/json" \
  -d '{"path":"/restore/plugins","conflictStrategy":"OVERWRITE"}' \
  "$AURA_API_URL/api/plugins/import/import-directory-sync"

# 4. 恢复 MinIO 对象
mc mirror /backups/minio/20260528-020000/ auraboot-prod/aura-files

留存策略

一份合理的默认值:

级别频率保留
小时级每小时24 小时
日级当地时间 02:0014 天
周级周日 02:008 周
月级每月 1 号12 个月

按合规要求与存储预算调整。至少保留一份异地副本。

验证

  • 转储文件非空,且 pg_restore --list 打印出预期的 schema。
  • 用昨晚的备份在 staging 环境恢复后能正常启动,/actuator/health 返回 UP,并能完成端到端的登录加列表页渲染。
  • DSL 回放完成且零 references unregistered handler 错误(见 插件开发)。
  • 恢复后 MinIO bucket 的文件数与总字节数在允许误差内与源端一致。
  • 恢复演练至少每季度一次;从未验证过的备份等于没有备份。

相关