From 35033fb86c915ea292e734b195a58daf5f0e9bc9 Mon Sep 17 00:00:00 2001 From: mrleo1nid <43583385+mrleo1nid@users.noreply.github.com> Date: Sun, 25 Oct 2026 02:44:50 +0300 Subject: [PATCH] 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 --- .gitignore | 2 + README.md | 6 +++ docker-compose.yml | 116 ++++++++++++++++++++++----------------------- start-test.bat | 88 ++++++++++++++++++++++++++++++++++ 4 files changed, 154 insertions(+), 58 deletions(-) create mode 100644 start-test.bat diff --git a/.gitignore b/.gitignore index 862f0e2..1b994ce 100644 --- a/.gitignore +++ b/.gitignore @@ -6,3 +6,5 @@ __pycache__/ .pytest_cache/ *.pyc sample.zip +.env.test +data-test/ diff --git a/README.md b/README.md index 2c393e0..87057c5 100644 --- a/README.md +++ b/README.md @@ -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 diff --git a/docker-compose.yml b/docker-compose.yml index f4271af..45d580f 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -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: diff --git a/start-test.bat b/start-test.bat new file mode 100644 index 0000000..ff5570c --- /dev/null +++ b/start-test.bat @@ -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