#!/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