# Backup Service для баз данных Централизованный Docker-образ для резервного копирования баз данных MariaDB с автоматической загрузкой в S3. ## Описание работы ### Алгоритм резервного копирования 1. **Запуск цикла**: Контейнер запускает бесконечный цикл в скрипте `/backup.sh` 2. **Получение списка БД**: Подключается к MariaDB и получает список всех баз данных (исключая системные) 3. **Создание бэкапов**: Для каждой БД: - Создает дамп через `mysqldump` с параметрами: - `--max-allowed-packet=1G` - для больших БД - `--single-transaction` - консистентный бэкап без блокировок - `--extended-insert` - оптимизация размера - Сжимает через pipe в gzip - Сохраняет как `{database}.{день_недели}.sql.gz` 4. **Загрузка в S3**: Через rclone копирует в `selectel:backup_db/{S3_PATH}/{environment}/` 5. **Ротация**: Удаляет старые локальные копии (хранит последние 7) 6. **Ожидание**: Спит 12 часов (43200 секунд) и повторяет цикл ### Структура проекта ``` backupdb/ ├── Dockerfile # Образ MariaDB + rclone ├── docker-compose.yml # Конфигурация для разных окружений ├── scripts/ │ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY) ├── configs/ │ └── rclone.conf # Конфигурация S3 (пример) └── README.md # Эта документация ``` ## Использование в проектах ### Интеграция в docker-compose.yml Добавьте сервис в ваш `docker-compose.yml`: ```yaml services: 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: dot # или spottorg для tqo/eks ENVIRONMENT: prod # prod/tqo/eks для разделения volumes: - mysql_backup_volume:/backups - /home/ddadmin/.config/rclone/rclone.conf:/root/.config/rclone/rclone.conf:ro depends_on: - db networks: - dd ``` ### Переменные окружения | Переменная | Описание | По умолчанию | |------------|----------|--------------| | `MYSQL_ROOT_PASSWORD` | Пароль root для MySQL | обязательно | | `DB_HOST` | Hostname/контейнер БД | `db` | | `DB_USER` | Пользователь БД | `root` | | `KEEP_BACKUPS` | Количество локальных копий | `7` | | `S3_BUCKET` | Bucket в S3 | `selectel:backup_db` | | `S3_PATH` | Путь в bucket | `dot` | | `ENVIRONMENT` | Окружение (prod/tqo/eks) | `prod` | ### Требования 1. **Сеть Docker**: Контейнер должен быть в той же сети, что и БД 2. **Конфиг rclone**: Файл `/home/ddadmin/.config/rclone/rclone.conf` на хосте 3. **Volume для бэкапов**: Для хранения локальных копий ## Сборка образа ```bash cd backupdb docker build -t registry.dot-dot.ru/backupdb:master . docker push registry.dot-dot.ru/backupdb:master ``` ## Мониторинг и отладка ### Просмотр логов ```bash docker-compose logs -f backupdb ``` ### Ручной запуск бэкапа ```bash # Перезапустить контейнер (начнет бэкап сразу) docker-compose restart backupdb # Или выполнить команду внутри docker-compose exec backupdb bash mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;" ``` ### Проверка бэкапов в S3 ```bash # На сервере с rclone rclone ls selectel:backup_db/dot/prod/ rclone ls selectel:backup_db/spottorg/tqo/ ``` ## Расположение бэкапов ### Локальные - Volume: `mysql_backup_volume` - Путь в контейнере: `/backups/` - Формат: `{database}.{День}.sql.gz` ### S3 (Selectel) - Bucket: `backup_db` - Пути: - Production: `dot/prod/{database}.{День}.sql.gz` - TQO: `spottorg/tqo/{database}.{День}.sql.gz` - EKS: `spottorg/eks/{database}.{День}.sql.gz` ## Восстановление из бэкапа ### Из S3 ```bash # Скачать бэкап rclone copy selectel:backup_db/dot/prod/mydatabase.Mon.sql.gz ./ # Распаковать gunzip mydatabase.Mon.sql.gz # Восстановить mysql -h localhost -u root -p mydatabase < mydatabase.Mon.sql ``` ### Из локального volume ```bash # Найти volume docker volume ls | grep mysql_backup # Скопировать из volume docker run --rm -v mysql_backup_volume:/backup -v $(pwd):/out alpine \ cp /backup/mydatabase.Mon.sql.gz /out/ # Восстановить gunzip mydatabase.Mon.sql.gz mysql -h localhost -u root -p mydatabase < mydatabase.Mon.sql ``` ## Особенности ротации - **Локальные бэкапы**: Хранятся 7 последних копий каждой БД - **S3 бэкапы**: По дням недели (Mon-Sun), перезаписываются еженедельно - **Итого в S3**: Максимум 7 дней истории для каждой БД ## Текущие окружения | Окружение | S3 Path | Container Name | Network | |-----------|---------|----------------|---------| | Production | `dot/prod/` | prod-db-1 | prod_dd | | TQO | `spottorg/tqo/` | tqo-db-1 | tqo_dd | | EKS | `spottorg/eks/` | eks-db-1 | eks_dd |