# 备份恢复

<cite>
**本文引用的文件**
- [server/src/config/index.ts](file://server/src/config/index.ts)
- [server/prisma/schema.prisma](file://server/prisma/schema.prisma)
- [server/src/services/storage.service.ts](file://server/src/services/storage.service.ts)
- [server/src/services/oss.service.ts](file://server/src/services/oss.service.ts)
- [server/deploy-auto.sh](file://server/deploy-auto.sh)
- [server/deploy-simple.sh](file://server/deploy-simple.sh)
- [deploy-prod.sh](file://deploy-prod.sh)
- [server/prisma/migrations/migration_lock.toml](file://server/prisma/migrations/migration_lock.toml)
</cite>

## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)

## 简介
本文件面向AI有声书生成平台，提供一套完整的备份与恢复方案，覆盖数据库（MySQL）、文件存储（本地/阿里云OSS）以及配置文件等关键资产。内容包括：
- 备份策略：全量与增量备份的时机、频率与存储位置
- 数据验证：备份完整性校验与一致性检查
- 安全与合规：传输加密与安全存储
- 灾难恢复：恢复流程、RTO/RPO目标与业务连续性保障
- 自动化：备份与恢复脚本、恢复测试与演练
- 监控与告警：备份状态监控、异常处理与告警联动

## 项目结构
围绕备份与恢复的关键目录与文件如下：
- 数据库：Prisma Schema定义与迁移锁文件
- 应用配置：运行时配置与上传目录
- 文件存储：统一存储服务（本地/阿里云OSS）
- 部署与备份：生产部署脚本中包含服务器侧备份逻辑

```mermaid
graph TB
subgraph "应用层"
APP["后端应用<br/>server/src/app.ts"]
CFG["配置模块<br/>server/src/config/index.ts"]
STORE["存储服务<br/>server/src/services/storage.service.ts"]
OSS["OSS服务<br/>server/src/services/oss.service.ts"]
end
subgraph "数据层"
PRISMA["Prisma Schema<br/>server/prisma/schema.prisma"]
MYSQL["MySQL 数据库"]
MIGLOCK["迁移锁<br/>server/prisma/migrations/migration_lock.toml"]
end
subgraph "文件存储"
LOCAL["本地上传目录<br/>process.cwd()/uploads"]
ALI["阿里云OSS Bucket"]
end
subgraph "部署与备份"
DPROD["生产部署脚本<br/>deploy-prod.sh"]
DAUTO["自动部署脚本<br/>server/deploy-auto.sh"]
DSIM["简化部署脚本<br/>server/deploy-simple.sh"]
end
APP --> CFG
APP --> STORE
STORE --> OSS
STORE --> LOCAL
APP --> PRISMA
PRISMA --> MYSQL
DPROD --> MYSQL
DPROD --> LOCAL
DAUTO --> MYSQL
DSIM --> MYSQL
```

图表来源
- [server/src/config/index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [server/prisma/schema.prisma:1-10](file://server/prisma/schema.prisma#L1-L10)
- [server/src/services/storage.service.ts:198-213](file://server/src/services/storage.service.ts#L198-L213)
- [server/src/services/oss.service.ts:18-30](file://server/src/services/oss.service.ts#L18-L30)
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)
- [server/deploy-auto.sh:47-53](file://server/deploy-auto.sh#L47-L53)

章节来源
- [server/src/config/index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [server/prisma/schema.prisma:1-10](file://server/prisma/schema.prisma#L1-L10)
- [server/src/services/storage.service.ts:198-213](file://server/src/services/storage.service.ts#L198-L213)
- [server/src/services/oss.service.ts:18-30](file://server/src/services/oss.service.ts#L18-L30)
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)
- [server/deploy-auto.sh:47-53](file://server/deploy-auto.sh#L47-L53)

## 核心组件
- 数据库（MySQL）：通过Prisma Schema定义表结构，使用环境变量DATABASE_URL连接；迁移锁文件确保迁移过程一致性。
- 文件存储（本地/OSS）：统一存储服务支持两种后端，自动切换；本地存储默认上传目录位于应用根目录的uploads子目录。
- 配置与部署：应用配置集中于config模块；生产部署脚本在服务器侧执行备份与部署。

章节来源
- [server/prisma/schema.prisma:1-10](file://server/prisma/schema.prisma#L1-L10)
- [server/src/config/index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [server/src/services/storage.service.ts:198-213](file://server/src/services/storage.service.ts#L198-L213)
- [server/src/services/oss.service.ts:18-30](file://server/src/services/oss.service.ts#L18-L30)

## 架构总览
备份与恢复涉及以下关键路径：
- 数据库备份：在部署前对数据库进行备份（生产脚本包含服务器侧备份步骤）
- 文件存储备份：在部署前对上传目录进行备份（生产脚本包含服务器侧备份步骤）
- 配置文件备份：生产脚本会复制生产环境配置到运行时环境文件
- 恢复验证：部署完成后进行关键文件存在性检查与服务健康检查

```mermaid
sequenceDiagram
participant CI as "CI/运维"
participant REM as "远端服务器"
participant DB as "MySQL"
participant FS as "文件系统"
participant APP as "后端应用"
CI->>REM : "执行生产部署脚本"
REM->>REM : "创建备份目录"
REM->>DB : "备份数据库部署前"
REM->>FS : "备份上传目录部署前"
REM->>REM : "解压并替换服务与前端"
REM->>APP : "复制生产配置(.env.production -> .env)"
REM->>APP : "生成Prisma客户端"
REM->>APP : "启动PM2服务"
REM->>APP : "健康检查"
APP-->>REM : "返回健康状态"
REM-->>CI : "部署完成"
```

图表来源
- [deploy-prod.sh:88-127](file://deploy-prod.sh#L88-L127)
- [deploy-prod.sh:140-164](file://deploy-prod.sh#L140-L164)

章节来源
- [deploy-prod.sh:88-127](file://deploy-prod.sh#L88-L127)
- [deploy-prod.sh:140-164](file://deploy-prod.sh#L140-L164)

## 详细组件分析

### 数据库备份与恢复
- 连接与结构
  - 数据库类型：MySQL
  - 连接字符串来源：环境变量DATABASE_URL
  - 表结构定义：Prisma Schema
  - 迁移一致性：迁移锁文件
- 备份策略
  - 全量备份：在每次生产部署前执行一次数据库全量备份
  - 增量备份：建议结合数据库二进制日志（binlog）进行增量备份（需数据库侧配置）
  - 存储位置：服务器本地备份目录（部署脚本创建）
- 恢复流程
  - 从最近一次全量备份与对应增量备份恢复
  - 恢复后执行Prisma迁移以确保Schema一致性
- RTO/RPO
  - RPO取决于增量备份频率；建议按小时级别
  - RTO取决于备份介质与恢复脚本执行效率

```mermaid
flowchart TD
Start(["开始备份"]) --> CheckLock["检查迁移锁文件"]
CheckLock --> LockOK{"迁移锁正常?"}
LockOK --> |否| Abort["中止并告警"]
LockOK --> |是| DumpDB["执行数据库全量备份"]
DumpDB --> BackupUploads["备份上传目录"]
BackupUploads --> Store["写入服务器备份目录"]
Store --> Done(["完成"])
Abort --> Done
```

图表来源
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)
- [server/prisma/migrations/migration_lock.toml:1-3](file://server/prisma/migrations/migration_lock.toml#L1-L3)

章节来源
- [server/prisma/schema.prisma:1-10](file://server/prisma/schema.prisma#L1-L10)
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)
- [server/prisma/migrations/migration_lock.toml:1-3](file://server/prisma/migrations/migration_lock.toml#L1-L3)

### 文件存储备份与恢复
- 存储后端
  - 本地存储：默认上传目录为应用根目录下的uploads
  - 阿里云OSS：通过OSS服务封装，支持上传、删除、签名URL等
- 备份策略
  - 全量备份：在部署前对uploads目录进行拷贝备份
  - 增量备份：可基于rsync或OSS对象版本控制进行增量同步
  - 存储位置：服务器本地备份目录
- 恢复流程
  - 将备份目录恢复至原路径
  - 若使用OSS，需确保桶内对象完整且可访问
- RTO/RPO
  - RPO取决于增量同步频率；建议按小时级别
  - RTO取决于对象数量与网络带宽

```mermaid
flowchart TD
S(["开始文件备份"]) --> DetectStore{"存储类型?"}
DetectStore --> |本地| LocalBackup["拷贝本地uploads目录"]
DetectStore --> |OSS| OSSBackup["列举并备份OSS对象"]
LocalBackup --> SaveLocal["保存至服务器备份目录"]
OSSBackup --> SaveOSS["保存至服务器备份目录"]
SaveLocal --> E(["结束"])
SaveOSS --> E
```

图表来源
- [server/src/config/index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [server/src/services/storage.service.ts:198-213](file://server/src/services/storage.service.ts#L198-L213)
- [server/src/services/oss.service.ts:138-158](file://server/src/services/oss.service.ts#L138-L158)
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)

章节来源
- [server/src/config/index.ts:113-117](file://server/src/config/index.ts#L113-L117)
- [server/src/services/storage.service.ts:198-213](file://server/src/services/storage.service.ts#L198-L213)
- [server/src/services/oss.service.ts:138-158](file://server/src/services/oss.service.ts#L138-L158)
- [deploy-prod.sh:88-95](file://deploy-prod.sh#L88-L95)

### 配置文件备份与恢复
- 配置来源
  - 应用配置：config模块读取环境变量与模型配置
  - 生产配置：部署脚本将生产配置复制为运行时配置
- 备份策略
  - 全量备份：备份生产配置文件与运行时配置
  - 存储位置：服务器本地备份目录
- 恢复流程
  - 将备份的配置文件恢复至原路径
  - 部署脚本会再次复制生产配置到运行时配置文件

```mermaid
sequenceDiagram
participant Ops as "运维"
participant Server as "服务器"
Ops->>Server : "备份生产配置"
Ops->>Server : "备份运行时配置(.env)"
Ops->>Server : "恢复配置文件"
Server->>Server : "部署脚本复制生产配置到运行时"
```

图表来源
- [deploy-prod.sh:117-118](file://deploy-prod.sh#L117-L118)

章节来源
- [deploy-prod.sh:117-118](file://deploy-prod.sh#L117-L118)

### 备份自动化与恢复测试
- 自动化脚本
  - 生产部署脚本：包含服务器侧备份、解压、替换、安装依赖、生成Prisma客户端、启动服务等步骤
  - 自动部署脚本：用于触发部署流程
  - 简化部署脚本：快速启动前后端服务
- 恢复测试
  - 部署完成后检查关键目录是否存在
  - 健康检查接口验证服务可用性

```mermaid
sequenceDiagram
participant Ops as "运维"
participant Prod as "生产部署脚本"
participant Auto as "自动部署脚本"
participant Sim as "简化部署脚本"
Ops->>Prod : "执行生产部署"
Ops->>Auto : "触发自动部署"
Ops->>Sim : "执行简化部署"
Prod-->>Ops : "部署完成并健康检查"
Auto-->>Ops : "部署完成"
Sim-->>Ops : "服务启动完成"
```

图表来源
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
- [server/deploy-auto.sh:47-53](file://server/deploy-auto.sh#L47-L53)
- [server/deploy-simple.sh:55-61](file://server/deploy-simple.sh#L55-L61)

章节来源
- [deploy-prod.sh:139-164](file://deploy-prod.sh#L139-L164)
- [server/deploy-auto.sh:47-53](file://server/deploy-auto.sh#L47-L53)
- [server/deploy-simple.sh:55-61](file://server/deploy-simple.sh#L55-L61)

## 依赖关系分析
- 存储服务依赖OSS服务或本地文件系统
- 应用通过配置模块读取数据库连接信息
- 部署脚本依赖服务器侧备份与PM2进程管理

```mermaid
graph LR
CFG["配置模块<br/>config/index.ts"] --> DB["数据库连接"]
STORE["存储服务<br/>storage.service.ts"] --> OSS["OSS服务<br/>oss.service.ts"]
STORE --> FS["本地文件系统"]
DPROD["生产部署脚本"] --> DB
DPROD --> FS
DPROD --> APP["后端应用"]
```

图表来源
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
- [server/src/services/storage.service.ts:14-20](file://server/src/services/storage.service.ts#L14-L20)
- [server/src/services/oss.service.ts:18-30](file://server/src/services/oss.service.ts#L18-L30)
- [deploy-prod.sh:88-127](file://deploy-prod.sh#L88-L127)

章节来源
- [server/src/config/index.ts:73-75](file://server/src/config/index.ts#L73-L75)
- [server/src/services/storage.service.ts:14-20](file://server/src/services/storage.service.ts#L14-L20)
- [server/src/services/oss.service.ts:18-30](file://server/src/services/oss.service.ts#L18-L30)
- [deploy-prod.sh:88-127](file://deploy-prod.sh#L88-L127)

## 性能考量
- 备份窗口：尽量避开业务高峰期，采用分时段全量+增量组合
- 并行策略：数据库与文件系统可并行备份，提升整体效率
- 压缩与去重：对备份数据进行压缩与重复数据删除，降低存储开销
- 传输安全：使用加密通道（如SFTP/HTTPS）进行跨网络传输
- 恢复验证：定期进行恢复演练，验证RTO/RPO指标达标

## 故障排查指南
- 数据库备份失败
  - 检查数据库连接字符串与权限
  - 确认迁移锁文件状态
  - 查看部署日志定位具体阶段
- 文件存储备份失败
  - 检查本地磁盘空间与权限
  - 若使用OSS，检查凭证与桶权限
- 部署后服务不可用
  - 检查PM2进程状态与日志
  - 验证健康检查接口返回
- 配置加载异常
  - 确认生产配置已复制到运行时配置文件

章节来源
- [deploy-prod.sh:88-127](file://deploy-prod.sh#L88-L127)
- [server/src/services/storage.service.ts:252-272](file://server/src/services/storage.service.ts#L252-L272)
- [server/src/services/oss.service.ts:241-250](file://server/src/services/oss.service.ts#L241-L250)

## 结论
本方案通过“部署前备份”与“双后端存储”相结合的方式，确保数据库与文件数据在生产环境中的高可靠与可恢复性。配合自动化脚本与恢复测试，可有效达成RTO/RPO目标，并保障业务连续性。

## 附录
- 备份策略建议
  - 全量备份：每周日凌晨执行
  - 增量备份：每小时执行一次
  - 存储位置：服务器本地备份目录，保留最近7天
- 安全与合规
  - 传输加密：使用受信网络与加密通道
  - 访问控制：限制备份目录与OSS桶访问权限
  - 审计日志：记录备份与恢复操作日志
- 监控与告警
  - 监控项：备份成功率、备份耗时、恢复演练通过率
  - 告警阈值：连续失败次数超过阈值立即告警
  - 演练频率：每季度进行一次恢复演练