Skip to content

VMax 服务端备份与恢复

1. 边界声明

服务端备份用于恢复实例配置、公开身份材料、设备状态、公开预密钥、仍在 TTL 内的密文队列、幂等与运维状态。它不能恢复客户端消息明文、身份私钥、会话密钥,也不能替代用户的加密 .vmaxbak

  • 来源 MUST:服务端、对象存储及其备份中不得出现消息明文或私钥。
  • 来源 MUST:生产发布前完成服务端备份恢复演练。
  • 待总控决策:客户端备份 KDF、文件格式、版本与恢复冲突属于 ADR-007;本文不冻结。
  • 已验证事实:当前无数据库、对象存储或备份脚本,以下恢复目标和步骤尚未实测。

2. 备份集合

数据是否备份说明
PostgreSQLschema、公开材料、未过期密文、幂等/清理状态
S3 兼容对象存储P1 附件启用时总体架构已选;MVP 关闭。启用后只含密文对象并与数据库清单对账
公开实例配置版本控制并校验签名
实例签名私钥独立高保护流程不进入普通数据库 dump;丢失/泄漏影响重大
APNs 凭据独立高保护流程只适用于对应 Gateway/Bundle ID;不进入普通备份
TLS 私钥独立或可重新签发按证书体系处理
Redis 队列从 PostgreSQL outbox_events 重建,不作为消息或任务意图的恢复来源
日志/指标默认否另行按合规策略保留,避免扩大隐私副本

3. 备份策略建议

  • PostgreSQL 使用加密的全量备份加连续 WAL/PITR,备份密钥与数据分离。
  • 对象存储使用版本化/生命周期时要确保删除策略不会无限保留已 ACK 或过期密文;不可把版本化当作规避 TTL 的后门。
  • 备份目录和 bucket 使用最小权限、不可公开访问、独立审计与保留策略。
  • 每份备份记录 schema 版本、应用版本、起止时间、校验和、对象清单和加密密钥版本,不记录用户完整标识。
  • 自动化任务失败必须告警;仅有“任务退出 0”不等于可恢复。

4. 恢复流程

  1. 宣告恢复事件,冻结写入或切换到明确维护模式,保存事故时间线。
  2. 选择满足时间点和 schema 兼容的备份,校验签名/哈希、加密可用性和访问审批。
  3. 恢复到隔离环境,不直接覆盖生产。
  4. 校验 schema、实例 ID、公钥指纹、信封行数/字节、TTL、ACK/清理状态、幂等唯一约束和 outbox。
  5. 清空恢复环境 Redis,从 PostgreSQL outbox 重建未完成任务,验证重复消费幂等和 dead-letter 隔离。
  6. P1 附件启用时对账数据库对象引用与 S3 bucket,隔离孤儿或缺失对象;MVP 必须验证无对象依赖。
  7. 运行敏感数据扫描,确认没有明文、私钥、token、APNs token、口令材料或超期日志。
  8. 运行提交/重试/拉取/ACK/过期冒烟测试;确认 Push 失败不影响拉取。
  9. 经审批切换流量,持续观察积压、重复率、过期率、数据库磁盘和错误码。
  10. 记录实际 RPO/RTO、差异、数据损失范围和修复项。

5. 恢复后的安全处理

  • 恢复会让已删除数据的旧副本在隔离环境重新出现,因此隔离环境必须执行与生产相同的访问、日志和 TTL 控制。
  • 从旧时间点恢复后,已在客户端完成 ACK 的信封可能重新出现。客户端必须按 message_id 去重;服务端恢复流程应重建 ACK/清理状态并评估重复投递。
  • 幂等记录若恢复到较早时间点,客户端重试可能越过原 24 小时窗口。恢复期间可临时扩大去重观察,但不得保存请求正文明文。
  • 实例签名私钥丢失或泄漏不能当作普通数据库恢复;需要信任迁移、客户端阻断和事故响应,具体流程待身份/配置签名 ADR 冻结。
  • APNs 凭据泄漏应撤销并轮换,不从疑似受损备份直接恢复。

6. RPO、RTO 与保留

待总控决策

  • 选项 A:RPO 15 分钟 / RTO 2 小时。成本适中,可能丢失窗口内的离线密文和状态。
  • 选项 B:RPO 5 分钟 / RTO 1 小时。恢复更快,但 WAL、演练和跨区域成本更高。
  • 选项 C:按部署者自定义。适合自托管,但必须有安全默认与最低告警。
  • 建议:官方实例评估 B,普通 Compose 默认以 A 为文档目标;在容量和演练数据出来前不承诺。
  • 验证:季度恢复演练记录实际 RPO/RTO;故障注入包含主库损坏、错误迁移、对象存储超时和备份密钥不可用。

备份保留不能无限延长密文业务 TTL。需要明确区分“运营恢复副本保留”与“在线可投递保留”,并在隐私说明中披露。具体天数需合规和恢复需求共同决定,待总控决策

7. 恢复演练矩阵

场景必查结果
全库丢失schema、实例配置、密文队列可恢复;Redis 丢失不影响
Redis 清空outbox 重建未完成任务;重复 handler 幂等;无永久漏清理/漏唤醒
PITR恢复点前数据一致;恢复点后损失可量化
迁移中断不出现半迁移不可识别状态;可 forward-fix 或从备份恢复
已 ACK 数据重现客户端去重;服务端重新进入清理,不永久积压
对象存储缺失文本消息不受影响;附件返回稳定错误,不泄漏信息
secret 丢失/泄漏进入独立轮换与信任迁移流程,不从普通 dump 找回
磁盘满备份和在线写入明确失败并告警,不伪报成功

8. 验收证据

  • 最近一次成功恢复的时间、备份标识、实际 RPO/RTO 和校验报告。
  • 恢复前后信封/ACK/过期/outbox 的一致性统计。
  • 备份与恢复环境敏感数据扫描结果。
  • 访问审批、密钥轮换和销毁记录。
  • 未完成真实恢复演练前,不得将“已配置备份”表述为“可恢复”。

系统初步设计 · 待决事项不代表批准 · 安全方案尚未完成独立审计