Files
LMS/deploy/BACKUP.md

115 lines
4.2 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Резервное копирование 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. Проверить вход, группу, лабу, сдачу и скачивание файла.