Files
play-life/init.sh
poignatov 6d7d59d2ae
All checks were successful
Build and Push Docker Image / build-and-push (push) Successful in 6s
Add init/run scripts and Cursor/VSCode configurations
- Add init.sh: initializes app with Docker, creates prod backup, restores to local DB
- Add run.sh: restarts all containers
- Update restore-db.sh: auto-selects latest dump, terminates active connections before restore
- Add .cursor/commands.json: Cursor commands (init, run, backupFromProd, restoreToLocal)
- Add .vscode/tasks.json: VSCode tasks for running scripts
- Add .vscode/launch.json: launch configurations for restarting server
- Remove play-life-backend/env.example (unified .env in root)
2026-01-03 17:08:42 +03:00

161 lines
7.0 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
# Скрипт для первоначальной настройки и запуска приложения
# Использование: ./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