backupdb/README.md

6.8 KiB
Raw Permalink Blame History

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
├── scripts/
│   └── backup.sh          # Основной скрипт бэкапа (встроен в образ через COPY)
├── configs/
│   └── rclone.conf        # Конфигурация S3 (пример, не используется в production)
├── .env.example            # Пример переменных окружения
└── README.md              # Эта документация

Важно: Образ registry.dot-dot.ru/backupdb:master используется напрямую в docker-compose.yml каждого окружения (config_prod, config_tqo, config_eks).

Использование в проектах

Интеграция в docker-compose.yml

Добавьте сервис в ваш docker-compose.yml:

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 для бэкапов: Для хранения локальных копий

Сборка образа

cd backupdb
docker build -t registry.dot-dot.ru/backupdb:master .
docker push registry.dot-dot.ru/backupdb:master

Мониторинг и отладка

Просмотр логов

docker-compose logs -f backupdb

Ручной запуск бэкапа

# Перезапустить контейнер (начнет бэкап сразу)
docker-compose restart backupdb

# Или выполнить команду внутри
docker-compose exec backupdb bash
mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;"

Проверка бэкапов в S3

# На сервере с 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

# Скачать бэкап
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

# Найти 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 DB Container Network
Production config_prod/docker-compose.yml dot/prod/ db prod_dd
TQO config_tqo/docker-compose.yml spottorg/tqo/ db tqo_dd
EKS config_eks/docker-compose.yml spottorg/eks/ db eks_dd

Запуск в окружениях

# Production
cd config_prod
docker-compose up -d backupdb

# TQO
cd config_tqo
docker-compose up -d backupdb

# EKS
cd config_eks
docker-compose up -d backupdb