Add start-test.bat for an isolated Docker test stand

Runs a separate compose project (pgames-test) on port 8090 with its own
.env.test and data-test/, starts Docker Desktop if needed and generates a
sample game to upload. env_file in compose is now overridable via ENV_FILE.

Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
This commit is contained in:
mrleo1nidandClaude Opus 5.5 committed 2026-10-25 02:44:50 +03:00
1 parent 364b312064
commit 35033fb86c
4 files changed
+154 -58

No files matched your search

+2
View File
@@ -6,3 +6,5 @@ __pycache__/
.pytest_cache/
*.pyc
sample.zip
.env.test
data-test/
+6
View File
@@ -49,6 +49,12 @@ games.example.lan {
## Разработка
На Windows тестовый стенд поднимается одной командой: `start-test.bat`.
Он запускает отдельный compose-проект `pgames-test` на http://localhost:8090
(свой `.env.test`, данные в `data-test\`), генерирует тестовую игру
`data-test\sample.zip` и открывает браузер. `start-test.bat stop` — остановить,
`reset` — удалить стенд вместе с данными, `logs` — логи бэкенда и воркера.
```bash
cd backend && pip install -r requirements.txt pytest && python -m pytest
cd frontend && npm install && npm run dev # проксирует /api на :8000
+58 -58
View File
@@ -1,58 +1,58 @@
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: pgames
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pgames}
POSTGRES_DB: pgames
volumes:
- db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U pgames"]
interval: 5s
retries: 20
backend:
build: ./backend
restart: unless-stopped
env_file: .env
environment:
DATABASE_URL: postgresql+asyncpg://pgames:${POSTGRES_PASSWORD:-pgames}@db:5432/pgames
DATA_DIR: /data
volumes:
- ${DATA_PATH:-./data}:/data
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"]
interval: 5s
retries: 30
depends_on:
db:
condition: service_healthy
worker:
build: ./backend
restart: unless-stopped
command: ["python", "-m", "app.worker"]
env_file: .env
environment:
DATABASE_URL: postgresql+asyncpg://pgames:${POSTGRES_PASSWORD:-pgames}@db:5432/pgames
DATA_DIR: /data
volumes:
- ${DATA_PATH:-./data}:/data
depends_on:
backend:
condition: service_healthy # migrations are applied by backend
web:
build: ./frontend
restart: unless-stopped
ports:
- "${HTTP_PORT:-8080}:80"
volumes:
- ${DATA_PATH:-./data}:/data:ro
depends_on:
- backend
volumes:
db:
services:
db:
image: postgres:16-alpine
restart: unless-stopped
environment:
POSTGRES_USER: pgames
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD:-pgames}
POSTGRES_DB: pgames
volumes:
- db:/var/lib/postgresql/data
healthcheck:
test: ["CMD-SHELL", "pg_isready -U pgames"]
interval: 5s
retries: 20
backend:
build: ./backend
restart: unless-stopped
env_file: ${ENV_FILE:-.env}
environment:
DATABASE_URL: postgresql+asyncpg://pgames:${POSTGRES_PASSWORD:-pgames}@db:5432/pgames
DATA_DIR: /data
volumes:
- ${DATA_PATH:-./data}:/data
healthcheck:
test: ["CMD", "python", "-c", "import urllib.request; urllib.request.urlopen('http://localhost:8000/api/health')"]
interval: 5s
retries: 30
depends_on:
db:
condition: service_healthy
worker:
build: ./backend
restart: unless-stopped
command: ["python", "-m", "app.worker"]
env_file: ${ENV_FILE:-.env}
environment:
DATABASE_URL: postgresql+asyncpg://pgames:${POSTGRES_PASSWORD:-pgames}@db:5432/pgames
DATA_DIR: /data
volumes:
- ${DATA_PATH:-./data}:/data
depends_on:
backend:
condition: service_healthy # migrations are applied by backend
web:
build: ./frontend
restart: unless-stopped
ports:
- "${HTTP_PORT:-8080}:80"
volumes:
- ${DATA_PATH:-./data}:/data:ro
depends_on:
- backend
volumes:
db:
+88
View File
@@ -0,0 +1,88 @@
@echo off
rem Test stand in Docker, isolated from a real install: own compose project,
rem own .env.test, data in data-test\, port 8090.
rem start-test.bat build and start
rem start-test.bat stop stop (data is kept)
rem start-test.bat reset stop and wipe database and data-test\
rem start-test.bat logs follow backend and worker logs
setlocal
chcp 65001 >nul
cd /d "%~dp0"
set PROJECT=pgames-test
set ENV_FILE=.env.test
set PORT=8090
set COMPOSE=docker compose -p %PROJECT% --env-file %ENV_FILE%
if not exist %ENV_FILE% (
echo Создаю %ENV_FILE% с тестовыми настройками
(
echo SECRET_KEY=test-stand-%RANDOM%%RANDOM%%RANDOM%
echo ADMIN_USERNAME=admin
echo ADMIN_PASSWORD=admin
echo POSTGRES_PASSWORD=pgames
echo HTTP_PORT=%PORT%
echo DATA_PATH=./data-test
echo WORKER_THREADS=4
echo COOKIE_SECURE=false
) > %ENV_FILE%
)
call :ensure_docker || exit /b 1
if /i "%~1"=="stop" (
%COMPOSE% down
exit /b
)
if /i "%~1"=="reset" (
%COMPOSE% down -v
if exist data-test rmdir /s /q data-test
echo Стенд и его данные удалены
exit /b
)
if /i "%~1"=="logs" (
%COMPOSE% logs -f backend worker
exit /b
)
echo Сборка и запуск контейнеров...
%COMPOSE% up -d --build || (
echo Не удалось запустить стенд
exit /b 1
)
echo Жду готовности http://localhost:%PORT% ...
for /l %%i in (1,1,60) do (
curl -fs http://localhost:%PORT%/api/health >nul 2>&1 && goto ready
timeout /t 2 /nobreak >nul
)
echo Стенд не ответил за 2 минуты. Логи: start-test.bat logs
exit /b 1
:ready
if not exist data-test\sample.zip (
echo Генерирую тестовую игру data-test\sample.zip
%COMPOSE% exec -T backend python -m tests.make_sample /data/sample.zip >nul
)
echo.
echo Стенд запущен: http://localhost:%PORT%
echo Первый вход: admin / admin (потребуется сменить логин и пароль)
echo Тестовая игра для загрузки: %CD%\data-test\sample.zip
echo Остановить: start-test.bat stop Сбросить: start-test.bat reset
start "" http://localhost:%PORT%
exit /b 0
:ensure_docker
docker info >nul 2>&1 && exit /b 0
if not exist "%ProgramFiles%\Docker\Docker\Docker Desktop.exe" (
echo Docker не запущен и Docker Desktop не найден
exit /b 1
)
echo Запускаю Docker Desktop...
start "" "%ProgramFiles%\Docker\Docker\Docker Desktop.exe"
for /l %%i in (1,1,60) do (
timeout /t 3 /nobreak >nul
docker info >nul 2>&1 && exit /b 0
)
echo Docker не запустился за 3 минуты
exit /b 1