#!/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 "Теперь приложение будет автоматически применять новые миграции при запуске."