From bf05fdb8b2bb7c04463e8cabcd1d5d1a4c27b26a Mon Sep 17 00:00:00 2001 From: Sergey Paramoshkin Date: Sat, 20 Sep 2025 18:05:59 +0300 Subject: [PATCH] update --- BACKUP.md | 130 +++++++++++++++++++++++++++++++++++++++++++++ docker-compose.yml | 19 +++++++ 2 files changed, 149 insertions(+) create mode 100644 BACKUP.md diff --git a/BACKUP.md b/BACKUP.md new file mode 100644 index 0000000..1e74221 --- /dev/null +++ b/BACKUP.md @@ -0,0 +1,130 @@ +# Резервное копирование БД - 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` \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index d72d5a0..70da8f8 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -226,3 +226,22 @@ services: restart: unless-stopped networks: - dd + + backupdb: + image: registry.dot-dot.ru/backupdb:master + restart: unless-stopped + environment: + MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} + DB_HOST: db + DB_USER: root + KEEP_BACKUPS: 7 + S3_BUCKET: selectel:backup_db + S3_PATH: spottorg + ENVIRONMENT: eks + volumes: + - mysql_backup_volume:/backups + - /home/ddadmin/.config/rclone/rclone.conf:/root/.config/rclone/rclone.conf:ro + depends_on: + - db + networks: + - dd