# 备份恢复
**本文引用的文件**
- [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)
## 目录
1. [简介](#简介)
2. [项目结构](#项目结构)
3. [核心组件](#核心组件)
4. [架构总览](#架构总览)
5. [详细组件分析](#详细组件分析)
6. [依赖关系分析](#依赖关系分析)
7. [性能考量](#性能考量)
8. [故障排查指南](#故障排查指南)
9. [结论](#结论)
10. [附录](#附录)
## 简介
本文件面向AI有声书生成平台,提供一套完整的备份与恢复方案,覆盖数据库(MySQL)、文件存储(本地/阿里云OSS)以及配置文件等关键资产。内容包括:
- 备份策略:全量与增量备份的时机、频率与存储位置
- 数据验证:备份完整性校验与一致性检查
- 安全与合规:传输加密与安全存储
- 灾难恢复:恢复流程、RTO/RPO目标与业务连续性保障
- 自动化:备份与恢复脚本、恢复测试与演练
- 监控与告警:备份状态监控、异常处理与告警联动
## 项目结构
围绕备份与恢复的关键目录与文件如下:
- 数据库:Prisma Schema定义与迁移锁文件
- 应用配置:运行时配置与上传目录
- 文件存储:统一存储服务(本地/阿里云OSS)
- 部署与备份:生产部署脚本中包含服务器侧备份逻辑
```mermaid
graph TB
subgraph "应用层"
APP["后端应用
server/src/app.ts"]
CFG["配置模块
server/src/config/index.ts"]
STORE["存储服务
server/src/services/storage.service.ts"]
OSS["OSS服务
server/src/services/oss.service.ts"]
end
subgraph "数据层"
PRISMA["Prisma Schema
server/prisma/schema.prisma"]
MYSQL["MySQL 数据库"]
MIGLOCK["迁移锁
server/prisma/migrations/migration_lock.toml"]
end
subgraph "文件存储"
LOCAL["本地上传目录
process.cwd()/uploads"]
ALI["阿里云OSS Bucket"]
end
subgraph "部署与备份"
DPROD["生产部署脚本
deploy-prod.sh"]
DAUTO["自动部署脚本
server/deploy-auto.sh"]
DSIM["简化部署脚本
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["配置模块
config/index.ts"] --> DB["数据库连接"]
STORE["存储服务
storage.service.ts"] --> OSS["OSS服务
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桶访问权限
- 审计日志:记录备份与恢复操作日志
- 监控与告警
- 监控项:备份成功率、备份耗时、恢复演练通过率
- 告警阈值:连续失败次数超过阈值立即告警
- 演练频率:每季度进行一次恢复演练