diff --git a/README.md b/README.md index 7562841..68edeb4 100644 --- a/README.md +++ b/README.md @@ -1,104 +1,167 @@ -# Backup Service +# Backup Service для баз данных -Централизованный сервис для резервного копирования баз данных всех окружений (prod, tqo, eks). +Централизованный Docker-образ для резервного копирования баз данных MariaDB с автоматической загрузкой в S3. -## Возможности +## Описание работы -- Автоматическое резервное копирование каждые 12 часов -- Сжатие бэкапов с помощью gzip -- Загрузка в S3 (Selectel) через rclone -- Раздельное хранение бэкапов по окружениям -- Автоматическая ротация (хранение последних 7 бэкапов) +### Алгоритм резервного копирования -## Структура каталогов +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 секунд) и повторяет цикл + +### Структура проекта ``` -backup_service/ -├── docker-compose.yml # Конфигурация Docker Compose -├── Dockerfile.backup # Docker образ с rclone -├── .env # Переменные окружения (создать из .env.example) +backupdb/ +├── Dockerfile # Образ MariaDB + rclone +├── docker-compose.yml # Конфигурация для разных окружений ├── scripts/ -│ └── backup-db.sh # Скрипт резервного копирования -└── configs/ - └── rclone.conf # Конфигурация rclone для S3 +│ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY) +├── configs/ +│ └── rclone.conf # Конфигурация S3 (пример) +└── README.md # Эта документация ``` -## Установка и запуск +## Использование в проектах -1. Скопируйте `.env.example` в `.env` и укажите пароли MySQL для каждого окружения: -```bash -cp .env.example .env -# Отредактируйте .env и укажите реальные пароли +### Интеграция в 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 ``` -2. Убедитесь, что сети Docker существуют: +### Переменные окружения + +| Переменная | Описание | По умолчанию | +|------------|----------|--------------| +| `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 -docker network ls | grep -E "prod_dd|tqo_dd|eks_dd" +cd backupdb +docker build -t registry.dot-dot.ru/backupdb:master . +docker push registry.dot-dot.ru/backupdb:master ``` -3. Соберите Docker образ: +## Мониторинг и отладка + +### Просмотр логов ```bash -docker-compose build +docker-compose logs -f backupdb ``` -4. Запустите нужные сервисы: +### Ручной запуск бэкапа ```bash -# Запуск всех бэкапов -docker-compose up -d +# Перезапустить контейнер (начнет бэкап сразу) +docker-compose restart backupdb -# Или запуск только для конкретного окружения -docker-compose up -d backup-prod -docker-compose up -d backup-tqo -docker-compose up -d backup-eks +# Или выполнить команду внутри +docker-compose exec backupdb bash +mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;" ``` -## Мониторинг - -Просмотр логов: +### Проверка бэкапов в S3 ```bash -# Все сервисы -docker-compose logs -f - -# Конкретное окружение -docker-compose logs -f backup-prod +# На сервере с rclone +rclone ls selectel:backup_db/dot/prod/ +rclone ls selectel:backup_db/spottorg/tqo/ ``` ## Расположение бэкапов -### Локальные бэкапы -- Prod: `mysql_backup_volume_prod` -- TQO: `mysql_backup_volume_tqo` -- EKS: `mysql_backup_volume_eks` +### Локальные +- Volume: `mysql_backup_volume` +- Путь в контейнере: `/backups/` +- Формат: `{database}.{День}.sql.gz` ### S3 (Selectel) -- Prod: `selectel:backup_db/dot/prod/` -- TQO: `selectel:backup_db/dot/tqo/` -- EKS: `selectel:backup_db/dot/eks/` - -## Формат имен файлов - -Бэкапы сохраняются в формате: `{database_name}.{day_of_week}.sql.gz` - -Например: -- `mydatabase.Mon.sql.gz` -- `mydatabase.Tue.sql.gz` - -## Ручной запуск бэкапа - -Для немедленного создания бэкапа: -```bash -docker-compose exec backup-prod sh -c "kill 1" -# Контейнер перезапустится и сразу начнет бэкап -``` +- Bucket: `backup_db` +- Пути: + - Production: `dot/prod/{database}.{День}.sql.gz` + - TQO: `spottorg/tqo/{database}.{День}.sql.gz` + - EKS: `spottorg/eks/{database}.{День}.sql.gz` ## Восстановление из бэкапа -1. Скачайте бэкап из S3 или найдите в локальном volume -2. Распакуйте: +### Из S3 ```bash -gunzip database.Mon.sql.gz +# Скачать бэкап +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 ``` -3. Восстановите: + +### Из локального volume ```bash -mysql -h hostname -u root -p database_name < database.Mon.sql -``` \ No newline at end of file +# Найти 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 | \ No newline at end of file