备份体系方法论沉淀(2026-08-18 详细版)
基于 2026-08-16~08-17 备份体系重构实战(5 包拆分、分层快照、三仓独立、索引体系)提炼。 每条含:含义 → 为什么 → 落地方式 → 实战案例/数据。
一、备份思想(哲学层,10 条)
1. 备份的目标不是「存下来」,而是「任何时候都能完整恢复」
含义:备份是手段,恢复是目的。一个能存不能恢复的备份体系等于零。
为什么:大多数备份体系死于两个慢性病——①存了但从未验证,恢复时才发现包损坏或加密口令忘了;②恢复流程复杂到灾难发生时根本没人能执行。衡量备份质量的唯一标准是「灾难来临时,能不能在规定时间内把数据完整拿回来」。
落地方式:
- 所有备份包带 sha256 校验(manifest 明文 + 索引密文双层)
- restore-backup.sh 提供 list / verify / restore 三条命令,恢复是命令级操作而非手工解包
- 恢复手册随系统维护(REBUILD.md / RESTORE.md)
- 设定量化指标:RPO ≤ 24h(每日全量),RTO 分钟级 ~ 半天
实战:8/17 审计时发现 backup-openclaw.sh 自 8/9 后再没跑过——「备份存在」是假象,产物只有 v1.0.0,之后 8 天的记忆零备份。如果以「能否恢复出 8/9 之后的记忆」来检验,立刻暴露。所以每次重构后必须实测一次完整恢复链路,而不是只看「文件生成了」。
2. 3-2-1 法则
含义:3 份数据、2 种介质、1 份异地。即:生产数据 1 份 + 本地备份 1 份 + 异地备份 1 份;至少两种存储介质;至少一份放在异地。
为什么:单点故障不可怕,可怕的是故障连锁。服务器硬盘坏了 → 本地备份还在;机房失联/整机被删 → 异地还在;异地账号被封 → 本地 7 份滚动还在。任何单一故障都不致命。
落地方式: - 第 1 份:生产环境(服务器原数据) - 第 2 份:本地备份包(/var/backups/server/ 等,7 份滚动) - 第 3 份:Gitee 私有仓异地(ccoad1-backup 主仓 + 4 个快照仓 + 2 个业务仓) - 介质:本地磁盘 + Git 远程(本质两类) - 额外第 4 处:加密口令/密钥走邮件附件存档(/root/.backup-pass、163 邮箱),即使服务器和 Gitee 同时完蛋,凭据还在邮箱里
实战:crmeb 商城数据 = 生产(/var/www/crmeb-data)→ 本地(/var/backups/gitee-mirror/crmeb)→ Gitee(ccoad1-crmeb-backup),三层齐全。
3. 分层纵深防御
含义:按风险频率分 5 层,每层覆盖不同的威胁场景,一层失效由其他层兜底。
为什么:单一备份机制只能防一种灾难。git 防误删误改,但防不了「整个仓库被删」;每日包防硬盘损坏,但防不了「昨天的修改今天发现不对要回滚到上周」;只有分层才能覆盖全部场景。
落地方式(我们的 5 层):
| 层 | 机制 | 频率 | 防什么 |
|---|---|---|---|
| L0 | 源码实时 git(ccoad1-* 8 个仓) | 每次提交 | 误删、误改、回滚任意历史版本 |
| L1 | 每日本地 5 包 | 03:30 | 硬盘损坏、配置漂移 |
| L2 | 周期快照(4 层独立仓) | daily/weekly/monthly/yearly | 时间维度归档,找回「上周/上月/去年」的状态 |
| L3 | 加密异地推送 | 04:00 | 整机灾难、机房失联 |
| L4 | 恢复演练 | 半年 | 验证整套体系真的能恢复 |
实战:8/17 凌晨 Gitee push 失败(500M 限额)→ L3 短暂失效,但本地 7 份(L1)+ 快照(L2)完全兜底,数据零丢失。
4. 冗余双通道
含义:同一数据至少两条独立的备份路径,任何一条通道损坏,另一条能顶上。
为什么:任何单通道都有特定死法——git 可能被 force push 覆盖、加密包可能损坏、镜像可能被限额卡住。双通道的关键是「独立」:不能两条通道依赖同一个前提(比如都在同一块磁盘上)。
落地方式: - 数据库:加密包(db-all)+ 各业务仓(ccoad1-crmeb-backup / ccoad1-blog-backup 里的 dump) - 代码:Gitee 源码仓(实时)+ walle releases(部署产物) - 博客:ccoad1-blog(源码)+ ccoad1-blog-backup(每日加密包)+ 主镜像 blog/(双保险) - 记忆:openclaw 包(本地)+ Gitee 加密镜像
实战:博客数据同时存在于「源码仓 + 独立备份仓 + 主仓 blog 目录」三条路径,任一条被删不影响恢复。
5. 可恢复性优先
含义:一切备份组件必须围绕「能不能恢复、恢复多快」来设计,校验和演练是刚需不是可选。
为什么:备份的完整链条是「产生 → 校验 → 存储 → 检索 → 解密 → 恢复」,只做到前四步,后面断了等于白做。加密包尤其危险:加密时一切正常,恢复时才发现口令忘了/算法不兼容,数据永远锁死。
落地方式: - 三层校验闭环:密文 sha256 对索引 → 解密 → 明文 sha256 对 manifest - restore-backup.sh 每次改动后实测(verify OK=5 FAIL=0、restore secrets 解密成功) - 恢复手册随包存放(RESTORE.md) - 未实施项:半年恢复演练(已列待办,restore 脚本已就绪)
实战:crmeb 独立仓首次备份(add7e5d)后立即做了解密恢复验证,确认 tar 内含 db dump + .env + uploads 才放心——第一次就验证,而不是等灾难。
6. 全自动 + 可观测
含义:备份不依赖人记得(人一定会忘);且每个环节必须留痕,失败必须「喊出声」,静默失败是最危险的失败。
为什么:cron 的价值不是自动化,而是确定性——每天 03:30 一定跑,不管你在睡觉还是在忙。但自动化有个陷阱:脚本悄悄失败(exit 0 但实际没干完),日志没人看,一个月后发现备份全断。所以「可观测」和「自动化」同等重要。
落地方式: - 全部 cron 化,错峰排布(3:00~4:10 之间 8 个任务互不踩踏) - 日志留档:/var/log/backup-server.log、backup-sync.log、backup-snapshot.log - 产物带时间戳(STAMP),能看出「今天到底跑没跑」 - 每次手动检查看三样:最新批次存在、日志尾部无异常、Gitee 远端有新 commit
实战:8/17 03:30 cron 备份因 SIGPIPE 中断,manifest 没生成——虽然 exit 非 0,但如果没有检查机制,这天的备份就是坏的。教训:批次目录里缺 manifest 的批次要能被一眼识别并跳过/重跑。
7. 敏感最小暴露
含义:凭据、密钥、隐私数据默认不进 git、不落地明文、不与其他数据混放;必须异地存储时加密;密钥与数据分离存放。
为什么:备份体系的敌人不只是灾难,还有泄露。备份包里常常躺着比生产环境更全的敏感数据(所有密码的汇总),一旦备份泄露 = 全部泄露(8/12 就发生过 nginx /backups/ 目录被 GPTBot 下载的泄露事件)。所以敏感数据要「加锁运输」,而不是裸奔进仓库。
落地方式: - 凭据文件一律 .gitignore,不进任何源码仓 - secrets 域独立打包,本地 openssl 加密(密钥 /root/.backup-enc-key) - 推 Gitee 的全部包 gpg AES-256 加密(口令 /root/.backup-pass) - 明文 dump 只进私有仓 - 敏感包与普通包分离:泄露普通包不泄露密码
实战:secrets 包动态收集 18+ 个凭据文件(zen tao/crmeb/walle/163/gitee/nav/vault 等),打包后仅 4K,加密存储;vault 站本身 basic auth + 私有仓双保护。
8. 简单可靠,不造轮子
含义:用最简单可靠的方案,优先复用已有能力(git、walle、cron),不引入不必要的复杂度(增量备份、专用备份软件、对象存储)。
为什么:复杂度 = 故障面。增量备份省了空间但引入「全量+增量链」的恢复复杂度,任何一个增量损坏全链报废;而我们的数据量(每日 70M)全量毫无压力。已有工具能解决的,不新装。
落地方式: - 每日全量,不做增量(数据量小是前提,量大了再评估) - 文章历史版本直接吃 git 能力(源码仓 commit 历史),不开发插件 - 备份脚本用 bash + tar + gpg + git,零新依赖 - 与现有 8 个 Gitee 仓 + walle 体系对齐,增量补齐不推倒重来
实战:设计文档里曾规划「博客文章 md 镜像入库」,评估后发现 git 历史已提供版本能力,降级为可选优化,不做复杂插件。
9. 成本可持续
含义:备份是长期运行的基础设施,必须算长期账:托管限额、磁盘增长、维护精力,都要可持续,不能第一天完美、三个月后爆炸。
为什么:Gitee 私有仓 500M 限额是硬约束。如果每天推 80M,git 历史还会膨胀(实测 3 批 + 历史 = 586M),第 4 天就 push 失败。不考虑限额的备份体系会在你最需要它的时候罢工。
落地方式: - 镜像只保留最新 1 批(历史靠本地 7 份 + 源码仓) - git 历史每月 1 号 04:10 自动重建(rm -rf .git → init → force push) - 本地滚动保留(7 份,满了删最旧) - 快照仓 476M/仓,同样贴近限额,监控中 - 「可重建即不备份」把备份量压到最低
实战:8/17 首次按新格式推送时 git 历史膨胀到 586M → push 失败 → 立即设计 rebase 方案并挂 cron,第二天 04:00 推送恢复正常(镜像 69M)。
10. Git 是唯一真相源
含义:一切变更以 git 为准:源码、配置、文档、脚本都在 git 里,部署/发布/回滚从 git 出发,任何状态可追溯、可重建。
为什么:服务器上直接改文件是灾难温床——改了没人知道、没有历史、无法回滚。git 让「每一次变更」都成为可回退的节点,这是误删/误改类事故的终极解药。
落地方式: - 各站源码在 Gitee 私有仓,walle 从 git 拉取部署 - 线上部署目录是符号链接 → releases(无 .git),改代码必须走 git 工作区 → commit+push → walle 部署 - 备份脚本、文件树、索引全部提交到备份仓 scripts/ - 恢复 = clone + 解密 + 解包,全部从 git 出发
实战:crmeb 上线后发现「线上直接改会丢」的坑(发布目录会被下次部署覆盖),建立 /var/www/crmeb/src 规范 git 工作区,README 明确路径说明,彻底杜绝「改了线上但没进 git」的幽灵修改。
二、策略(战术层,7 条)
1. 按域拆分,而非单一大包
含义:把全量备份按数据性质拆成 5 个独立域,每域独立打包、独立加密、独立保留。
为什么(单包痛点): - 恢复粒度差:只想找回记忆,却要拖 289M 全量包 - 故障放大:一个包损坏 = 全部数据不可恢复 - 敏感混放:凭据和公开内容混在一个包,加密策略无法分级 - 增量膨胀:全量包里大量可重建数据(1.4G releases 版本库)白占空间
5 域职责:
| 域 | 内容 | 体积 | 加密 |
|---|---|---|---|
| sys-config | nginx/系统配置/crontab/GoAccess 库 | ~1.1M | 普通 |
| db-all | emlog/crmeb/zentao/walle 全库 dump | ~2.2M | 普通 |
| secrets | 全部凭据(动态收集) | ~4K | openssl 强加密 |
| openclaw | agent 记忆+会话+配置(整目录排除法) | ~30M | gpg |
| site-data | 站点数据/数据目录/vault/招聘数据 | ~45M | gpg |
收益:恢复粒度细(只要记忆就只解 openclaw 包)、敏感隔离、每日增量 80M(原 289M)。
关键教训:agent 自身记忆(workspace/sessions)不在 /var/www、不在数据库,是备份体系最容易遗漏的盲区——必须显式纳入并定期验证(8/17 发现 8 天零备份)。
2. 双加密策略
含义:两层加密,应对两种威胁——异地传输(防仓库泄露)和本地敏感存储(防本机泄露)。
落地: - 异地层:所有推 Gitee 的包 gpg AES-256 加密,口令 /root/.backup-pass(独立存放 + 163 邮箱附件存档) - 敏感层:secrets 域本地 openssl 加密,密钥 /root/.backup-enc-key(与数据分离) - 恢复时 restore-backup.sh 自动识别并解密(gpg 口令 + openssl 密钥都从文件中读取)
为什么密钥必须分离:数据 + 口令同毁 = 白备份。密钥文件放在和备份不同的位置(口令文件在 /root,备份在 /var/backups),且邮箱再存一份,任何单一位置丢失都不致命。
实战:secrets 包 4K 内包含 18+ 个服务全部凭据,openssl 加密后 .enc 落地;gpg 层再包一层推 Gitee。泄露任一环节都不泄露明文密码。
3. 批次-清单-索引三位一体
含义:用「批次 STAMP」关联同批 5 包,用「manifest 清单」记录明文 sha256,用「backup-index.txt 索引」汇总密文↔明文对应关系,形成完整校验链。
为什么:备份最怕「不知道哪批文件是配套的」「不知道文件是否完整」「恢复后无法验证对不对」。三位一体解决三个问题:批次关联、完整性校验、可验证性。
落地:
- STAMP = YYYYMMDD-HHMMSS(如 20260818-033001),同批 5 包共享
- 批次目录内 backup-manifest-<STAMP>.txt:每包明文 sha256 + 大小
- 根 backup-index.txt:[域] 密文文件 | 密文 sha256 | 明文 sha256(与 manifest 关联)
- 恢复验证三步:①选批次 manifest → ②密文 sha256 对照索引 → ③解密后明文 sha256 对照 manifest
实战:verify 023357 输出 OK=5 FAIL=0;索引 29 行 15 明文全对上 MISSING 0。误删场景:cleanup bug 曾误删旧包,靠索引+清单立刻确认「内容已被新格式覆盖,可重建,不追」。
4. 分层周期快照
含义:4 个时间粒度(daily/weekly/monthly/yearly)各建独立仓,滚动保留 7 份,形成时间维度上的归档能力。
为什么:每日备份只能回到「昨天」;要回到「上周三」「上个月」「去年今天」的状态,必须有多粒度快照。而且快照从「当天最新批次」归档,保证 5 包一致性(不是重新打包,避免打包期间数据变动导致 5 包对不上)。
落地:
- 统一脚本 backup-snapshot.sh <daily|weekly|monthly|yearly>
- cron:daily 每日 3:35 / weekly 周一 3:50 / monthly 每月 1 号 3:55 / yearly 每年 1/1 3:55
- 独立仓:ccoad1-daily-backup / weekly / monthly / yearly
- 本地 /var/backups/snapshots/<period>/,每份 ~68M,7 份/仓(476M,500M 限额内)
- 恢复:restore <日期> <域> daily|weekly|monthly|yearly
实战:8/18 daily 快照 full-20260818 发布成功(69M,5 包齐全),远端 2d13d2e..9671e4b。
5. 业务独立仓
含义:除全服主仓外,为高价值业务(商城、博客)单独建备份仓,业务数据独立成仓、独立加密、独立保留。
为什么:全服主仓是「所有数据的最终兜底」,业务仓是「单业务的便捷恢复通道」。业务回滚不需要碰全服;业务仓限额独立,不会被全服数据挤爆;关注点分离,商城坏了只动商城仓。
落地:
- ccoad1-crmeb-backup:每日 crmeb 库 dump + /var/www/crmeb-data(.env+uploads)→ gpg → 推送,保留 7 份
- ccoad1-blog-backup:博客最新 7 份 → gpg → 推送
- 各仓独立 backup-index.txt + BACKUP-FILETREE.md(gen-pack-meta.py 生成)
- restore-backup.sh 支持三仓:verify <STAMP> [server|crmeb|blog]
实战:crmeb 首次备份 add7e5d 后解密验证通过(tar 含 db dump + .env + uploads);博客仓首次推送 e57f0c7(6 份密文 + README-DECRYPT)。
6. 明确「不备份清单」
含义:凡能从 Gitee/安装源重建的数据,一律不进备份包,并写成文档形成共识。
为什么:备份的容量、推送时间、维护精力都是成本。「什么都备份」会导致:包越来越大(289M→1.7G)、推送逼近限额、恢复时拖一堆没用的。真正需要备份的是「不可重建」的数据:数据库、凭据、记忆、数据目录、配置。
落地(我们的清单): - 各站源码(Gitee 实时,不重复备份) - walle releases 版本库(1.4G,可从 git 重建) - crmeb/src(308M git 工作区) - zentao.bak(662M 安装归档) - liepin node_modules/截图(98M,可重建) - fontwork 字体(41M,可重下) - browser 缓存等动态垃圾
实战:5 包拆分时明确排除以上清单,每日增量从 289M 降到 80M;README-BACKUP-SYSTEM.md 记录清单,防止后人「好心」把可重建数据加回来。
7. git 历史防膨胀
含义:托管仓库的 git 历史会随每日推送无限膨胀,必须定期重建,否则 push 失败 = 异地备份静默失效。
为什么:Gitee 私有仓 500M 限额。实测:每日 80M × 3 批 + git 历史膨胀 = 586M → push 失败。git 历史里存着大量旧版二进制包对象,是膨胀主因。
落地: - 镜像只保留最新 1 批(历史靠本地 7 份 + 源码仓) - backup-gitee-rebase.sh:每月 1 号 04:10 rm -rf .git → git init → force push(清掉旧大包对象) - 重建时机选在月初(快照 monthly/yearly 之后),避开每日备份窗口 - 适用所有 5 仓:主仓 + 4 个快照仓
实战:8/17 首次 push 失败后立即执行重建,镜像从 733M 缩到 99M,之后 04:00 推送稳定;rebase 脚本已挂 cron,长期无压力。
三、落地方法(执行层)
1. cron 时间表(错峰设计)
| 时间 | 任务 | 说明 |
|---|---|---|
| 03:00 | backup-blog.sh | 博客本地包 |
| 03:30 | backup-server.sh | 5 包拆分,本地 7 份,末尾生成文件树 |
| 03:35 | backup-snapshot.sh daily | 每日快照 |
| 03:40 | backup-crmeb.sh | 商城独立仓 |
| 03:50 | backup-snapshot.sh weekly | 仅周一 |
| 04:00 | backup-sync-gitee.sh | 加密推主仓 |
| 03:55(每月 1 号) | backup-snapshot.sh monthly/yearly | 月/年快照 |
| 04:10(每月 1 号) | backup-gitee-rebase.sh | git 历史重建 |
设计原则:错峰(3:00→4:10 每 5-10 分钟一个,互不踩踏)、依赖有序(先本地后异地,blog→server→snapshot→push)。
2. 脚本族(8 个,全部入 git scripts/)
| 脚本 | 职责 |
|---|---|
| backup-server.sh | 5 域拆分打包,动态收集凭据,滚动保留 7 份,生成 manifest + 文件树 |
| backup-sync-gitee.sh | 批次目录组织,加密,推 Gitee 主仓,重建统一索引 |
backup-snapshot.sh <period> |
4 层快照统一入口,从最新批次归档 |
| backup-crmeb.sh | 商城 DB + 数据目录 → gpg → 独立仓 |
| backup-blog-gitee.sh | 博客包 → gpg → 独立仓 |
| restore-backup.sh | list / verify / restore 三合一,本地优先镜像兜底 |
| gen-backup-tree.py | 主仓文件树总览(自动标注敏感/数据/配置/记忆/程序/动态) |
| gen-pack-meta.py | 独立仓索引 + 文件树生成 |
| backup-gitee-rebase.sh | git 历史重建 |
铁律:备份脚本本身必须入 git(8/17 发现重构后的新脚本完全没进镜像 scripts/,灾难时手上还是旧脚本 → 已全部同步)。
3. 镜像批次目录结构
gitee-mirror/
├── <STAMP>/ # 最新一批:5 包(.gpg/.enc) + backup-manifest.txt + BACKUP-FILETREE.md
├── blog/ # 博客双保险(独立仓之外)
├── scripts/ # 全部脚本 + 文档
├── backup-index.txt # 统一索引(密文↔明文 sha256)
└── BACKUP-FILETREE.md # 最新文件树总览
四、最佳实践(踩坑提炼,10 条)
1. 覆盖审计要「清单驱动」而非「白名单驱动」
含义:每次新增服务后,逐个确认其凭据/配置/数据是否进了备份包,而不是维护一张「要备份什么」的静态白名单。
为什么:白名单必然过时——8/17 审计发现 zentao/crmeb/walle/163/gitee/nav/vault 等 18 个新增凭据文件全部漏备份,Redis 配置漏打包,全是新装服务没跟上白名单。
落地:凭据动态收集(find /root -maxdepth 1 -name ".*-pass|.*-auth|.*-token");每次装完新服务跑一次「新增数据是否进包」检查。
2. 凭据动态收集,不手写清单
含义:用 find 按命名模式收集凭据文件,新凭据自动进包。
为什么:手写清单漏一个 = 该服务密码永久丢失(且不自知)。
落地:find /root -maxdepth 1 -name ".*-pass" -o -name ".*-auth" -o -name ".*-token" + .htpasswd-* + .backup-enc-key 自身。
3. 备份脚本本身必须入 git
含义:脚本和文档与备份包同仓提交,灾难时拿得到。 为什么:8/17 实测——重构后的 backup-split.sh 和 backup-openclaw.sh 完全没进 Gitee 镜像 scripts/,server/sync 还是旧版。如果当时服务器挂了,恢复出来的是一套旧脚本 + 新格式的包,无法匹配。
4. tar exclude 先验证路径真实存在
含义:排除列表里的路径写错,tar 会静默忽略,把该排除的大目录照常打包。
为什么:crmeb/src 排除路径曾写错 → 308M git 工作区被整个打包,包暴涨。
落地:排除前 ls 确认路径;打包后检查包内是否出现不该有的目录。
5. agent 记忆是最高优先级数据
含义:agent 的 workspace/会话/记忆比站点数据更不可重建——丢了站点可以重装,丢了记忆 = 失忆。 为什么:8/17 发现 sessions 路径配错(排除 /root/.openclaw/sessions 但实际在 agents/main/sessions,80M 全部被排除),每日备份完全不含记忆。 落地:openclaw 包用整目录排除法(排除 logs/cache/completions/npm/tui/browser),自动覆盖 media/identity/audit/devices/skills 等新增子目录,防白名单遗漏。
6. 脚本健壮性三坑
- pipefail + head 截断 → SIGPIPE(141):
ls|sort|head|while在 set -e + pipefail 下,head 截断管道会让上游收到 SIGPIPE,脚本静默中断,manifest 都没生成 → 循环管道加|| true。 - local 在 case 分支 / 子 shell 计数丢失:restore 脚本里计数在子 shell 里归零 → 改用进程替换
< <()+ 临时文件。 - glob 通配 + cleanup 混删:
manifest-*vsbackup-manifest-*写错、按整个目录保留导致不同前缀文件混删 → 按前缀 cleanup_glob 精确清理;误删过一次旧 gpg 包(可重建,不追)。
7. 进程管理:bracket 技巧防自匹配
含义:pgrep -f "xxx" 会匹配到执行命令的 bash 自身 → 自杀/自锁。
落地:ps -eo pid,args | grep '[b]ackup-server';清理旧 push 进程先拿真实 PID 再 kill,不用 pkill -f。
8. 内存受限环境:git push 被 SIGKILL
含义:小内存机器(1.6G)上 git 打包大对象会 OOM。
落地:git -c pack.windowMemory=128m -c pack.threads=1 push,首次推送前调低打包内存。
9. 恢复脚本与备份脚本同仓、同步迭代、改完必实测
含义:restore 每次改动必须跑通 verify + 一次真实 restore。
为什么:恢复脚本是灾难时的救命工具,没实测过的恢复脚本 = 没写。
落地:每次改完执行 verify <STAMP> 看 OK/FAIL,restore 一个域看解密解包是否成功(8/17 多次实测:verify OK=5 FAIL=0、restore secrets/crmeb/blog 全部通过)。
10. 批次可追溯
含义:文件名带 STAMP(YYYYMMDD-HHMMSS),同批 5 包共享;误删/混删靠前缀隔离识别。 为什么:没有 STAMP 就无法确定「哪 5 个包是同一批」,恢复时可能把不同批次混在一起。 落地:manifest 文件名即 STAMP;backup-index 按批次记录;cleanup 按前缀清理,绝不对整个目录一刀切。
五、可复用方法论清单(拿来即用)
| 方法论 | 一句话 | 适用场景 |
|---|---|---|
| 3-2-1 备份法则 | 3 份数据、2 种介质、1 份异地 + 口令独立存档 | 任何规模,起点 |
| 分层纵深防御 | L0 git → L1 每日 → L2 快照 → L3 异地 → L4 演练 | 有多层威胁场景时 |
| 按域拆分 | 系统/DB/凭据/记忆/站点 5 域,按需恢复 | 数据种类杂、恢复粒度要求高 |
| 批次-清单-索引 | STAMP 关联 + 明文 sha256 + 统一索引,三层校验 | 多包批次化备份的标配 |
| 可重建即不备份 | 凡能从 git/源重装的,不进包 | 容量/限额敏感时 |
| 双通道冗余 | 同数据 ≥2 条独立路径 | 高价值业务(DB/代码) |
| 覆盖审计循环 | 每次新增服务后审计一次 | 系统持续演进时 |
| git 历史定期重建 | 保留最新 1 批 + 本地滚动,月度 rebase | 用托管 git 做备份时 |
| 敏感最小暴露 | 凭据不入 git,异地必加密,密钥分离 | 含凭据/隐私数据时 |
| 全自动 + 可观测 | cron + 日志 + 产物留痕 + 失败告警 | 所有备份系统 |
最终保障指标:RPO ≤ 24h(每日全量),RTO 分钟级 ~ 半天(restore 脚本 + 恢复手册)。