fix update
build (backupdb) TeamCity build finished Details

This commit is contained in:
Sergey Paramoshkin 2025-09-19 11:52:32 +03:00
parent 30d940e3a0
commit ee48909f91
1 changed files with 132 additions and 69 deletions

199
README.md
View File

@ -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/ backupdb/
├── docker-compose.yml # Конфигурация Docker Compose ├── Dockerfile # Образ MariaDB + rclone
├── Dockerfile.backup # Docker образ с rclone ├── docker-compose.yml # Конфигурация для разных окружений
├── .env # Переменные окружения (создать из .env.example)
├── scripts/ ├── scripts/
│ └── backup-db.sh # Скрипт резервного копирования │ └── backup.sh # Основной скрипт бэкапа (встроен в образ через COPY)
└── configs/ ├── configs/
└── rclone.conf # Конфигурация rclone для S3 │ └── rclone.conf # Конфигурация S3 (пример)
└── README.md # Эта документация
``` ```
## Установка и запуск ## Использование в проектах
1. Скопируйте `.env.example` в `.env` и укажите пароли MySQL для каждого окружения: ### Интеграция в docker-compose.yml
```bash
cp .env.example .env Добавьте сервис в ваш `docker-compose.yml`:
# Отредактируйте .env и укажите реальные пароли
```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 ```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 ```bash
docker-compose build docker-compose logs -f backupdb
``` ```
4. Запустите нужные сервисы: ### Ручной запуск бэкапа
```bash ```bash
# Запуск всех бэкапов # Перезапустить контейнер (начнет бэкап сразу)
docker-compose up -d docker-compose restart backupdb
# Или запуск только для конкретного окружения # Или выполнить команду внутри
docker-compose up -d backup-prod docker-compose exec backupdb bash
docker-compose up -d backup-tqo mysql -h $DB_HOST -u$DB_USER -p$MYSQL_ROOT_PASSWORD -e "show databases;"
docker-compose up -d backup-eks
``` ```
## Мониторинг ### Проверка бэкапов в S3
Просмотр логов:
```bash ```bash
# Все сервисы # На сервере с rclone
docker-compose logs -f rclone ls selectel:backup_db/dot/prod/
rclone ls selectel:backup_db/spottorg/tqo/
# Конкретное окружение
docker-compose logs -f backup-prod
``` ```
## Расположение бэкапов ## Расположение бэкапов
### Локальные бэкапы ### Локальные
- Prod: `mysql_backup_volume_prod` - Volume: `mysql_backup_volume`
- TQO: `mysql_backup_volume_tqo` - Путь в контейнере: `/backups/`
- EKS: `mysql_backup_volume_eks` - Формат: `{database}.{День}.sql.gz`
### S3 (Selectel) ### S3 (Selectel)
- Prod: `selectel:backup_db/dot/prod/` - Bucket: `backup_db`
- TQO: `selectel:backup_db/dot/tqo/` - Пути:
- EKS: `selectel:backup_db/dot/eks/` - Production: `dot/prod/{database}.{День}.sql.gz`
- TQO: `spottorg/tqo/{database}.{День}.sql.gz`
## Формат имен файлов - EKS: `spottorg/eks/{database}.{День}.sql.gz`
Бэкапы сохраняются в формате: `{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"
# Контейнер перезапустится и сразу начнет бэкап
```
## Восстановление из бэкапа ## Восстановление из бэкапа
1. Скачайте бэкап из S3 или найдите в локальном volume ### Из S3
2. Распакуйте:
```bash ```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 ```bash
mysql -h hostname -u root -p database_name < database.Mon.sql # Найти 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 |