From f58306cbb4ccbcaf646e4e47b4fd14926910f680 Mon Sep 17 00:00:00 2001 From: protokey Date: Mon, 12 Oct 2026 14:20:46 +0400 Subject: [PATCH] =?UTF-8?q?chore:=20=D0=BD=D0=B0=D1=81=D1=82=D1=80=D0=BE?= =?UTF-8?q?=D0=B5=D0=BD=D0=B0=20=D0=BA=D0=BE=D0=BC=D0=B0=D0=BD=D0=B4=D0=B0?= =?UTF-8?q?=20=D1=81=D0=B1=D0=BE=D1=80=D0=BA=D0=B8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .gitignore | 2 +- Makefile | 31 +++++++++++++++++++++++++++++-- docker-compose.prod.yml | 22 ++++++++++++++++++++++ dot_env | 4 ++++ 4 files changed, 56 insertions(+), 3 deletions(-) create mode 100644 docker-compose.prod.yml create mode 100644 dot_env diff --git a/.gitignore b/.gitignore index fed0135..00687ad 100644 --- a/.gitignore +++ b/.gitignore @@ -5,4 +5,4 @@ __pycache__/ wheels/ docs/*.bkp docs/*.dtmp - +build/ diff --git a/Makefile b/Makefile index bc57b1e..4b3eb7b 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 +MAKECMDGOALS_TARGETS := install freeze wheels sync sync-offline clean help build release PKG := $(filter-out $(MAKECMDGOALS_TARGETS),$(MAKECMDGOALS)) -.PHONY: install freeze wheels sync sync-offline clean help venv build +.PHONY: install freeze wheels sync sync-offline clean help venv build release help: @echo "make install [ ...] - установить пакет(ы) в $(VENV), обновить $(REQUIREMENTS), собрать wheel в $(WHEELS_DIR)/" @@ -17,6 +17,8 @@ help: @echo "make freeze - перезаписать $(REQUIREMENTS) текущим состоянием окружения" @echo "make wheels - собрать wheel для всех пакетов из $(REQUIREMENTS)" @echo "make clean - удалить $(WHEELS_DIR)/" + @echo "make build [ver=latest] - собрать docker-образ robotex:" + @echo "make release ver= - собрать образ и пакет для деплоя в build// (compose, .env, образ .tar.gz)" venv: @test -d $(VENV) || python3 -m venv $(VENV) @@ -51,6 +53,31 @@ build: @echo "build an application" docker build -t robotex:$(ver) . +RELEASE_DIR := build/$(ver) + +ifneq ($(filter release,$(MAKECMDGOALS)),) +ifeq ($(ver),latest) +$(error Укажите версию: make release ver=v0.0.2) +endif +endif + +release: build + @echo "make release $(ver) -> $(RELEASE_DIR)/" + @mkdir -p $(RELEASE_DIR) + sed 's|image: robotex:.*|image: robotex:$(ver)|' docker-compose.prod.yml > $(RELEASE_DIR)/docker-compose.yml + cp dot_env $(RELEASE_DIR)/.env + docker save robotex:$(ver) | gzip > $(RELEASE_DIR)/robotex-$(ver).tar.gz + @printf '%s\n' \ + '# Robotex $(ver)' \ + '' \ + '```bash' \ + 'docker load -i robotex-$(ver).tar.gz' \ + 'docker compose up -d' \ + '```' \ + '' \ + 'Настройки (порт, CPU, память) — в .env.' > $(RELEASE_DIR)/README.md + @echo "Готово: $(RELEASE_DIR)/" + # позволяет передавать имя пакета как аргумент: make install redis %: @: diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml new file mode 100644 index 0000000..7b44c80 --- /dev/null +++ b/docker-compose.prod.yml @@ -0,0 +1,22 @@ +services: + api: + image: robotex:v0.0.1 + restart: unless-stopped + ports: + - "${API_PORT:-8000}:8000" + env_file: + - path: .env + required: false + volumes: + - api-data:/app/extra + # Chrome активно использует /dev/shm, дефолтных 64MB не хватает + shm_size: "2gb" + # Потолок ресурсов: при переборе OOM-killer прибьёт процесс Chrome внутри контейнера, + # а не соседние сервисы на хосте. Подбирать под сервер вместе с BROWSER_SLOTS. + cpus: ${API_CPUS:-4} + mem_limit: ${API_MEM_LIMIT:-8g} + memswap_limit: ${API_MEM_LIMIT:-8g} + + +volumes: + api-data: diff --git a/dot_env b/dot_env new file mode 100644 index 0000000..b853412 --- /dev/null +++ b/dot_env @@ -0,0 +1,4 @@ +API_PORT= +API_CPUS=1 +API_MEM_LIMIT=1g +API_MEM_LIMIT=1g