# Резервное копирование БД - 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`