|
build (backupdb) TeamCity build finished
Details
|
||
|---|---|---|
| configs | ||
| scripts | ||
| .env.example | ||
| Dockerfile | ||
| README.md | ||
README.md
Backup Service для баз данных
Централизованный Docker-образ для резервного копирования баз данных MariaDB с автоматической загрузкой в S3.
Описание работы
Алгоритм резервного копирования
- Запуск цикла: Контейнер запускает бесконечный цикл в скрипте
/backup.sh - Получение списка БД: Подключается к MariaDB и получает список всех баз данных (исключая системные)
- Создание бэкапов: Для каждой БД:
- Создает дамп через
mysqldumpс параметрами:--max-allowed-packet=1G- для больших БД--single-transaction- консистентный бэкап без блокировок--extended-insert- оптимизация размера
- Сжимает через pipe в gzip
- Сохраняет как
{database}.{день_недели}.sql.gz
- Создает дамп через
- Загрузка в S3: Через rclone копирует в
selectel:backup_db/{S3_PATH}/{environment}/ - Ротация: Удаляет старые локальные копии (хранит последние 7)
- Ожидание: Спит 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 |
Требования
- Сеть Docker: Контейнер должен быть в той же сети, что и БД
- Конфиг rclone: Файл
/home/ddadmin/.config/rclone/rclone.confна хосте - 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
- Production:
Восстановление из бэкапа
Из 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