Files
play-life/play-life-backend/apply_baseline.sh
2026-02-08 17:01:36 +03:00

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