Compare commits
1 Commits
36c566d8dd
...
40c59ee46d
| Author | SHA1 | Date |
|---|---|---|
|
|
40c59ee46d |
2
.env
2
.env
|
|
@ -1,4 +1,4 @@
|
||||||
COMPOSE_PROJECT_NAME=tqo
|
1COMPOSE_PROJECT_NAME=tqo
|
||||||
NETWORK=tqo
|
NETWORK=tqo
|
||||||
|
|
||||||
FRONT_TAG=139.2
|
FRONT_TAG=139.2
|
||||||
|
|
|
||||||
|
|
@ -0,0 +1,130 @@
|
||||||
|
# Резервное копирование БД - TQO
|
||||||
|
|
||||||
|
## Описание
|
||||||
|
|
||||||
|
В этой конфигурации настроено автоматическое резервное копирование всех баз данных MariaDB каждые 12 часов с загрузкой в S3 хранилище Selectel.
|
||||||
|
|
||||||
|
## Как это работает
|
||||||
|
|
||||||
|
### Сервис backupdb
|
||||||
|
|
||||||
|
В `docker-compose.yml` добавлен сервис `backupdb`, который:
|
||||||
|
|
||||||
|
1. **Запускается автоматически** вместе с остальными сервисами
|
||||||
|
2. **Подключается к БД** через контейнер `db` в той же Docker сети
|
||||||
|
3. **Создает бэкапы** каждые 12 часов для всех баз (кроме системных)
|
||||||
|
4. **Сжимает данные** через gzip для экономии места
|
||||||
|
5. **Загружает в S3** по пути `selectel:backup_db/spottorg/tqo/`
|
||||||
|
6. **Ротирует бэкапы** - хранит 7 последних копий локально
|
||||||
|
|
||||||
|
### Процесс создания бэкапа
|
||||||
|
|
||||||
|
```
|
||||||
|
1. Получение списка БД → 2. Создание дампа → 3. Сжатие → 4. Загрузка в S3 → 5. Очистка старых
|
||||||
|
```
|
||||||
|
|
||||||
|
Для каждой базы данных:
|
||||||
|
- Создается файл: `{database}.{День}.sql.gz` (например: `tqo_db.Mon.sql.gz`)
|
||||||
|
- Используется `mysqldump` с параметрами для консистентности без блокировок
|
||||||
|
- Загружается в S3 с помощью rclone
|
||||||
|
|
||||||
|
## Конфигурация
|
||||||
|
|
||||||
|
### Переменные окружения
|
||||||
|
```yaml
|
||||||
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD} # из .env файла
|
||||||
|
DB_HOST: db # контейнер с БД
|
||||||
|
S3_PATH: spottorg # путь в S3
|
||||||
|
ENVIRONMENT: tqo # окружение
|
||||||
|
```
|
||||||
|
|
||||||
|
### Volumes
|
||||||
|
- `mysql_backup_volume:/backups` - локальное хранение бэкапов
|
||||||
|
- `/home/ddadmin/.config/rclone/rclone.conf` - конфиг для S3
|
||||||
|
|
||||||
|
## Мониторинг
|
||||||
|
|
||||||
|
### Просмотр логов
|
||||||
|
```bash
|
||||||
|
docker-compose logs -f backupdb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Проверка статуса
|
||||||
|
```bash
|
||||||
|
docker-compose ps backupdb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Просмотр бэкапов в S3
|
||||||
|
```bash
|
||||||
|
rclone ls selectel:backup_db/spottorg/tqo/
|
||||||
|
```
|
||||||
|
|
||||||
|
## Восстановление
|
||||||
|
|
||||||
|
### Из S3
|
||||||
|
```bash
|
||||||
|
# 1. Скачать бэкап
|
||||||
|
rclone copy selectel:backup_db/spottorg/tqo/tqo_db.Mon.sql.gz ./
|
||||||
|
|
||||||
|
# 2. Распаковать
|
||||||
|
gunzip tqo_db.Mon.sql.gz
|
||||||
|
|
||||||
|
# 3. Восстановить в БД
|
||||||
|
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} tqo_db < tqo_db.Mon.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
### Из локального volume
|
||||||
|
```bash
|
||||||
|
# 1. Копировать из volume
|
||||||
|
docker run --rm -v tqo_mysql_backup_volume:/backup -v $(pwd):/out alpine \
|
||||||
|
cp /backup/tqo_db.Mon.sql.gz /out/
|
||||||
|
|
||||||
|
# 2. Распаковать и восстановить
|
||||||
|
gunzip tqo_db.Mon.sql.gz
|
||||||
|
docker-compose exec db mysql -uroot -p${MYSQL_ROOT_PASSWORD} tqo_db < tqo_db.Mon.sql
|
||||||
|
```
|
||||||
|
|
||||||
|
## Ручное управление
|
||||||
|
|
||||||
|
### Немедленный запуск бэкапа
|
||||||
|
```bash
|
||||||
|
docker-compose restart backupdb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Остановка бэкапов
|
||||||
|
```bash
|
||||||
|
docker-compose stop backupdb
|
||||||
|
```
|
||||||
|
|
||||||
|
### Запуск бэкапов
|
||||||
|
```bash
|
||||||
|
docker-compose start backupdb
|
||||||
|
```
|
||||||
|
|
||||||
|
## Расписание и ротация
|
||||||
|
|
||||||
|
- **Частота**: каждые 12 часов
|
||||||
|
- **Локальное хранение**: 7 последних копий
|
||||||
|
- **S3 хранение**: по дням недели (Mon-Sun), перезаписываются еженедельно
|
||||||
|
- **Максимальная история**: 7 дней для каждой БД
|
||||||
|
|
||||||
|
## Особенности TQO
|
||||||
|
|
||||||
|
- **S3 путь**: `spottorg/tqo/` (отличается от production)
|
||||||
|
- **Окружение**: TQO (Test Quality Optimization)
|
||||||
|
- **Сеть Docker**: `tqo_dd`
|
||||||
|
|
||||||
|
## Troubleshooting
|
||||||
|
|
||||||
|
### Бэкап не создается
|
||||||
|
1. Проверьте логи: `docker-compose logs backupdb`
|
||||||
|
2. Проверьте пароль MySQL в .env
|
||||||
|
3. Проверьте доступность БД: `docker-compose exec backupdb mysql -h db -uroot -p`
|
||||||
|
|
||||||
|
### Не загружается в S3
|
||||||
|
1. Проверьте конфиг rclone: `ls -la /home/ddadmin/.config/rclone/rclone.conf`
|
||||||
|
2. Тестируйте подключение: `docker-compose exec backupdb rclone ls selectel:backup_db/`
|
||||||
|
|
||||||
|
### Нет места на диске
|
||||||
|
1. Проверьте volume: `docker volume ls | grep backup`
|
||||||
|
2. Очистите старые бэкапы: `docker-compose exec backupdb rm /backups/*.sql.gz`
|
||||||
8
app.sh
8
app.sh
|
|
@ -1,8 +1,8 @@
|
||||||
DIRECTORY=`dirname $0`
|
DIRECTORY=`dirname $0`
|
||||||
|
|
||||||
#MYSQL_ROOT_PASSWORD=$(grep MYSQL_ROOT_PASSWORD $DIRECTORY"/.env" | xargs)
|
MYSQL_ROOT_PASSWORD=$(grep MYSQL_ROOT_PASSWORD $DIRECTORY"/.env" | xargs)
|
||||||
#MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD#*=}
|
MYSQL_ROOT_PASSWORD=${MYSQL_ROOT_PASSWORD#*=}
|
||||||
source $DIRECTORY"/.env"
|
|
||||||
help() {
|
help() {
|
||||||
echo "run $0 [COMMAND] "
|
echo "run $0 [COMMAND] "
|
||||||
echo '
|
echo '
|
||||||
|
|
@ -48,7 +48,7 @@ log() {
|
||||||
## restore last backup from s3 storage
|
## restore last backup from s3 storage
|
||||||
restoredb() {
|
restoredb() {
|
||||||
log "run restore database"
|
log "run restore database"
|
||||||
sudo rclone copy --verbose selectel:backup_db/dot/spottorg/tqo/dot.$(date +%a).sql.gz backups/
|
sudo rclone copy --verbose selectel:backup_db/dot/dot.$(date +%a).sql.gz backups/
|
||||||
zcat backups/dot.$(date +%a).sql.gz | docker compose exec -T db mysql -uroot -p${MYSQL_ROOT_PASSWORD} dot
|
zcat backups/dot.$(date +%a).sql.gz | docker compose exec -T db mysql -uroot -p${MYSQL_ROOT_PASSWORD} dot
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -232,7 +232,7 @@ services:
|
||||||
- dd
|
- dd
|
||||||
|
|
||||||
backupdb:
|
backupdb:
|
||||||
image: registry.dot-dot.ru/backupdb:v0.0.2
|
image: registry.dot-dot.ru/backupdb:master
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
MYSQL_ROOT_PASSWORD: ${MYSQL_ROOT_PASSWORD}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue