Files
play-life/restore-db.sh
poignatov 7398918bc0
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 57s
Release v1.1.0: Add Telegram and Todoist integrations UI
- Add telegram_integrations table to store bot token and chat_id
- Add Integrations tab with Todoist and Telegram integration screens
- Remove TELEGRAM_BOT_TOKEN and TELEGRAM_CHAT_ID from env variables
- All Telegram configuration now done through UI
- Telegram webhook registration happens when user saves bot token
- Rename TELEGRAM_WEBHOOK_BASE_URL to WEBHOOK_BASE_URL
2025-12-31 19:11:28 +03:00

137 lines
5.3 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/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 "✅ База данных успешно восстановлена из дампа!"