115 lines
4.2 KiB
Markdown
115 lines
4.2 KiB
Markdown
# Резервное копирование LMS
|
||
|
||
Резервное копирование обязательно:
|
||
|
||
- **перед каждым обновлением** (`./deploy/deploy.sh up` делает backup автоматически);
|
||
- **ежедневно** по расписанию (systemd timer);
|
||
- перед миграциями и любыми ручными изменениями схемы/данных.
|
||
|
||
## Что входит в backup
|
||
|
||
Один каталог `backups/lms-<UTC timestamp>/`:
|
||
|
||
| Файл | Содержимое |
|
||
|---|---|
|
||
| `db.dump` | `pg_dump --format=custom` всей БД `lms` |
|
||
| `submissions.tar.gz` | volume `lms_lms_submissions` — решения студентов |
|
||
| `assets.tar.gz` | volume `lms_lms_assets` — файлы материалов |
|
||
| `SHA256SUMS` | контрольные суммы |
|
||
| `manifest.txt` | дата, БД, пользователь, проект, retention |
|
||
|
||
Каталоги бэкапов создаются с правами `700`: внутри персональные данные.
|
||
|
||
## Настройки
|
||
|
||
В `.env.prod`:
|
||
|
||
```dotenv
|
||
LMS_BACKUP_DIR=/opt/lms/backups
|
||
LMS_BACKUP_KEEP_DAYS=14
|
||
```
|
||
|
||
`LMS_BACKUP_KEEP_DAYS` — сколько дней хранить. `0` отключает автоудаление.
|
||
|
||
## Ручные команды
|
||
|
||
```bash
|
||
./deploy/backup.sh backup # создать backup
|
||
./deploy/backup.sh backup --if-running # пропустить, если стек не запущен
|
||
./deploy/backup.sh list # список backup-каталогов
|
||
./deploy/backup.sh verify <dir> # проверить суммы и целостность
|
||
./deploy/backup.sh restore <dir> # восстановить (destructive)
|
||
```
|
||
|
||
`restore` требует ввести `RESTORE`, останавливает прикладные сервисы,
|
||
пересоздаёт БД, восстанавливает файлы и поднимает стек. PostgreSQL при этом
|
||
не удаляется.
|
||
|
||
## Автоматически перед обновлением
|
||
|
||
`deploy/deploy.sh up` вызывает:
|
||
|
||
```bash
|
||
./deploy/backup.sh backup --if-running
|
||
```
|
||
|
||
Если стек ещё не запущен (первый деплой), шаг пропускается. Если backup
|
||
завершился ошибкой — деплой прерывается.
|
||
|
||
## Ежедневное расписание (systemd)
|
||
|
||
```bash
|
||
sudo cp deploy/systemd/lms-backup.service /etc/systemd/system/
|
||
sudo cp deploy/systemd/lms-backup.timer /etc/systemd/system/
|
||
sudo systemctl daemon-reload
|
||
sudo systemctl enable --now lms-backup.timer
|
||
systemctl list-timers lms-backup.timer
|
||
```
|
||
|
||
По умолчанию — каждый день в 03:00 с разбросом до 30 минут. `Persistent=true`
|
||
означает, что пропущенный запуск выполнится после включения сервера.
|
||
|
||
Если systemd недоступен, cron:
|
||
|
||
```cron
|
||
0 3 * * * cd /opt/lms && ./deploy/backup.sh backup >>/var/log/lms-backup.log 2>&1
|
||
```
|
||
|
||
## Восстановление
|
||
|
||
```bash
|
||
./deploy/backup.sh verify /opt/lms/backups/lms-20261023T030000Z
|
||
./deploy/backup.sh restore /opt/lms/backups/lms-20261023T030000Z
|
||
```
|
||
|
||
Проверка после восстановления:
|
||
|
||
```bash
|
||
./deploy/deploy.sh ps
|
||
curl -fsS http://127.0.0.1:8090/actuator/health
|
||
```
|
||
|
||
## Внешняя копия
|
||
|
||
Backup на том же сервере не защищает от потери сервера. Настройте выгрузку:
|
||
|
||
```bash
|
||
rsync -a --delete /opt/lms/backups/ backup-host:/srv/lms-backups/
|
||
```
|
||
|
||
Требования:
|
||
|
||
- шифрование при передаче и хранении (backups содержат ПДн);
|
||
- отдельный хост/хранилище;
|
||
- проверка восстановления не реже раза в месяц на staging;
|
||
- не хранить backup в git и в каталоге проекта без `.gitignore`.
|
||
|
||
## Проверка
|
||
|
||
Минимум раз в месяц:
|
||
|
||
1. `./deploy/backup.sh verify <dir>`.
|
||
2. Развернуть копию на staging.
|
||
3. Восстановить БД и файлы.
|
||
4. Проверить вход, группу, лабу, сдачу и скачивание файла.
|