外观
VMax 服务端备份与恢复
1. 边界声明
服务端备份用于恢复实例配置、公开身份材料、设备状态、公开预密钥、仍在 TTL 内的密文队列、幂等与运维状态。它不能恢复客户端消息明文、身份私钥、会话密钥,也不能替代用户的加密 .vmaxbak。
- 来源 MUST:服务端、对象存储及其备份中不得出现消息明文或私钥。
- 来源 MUST:生产发布前完成服务端备份恢复演练。
- 待总控决策:客户端备份 KDF、文件格式、版本与恢复冲突属于 ADR-007;本文不冻结。
- 已验证事实:当前无数据库、对象存储或备份脚本,以下恢复目标和步骤尚未实测。
2. 备份集合
| 数据 | 是否备份 | 说明 |
|---|---|---|
| PostgreSQL | 是 | schema、公开材料、未过期密文、幂等/清理状态 |
| S3 兼容对象存储 | P1 附件启用时 | 总体架构已选;MVP 关闭。启用后只含密文对象并与数据库清单对账 |
| 公开实例配置 | 是 | 版本控制并校验签名 |
| 实例签名私钥 | 独立高保护流程 | 不进入普通数据库 dump;丢失/泄漏影响重大 |
| APNs 凭据 | 独立高保护流程 | 只适用于对应 Gateway/Bundle ID;不进入普通备份 |
| TLS 私钥 | 独立或可重新签发 | 按证书体系处理 |
| Redis 队列 | 否 | 从 PostgreSQL outbox_events 重建,不作为消息或任务意图的恢复来源 |
| 日志/指标 | 默认否 | 另行按合规策略保留,避免扩大隐私副本 |
3. 备份策略建议
- PostgreSQL 使用加密的全量备份加连续 WAL/PITR,备份密钥与数据分离。
- 对象存储使用版本化/生命周期时要确保删除策略不会无限保留已 ACK 或过期密文;不可把版本化当作规避 TTL 的后门。
- 备份目录和 bucket 使用最小权限、不可公开访问、独立审计与保留策略。
- 每份备份记录 schema 版本、应用版本、起止时间、校验和、对象清单和加密密钥版本,不记录用户完整标识。
- 自动化任务失败必须告警;仅有“任务退出 0”不等于可恢复。
4. 恢复流程
- 宣告恢复事件,冻结写入或切换到明确维护模式,保存事故时间线。
- 选择满足时间点和 schema 兼容的备份,校验签名/哈希、加密可用性和访问审批。
- 恢复到隔离环境,不直接覆盖生产。
- 校验 schema、实例 ID、公钥指纹、信封行数/字节、TTL、ACK/清理状态、幂等唯一约束和 outbox。
- 清空恢复环境 Redis,从 PostgreSQL outbox 重建未完成任务,验证重复消费幂等和 dead-letter 隔离。
- P1 附件启用时对账数据库对象引用与 S3 bucket,隔离孤儿或缺失对象;MVP 必须验证无对象依赖。
- 运行敏感数据扫描,确认没有明文、私钥、token、APNs token、口令材料或超期日志。
- 运行提交/重试/拉取/ACK/过期冒烟测试;确认 Push 失败不影响拉取。
- 经审批切换流量,持续观察积压、重复率、过期率、数据库磁盘和错误码。
- 记录实际 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 的一致性统计。
- 备份与恢复环境敏感数据扫描结果。
- 访问审批、密钥轮换和销毁记录。
- 未完成真实恢复演练前,不得将“已配置备份”表述为“可恢复”。