config_eks/BACKUP.md

130 lines
4.6 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.

# Резервное копирование БД - EKS
## Описание
В этой конфигурации настроено автоматическое резервное копирование всех баз данных MariaDB каждые 12 часов с загрузкой в S3 хранилище Selectel.
## Как это работает
### Сервис backupdb
В `docker-compose.yml` добавлен сервис `backupdb`, который:
1. **Запускается автоматически** вместе с остальными сервисами
2. **Подключается к БД** через контейнер `db` в той же Docker сети
3. **Создает бэкапы** каждые 12 часов для всех баз (кроме системных)
4. **Сжимает данные** через gzip для экономии места
5. **Загружает в S3** по пути `selectel:backup_db/spottorg/eks/`
6. **Ротирует бэкапы** - хранит 7 последних копий локально
### Процесс создания бэкапа
```
1. Получение списка БД → 2. Создание дампа → 3. Сжатие → 4. Загрузка в S3 → 5. Очистка старых
```
Для каждой базы данных:
- Создается файл: `{database}.{День}.sql.gz` (например: `eks_db.Mon.sql.gz`)
- Используется `mysqldump` с параметрами для консистентности без блокировок
- Загружается в S3 с помощью rclone
## Конфигурация
### Переменные окружения
```yaml
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # из .env файла
DB_HOST: db # контейнер с БД
S3_PATH: spottorg # путь в S3
ENVIRONMENT: eks # окружение
```
### Volumes
- `mysql_backup_volume:/backups` - локальное хранение бэкапов
- `/home/ddadmin/.config/rclone/rclone.conf` - конфиг для S3
## Мониторинг
### Просмотр логов
```bash
docker-compose logs -f backupdb
```
### Проверка статуса
```bash
docker-compose ps backupdb
```
### Просмотр бэкапов в S3
```bash
rclone ls selectel:backup_db/spottorg/eks/
```
## Восстановление
### Из S3
```bash
# 1. Скачать бэкап
rclone copy selectel:backup_db/spottorg/eks/eks_db.Mon.sql.gz ./
# 2. Распаковать
gunzip eks_db.Mon.sql.gz
# 3. Восстановить в БД
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} eks_db < eks_db.Mon.sql
```
### Из локального volume
```bash
# 1. Копировать из volume
docker run --rm -v eks_mysql_backup_volume:/backup -v $(pwd):/out alpine \
cp /backup/eks_db.Mon.sql.gz /out/
# 2. Распаковать и восстановить
gunzip eks_db.Mon.sql.gz
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} eks_db < eks_db.Mon.sql
```
## Ручное управление
### Немедленный запуск бэкапа
```bash
docker-compose restart backupdb
```
### Остановка бэкапов
```bash
docker-compose stop backupdb
```
### Запуск бэкапов
```bash
docker-compose start backupdb
```
## Расписание и ротация
- **Частота**: каждые 12 часов
- **Локальное хранение**: 7 последних копий
- **S3 хранение**: по дням недели (Mon-Sun), перезаписываются еженедельно
- **Максимальная история**: 7 дней для каждой БД
## Особенности EKS
- **S3 путь**: `spottorg/eks/` (отличается от production)
- **Окружение**: EKS (Elastic Kubernetes Service - тестовое окружение)
- **Сеть Docker**: `eks_dd`
## Troubleshooting
### Бэкап не создается
1. Проверьте логи: `docker-compose logs backupdb`
2. Проверьте пароль MySQL в .env
3. Проверьте доступность БД: `docker-compose exec backupdb mysql -h db -uroot -p`
### Не загружается в S3
1. Проверьте конфиг rclone: `ls -la /home/ddadmin/.config/rclone/rclone.conf`
2. Тестируйте подключение: `docker-compose exec backupdb rclone ls selectel:backup_db/`
### Нет места на диске
1. Проверьте volume: `docker volume ls | grep backup`
2. Очистите старые бэкапы: `docker-compose exec backupdb rm /backups/*.sql.gz`