100 lines
3.4 KiB
Bash
100 lines
3.4 KiB
Bash
#!/bin/bash
|
|
|
|
# Автоматический скрипт для создания бэкапов БД PROD и DEV
|
|
# Запускается через cron дважды в день (00:00 и 12:00)
|
|
|
|
set -e
|
|
|
|
BACKUP_DIR="/var/www/platform/prod/backups"
|
|
LOG_FILE="/var/www/platform/prod/backups/backup.log"
|
|
TIMESTAMP=$(date +%Y%m%d_%H%M%S)
|
|
DATE=$(date +%Y-%m-%d\ %H:%M:%S)
|
|
|
|
# Создать директорию для бэкапов и логов
|
|
mkdir -p "$BACKUP_DIR"
|
|
|
|
# Функция для логирования
|
|
log() {
|
|
echo "[$DATE] $1" | tee -a "$LOG_FILE"
|
|
}
|
|
|
|
log "=========================================="
|
|
log "Начало автоматического бэкапа БД"
|
|
log "=========================================="
|
|
|
|
# Функция для создания бэкапа
|
|
backup_db() {
|
|
local CONTAINER_NAME=$1
|
|
local DB_USER=$2
|
|
local DB_NAME=$3
|
|
local BACKUP_NAME=$4
|
|
|
|
log "Создание бэкапа: $BACKUP_NAME"
|
|
|
|
# Проверить, что контейнер запущен
|
|
if ! docker ps | grep -q "$CONTAINER_NAME"; then
|
|
log "⚠️ Контейнер $CONTAINER_NAME не запущен, пропускаем..."
|
|
return 1
|
|
fi
|
|
|
|
BACKUP_FILE="$BACKUP_DIR/${BACKUP_NAME}_${TIMESTAMP}.sql.gz"
|
|
|
|
# Создать бэкап
|
|
if docker exec "$CONTAINER_NAME" pg_dumpall -U "$DB_USER" -c 2>/dev/null | gzip > "$BACKUP_FILE"; then
|
|
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
|
log " ✓ Бэкап создан: $BACKUP_FILE ($BACKUP_SIZE)"
|
|
|
|
# Проверить размер файла (должен быть больше 0)
|
|
if [ ! -s "$BACKUP_FILE" ]; then
|
|
log " ✗ ОШИБКА: Бэкап пустой!"
|
|
rm -f "$BACKUP_FILE"
|
|
return 1
|
|
fi
|
|
|
|
return 0
|
|
else
|
|
log " ✗ Ошибка создания бэкапа для $BACKUP_NAME"
|
|
return 1
|
|
fi
|
|
}
|
|
|
|
# Бэкап PROD БД
|
|
PROD_SUCCESS=false
|
|
if backup_db "platform_prod_db" "platform_prod_user" "platform_prod_db" "platform_prod_db"; then
|
|
PROD_SUCCESS=true
|
|
fi
|
|
|
|
# Бэкап DEV БД
|
|
DEV_SUCCESS=false
|
|
if backup_db "platform_dev_db" "platform_dev_user" "platform_dev_db" "platform_dev_db"; then
|
|
DEV_SUCCESS=true
|
|
fi
|
|
|
|
# Очистка старых бэкапов (оставляем последние 30 дней)
|
|
log "Очистка старых бэкапов (старше 30 дней)..."
|
|
find "$BACKUP_DIR" -name "*.sql.gz" -type f -mtime +30 -delete 2>/dev/null || true
|
|
DELETED_COUNT=$(find "$BACKUP_DIR" -name "*.sql.gz" -type f 2>/dev/null | wc -l)
|
|
log "Осталось бэкапов: $DELETED_COUNT"
|
|
|
|
# Итоги
|
|
log "=========================================="
|
|
if [ "$PROD_SUCCESS" = true ] && [ "$DEV_SUCCESS" = true ]; then
|
|
log "✓ Бэкапы созданы успешно (PROD и DEV)"
|
|
elif [ "$PROD_SUCCESS" = true ]; then
|
|
log "⚠️ Бэкап PROD создан, DEV пропущен"
|
|
elif [ "$DEV_SUCCESS" = true ]; then
|
|
log "⚠️ Бэкап DEV создан, PROD пропущен"
|
|
else
|
|
log "✗ Ошибка: бэкапы не созданы!"
|
|
exit 1
|
|
fi
|
|
log "=========================================="
|
|
|
|
# Проверка места на диске
|
|
DISK_USAGE=$(df -h "$BACKUP_DIR" | tail -1 | awk '{print $5}' | sed 's/%//')
|
|
if [ "$DISK_USAGE" -gt 80 ]; then
|
|
log "⚠️ ВНИМАНИЕ: Использовано дискового пространства: ${DISK_USAGE}%"
|
|
fi
|
|
|
|
exit 0
|