From 99976ef77f654b43cf14bb34fc913f1a036f726e Mon Sep 17 00:00:00 2001 From: flym Date: Thu, 10 Sep 2026 15:24:04 +0800 Subject: [PATCH] docs: record configured offsite NAS backup (rsync over SSH) Offsite backup to the Synology NAS (103.40.14.100:52200) is now configured: pg_dump of business+CMS DBs (keep 7 per series) plus rsync of the audio dir, encrypted over SSH with key auth, on a daily 03:00 systemd timer. Document the destination, transport, script, timer, and restore-from-NAS procedure; mark the backup-location item resolved (retention/threshold/owner still pending). --- docs/OPERATIONS.md | 28 +++++++++++++++++++--------- docs/phase-5-report.md | 8 ++++++++ 2 files changed, 27 insertions(+), 9 deletions(-) diff --git a/docs/OPERATIONS.md b/docs/OPERATIONS.md index 52246a9..61c9187 100644 --- a/docs/OPERATIONS.md +++ b/docs/OPERATIONS.md @@ -10,15 +10,25 @@ - 写入:成功结算时先写文件、再登记 `audio_files`(含 SHA256)。 - 读取:回放/下载按 `storage_key` 取文件;文件缺失返回 404(优雅降级)。 -## 2. 备份 +## 2. 备份(已配置异地备份) -| 对象 | 工具 | 位置 | 说明 | +- 本机暂存:`/home/flym/backups/`(仅存放 `.dump`)。 +- 异地备份目标:**Synology NAS** `103.40.14.100`(Synology DSM),账号 `kts_bak`,落盘 `/var/services/homes/kts_bak/backup/kaotings/`(`db/` + `audio/`),可用容量约 92 GiB。 +- 传输方式:**rsync over SSH**(端口 `52200`,**加密**),密钥认证(`/root/.ssh/id_ed25519_ktsbak`,公钥已加入 NAS `kts_bak` 的 `authorized_keys`)。**不使用** 公网明文 rsync 守护端口 `50873`。 +- 脚本:`/usr/local/sbin/kaotings-backup.sh`(root 运行): + 1. `pg_dump --format=custom` 业务库(`/etc/kaotings/api.env` → `DATABASE_URL`)与 CMS 库(`/etc/kaotings/cms.env` → `DATABASE_URI`)。 + 2. 每库保留最近 **7** 份(按序列独立轮转)。 + 3. `rsync -a --delete` 增量镜像 `db/` 与 `audio/`(`AUDIO_STORAGE_DIR`)到 NAS。 +- 定时:systemd `kaotings-backup.timer`,每日 **03:00**(`Persistent=true`,`RandomizedDelaySec=30min`)触发 `kaotings-backup.service`。 +- 验证:首份备份已落盘(业务库 54K、CMS 48K、音频 22 文件 4.8M);`pg_restore --list` 确认归档可恢复。 + +| 对象 | 工具 | 本机 | 异地(NAS) | | --- | --- | --- | --- | -| 业务库 `kaotings` | `pg_dump --format=custom` | `/home/flym/backups/kaotings_.dump` | 含用户/额度/任务/音频元数据/流水 | -| CMS 库 `kaotings_cms` | `infra/scripts/backup-cms-db.sh`(root) | `/home/flym/backups/kaotings_cms_.dump` | 独立库/账号 | -| 音频目录 | `tar`/`rsync` 到隔离位置 | 待指定 | 与库备份分开存放 | +| 业务库 `kaotings` | `pg_dump --format=custom` | `/home/flym/backups/kaotings_.dump` | `…/backup/kaotings/db/` | +| CMS 库 `kaotings_cms` | `pg_dump --format=custom` | `/home/flym/backups/kaotings_cms_.dump` | `…/backup/kaotings/db/` | +| 音频目录 | `rsync -a --delete` | `/home/flym/kaotings-audio/` | `…/backup/kaotings/audio/` | -> 备份位置、保留期、异地/异机与责任人:**待用户确认**(见 §5)。 +> 仍待用户确认:音频保留期、磁盘告警阈值、是否启用按 `expires_at` 的定时清理(见 §5)。备份保留份数当前=7,可按需调整脚本 `KEEP`。 ## 3. 容量 / 保留 / 清理(需用户决定的参数集中列出) @@ -28,7 +38,7 @@ | 磁盘容量上限 / 告警阈值 | 根盘约 48 GiB 可用,无上限告警 | 是(阈值 + 通知方式) | | 保留期清理策略 | 未启用定时清理(仅启动时清孤儿) | 是(是否按 `expires_at` 定时删除) | | 原始文本保留期 | 存于 `tts_tasks.text` | 是(产品/隐私) | -| 备份保留份数 / 周期 | 待确认 | 是(运维负责人) | +| 备份保留份数 / 周期 | 已配置:每库 7 份 · 每日 03:00 · 异地 NAS | 否(可调脚本 `KEEP` 与 timer) | - 清理安全边界: - 启动时 `cleanup_orphan_audio` 仅删除“**无** `available` 记录且 mtime>1h”的孤儿文件。 @@ -41,7 +51,7 @@ 1. 停止写入(可选,视 RPO):`systemctl stop kaotings-api`。 2. 建空库 → `pg_restore --clean --if-exists` 业务库 / CMS 库。 -3. 音频:从隔离备份拷贝到 `/home/flym/kaotings-audio`。 +3. 音频:从 NAS 异地备份 `rsync`/`scp` 回 `/home/flym/kaotings-audio`(源:`…/backup/kaotings/audio/`)。 4. 校验:行数、音频文件↔`audio_files` 关联、`checksum`、额度↔流水一致(见 §4.2 校验 SQL)。 5. `systemctl start kaotings-api`,`/healthz` 复核。 @@ -64,7 +74,7 @@ 2. 磁盘容量上限与告警阈值、通知方式。 3. 是否启用按 `expires_at` 的定时保留期清理。 4. 原始文本保留期。 -5. 备份位置(异地/异机)、保留份数与周期、责任人。 +5. 备份:异地 NAS 已配置(`103.40.14.100`,每日 03:00,每库 7 份);**剩余待确认**:保留份数/周期是否调整、备份责任人。 6. 上游 HTTPS/加密端点、允许来源网段、凭据轮换(见 `DEPLOYMENT.md` §4)。 ## 6. 待调查 / 未闭环项(不标为完成) diff --git a/docs/phase-5-report.md b/docs/phase-5-report.md index 704709a..500893c 100644 --- a/docs/phase-5-report.md +++ b/docs/phase-5-report.md @@ -90,6 +90,14 @@ 结论:业务库、CMS 库、音频均可在隔离环境完整恢复,历史↔音频关联与额度数据一致(除上述 4 条既有缺失)。 +### 3.3 异地备份(本阶段后续配置,已落地) + +- 用户提供异地 NAS(Synology)`103.40.14.100`(SSH `52200` / rsync 守护 `50873`)。 +- 采用 **rsync over SSH(52200,加密 + 密钥认证)**,不使用公网明文 rsync 守护端口;密钥 `/root/.ssh/id_ed25519_ktsbak`,公钥加入 NAS `kts_bak`。 +- 脚本 `/usr/local/sbin/kaotings-backup.sh`(root):`pg_dump` 业务库 + CMS 库(每库保留 7 份)+ `rsync -a --delete` 音频目录 → `…/backup/kaotings/{db,audio}/`;systemd `kaotings-backup.timer` 每日 03:00 触发。 +- 首份备份已落盘并 `pg_restore --list` 验证可恢复;详见 `OPERATIONS.md` §2。 +- 仍待确认:保留份数/周期、磁盘告警阈值、责任人(`OPERATIONS.md` §5)。 + ## 4. 上游安全改造(上线阻断,待外部条件) - 现状:TTS 上游为公网 **HTTP**(`TTS_UPSTREAM_URL`),Bearer Key 走明文传输。这是正式上线阻断项。