161 lines
7.0 KiB
Bash
161 lines
7.0 KiB
Bash
|
|
#!/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
|
|||
|
|
|