From fdee12e2d8574810a7d6a7708fa778dca1379ed0 Mon Sep 17 00:00:00 2001 From: protokey Date: Tue, 13 Oct 2026 23:01:05 +0400 Subject: [PATCH] =?UTF-8?q?feature:=20make=20dev=20=E2=80=94=20api=20?= =?UTF-8?q?=D0=B8=20worker=20=D0=BD=D0=B0=20=D1=85=D0=BE=D1=81=D1=82=D0=B5?= =?UTF-8?q?=20=D1=81=20=D0=B2=D0=B8=D0=B4=D0=B8=D0=BC=D1=8B=D0=BC=20=D0=BE?= =?UTF-8?q?=D0=BA=D0=BD=D0=BE=D0=BC=20Chrome=20(#90)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker-compose.dev.yml: порты rabbitmq, redis, postgres на 127.0.0.1 (5673, 6380, 5433 — стандартные часто заняты другими проектами) - make dev: останавливает контейнерные api и worker (иначе worker в Docker тоже берёт задачи из общей очереди и выполняет их невидимо), поднимает инфраструктуру, запускает uvicorn --reload на :8010 и воркер dramatiq; Ctrl+C останавливает оба - make dev-key name=...: API-ключ без контейнера api - README: раздел Local development Co-Authored-By: Claude Opus 5.5 --- Makefile | 38 ++++++++++++++++++++++++++++++++++++-- README.md | 15 +++++++++------ docker-compose.dev.yml | 15 +++++++++++++++ 3 files changed, 60 insertions(+), 8 deletions(-) create mode 100644 docker-compose.dev.yml diff --git a/Makefile b/Makefile index c460b0a..b587c1b 100644 --- a/Makefile +++ b/Makefile @@ -5,10 +5,10 @@ WHEELS_DIR := wheels REQUIREMENTS := requirements.txt ver ?= latest -MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help build release sync-dev test test-browser up down logs smoke key-create key-list key-revoke stats push +MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help build release sync-dev test test-browser up down logs smoke key-create key-list key-revoke stats push dev dev-deps dev-key PKG := $(filter-out $(MAKECMDGOALS_TARGETS),$(MAKECMDGOALS)) -.PHONY: install freeze wheels sync sync-offline clean help venv build release sync-dev test test-browser up down logs smoke key-create key-list key-revoke stats push +.PHONY: install freeze wheels sync sync-offline clean help venv build release sync-dev test test-browser up down logs smoke key-create key-list key-revoke stats push dev dev-deps dev-key # образы сервисов: api — без Chrome, worker — Chrome + Xvfb; rabbitmq и redis — сторонние, кладутся в релиз REGISTRY := docker.sokolab.xyz @@ -18,6 +18,23 @@ DEPS_IMAGES := rabbitmq:4.1-alpine redis:8.2-alpine postgres:17-alpine API_URL ?= http://localhost:8000 API_KEY ?= +# make dev (#90): rabbitmq, redis, postgres — в Docker с портами на 127.0.0.1 (docker-compose.dev.yml), api и worker — +# на хосте, Chrome открывается на рабочем столе. Порты нестандартные: 5672/5432/8000 часто заняты другими проектами. +DEV_COMPOSE := docker compose -f docker-compose.yml -f docker-compose.dev.yml +DEV_API_PORT ?= 8010 +DEV_RABBITMQ_PORT ?= 5673 +DEV_REDIS_PORT ?= 6380 +DEV_POSTGRES_PORT ?= 5433 +# окон Chrome на рабочем столе; потоков dramatiq — вдвое больше, как в Dockerfile +DEV_SLOTS ?= 2 +RABBITMQ_PASSWORD ?= robotex +POSTGRES_PASSWORD ?= robotex +export DEV_RABBITMQ_PORT DEV_REDIS_PORT DEV_POSTGRES_PORT RABBITMQ_PASSWORD POSTGRES_PASSWORD +DEV_ENV := RABBITMQ_URL=amqp://robotex:$(RABBITMQ_PASSWORD)@localhost:$(DEV_RABBITMQ_PORT)/ \ + REDIS_URL=redis://localhost:$(DEV_REDIS_PORT)/0 \ + DATABASE_URL=postgresql+asyncpg://robotex:$(POSTGRES_PASSWORD)@localhost:$(DEV_POSTGRES_PORT)/robotex \ + BROWSER_SLOTS=$(DEV_SLOTS) + help: @echo "make install [ ...] - установить пакет(ы) в $(VENV), обновить $(REQUIREMENTS), собрать wheel в $(WHEELS_DIR)/" @echo "make sync - установить все пакеты из $(REQUIREMENTS) (из индекса)" @@ -31,6 +48,8 @@ help: @echo "make up - собрать и запустить локально: api, worker, rabbitmq, redis" @echo "make down - остановить локальный стенд" @echo "make logs - логи api и worker" + @echo "make dev - api и worker на хосте с видимым Chrome, rabbitmq/redis/postgres в Docker; API на :$(DEV_API_PORT)" + @echo "make dev-key name=<клиент> - выпустить API-ключ клиенту при make dev" @echo "make smoke API_KEY=... [API_URL=...] - проверить запущенный стенд: ключ, /v1/solve, /v2/tasks, удержание окна" @echo "make key-create name=<клиент> - выпустить API-ключ клиенту (в запущенном compose)" @echo "make key-list - клиенты и их ключи (без самих ключей)" @@ -88,6 +107,21 @@ down: logs: docker compose logs -f api worker +# контейнерные api и worker останавливаются: иначе worker в Docker тоже берёт задачи из общей очереди и выполняет их невидимо +dev-deps: + -docker compose stop api worker + $(DEV_COMPOSE) up -d --wait rabbitmq redis postgres + +# Ctrl+C останавливает оба процесса; инфраструктура остаётся запущенной (make down — остановить) +dev: dev-deps + cd src && export $(DEV_ENV) && \ + { $(PYTHON) -m uvicorn main:app --reload --port $(DEV_API_PORT) & api=$$!; \ + trap 'kill $$api 2>/dev/null' EXIT INT TERM; \ + $(PYTHON) -m dramatiq worker.actors --processes 1 --threads $$(( $(DEV_SLOTS) * 2 )); } + +dev-key: dev-deps + cd src && $(DEV_ENV) $(PYTHON) -m db.cli create "$(name)" + smoke: $(PYTHON) tests/smoke.py $(API_URL) $(API_KEY) diff --git a/README.md b/README.md index 82d3112..a3d6df2 100644 --- a/README.md +++ b/README.md @@ -167,14 +167,17 @@ Not done yet: ## Local development ```bash -make sync-offline # venv in ~/.py_envs/robotex; another path: make VENV=... -docker compose up -d rabbitmq redis # queue and storage -cd src && RABBITMQ_URL=... REDIS_URL=... uvicorn main:app --reload -cd src && dramatiq worker.actors --processes 1 --threads 4 +make sync-offline # venv in ~/.py_envs/robotex; another path: make VENV=... +make dev # api + worker on the host, Chrome windows visible on your desktop; API on :8010 +make dev-key name=local # API key for it (stored in the same postgres volume as make up) ``` -The compose network is not published, so for running the services on the host publish `5672` and `6379` yourself, -or just use `make up`. Chrome runs headful, so a display is required (locally — your desktop, in Docker — Xvfb). +`make dev` stops the containerized api and worker (otherwise the Docker worker also takes tasks from the common +queue and runs them invisibly), starts rabbitmq, redis and postgres with ports published on 127.0.0.1 +(`docker-compose.dev.yml`: 5673, 6380, 5433), then runs uvicorn with `--reload` and the dramatiq worker in the +foreground. Ctrl+C stops both; `make down` stops the infrastructure. Ports, slots: `DEV_API_PORT`, +`DEV_RABBITMQ_PORT`, `DEV_REDIS_PORT`, `DEV_POSTGRES_PORT`, `DEV_SLOTS` (default 2). Chrome runs headful, so a display +is required (locally — your desktop, in Docker — Xvfb). Tests: diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..a1528c1 --- /dev/null +++ b/docker-compose.dev.yml @@ -0,0 +1,15 @@ +# Локальная разработка (make dev, #90): поверх docker-compose.yml открывает порты rabbitmq, redis и postgres +# на 127.0.0.1, чтобы api и worker запускались на хосте — с видимым окном Chrome на рабочем столе. +# Порты нестандартные: 5672/5432 на хосте часто заняты другими проектами. +services: + rabbitmq: + ports: + - "127.0.0.1:${DEV_RABBITMQ_PORT:-5673}:5672" + + redis: + ports: + - "127.0.0.1:${DEV_REDIS_PORT:-6380}:6379" + + postgres: + ports: + - "127.0.0.1:${DEV_POSTGRES_PORT:-5433}:5432"