/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
scripts/Init_cmd.cmd
748 строк
28 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
@echo off chcp 65001 >nul setlocal enabledelayedexpansion :: ============================================================================= :: TestGen — Скрипт инициализации проекта (Windows) :: :: Что делает: :: 1. Проверяет наличие Python, Node.js, Docker, Git :: 2. Создаёт виртуальное окружение Python :: 3. Устанавливает backend-зависимости :: 4. Устанавливает frontend-зависимости :: 5. Создаёт .env файл из шаблона :: 6. Генерирует ключи безопасности :: 7. Инициализирует Git (если нужно) :: 8. Запускает Docker-сервисы (опционально) :: 9. Применяет миграции БД :: 10. Создаёт суперпользователя :: 11. Наполняет БД тестовыми данными (опционально) :: ============================================================================= title TestGen — Инициализация проекта echo. echo ╔══════════════════════════════════════════════════════════════╗ echo ║ TestGen — Инициализация проекта ║ echo ║ Система интеллектуальной генерации тестовых заданий ║ echo ╚══════════════════════════════════════════════════════════════╝ echo. :: ============================================================================= :: Определение путей :: ============================================================================= set "SCRIPT_DIR=%~dp0" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" set "BACKEND_DIR=%SCRIPT_DIR%\backend" set "FRONTEND_DIR=%SCRIPT_DIR%\frontend" set "VENV_DIR=%SCRIPT_DIR%\.venv" set "ENV_FILE=%SCRIPT_DIR%\.env" set "ENV_EXAMPLE=%SCRIPT_DIR%\.env.example" cd /d "%SCRIPT_DIR%" :: ============================================================================= :: Проверка прав администратора :: ============================================================================= echo [1/15] Проверка прав администратора... net session >nul 2>&1 if %errorlevel% neq 0 ( echo [!] Скрипт запущен без прав администратора. echo Некоторые операции могут не выполниться. echo Рекомендуется запустить от имени администратора. echo. set "IS_ADMIN=0" ) else ( echo [√] Права администратора получены. set "IS_ADMIN=1" ) echo. :: ============================================================================= :: Проверка и установка необходимых компонентов :: ============================================================================= echo [2/15] Проверка необходимых компонентов... echo. :: --- Проверка Python --- set "PYTHON_OK=0" where python >nul 2>&1 if %errorlevel% equ 0 ( for /f "tokens=2" %%v in ('python --version 2^>^&1') do set "PYTHON_VER=%%v" echo [√] Python найден: !PYTHON_VER! :: Проверка версии (3.12+) for /f "tokens=2 delims=." %%a in ("!PYTHON_VER!") do set "PYTHON_MINOR=%%a" if !PYTHON_MINOR! geq 12 ( set "PYTHON_OK=1" ) else ( echo [!] Требуется Python 3.12 или выше. Найдена версия !PYTHON_VER! echo Скачайте: https://www.python.org/downloads/ ) ) else ( echo [!] Python не найден. echo Скачайте Python 3.12+: https://www.python.org/downloads/ echo При установке отметьте "Add Python to PATH" ) echo. :: --- Проверка Node.js --- set "NODE_OK=0" where node >nul 2>&1 if %errorlevel% equ 0 ( for /f "tokens=2" %%v in ('node --version 2^>^&1') do set "NODE_VER=%%v" echo [√] Node.js найден: !NODE_VER! set "NODE_OK=1" ) else ( echo [!] Node.js не найден. echo Скачайте Node.js 20 LTS: https://nodejs.org/ ) echo. :: --- Проверка npm --- set "NPM_OK=0" where npm >nul 2>&1 if %errorlevel% equ 0 ( for /f "tokens=2" %%v in ('npm --version 2^>^&1') do set "NPM_VER=%%v" echo [√] npm найден: !NPM_VER! set "NPM_OK=1" ) else ( echo [!] npm не найден. ) echo. :: --- Проверка Docker --- set "DOCKER_OK=0" where docker >nul 2>&1 if %errorlevel% equ 0 ( for /f "tokens=3" %%v in ('docker --version 2^>^&1') do set "DOCKER_VER=%%v" echo [√] Docker найден: !DOCKER_VER! :: Проверка, запущен ли Docker docker info >nul 2>&1 if %errorlevel% equ 0 ( set "DOCKER_OK=1" echo [√] Docker запущен и работает. ) else ( echo [!] Docker установлен, но не запущен. echo Запустите Docker Desktop. ) ) else ( echo [!] Docker не найден. echo Скачайте Docker Desktop: https://www.docker.com/products/docker-desktop/ ) echo. :: --- Проверка Docker Compose --- set "COMPOSE_OK=0" where docker-compose >nul 2>&1 if %errorlevel% equ 0 ( set "COMPOSE_OK=1" echo [√] Docker Compose найден. ) else ( docker compose version >nul 2>&1 if %errorlevel% equ 0 ( set "COMPOSE_OK=1" echo [√] Docker Compose (plugin) найден. ) else ( echo [!] Docker Compose не найден. ) ) echo. :: --- Проверка Git --- set "GIT_OK=0" where git >nul 2>&1 if %errorlevel% equ 0 ( for /f "tokens=3" %%v in ('git --version 2^>^&1') do set "GIT_VER=%%v" echo [√] Git найден: !GIT_VER! set "GIT_OK=1" ) else ( echo [!] Git не найден. echo Скачайте: https://git-scm.com/download/win ) echo. :: ============================================================================= :: Проверка возможности продолжить :: ============================================================================= if "%PYTHON_OK%"=="0" ( echo [X] КРИТИЧЕСКАЯ ОШИБКА: Python 3.12+ не найден. echo Установите Python и перезапустите скрипт. pause exit /b 1 ) if "%NODE_OK%"=="0" ( echo [X] КРИТИЧЕСКАЯ ОШИБКА: Node.js не найден. echo Установите Node.js и перезапустите скрипт. pause exit /b 1 ) echo ──────────────────────────────────────────────────────────────── echo Все критические компоненты найдены. Продолжаем инициализацию. echo ──────────────────────────────────────────────────────────────── echo. :: ============================================================================= :: Создание виртуального окружения Python :: ============================================================================= echo [3/15] Создание виртуального окружения Python... if exist "%VENV_DIR%\Scripts\python.exe" ( echo [√] Виртуальное окружение уже существует. ) else ( echo Создание .venv в %VENV_DIR%... python -m venv "%VENV_DIR%" if %errorlevel% neq 0 ( echo [X] Ошибка при создании виртуального окружения. pause exit /b 1 ) echo [√] Виртуальное окружение создано. ) echo. :: --- Активация venv --- call "%VENV_DIR%\Scripts\activate.bat" if %errorlevel% neq 0 ( echo [X] Ошибка активации виртуального окружения. pause exit /b 1 ) echo [√] Виртуальное окружение активировано. echo. :: ============================================================================= :: Обновление pip и установка poetry :: ============================================================================= echo [4/15] Обновление pip и установка Poetry... python -m pip install --upgrade pip --quiet if %errorlevel% neq 0 ( echo [!] Предупреждение: не удалось обновить pip. ) pip install poetry==1.8.5 --quiet if %errorlevel% neq 0 ( echo [X] Ошибка установки Poetry. pause exit /b 1 ) echo [√] pip обновлён, Poetry установлен. echo. :: ============================================================================= :: Установка backend-зависимостей :: ============================================================================= echo [5/15] Установка backend-зависимостей... cd /d "%BACKEND_DIR%" if exist "poetry.lock" ( echo Установка из poetry.lock... poetry install --no-interaction --no-ansi ) else ( echo Установка и создание poetry.lock... poetry install --no-interaction --no-ansi ) if %errorlevel% neq 0 ( echo [!] Предупреждение: возможны проблемы с установкой зависимостей. echo Попытка альтернативной установки через pip... if exist "requirements.txt" ( pip install -r requirements.txt ) else ( echo [X] Не удалось установить зависимости. pause exit /b 1 ) ) echo [√] Backend-зависимости установлены. echo. :: ============================================================================= :: Установка frontend-зависимостей :: ============================================================================= echo [6/15] Установка frontend-зависимостей... cd /d "%FRONTEND_DIR%" if exist "node_modules" ( echo node_modules уже существует. Пропускаем установку. echo Для переустановки удалите папку node_modules и запустите скрипт заново. ) else ( echo Выполняется npm install... call npm install if %errorlevel% neq 0 ( echo [!] Предупреждение: возможны проблемы с npm install. echo Попробуйте выполнить вручную: cd frontend ^&^& npm install ) ) echo [√] Frontend-зависимости установлены. echo. :: ============================================================================= :: Создание .env файла :: ============================================================================= echo [7/15] Настройка переменных окружения... cd /d "%SCRIPT_DIR%" if exist "%ENV_FILE%" ( echo [√] Файл .env уже существует. echo Создаём резервную копию .env.backup... copy /y "%ENV_FILE%" "%ENV_FILE%.backup" >nul ) else ( if exist "%ENV_EXAMPLE%" ( echo Копирование .env.example в .env... copy /y "%ENV_EXAMPLE%" "%ENV_FILE%" >nul echo [√] Файл .env создан из шаблона. ) else ( echo Создание .env с настройками по умолчанию... call :generate_default_env echo [√] Файл .env создан с настройками по умолчанию. ) ) echo. :: ============================================================================= :: Генерация ключей безопасности :: ============================================================================= echo [8/15] Генерация ключей безопасности... :: Генерация SECRET_KEY python -c "import secrets; print(secrets.token_urlsafe(32))" > "%TEMP%\testgen_secret.tmp" set /p SECRET_KEY=<"%TEMP%\testgen_secret.tmp" del "%TEMP%\testgen_secret.tmp" >nul 2>&1 :: Генерация ENCRYPTION_KEY (32 байта для AES-256) python -c "import secrets; print(secrets.token_hex(16))" > "%TEMP%\testgen_encrypt.tmp" set /p ENCRYPTION_KEY=<"%TEMP%\testgen_encrypt.tmp" del "%TEMP%\testgen_encrypt.tmp" >nul 2>&1 :: Обновление SECRET_KEY в .env if exist "%ENV_FILE%" ( powershell -Command "(Get-Content '%ENV_FILE%') -replace '^SECRET_KEY=.*$', 'SECRET_KEY=!SECRET_KEY!' | Set-Content '%ENV_FILE%'" powershell -Command "(Get-Content '%ENV_FILE%') -replace '^ENCRYPTION_KEY=.*$', 'ENCRYPTION_KEY=!ENCRYPTION_KEY!' | Set-Content '%ENV_FILE%'" echo [√] Ключи безопасности сгенерированы и записаны в .env. ) else ( echo [!] Файл .env не найден. Ключи не записаны. ) echo. :: ============================================================================= :: Инициализация Git (если нужно) :: ============================================================================= echo [9/15] Проверка Git-репозитория... if not exist "%SCRIPT_DIR%\.git" ( if "%GIT_OK%"=="1" ( echo Инициализация Git-репозитория... git init echo [√] Git-репозиторий инициализирован. ) else ( echo [!] Git не установлен. Пропускаем инициализацию. ) ) else ( echo [√] Git-репозиторий уже существует. ) echo. :: ============================================================================= :: Выбор режима запуска :: ============================================================================= echo [10/15] Выбор режима запуска... echo. echo Выберите режим запуска: echo [1] Docker (рекомендуется) — все сервисы в контейнерах echo [2] Локальный — backend и frontend отдельно (без Docker) echo [3] Только установка — без запуска echo. set /p RUN_MODE="Ваш выбор (1-3) [1]: " if "%RUN_MODE%"=="" set "RUN_MODE=1" echo. :: ============================================================================= :: Режим 1: Docker :: ============================================================================= if "%RUN_MODE%"=="1" ( echo [11/15] Запуск Docker-сервисов... if "%DOCKER_OK%"=="0" ( echo [X] Docker не запущен. Не могу продолжить. echo Запустите Docker Desktop и повторите попытку. goto :after_run ) :: Сборка образов echo Сборка Docker-образов... docker compose build if %errorlevel% neq 0 ( echo [X] Ошибка сборки Docker-образов. pause exit /b 1 ) :: Запуск сервисов echo Запуск сервисов... docker compose up -d if %errorlevel% neq 0 ( echo [X] Ошибка запуска Docker-сервисов. pause exit /b 1 ) echo [√] Docker-сервисы запущены. echo. :: Ожидание готовности echo [12/15] Ожидание готовности сервисов... echo Ожидание PostgreSQL... set "MAX_RETRIES=30" set "RETRY_COUNT=0" :wait_db docker compose exec -T db pg_isready -U testgen >nul 2>&1 if %errorlevel% equ 0 goto :db_ready set /a RETRY_COUNT+=1 if !RETRY_COUNT! geq %MAX_RETRIES% ( echo [!] Таймаут ожидания PostgreSQL. goto :db_ready ) timeout /t 2 /nobreak >nul goto :wait_db :db_ready echo [√] PostgreSQL готов. echo Ожидание Redis... set "RETRY_COUNT=0" :wait_redis docker compose exec -T redis redis-cli ping >nul 2>&1 if %errorlevel% equ 0 goto :redis_ready set /a RETRY_COUNT+=1 if !RETRY_COUNT! geq %MAX_RETRIES% ( echo [!] Таймаут ожидания Redis. goto :redis_ready ) timeout /t 2 /nobreak >nul goto :wait_redis :redis_ready echo [√] Redis готов. echo. :: Миграции БД echo [13/15] Применение миграций базы данных... docker compose exec -T backend alembic upgrade head if %errorlevel% neq 0 ( echo [X] Ошибка применения миграций. echo Проверьте логи: docker compose logs backend ) else ( echo [√] Миграции применены успешно. ) echo. :: Создание суперпользователя echo [14/15] Создание суперпользователя... echo. set /p ADMIN_EMAIL="Email администратора [admin@testgen.local]: " if "!ADMIN_EMAIL!"=="" set "ADMIN_EMAIL=admin@testgen.local" set /p ADMIN_PASS="Пароль администратора [Admin123!]: " if "!ADMIN_PASS!"=="" set "ADMIN_PASS=Admin123!" set /p ADMIN_NAME="Имя администратора [Администратор]: " if "!ADMIN_NAME!"=="" set "ADMIN_NAME=Администратор" docker compose exec -T backend python scripts/create_superuser.py ^ --email "!ADMIN_EMAIL!" ^ --password "!ADMIN_PASS!" ^ --name "!ADMIN_NAME!" if %errorlevel% neq 0 ( echo [!] Ошибка создания суперпользователя. ) else ( echo [√] Суперпользователь создан. ) echo. :: Тестовые данные (опционально) echo [15/15] Наполнение тестовыми данными... set /p SEED_DATA="Загрузить тестовые данные (курсы, темы)? (y/n) [n]: " if /i "!SEED_DATA!"=="y" ( docker compose exec -T backend python scripts/seed_data.py if %errorlevel% neq 0 ( echo [!] Ошибка загрузки тестовых данных. ) else ( echo [√] Тестовые данные загружены. ) ) else ( echo Пропущено. ) echo. goto :after_run ) :: ============================================================================= :: Режим 2: Локальный запуск :: ============================================================================= if "%RUN_MODE%"=="2" ( echo [11/15] Настройка локального запуска... echo. echo Для локального запуска необходимы: echo - PostgreSQL 16 (localhost:5432) echo - Redis 7 (localhost:6379) echo. echo Убедитесь, что они запущены и настроены. echo Параметры подключения можно изменить в файле .env echo. :: Применение миграций echo [12/15] Применение миграций базы данных... cd /d "%BACKEND_DIR%" call "%VENV_DIR%\Scripts\activate.bat" alembic upgrade head if %errorlevel% neq 0 ( echo [X] Ошибка применения миграций. echo Проверьте, что PostgreSQL запущен и доступен. ) else ( echo [√] Миграции применены. ) echo. :: Создание суперпользователя echo [13/15] Создание суперпользователя... set /p ADMIN_EMAIL="Email администратора [admin@testgen.local]: " if "!ADMIN_EMAIL!"=="" set "ADMIN_EMAIL=admin@testgen.local" set /p ADMIN_PASS="Пароль администратора [Admin123!]: " if "!ADMIN_PASS!"=="" set "ADMIN_PASS=Admin123!" set /p ADMIN_NAME="Имя администратора [Администратор]: " if "!ADMIN_NAME!"=="" set "ADMIN_NAME=Администратор" python scripts/create_superuser.py ^ --email "!ADMIN_EMAIL!" ^ --password "!ADMIN_PASS!" ^ --name "!ADMIN_NAME!" echo. :: Тестовые данные (опционально) echo [14/15] Наполнение тестовыми данными... set /p SEED_DATA="Загрузить тестовые данные (курсы, темы)? (y/n) [n]: " if /i "!SEED_DATA!"=="y" ( python scripts/seed_data.py if %errorlevel% neq 0 ( echo [!] Ошибка загрузки тестовых данных. ) else ( echo [√] Тестовые данные загружены. ) ) else ( echo Пропущено. ) echo. :: Инструкции по запуску echo [15/15] Инструкции по запуску: echo. echo Backend (в отдельном окне): echo cd backend echo .venv\Scripts\activate echo uvicorn src.testgen.main:app --reload --host 0.0.0.0 --port 8000 echo. echo Celery Worker (в отдельном окне): echo cd backend echo .venv\Scripts\activate echo celery -A src.testgen.tasks.celery_app worker -l info echo. echo Frontend (в отдельном окне): echo cd frontend echo npm run dev echo. echo Открыть в браузере: echo Frontend: http://localhost:5173 echo API Docs: http://localhost:8000/api/docs echo. goto :after_run ) :: ============================================================================= :: Режим 3: Только установка :: ============================================================================= if "%RUN_MODE%"=="3" ( echo [11/15] Режим "Только установка" — сервисы не запускаются. echo. echo Для запуска используйте: echo Docker: docker compose up -d echo Локально: смотрите инструкции в README.md echo. :: Создание скриптов быстрого запуска echo [12/15] Создание скриптов быстрого запуска... call :create_launch_scripts echo [√] Скрипты запуска созданы в папке scripts\. echo. ) :after_run :: ============================================================================= :: Создание скриптов быстрого запуска :: ============================================================================= call :create_launch_scripts :: ============================================================================= :: Завершение :: ============================================================================= echo ╔══════════════════════════════════════════════════════════════╗ echo ║ Инициализация завершена! ║ echo ╚══════════════════════════════════════════════════════════════╝ echo. echo Краткая информация: echo Проект: %SCRIPT_DIR% echo Виртуальное окружение: %VENV_DIR% echo Backend: %BACKEND_DIR% echo Frontend: %FRONTEND_DIR% echo. if "%RUN_MODE%"=="1" ( echo Сервисы запущены в Docker: echo Backend: http://localhost:8000 echo Frontend: http://localhost:5173 echo API Docs: http://localhost:8000/api/docs echo. echo Управление сервисами: echo Статус: docker compose ps echo Логи: docker compose logs -f echo Остановка: docker compose down echo. ) if defined ADMIN_EMAIL ( echo Данные администратора: echo Email: !ADMIN_EMAIL! echo Пароль: !ADMIN_PASS! echo. ) echo Полезные команды (Makefile): echo make test — запуск тестов echo make lint — запуск линтеров echo make migrate — применение миграций echo. echo Полная документация: docs\index.md echo. pause exit /b 0 :: ============================================================================= :: Функция: генерация .env по умолчанию :: ============================================================================= :generate_default_env ( echo # ============================================================================= echo # TestGen — Конфигурация окружения echo # Сгенерировано автоматически %date% %time% echo # ============================================================================= echo. echo # Приложение echo APP_NAME=TestGen echo APP_VERSION=0.1.0 echo ENVIRONMENT=development echo DEBUG=true echo LOG_LEVEL=DEBUG echo. echo # Безопасность echo SECRET_KEY=change-me-to-a-random-string-at-least-32-chars echo ACCESS_TOKEN_EXPIRE_MINUTES=30 echo REFRESH_TOKEN_EXPIRE_DAYS=30 echo ENCRYPTION_KEY=change-me-to-exactly-32-bytes! echo. echo # База данных echo DB_HOST=localhost echo DB_PORT=5432 echo DB_NAME=testgen echo DB_USER=testgen echo DB_PASSWORD=password echo DB_POOL_SIZE=20 echo DB_MAX_OVERFLOW=10 echo DB_POOL_RECYCLE=3600 echo DB_ECHO=false echo. echo # Redis echo REDIS_HOST=localhost echo REDIS_PORT=6379 echo REDIS_DB=0 echo REDIS_PASSWORD= echo REDIS_MAX_CONNECTIONS=50 echo. echo # Celery echo CELERY_BROKER_DB=1 echo CELERY_RESULT_DB=2 echo. echo # Хранилище echo STORAGE_PATH=./storage echo MAX_UPLOAD_SIZE_MB=50 echo. echo # CORS echo CORS_ORIGINS=["http://localhost:5173","http://localhost:3000"] ) > "%ENV_FILE%" exit /b :: ============================================================================= :: Функция: создание скриптов быстрого запуска :: ============================================================================= :create_launch_scripts if not exist "%SCRIPT_DIR%\scripts\" mkdir "%SCRIPT_DIR%\scripts\" :: --- Запуск Backend --- ( echo @echo off echo cd /d "%BACKEND_DIR%" echo call "%VENV_DIR%\Scripts\activate.bat" echo echo Запуск Backend на http://localhost:8000 echo uvicorn src.testgen.main:app --reload --host 0.0.0.0 --port 8000 echo pause ) > "%SCRIPT_DIR%\scripts\run_backend.cmd" :: --- Запуск Celery Worker --- ( echo @echo off echo cd /d "%BACKEND_DIR%" echo call "%VENV_DIR%\Scripts\activate.bat" echo echo Запуск Celery Worker echo celery -A src.testgen.tasks.celery_app worker -l info -Q llm_high_priority,llm_low_priority,export echo pause ) > "%SCRIPT_DIR%\scripts\run_worker.cmd" :: --- Запуск Frontend --- ( echo @echo off echo cd /d "%FRONTEND_DIR%" echo echo Запуск Frontend на http://localhost:5173 echo call npm run dev echo pause ) > "%SCRIPT_DIR%\scripts\run_frontend.cmd" :: --- Запуск всего (локально) --- ( echo @echo off echo echo Запуск всех сервисов локально... echo start "TestGen Backend" cmd /c "%SCRIPT_DIR%\scripts\run_backend.cmd" echo timeout /t 3 /nobreak ^>nul echo start "TestGen Worker" cmd /c "%SCRIPT_DIR%\scripts\run_worker.cmd" echo timeout /t 2 /nobreak ^>nul echo start "TestGen Frontend" cmd /c "%SCRIPT_DIR%\scripts\run_frontend.cmd" echo echo. echo echo Все сервисы запущены в отдельных окнах. echo echo Backend: http://localhost:8000 echo echo Frontend: http://localhost:5173 echo echo API Docs: http://localhost:8000/api/docs echo pause ) > "%SCRIPT_DIR%\scripts\run_all.cmd" exit /b