/
gr.ev.vl
/
TestGen
Обзор
Документация
Войти
/
gr.ev.vl
/
TestGen
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master2
scripts/setup_db2.cmd
454 строки
13 KB
gr.ev.vl
Initial commit
06 июн 2026, 02:41
06 июн 2026, 02:41
02fb1fb
Код
Авторство
О чём код?
@echo off chcp 1251 >nul setlocal enabledelayedexpansion :: ============================================================================= :: TestGen � ��������� � ������������� ��� ������ (PostgreSQL + Redis) :: ============================================================================= title TestGen � ��������� ��� ������ echo. echo ================================================================= echo TestGen � ��������� � ������������� ��� ������ echo PostgreSQL + Redis echo ================================================================= echo. :: ============================================================================= :: ����������� ����� :: ============================================================================= set "SCRIPT_DIR=%~dp0" set "SCRIPT_DIR=%SCRIPT_DIR:~0,-1%" for %%i in ("%SCRIPT_DIR%") do set "PROJECT_DIR=%%~dpi" set "PROJECT_DIR=%PROJECT_DIR:~0,-1%" set "BACKEND_DIR=%PROJECT_DIR%\backend" set "ENV_FILE=%PROJECT_DIR%\.env" cd /d "%PROJECT_DIR%" :: ============================================================================= :: �������� ���������� �� .env :: ============================================================================= echo [1/10] �������� ������������... :: �������� �� ��������� set "DB_HOST=localhost" set "DB_PORT=5432" set "DB_NAME=testgen" set "DB_USER=testgen" set "DB_PASSWORD=password" set "REDIS_HOST=localhost" set "REDIS_PORT=6379" set "REDIS_DB=0" set "REDIS_PASSWORD=" if exist "%ENV_FILE%" ( echo [OK] ���� .env ������. for /f "usebackq tokens=1,2 delims==" %%a in (`type "%ENV_FILE%" ^| findstr /b /v "#" ^| findstr "="`) do ( if "%%a"=="DB_HOST" set "DB_HOST=%%b" if "%%a"=="DB_PORT" set "DB_PORT=%%b" if "%%a"=="DB_NAME" set "DB_NAME=%%b" if "%%a"=="DB_USER" set "DB_USER=%%b" if "%%a"=="DB_PASSWORD" set "DB_PASSWORD=%%b" if "%%a"=="REDIS_HOST" set "REDIS_HOST=%%b" if "%%a"=="REDIS_PORT" set "REDIS_PORT=%%b" if "%%a"=="REDIS_DB" set "REDIS_DB=%%b" if "%%a"=="REDIS_PASSWORD" set "REDIS_PASSWORD=%%b" ) ) else ( echo [!] ���� .env �� ������. ������������ �������� �� ���������. ) echo. echo ������� ������������: echo PostgreSQL: %DB_HOST%:%DB_PORT%/%DB_NAME% (user: %DB_USER%) echo Redis: %REDIS_HOST%:%REDIS_PORT% (db: %REDIS_DB%) echo. :: ============================================================================= :: ����� ������ ������ :: ============================================================================= echo [2/10] ����� ������ ������... echo. echo [1] ������ ��������� (�������� ��, ������������, ��������, ������) echo [2] ������ �������� (�� ��� ����������) echo [3] ������ �������� �� � ������������ (��� ��������) echo [4] ������ �������� ������ echo [5] ������ �������� �������������� echo [0] ����� echo. set /p RUN_MODE="�������� ����� [1]: " if "%RUN_MODE%"=="" set "RUN_MODE=1" if "%RUN_MODE%"=="0" ( echo �����. pause exit /b 0 ) if "%RUN_MODE%"=="5" goto :create_admin_only echo. :: ============================================================================= :: ����� psql :: ============================================================================= echo [3/10] ����� PostgreSQL (psql)... set "PSQL_EXE=" :: �������� � PATH where psql.exe >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where psql.exe') do set "PSQL_EXE=%%i" echo [OK] psql ������ � PATH: !PSQL_EXE! goto :psql_found ) :: ����� � ����������� ����� for %%v in (18 17 16 15 14) do ( if exist "C:\Program Files\PostgreSQL\%%v\bin\psql.exe" ( set "PSQL_EXE=C:\Program Files\PostgreSQL\%%v\bin\psql.exe" echo [OK] psql ������: !PSQL_EXE! goto :psql_found ) ) :: ����� ����� ������ for /f "tokens=2*" %%a in ('reg query "HKLM\SOFTWARE\PostgreSQL\Installations" /s 2^>nul ^| findstr "Base Directory"') do ( set "PG_DIR=%%b" if exist "!PG_DIR!\bin\psql.exe" ( set "PSQL_EXE=!PG_DIR!\bin\psql.exe" echo [OK] psql ������ ����� ������: !PSQL_EXE! goto :psql_found ) ) echo [!] psql �� ������. ������ � PostgreSQL ����� ����������. set "PSQL_EXE=" :psql_found echo. :: ============================================================================= :: �������� ����������� PostgreSQL :: ============================================================================= echo [4/10] �������� ����������� PostgreSQL... set "PG_OK=0" if defined PSQL_EXE ( set "PGPASSWORD=%DB_PASSWORD%" "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d postgres -c "SELECT 1;" >nul 2>&1 if !errorlevel! equ 0 ( set "PG_OK=1" set "ADMIN_USER=%DB_USER%" echo [OK] PostgreSQL �������� (������������ %DB_USER%). goto :pg_checked ) "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U postgres -d postgres -c "SELECT 1;" >nul 2>&1 if !errorlevel! equ 0 ( set "PG_OK=1" set "ADMIN_USER=postgres" set "NEED_CREATE_USER=1" echo [OK] PostgreSQL �������� (������������ postgres). goto :pg_checked ) ) echo [X] PostgreSQL ����������. echo ���������: echo - PostgreSQL ���������� � ������� echo - ��������� ����������� ����� echo - ���������� �� ��������� ���� %DB_PORT% echo. set /p IGNORE_PG="���������� ��� PostgreSQL? (y/n) [n]: " if /i not "!IGNORE_PG!"=="y" ( pause exit /b 1 ) :pg_checked echo. :: ============================================================================= :: ��������� PostgreSQL :: ============================================================================= if "%RUN_MODE%"=="2" goto :skip_pg_setup if "%RUN_MODE%"=="4" goto :skip_pg_setup if "%PG_OK%"=="0" goto :skip_pg_setup echo [5/10] ��������� PostgreSQL... :: �������� ������������ if "%NEED_CREATE_USER%"=="1" ( echo �������� ������������ %DB_USER%... set "PGPASSWORD=%DB_PASSWORD%" "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "CREATE ROLE %DB_USER% WITH LOGIN PASSWORD '%DB_PASSWORD%';" 2>nul "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "ALTER ROLE %DB_USER% CREATEDB;" 2>nul echo [OK] ������������ ������. ) :: �������� ������������� �� set "DB_EXISTS=0" set "PGPASSWORD=%DB_PASSWORD%" for /f "tokens=*" %%i in ('"%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -t -c "SELECT 1 FROM pg_database WHERE datname='%DB_NAME%';" 2^>nul') do ( set "DB_CHECK=%%i" if "!DB_CHECK: =!"=="1" set "DB_EXISTS=1" ) if "%DB_EXISTS%"=="1" ( echo [OK] ���� ������ %DB_NAME% ��� ����������. if "%RUN_MODE%"=="1" ( echo. echo ��������: ���� ������ ��� ����������! set /p RECREATE="�����������? ��� ������ ����� �������! (y/n) [n]: " if /i "!RECREATE!"=="y" ( echo �������� ���� ������... "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "DROP DATABASE IF EXISTS %DB_NAME%;" 2>nul set "DB_EXISTS=0" echo [OK] ���� ������ �������. ) ) ) if "%DB_EXISTS%"=="0" ( echo �������� ���� ������ %DB_NAME%... "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d postgres -c "CREATE DATABASE %DB_NAME% OWNER %DB_USER% ENCODING 'UTF8';" 2>nul if !errorlevel! neq 0 ( echo [!] ������ �������� ���� ������. ) else ( echo [OK] ���� ������ �������. ) ) :: ���������� echo ��������� ����������... "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "CREATE EXTENSION IF NOT EXISTS \"uuid-ossp\";" 2>nul "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "CREATE EXTENSION IF NOT EXISTS \"pgcrypto\";" 2>nul echo [OK] ���������� ���������. :: ����� "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %ADMIN_USER% -d %DB_NAME% -c "GRANT ALL ON SCHEMA public TO %DB_USER%;" 2>nul echo [OK] ����� ���������. :skip_pg_setup echo. :: ============================================================================= :: �������� Redis :: ============================================================================= echo [6/10] �������� Redis... set "REDIS_OK=0" where redis-cli.exe >nul 2>&1 if %errorlevel% equ 0 ( if defined REDIS_PASSWORD ( redis-cli -h %REDIS_HOST% -p %REDIS_PORT% -a "%REDIS_PASSWORD%" --no-auth-warning ping >nul 2>&1 ) else ( redis-cli -h %REDIS_HOST% -p %REDIS_PORT% ping >nul 2>&1 ) if !errorlevel! equ 0 ( set "REDIS_OK=1" echo [OK] Redis ��������. ) else ( echo [!] Redis ����������. ) ) else ( echo [!] redis-cli �� ������. ) echo. :: ============================================================================= :: ����� Python :: ============================================================================= echo [7/10] ����� Python... set "PYTHON_EXE=" if exist "%PROJECT_DIR%\.venv\Scripts\python.exe" ( set "PYTHON_EXE=%PROJECT_DIR%\.venv\Scripts\python.exe" echo [OK] ������� ����������� ��������� (������). goto :python_found ) if exist "%BACKEND_DIR%\.venv\Scripts\python.exe" ( set "PYTHON_EXE=%BACKEND_DIR%\.venv\Scripts\python.exe" echo [OK] ������� ����������� ��������� (backend). goto :python_found ) where python.exe >nul 2>&1 if %errorlevel% equ 0 ( for /f "delims=" %%i in ('where python.exe') do set "PYTHON_EXE=%%i" echo [OK] ������������ ��������� Python. goto :python_found ) echo [X] Python �� ������. :python_found echo. :: ============================================================================= :: ���������� �������� :: ============================================================================= if "%RUN_MODE%"=="3" goto :skip_migrate if "%RUN_MODE%"=="4" goto :skip_migrate if "%RUN_MODE%"=="5" goto :skip_migrate echo [8/10] ���������� ��������... if not defined PYTHON_EXE ( echo [X] �������: Python �� ������. goto :skip_migrate ) if "%PG_OK%"=="0" ( echo [X] �������: PostgreSQL ����������. goto :skip_migrate ) cd /d "%BACKEND_DIR%" :: �������� alembic "%PYTHON_EXE%" -c "import alembic" >nul 2>&1 if %errorlevel% neq 0 ( echo ��������� alembic... "%PYTHON_EXE%" -m pip install alembic --quiet 2>nul ) set "DATABASE_URL=postgresql://%DB_USER%:%DB_PASSWORD%@%DB_HOST%:%DB_PORT%/%DB_NAME%" echo ���������� ��������... "%PYTHON_EXE%" -m alembic upgrade head 2>&1 if %errorlevel% neq 0 ( echo [X] ������ ��������. ) else ( echo [OK] �������� ���������. ) cd /d "%PROJECT_DIR%" :skip_migrate echo. :: ============================================================================= :: �������� �������������� :: ============================================================================= :create_admin_only if "%RUN_MODE%"=="3" goto :skip_admin if "%RUN_MODE%"=="4" goto :skip_admin echo [9/10] �������� ��������������... echo. if not defined PYTHON_EXE ( echo [X] �������: Python �� ������. goto :skip_admin ) set /p CREATE_ADMIN="������� ��������������? (y/n) [y]: " if "%CREATE_ADMIN%"=="" set "CREATE_ADMIN=y" if /i "%CREATE_ADMIN%"=="y" ( 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=�������������" echo. cd /d "%BACKEND_DIR%" "%PYTHON_EXE%" scripts/create_superuser.py --email "!ADMIN_EMAIL!" --password "!ADMIN_PASS!" --name "!ADMIN_NAME!" 2>&1 if !errorlevel! neq 0 ( echo [!] �� ������� ������� ��������������. ) else ( echo [OK] ������������� ������. ) cd /d "%PROJECT_DIR%" ) :skip_admin echo. :: ============================================================================= :: �������� ������ :: ============================================================================= if "%RUN_MODE%"=="1" goto :ask_seed if "%RUN_MODE%"=="4" goto :do_seed goto :skip_seed :ask_seed echo [10/10] �������� ������... echo. set /p SEED_DATA="��������� �������� ������ (�����, ����)? (y/n) [n]: " if /i "!SEED_DATA!"=="y" goto :do_seed goto :skip_seed :do_seed if not defined PYTHON_EXE ( echo [X] �������: Python �� ������. goto :skip_seed ) echo �������� �������� ������... cd /d "%BACKEND_DIR%" "%PYTHON_EXE%" scripts/seed_data.py 2>&1 if !errorlevel! neq 0 ( echo [!] ������ �������� ������. ) else ( echo [OK] ������ ���������. ) cd /d "%PROJECT_DIR%" :skip_seed echo. :: ============================================================================= :: �������� ���������� :: ============================================================================= if defined PSQL_EXE ( if "%PG_OK%"=="1" ( echo ������� ������ � ��: set "PGPASSWORD=%DB_PASSWORD%" "%PSQL_EXE%" -h %DB_HOST% -p %DB_PORT% -U %DB_USER% -d %DB_NAME% -c "SELECT 'users: ' || COUNT(*) FROM users; SELECT 'courses: ' || COUNT(*) FROM courses; SELECT 'questions: ' || COUNT(*) FROM questions;" 2>nul echo. ) ) :: ============================================================================= :: ���������� :: ============================================================================= echo ================================================================= echo ��������� ���������! echo ================================================================= echo. echo ��������� �����������: echo PostgreSQL: %DB_HOST%:%DB_PORT%/%DB_NAME% (user: %DB_USER%) echo Redis: %REDIS_HOST%:%REDIS_PORT% (db: %REDIS_DB%) echo. if defined ADMIN_EMAIL ( echo �������������: echo Email: !ADMIN_EMAIL! echo ������: !ADMIN_PASS! echo. ) echo ������ ����������: echo docker compose up -d echo. pause exit /b 0