diff --git a/BACKUP.md b/BACKUP.md new file mode 100644 index 0000000..0b8ded9 --- /dev/null +++ b/BACKUP.md @@ -0,0 +1,130 @@ +# Резервное копирование БД - TQO + +## Описание + +В этой конфигурации настроено автоматическое резервное копирование всех баз данных MariaDB каждые 12 часов с загрузкой в S3 хранилище Selectel. + +## Как это работает + +### Сервис backupdb + +В `docker-compose.yml` добавлен сервис `backupdb`, который: + +1. **Запускается автоматически** вместе с остальными сервисами +2. **Подключается к БД** через контейнер `db` в той же Docker сети +3. **Создает бэкапы** каждые 12 часов для всех баз (кроме системных) +4. **Сжимает данные** через gzip для экономии места +5. **Загружает в S3** по пути `selectel:backup_db/spottorg/tqo/` +6. **Ротирует бэкапы** - хранит 7 последних копий локально + +### Процесс создания бэкапа + +``` +1. Получение списка БД → 2. Создание дампа → 3. Сжатие → 4. Загрузка в S3 → 5. Очистка старых +``` + +Для каждой базы данных: +- Создается файл: `{database}.{День}.sql.gz` (например: `tqo_db.Mon.sql.gz`) +- Используется `mysqldump` с параметрами для консистентности без блокировок +- Загружается в S3 с помощью rclone + +## Конфигурация + +### Переменные окружения +```yaml +MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # из .env файла +DB_HOST: db # контейнер с БД +S3_PATH: spottorg # путь в S3 +ENVIRONMENT: tqo # окружение +``` + +### 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/tqo/ +``` + +## Восстановление + +### Из S3 +```bash +# 1. Скачать бэкап +rclone copy selectel:backup_db/spottorg/tqo/tqo_db.Mon.sql.gz ./ + +# 2. Распаковать +gunzip tqo_db.Mon.sql.gz + +# 3. Восстановить в БД +docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} tqo_db < tqo_db.Mon.sql +``` + +### Из локального volume +```bash +# 1. Копировать из volume +docker run --rm -v tqo_mysql_backup_volume:/backup -v $(pwd):/out alpine \ + cp /backup/tqo_db.Mon.sql.gz /out/ + +# 2. Распаковать и восстановить +gunzip tqo_db.Mon.sql.gz +docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} tqo_db < tqo_db.Mon.sql +``` + +## Ручное управление + +### Немедленный запуск бэкапа +```bash +docker-compose restart backupdb +``` + +### Остановка бэкапов +```bash +docker-compose stop backupdb +``` + +### Запуск бэкапов +```bash +docker-compose start backupdb +``` + +## Расписание и ротация + +- **Частота**: каждые 12 часов +- **Локальное хранение**: 7 последних копий +- **S3 хранение**: по дням недели (Mon-Sun), перезаписываются еженедельно +- **Максимальная история**: 7 дней для каждой БД + +## Особенности TQO + +- **S3 путь**: `spottorg/tqo/` (отличается от production) +- **Окружение**: TQO (Test Quality Optimization) +- **Сеть Docker**: `tqo_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