#!/bin/bash # Скрипт резервного копирования БД PostgreSQL # Использование: ./backup_db.sh # Для автоматизации добавьте в crontab: 0 3 * * * /path/to/backup_db.sh set -e # Переменные BACKUP_DIR="${HOME}/new_lottery_bot/backups" DB_NAME="${DATABASE_DEFAULT:-lottery_bot}" DB_USER="${DATABASE_USER:-trevor}" DB_HOST="${DATABASE_HOST:-localhost}" TIMESTAMP=$(date +"%Y%m%d_%H%M%S") BACKUP_FILE="${BACKUP_DIR}/lottery_bot_${TIMESTAMP}.sql.gz" KEEP_DAYS=7 # Хранить резервные копии 7 дней # Цвета GREEN='\033[0;32m' YELLOW='\033[1;33m' RED='\033[0;31m' NC='\033[0m' log_info() { echo -e "${GREEN}✅ $1${NC}" } log_warn() { echo -e "${YELLOW}⚠️ $1${NC}" } log_error() { echo -e "${RED}❌ $1${NC}" } echo "🔄 Резервное копирование БД PostgreSQL" echo "========================================" # Создание директории для резервных копий if [ ! -d "$BACKUP_DIR" ]; then log_info "Создание директории для резервных копий..." mkdir -p "$BACKUP_DIR" fi # Получение размера БД перед резервной копией DB_SIZE=$(psql -h "$DB_HOST" -U "$DB_USER" -t -c " SELECT pg_size_pretty(pg_database.datsize) FROM pg_database WHERE datname = '$DB_NAME'; ") log_info "База данных: $DB_NAME" log_info "Размер БД: $DB_SIZE" log_info "Файл резервной копии: $BACKUP_FILE" # Создание резервной копии echo "" echo "⏳ Выполнение резервной копии..." if pg_dump -h "$DB_HOST" -U "$DB_USER" "$DB_NAME" | gzip > "$BACKUP_FILE" 2>/dev/null; then BACKUP_SIZE=$(ls -lh "$BACKUP_FILE" | awk '{print $5}') log_info "Резервная копия создана успешно" log_info "Размер файла: $BACKUP_SIZE" else log_error "Ошибка при создании резервной копии" exit 1 fi # Удаление старых резервных копий echo "" echo "🧹 Удаление старых резервных копий..." find "$BACKUP_DIR" -name "lottery_bot_*.sql.gz" -mtime +$KEEP_DAYS -exec rm -f {} \; log_info "Очистка завершена (хранятся копии за последние $KEEP_DAYS дней)" # Статистика echo "" echo "📊 Статистика резервных копий:" TOTAL_SIZE=$(du -sh "$BACKUP_DIR" | awk '{print $1}') COUNT=$(ls -1 "$BACKUP_DIR"/lottery_bot_*.sql.gz 2>/dev/null | wc -l) log_info "Всего резервных копий: $COUNT" log_info "Общий размер: $TOTAL_SIZE" # Информация о последних копиях echo "" echo "📋 Последние 5 резервных копий:" ls -1t "$BACKUP_DIR"/lottery_bot_*.sql.gz 2>/dev/null | head -5 | while read file; do size=$(ls -lh "$file" | awk '{print $5}') name=$(basename "$file") echo " • $name ($size)" done echo "" echo "========================================" log_info "Резервная копия завершена!" # Дополнительная информация echo "" echo "💡 Советы:" echo " • Важные копии загружайте на облако" echo " • Тестируйте восстановление из копий" echo " • Добавьте в crontab для автоматизации:" echo " 0 3 * * * $PWD/scripts/backup_db.sh" echo ""