#!/bin/bash # Скрипт для первоначальной настройки и запуска приложения # Использование: ./init.sh set -e # Цвета для вывода RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" cd "$SCRIPT_DIR" # Проверка наличия .env файла if [ ! -f ".env" ]; then echo -e "${RED}❌ Файл .env не найден!${NC}" echo " Создайте файл .env на основе env.example" exit 1 fi # Загружаем переменные окружения export $(cat .env | grep -v '^#' | grep -v '^$' | xargs) # Значения по умолчанию DB_USER=${DB_USER:-playeng} DB_PASSWORD=${DB_PASSWORD:-playeng} DB_NAME=${DB_NAME:-playeng} DB_PORT=${DB_PORT:-5432} PORT=${PORT:-8080} WEB_PORT=${WEB_PORT:-3001} echo -e "${GREEN}🚀 Инициализация Play Life...${NC}" echo "" # 1. Остановка и удаление существующих контейнеров echo -e "${YELLOW}1. Остановка существующих контейнеров...${NC}" docker-compose down -v 2>/dev/null || true echo -e "${GREEN} ✅ Контейнеры остановлены${NC}" # Удаляем старые образы postgres, если они есть echo -e "${YELLOW} Удаление старых образов postgres...${NC}" docker images | grep -E "postgres:(15|16|17|18|latest)" | awk '{print $3}' | xargs -r docker rmi -f 2>/dev/null || true echo -e "${GREEN} ✅ Старые образы postgres удалены${NC}" echo "" # 2. Поднятие всех сервисов echo -e "${YELLOW}2. Поднятие сервисов через Docker Compose...${NC}" echo " - База данных PostgreSQL 18.0 (порт: $DB_PORT)" echo " - Backend сервер (порт: $PORT)" echo " - Frontend приложение (порт: $WEB_PORT)" docker-compose up -d --build echo -e "${GREEN} ✅ Сервисы запущены${NC}" echo "" # 3. Ожидание готовности базы данных echo -e "${YELLOW}3. Ожидание готовности базы данных...${NC}" MAX_WAIT=60 WAIT_COUNT=0 while ! docker-compose exec -T db pg_isready -U "$DB_USER" >/dev/null 2>&1; do if [ $WAIT_COUNT -ge $MAX_WAIT ]; then echo -e "${RED} ❌ База данных не готова за $MAX_WAIT секунд${NC}" exit 1 fi echo -n "." sleep 1 WAIT_COUNT=$((WAIT_COUNT + 1)) done echo "" echo -e "${GREEN} ✅ База данных готова${NC}" echo "" # 4. Поиск самого свежего дампа echo -e "${YELLOW}4. Поиск самого свежего дампа...${NC}" DUMP_DIR="database-dumps" if [ ! -d "$DUMP_DIR" ]; then echo -e "${YELLOW} ⚠️ Директория дампов не найдена, создаём...${NC}" mkdir -p "$DUMP_DIR" fi # Ищем все дампы (сначала .sql.gz, потом .sql) LATEST_DUMP=$(ls -t "$DUMP_DIR"/*.{sql.gz,sql} 2>/dev/null | head -n 1) if [ -z "$LATEST_DUMP" ]; then echo -e "${YELLOW} ⚠️ Дампы не найдены${NC}" echo "" # Создаём дамп с продакшена используя креденшелы из .env echo -e "${YELLOW}5. Создание дампа с продакшена...${NC}" echo -e "${BLUE} 📦 Используются креденшелы из .env${NC}" echo " Используется скрипт dump-db.sh" if [ -f "./dump-db.sh" ]; then chmod +x ./dump-db.sh DUMP_NAME="prod_backup_$(date +%Y%m%d_%H%M%S)" # Временно останавливаем контейнер db, чтобы dump-db.sh не использовал docker-compose exec # и подключился напрямую к продакшен базе по креденшелам из .env echo -e "${BLUE} ⏸️ Временно останавливаем локальный контейнер db для создания дампа с продакшена...${NC}" docker-compose stop db 2>/dev/null || true # Используем dump-db.sh с креденшелами из .env (по умолчанию) # Теперь он подключится напрямую к продакшен базе, а не через docker-compose ./dump-db.sh "$DUMP_NAME" # Запускаем контейнер db обратно echo -e "${BLUE} ▶️ Запускаем локальный контейнер db обратно...${NC}" docker-compose start db 2>/dev/null || docker-compose up -d db # Проверяем, был ли создан дамп CREATED_DUMP=$(ls -t "$DUMP_DIR"/"$DUMP_NAME".sql.gz 2>/dev/null | head -n 1) if [ -n "$CREATED_DUMP" ]; then echo -e "${GREEN} ✅ Дамп с продакшена создан: $(basename "$CREATED_DUMP")${NC}" LATEST_DUMP="$CREATED_DUMP" # Продолжаем с восстановлением ниже else echo -e "${RED} ❌ Не удалось создать дамп с продакшена${NC}" echo -e "${YELLOW} ⚠️ Проверьте креденшелы в .env и доступность базы данных${NC}" exit 1 fi else echo -e "${RED} ❌ Скрипт dump-db.sh не найден${NC}" exit 1 fi fi # Если дамп найден или создан, восстанавливаем его if [ -n "$LATEST_DUMP" ]; then LATEST_DUMP_NAME=$(basename "$LATEST_DUMP") echo -e "${GREEN} ✅ Найден дамп: $LATEST_DUMP_NAME${NC}" echo "" # 6. Восстановление базы данных echo -e "${YELLOW}6. Восстановление базы данных из дампа...${NC}" echo " Файл: $LATEST_DUMP_NAME" echo " Используется скрипт restore-db.sh (восстановление в локальную базу)" # Используем restore-db.sh, который автоматически восстанавливает в локальную базу при использовании .env # restore-db.sh автоматически выберет самый свежий дамп, если имя не указано if [ -f "./restore-db.sh" ]; then chmod +x ./restore-db.sh # Автоматически подтверждаем восстановление # restore-db.sh сам выберет самый свежий дамп из database-dumps/ echo "yes" | ./restore-db.sh else echo -e "${RED} ❌ Скрипт restore-db.sh не найден${NC}" exit 1 fi fi echo "" echo -e "${GREEN}✅ Инициализация завершена!${NC}" echo "" echo -e "${BLUE}📋 Статус сервисов:${NC}" docker-compose ps