维护与备份 OCI 服务器
为 OCI Linux 实例建立更新、配置记录、应用一致性备份、引导卷备份和恢复演练的日常制度。
[!abstract] 核心结论 引导卷备份、文件备份和数据库导出解决的是不同问题。只有能够在另一环境成功恢复的备份,才算可用备份。
维护与备份 OCI 服务器
目标
- 每周可发现更新、磁盘、服务和安全问题;
- 配置与数据有异地副本;
- 知道每类数据用什么方式恢复;
- 引导卷备份不超过免费数量和存储边界;
- 至少完成一次从备份恢复的演练。
1. 建立资产与服务清单
记录但不提交秘密:
实例/引导卷/VNIC OCID
系统与架构
公网 IP 和域名
OCI NSG/Security List
开放端口
systemd 服务
Docker Compose 项目
数据目录
配置目录
备份目的地与保留周期
恢复负责人
2. 每周健康检查
uptime
free -h
df -hT
df -ih
sudo systemctl --failed
sudo journalctl -p warning --since '7 days ago' --no-pager
sudo ss -lntup
sudo ufw status verbose
sudo fail2ban-client status sshd
docker ps --format 'table {{.Names}}\t{{.Image}}\t{{.Status}}' 2>/dev/null || true
关注磁盘 inode、意外监听端口、失败服务和容器重启循环。
3. 安全更新
先看待更新项:
sudo apt-get update
apt list --upgradable
变更前备份关键配置和数据,再更新:
sudo DEBIAN_FRONTEND=noninteractive apt-get -y upgrade
test -f /var/run/reboot-required && cat /var/run/reboot-required || true
内核、SSH、Docker 或数据库升级后安排维护窗口和回归验证。
4. 配置备份
适合版本化但必须脱敏的内容:
- Compose、Caddy/Nginx 配置;
- systemd unit;
- 部署脚本;
- 包和镜像版本;
- 防火墙规则的文本导出。
不进入普通 Git:私钥、.env、数据库密码、API token、MFA 恢复码、真实备份数据。
示例导出:
sudo sshd -T > sshd-effective.txt
sudo ufw status numbered > ufw-rules.txt
docker compose config > compose-rendered.yaml
dpkg-query -W -f='${binary:Package}\t${Version}\n' > packages.tsv
检查输出是否含秘密后再传输。
5. 应用一致性备份
PostgreSQL
pg_dump --format=custom --file=app-$(date +%F).dump DATABASE_NAME
pg_restore --list app-YYYY-MM-DD.dump | head
文件服务
停止写入或使用应用自带快照后再归档:
sudo tar --xattrs --acls -C /srv -czf app-data-$(date +%F).tar.gz app-data
sha256sum app-data-$(date +%F).tar.gz > app-data-$(date +%F).sha256
直接复制正在写入的数据库目录不能保证一致性。
Oracle2 当前周备份体系(2026-09-08)
Oracle2 的正式异地备份入口是 personal-infrastructure/etc/server/oracle2/backup-to-onedrive.sh,默认目标:
myonedrive:/ServerBackups/Oracle2
由 oracle2-agent-backup.timer 每周触发:周日约 03:20(Asia/Shanghai),并带最多 20 分钟随机延迟。保留策略是最新 2 组完整的 archive + sha256 配对。
2026-09-08 已把备份格式升级为:
schema=oracle2-runtime-backup-v3
components=hermes,cpa,nezha-dashboard,sub-store
当前同一个周归档包含:
- Hermes:各 Profile 的 quick snapshot;手动
--full时改为完整 Hermes backup。 - Hermes deployment:Compose、环境、context、Skills;项目 Git 仓库本身仍由 GitHub 恢复,不重复塞进运行时归档。
- CPA:Compose、Caddy、路由配置、auth、plugins 等运行状态。
- Nezha Dashboard:
config.yaml、通过 SQLite.backup生成的一致性数据库副本、nezha-dashboard.service、Dashboard 版本信息;备份时额外执行PRAGMA integrity_check。 - Sub-Store:
sub-store.json、root.json、运行 env、systemd unit、Caddy 状态和代码 commit;为了得到同一时间点的两个 JSON,备份脚本只在复制窗口短暂停止sub-store.service,复制完成立即启动,异常退出时 cleanup 也会尝试恢复服务。 - 完整
SHA256SUMS与归档外层.sha256。
本机快照与异地备份的分层
Tier 0:本机 rollback snapshot
目标:最近一次改动失败时快速恢复
故障域:与生产同机
示例:Nezha *.bak-*、theme-backups;Sub-Store /opt/sub-store/backups/
Tier 2:OneDrive weekly runtime backup
目标:Oracle2 整机丢失后重建持久状态
故障域:异地
覆盖:Hermes + CPA + Nezha + Sub-Store
所以本机 .bak-* 仍应保留,它解决“改坏”;周归档解决“机器没了”。两者不是互相替代关系。
2026-09-08 实施与验收记录
接入 Nezha/Sub-Store 时同时发现旧周备份链已经失效:2026-09-05 的任务在 Hermes quick backup 枚举旧 state snapshot 时遇到 PermissionError。根因之一是一个历史 pre-change snapshot 目录权限为 711;已修正为可枚举的 755。另外旧脚本把 /opt/data/profiles 下所有目录都当成 Profile,当前运行时已有 audio_cache、logs 等非 Profile 目录;现已改为只识别包含 config.yaml 的 Profile 目录。
修复后先使用本地临时 rclone backend 做完整端到端测试,再执行真实 OneDrive 周备份。新的生产备份:
oracle2-agent-20260908T044352Z.tar.gz
已通过:
- 外层 archive SHA-256;
- 内层每个 payload 的
SHA256SUMS; - Hermes quick snapshot tar 校验;
- CPA tar 校验;
- Nezha SQLite
PRAGMA integrity_check = ok; - Sub-Store 两个 JSON 解析;
restore-drill.sh完整恢复演练;- 备份结束后 Nezha Dashboard 与 Sub-Store 均保持
active。
实现已提交到 personal-infrastructure:d832727 feat(backup): include Nezha and Sub-Store in Oracle2 weekly backups。
[!warning] 当前加密边界 Oracle2 周归档仍是普通
tar.gz,保护方式是onedrive-access-control-only,不是客户端加密。归档包含 Hermes/CPA 凭据、Nezha secret 和 Sub-Store 运行配置,必须把 Microsoft 账号 MFA、OAuth 应用审计和最小共享权限视为当前安全边界。以后若升级为 SOPS/age 或其他客户端加密,应同步修改恢复链和演练。
相关恢复对象见 备份、升级和恢复哪吒 Dashboard 与 Sub-Store。
6. OCI 引导卷备份
OCI Boot Volume Backup 是时间点、crash-consistent 快照,可在实例运行或停止时创建。它适合快速恢复整个系统,但不一定保证数据库应用一致。
操作前:
- 检查当前免费卷备份总数;
- 给备份写清日期、原因和源实例;
- 大变更前做手动备份;
- 定期删除确认不再需要的旧备份;
- 重要数据另做跨供应商/本地副本。
7. 3-2-1 备份
- 至少 3 份数据;
- 使用 2 种不同介质/系统;
- 至少 1 份在 OCI 之外。
OCI 实例、同区域块卷和同账号 Object Storage 不能完全视为三个独立故障域。
8. 恢复演练
每季度选择一个小服务:
- 创建空目录或临时实例;
- 恢复配置;
- 恢复数据库/数据文件;
- 启动服务;
- 验证登录、读写和关键业务;
- 记录耗时、缺失步骤和秘密来源;
- 清理临时资源并检查费用。
验证清单
- 最近备份成功且有校验和
- 至少一个副本位于 OCI 之外
- 数据库使用逻辑/应用一致性备份
- 引导卷备份数量在免费边界内
- 恢复文档不依赖某个人的记忆
- 最近一次恢复演练成功
- 若备份未做客户端加密,已明确其账号访问控制边界并启用强 MFA
Related notes
- 所属 MOC:甲骨文云服务器 MOC
- 备份地图:数据备份 MOC
- 生命周期:OCI 服务器生命周期与恢复阶梯
- 异常响应:OCI 异常费用与流量激增处置
- Nezha:备份、升级和恢复哪吒 Dashboard
- Sub-Store:Sub-Store