#!/bin/bash # Скрипт для восстановления базы данных из дампа # Использование: # ./restore-db.sh [имя_дампа.sql.gz] # Восстановление в .env # ./restore-db.sh --env-file .env.prod [имя_дампа] # Восстановление в указанный файл # ./restore-db.sh production-backup.sql.gz # Восстановление в .env set -e # Значения по умолчанию DEFAULT_ENV_FILE=".env" ENV_FILE="$DEFAULT_ENV_FILE" DUMP_FILE="" # Парсим аргументы while [[ $# -gt 0 ]]; do case $1 in --env-file) ENV_FILE="$2" shift 2 ;; *) if [ -z "$DUMP_FILE" ]; then DUMP_FILE="$1" else echo "❌ Ошибка: Неизвестный аргумент: $1" echo "Использование: ./restore-db.sh [--env-file FILE] [имя_дампа.sql.gz]" exit 1 fi shift ;; esac done # Загружаем переменные окружения из указанного файла if [ -f "$ENV_FILE" ]; then export $(cat "$ENV_FILE" | grep -v '^#' | grep -v '^$' | xargs) echo "📋 Используется файл окружения: $ENV_FILE" else echo "⚠️ Файл $ENV_FILE не найден, используются значения по умолчанию" fi DB_HOST=${DB_HOST:-localhost} DB_PORT=${DB_PORT:-5432} DB_USER=${DB_USER:-playeng} DB_PASSWORD=${DB_PASSWORD:-playeng} DB_NAME=${DB_NAME:-playeng} # Проверяем наличие дампа if [ -z "$DUMP_FILE" ]; then echo "❌ Ошибка: Укажите имя дампа" echo "Использование: ./restore-db.sh [--env-file FILE] [имя_дампа.sql.gz]" echo "" echo "Доступные дампы:" ls -lh database-dumps/*.sql.gz 2>/dev/null | awk '{print " " $9}' | sed "s|database-dumps/||g" || echo " (нет дампов)" exit 1 fi # Определяем полный путь к файлу if [[ "$DUMP_FILE" =~ ^/ ]]; then # Абсолютный путь FULL_DUMP_PATH="$DUMP_FILE" else # Относительный путь if [[ "$DUMP_FILE" == *.sql.gz ]] || [[ "$DUMP_FILE" == *.sql ]]; then FULL_DUMP_PATH="database-dumps/$DUMP_FILE" else # Пробуем с расширениями if [ -f "database-dumps/$DUMP_FILE.sql.gz" ]; then FULL_DUMP_PATH="database-dumps/$DUMP_FILE.sql.gz" elif [ -f "database-dumps/$DUMP_FILE.sql" ]; then FULL_DUMP_PATH="database-dumps/$DUMP_FILE.sql" else FULL_DUMP_PATH="database-dumps/$DUMP_FILE" fi fi fi if [ ! -f "$FULL_DUMP_PATH" ]; then echo "❌ Ошибка: Файл дампа не найден: $FULL_DUMP_PATH" echo "" echo "Доступные дампы:" ls -lh database-dumps/*.sql.gz 2>/dev/null | awk '{print " " $9}' | sed "s|database-dumps/||g" || echo " (нет дампов)" exit 1 fi echo "⚠️ ВНИМАНИЕ: Это действие удалит все данные в базе $DB_NAME!" echo " Хост: $DB_HOST:$DB_PORT" echo " Пользователь: $DB_USER" read -p " Продолжить? (yes/no): " confirm if [ "$confirm" != "yes" ]; then echo "❌ Отменено." exit 0 fi echo "🔄 Восстановление базы данных из дампа..." echo " База: $DB_NAME" echo " Хост: $DB_HOST:$DB_PORT" echo " Файл: $FULL_DUMP_PATH" # Распаковываем, если сжат TEMP_DUMP="/tmp/restore_$$.sql" if [[ "$FULL_DUMP_PATH" == *.gz ]]; then echo " Распаковка дампа..." gunzip -c "$FULL_DUMP_PATH" > "$TEMP_DUMP" else cp "$FULL_DUMP_PATH" "$TEMP_DUMP" fi # Восстанавливаем через docker-compose, если контейнер запущен if docker-compose ps db 2>/dev/null | grep -q "Up"; then echo " Используется docker-compose..." # Очищаем базу и восстанавливаем docker-compose exec -T db psql -U "$DB_USER" -d postgres -c "DROP DATABASE IF EXISTS $DB_NAME;" docker-compose exec -T db psql -U "$DB_USER" -d postgres -c "CREATE DATABASE $DB_NAME;" docker-compose exec -T db psql -U "$DB_USER" -d "$DB_NAME" < "$TEMP_DUMP" elif command -v psql &> /dev/null; then # Или напрямую через psql echo " Используется локальный psql..." PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "DROP DATABASE IF EXISTS $DB_NAME;" PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d postgres -c "CREATE DATABASE $DB_NAME;" PGPASSWORD="$DB_PASSWORD" psql -h "$DB_HOST" -p "$DB_PORT" -U "$DB_USER" -d "$DB_NAME" < "$TEMP_DUMP" else echo "❌ Ошибка: psql не найден и docker-compose не запущен" echo " Запустите docker-compose или установите PostgreSQL клиент" rm -f "$TEMP_DUMP" exit 1 fi # Удаляем временный файл rm -f "$TEMP_DUMP" echo "✅ База данных успешно восстановлена из дампа!"