169 lines
5.8 KiB
Bash
Executable File
169 lines
5.8 KiB
Bash
Executable File
#!/bin/bash
|
||
|
||
# Безопасный скрипт для применения baseline миграции к существующим БД
|
||
# Включает создание backup, проверки и применение baseline
|
||
|
||
set -e
|
||
|
||
# Цвета для вывода
|
||
RED='\033[0;31m'
|
||
GREEN='\033[0;32m'
|
||
YELLOW='\033[1;33m'
|
||
NC='\033[0m' # No Color
|
||
|
||
# Получаем переменные окружения
|
||
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}
|
||
|
||
MIGRATIONS_PATH="play-life-backend/migrations"
|
||
BACKUP_DIR="../database-dumps"
|
||
|
||
echo "=== Применение baseline миграции ==="
|
||
echo ""
|
||
|
||
# Проверяем наличие необходимых инструментов
|
||
if ! command -v migrate &> /dev/null; then
|
||
echo -e "${RED}Ошибка: migrate не найден. Установите golang-migrate:${NC}"
|
||
echo " brew install golang-migrate"
|
||
echo " или"
|
||
echo " go install -tags 'postgres' github.com/golang-migrate/migrate/v4/cmd/migrate@latest"
|
||
exit 1
|
||
fi
|
||
|
||
if ! command -v pg_dump &> /dev/null; then
|
||
echo -e "${RED}Ошибка: pg_dump не найден. Установите PostgreSQL client tools.${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# Проверяем наличие директории миграций
|
||
if [ ! -d "$MIGRATIONS_PATH" ]; then
|
||
echo -e "${RED}Ошибка: Директория миграций не найдена: $MIGRATIONS_PATH${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
# Проверяем наличие baseline миграции
|
||
if [ ! -f "$MIGRATIONS_PATH/000001_baseline.up.sql" ]; then
|
||
echo -e "${RED}Ошибка: Baseline миграция не найдена: $MIGRATIONS_PATH/000001_baseline.up.sql${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo "Параметры подключения:"
|
||
echo " Host: $DB_HOST"
|
||
echo " Port: $DB_PORT"
|
||
echo " User: $DB_USER"
|
||
echo " Database: $DB_NAME"
|
||
echo ""
|
||
|
||
# Проверяем подключение к БД
|
||
echo "1. Проверка подключения к БД..."
|
||
PGPASSWORD=$DB_PASSWORD psql \
|
||
-h $DB_HOST \
|
||
-p $DB_PORT \
|
||
-U $DB_USER \
|
||
-d $DB_NAME \
|
||
-c "SELECT 1;" > /dev/null 2>&1
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo -e "${RED}Ошибка: Не удалось подключиться к БД${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ Подключение успешно${NC}"
|
||
echo ""
|
||
|
||
# Проверяем текущую версию миграции
|
||
echo "2. Проверка текущей версии миграции..."
|
||
DATABASE_URL="postgres://$DB_USER:$DB_PASSWORD@$DB_HOST:$DB_PORT/$DB_NAME?sslmode=disable"
|
||
|
||
CURRENT_VERSION=$(migrate -path "$MIGRATIONS_PATH" -database "$DATABASE_URL" version 2>&1 || echo "none")
|
||
|
||
if echo "$CURRENT_VERSION" | grep -q "dirty"; then
|
||
echo -e "${YELLOW}⚠ База данных находится в состоянии 'dirty'${NC}"
|
||
echo " Это нормально для baseline - будет исправлено"
|
||
elif echo "$CURRENT_VERSION" | grep -q "^[0-9]"; then
|
||
VERSION_NUM=$(echo "$CURRENT_VERSION" | grep -oE "^[0-9]+" || echo "0")
|
||
if [ "$VERSION_NUM" -ge 1 ]; then
|
||
echo -e "${GREEN}✓ Версия миграции уже установлена: $VERSION_NUM${NC}"
|
||
echo " Baseline уже применен, дальнейшие действия не требуются"
|
||
exit 0
|
||
fi
|
||
fi
|
||
|
||
echo " Текущая версия: $CURRENT_VERSION"
|
||
echo ""
|
||
|
||
# Создаем backup
|
||
echo "3. Создание backup БД..."
|
||
mkdir -p "$BACKUP_DIR"
|
||
BACKUP_FILE="$BACKUP_DIR/baseline_backup_$(date +%Y%m%d_%H%M%S).sql.gz"
|
||
|
||
PGPASSWORD=$DB_PASSWORD pg_dump \
|
||
-h $DB_HOST \
|
||
-p $DB_PORT \
|
||
-U $DB_USER \
|
||
-d $DB_NAME \
|
||
| gzip > "$BACKUP_FILE"
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo -e "${RED}Ошибка: Не удалось создать backup${NC}"
|
||
exit 1
|
||
fi
|
||
|
||
BACKUP_SIZE=$(du -h "$BACKUP_FILE" | cut -f1)
|
||
echo -e "${GREEN}✓ Backup создан: $BACKUP_FILE (размер: $BACKUP_SIZE)${NC}"
|
||
echo ""
|
||
|
||
# Подтверждение
|
||
echo "4. Подтверждение применения baseline..."
|
||
echo ""
|
||
echo -e "${YELLOW}ВНИМАНИЕ:${NC}"
|
||
echo " Будет установлена версия миграции в 1 (baseline)"
|
||
echo " Сама миграция НЕ будет применена (схема уже существует)"
|
||
echo " Backup сохранен в: $BACKUP_FILE"
|
||
echo ""
|
||
read -p "Продолжить? (yes/no): " CONFIRM
|
||
|
||
if [ "$CONFIRM" != "yes" ]; then
|
||
echo "Отменено пользователем"
|
||
exit 0
|
||
fi
|
||
|
||
# Применяем baseline (force 1)
|
||
echo ""
|
||
echo "5. Установка версии миграции в 1 (baseline)..."
|
||
migrate -path "$MIGRATIONS_PATH" \
|
||
-database "$DATABASE_URL" \
|
||
force 1
|
||
|
||
if [ $? -ne 0 ]; then
|
||
echo -e "${RED}Ошибка: Не удалось установить версию миграции${NC}"
|
||
echo " Backup доступен в: $BACKUP_FILE"
|
||
exit 1
|
||
fi
|
||
|
||
echo -e "${GREEN}✓ Версия миграции установлена${NC}"
|
||
echo ""
|
||
|
||
# Проверяем результат
|
||
echo "6. Проверка результата..."
|
||
FINAL_VERSION=$(migrate -path "$MIGRATIONS_PATH" -database "$DATABASE_URL" version 2>&1)
|
||
echo " Версия миграции: $FINAL_VERSION"
|
||
|
||
if echo "$FINAL_VERSION" | grep -qE "^1"; then
|
||
echo -e "${GREEN}✓ Baseline успешно применен!${NC}"
|
||
else
|
||
echo -e "${YELLOW}⚠ Версия миграции: $FINAL_VERSION${NC}"
|
||
echo " Это может быть нормально, если база в состоянии 'dirty'"
|
||
fi
|
||
|
||
echo ""
|
||
echo "=== Готово ==="
|
||
echo ""
|
||
echo "Backup сохранен в: $BACKUP_FILE"
|
||
echo "Версия миграции установлена в: 1 (baseline)"
|
||
echo ""
|
||
echo "Теперь приложение будет автоматически применять новые миграции при запуске."
|