← [ BACK_TO_NOTES ]

维护与备份 OCI 服务器

为 OCI Linux 实例建立更新、配置记录、应用一致性备份、引导卷备份和恢复演练的日常制度。

#howto #growing #ops #oracle-cloud #server

[!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. 恢复演练

每季度选择一个小服务:

  1. 创建空目录或临时实例;
  2. 恢复配置;
  3. 恢复数据库/数据文件;
  4. 启动服务;
  5. 验证登录、读写和关键业务;
  6. 记录耗时、缺失步骤和秘密来源;
  7. 清理临时资源并检查费用。

验证清单

  • 最近备份成功且有校验和
  • 至少一个副本位于 OCI 之外
  • 数据库使用逻辑/应用一致性备份
  • 引导卷备份数量在免费边界内
  • 恢复文档不依赖某个人的记忆
  • 最近一次恢复演练成功
  • 若备份未做客户端加密,已明确其账号访问控制边界并启用强 MFA
创建于 2026/7/20 更新于 2026/10/16
Digital Biome
Access

键盘导航

j / k / ↑ / ↓
选择对象
Enter / o
打开选择
/ 或 Ctrl+K
全站搜索
i / f / 1–4
筛选当前列表
g → h / l / p / t / a
首页 / 笔记 / 项目 / 工具 / About
r → 1–9
打开所选对象的关联
u
返回上一页
Esc
关闭浮层 / 取消命令;输入框内清空文本