# 数据备份与恢复

> **中学成绩档案系统** · 备份目录默认 `/root/grade-archive-backups`

---

## 1. 备份内容

每次备份生成一个压缩包 `grade-archive_YYYYMMDD_HHMMSS.tar.gz`，包含：

| 文件/目录 | 说明 |
|-----------|------|
| `database.sql` | PostgreSQL 全库导出（含 `--clean`，可覆盖恢复） |
| `uploads/` | 错题图片、学生头像等上传文件 |
| `manifest.json` | 备份元信息（时间、库名） |

---

## 2. 自动备份

- **目录**：`/root/grade-archive-backups`（可通过 `.env` 中 `BACKUP_DIR` 修改）
- **频率**：应用启动后每 **24 小时**自动备份一次（`AUTO_BACKUP_INTERVAL_HOURS=24`）
- **保留**：默认保留最近 **30 天**（`BACKUP_RETENTION_DAYS=30`）
- **系统 cron**（可选，安装脚本会写入）：每天凌晨 3:00 执行 `deploy/backup.sh`

### 环境变量（`.env`）

```env
BACKUP_DIR=/root/grade-archive-backups
BACKUP_RETENTION_DAYS=30
AUTO_BACKUP_INTERVAL_HOURS=24
```

---

## 3. 手动备份（服务器命令行）

```bash
sudo BACKUP_DIR=/root/grade-archive-backups \
  bash /opt/secondary-school-grade-archive/deploy/backup.sh
```

备份文件位于 `/root/grade-archive-backups/`。

---

## 4. 系统设置中下载备份

1. 使用超级管理员登录
2. 进入 **系统设置 → 数据备份**
3. 点击 **立即备份** 或等待自动备份
4. 在列表中点击 **下载** 保存 `.tar.gz` 到本地

---

## 5. 更换服务器 — 数据恢复

### 方式 A：Web 界面（推荐）

1. 在新服务器完成 `deploy/install.sh` 并 `git pull` 到最新版本
2. 超级管理员登录 → **系统设置 → 数据备份**
3. 在「数据恢复」区域上传旧服务器下载的 `grade-archive_*.tar.gz`
4. 恢复成功后建议执行：`sudo systemctl restart grade-archive`

### 方式 B：命令行

1. 将备份包复制到新服务器，例如 `/root/grade-archive_20260628_030000.tar.gz`
2. 执行：

```bash
sudo bash /opt/secondary-school-grade-archive/deploy/restore.sh \
  /root/grade-archive_20260628_030000.tar.gz
```

3. 按提示确认后，脚本会恢复数据库与 `uploads/`，并尝试重启服务

---

## 6. 迁移检查清单

- [ ] 旧服务器下载最新备份包
- [ ] 新服务器安装系统（`install.sh`）并配置 Ollama / OCR 地址
- [ ] 上传备份并恢复
- [ ] 验证学生资料、成绩、错题图片、头像是否正常
- [ ] 确认 `.env` 中 `OLLAMA_BASE_URL`、`OCR_SERVICE_URL` 符合新环境

---

## 7. 注意事项

- **恢复会覆盖**当前数据库与 `uploads` 目录，操作前请先备份当前数据
- 备份与恢复需要服务器已安装 `pg_dump` / `psql`（安装脚本已包含 PostgreSQL）
- 备份目录在 `/root` 下，仅 root 可读写；应用以 systemd 运行时需确保 `BACKUP_DIR` 对运行用户可写，或保持默认由 root cron / 管理员 API 触发
- 学生头像、学校、年级等资料保存在数据库 `students` 表中，随数据库一并备份

---

## 8. 学生资料字段说明

| 字段 | 说明 |
|------|------|
| 姓名 | 必填 |
| 学校 | 可选，显示在卡片与详情 |
| 学段 | 初中 / 高中 |
| 年级 | 初一～初三 或 高一～高三（带明确标识） |
| 班级 | 如 `3` 或 `3班` |
| 头像 | 保存在 `uploads/{用户ID}/avatars/{学生ID}.jpg` |

在学生详情页 **设置** Tab 或首页卡片 **修改** 中维护；首页卡片支持 **删除**。
