feat(docker): многоступенчатая сборка с Nuitka и офлайн-режим

api и worker компилируются Nuitka (--mode=standalone) в builder-стадии; в финальном
образе — только скомпилированный бинарник и системные библиотеки, без исходников,
pip и build-инструментов. api/runtime — debian:bookworm-slim без Python вообще;
worker/runtime — python:3.12-slim-bookworm, но Python там нужен только на шаг
установки Chrome. db.cli объединён с сервером в один бинарник (entry_api.bin dbcli ...).

Заодно убрано 51 неиспользуемый пакет из requirements.txt (camoufox, PySide6, moz*-
стек и др., подтверждено графом зависимостей) — он давал больше веса, чем сама
компиляция. make build offline=1 ставит python-зависимости из wheels/ без PyPI.

make test-browser адаптирован под новую сборку: pytest не может подключиться к
internals скомпилированного бинарника, поэтому гоняется против отдельной стадии
test (Chrome из runtime + исходники как обычный интерпретируемый Python).

Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
s0k0landClaude Sonnet 5 committed 2026-11-06 13:52:28 +03:00
1 parent f21483489a
commit 0a4da80ca9
12 files changed
+218 -100

No files matched your search

+7 -1
View File
@@ -10,6 +10,8 @@ services:
build:
context: .
dockerfile: Dockerfile.api
args:
OFFLINE: ${OFFLINE:-0}
image: robotex-api:latest
restart: unless-stopped
ports:
@@ -24,7 +26,11 @@ services:
postgres: {condition: service_healthy}
worker:
build: .
build:
context: .
target: runtime
args:
OFFLINE: ${OFFLINE:-0}
image: robotex-worker:latest
restart: unless-stopped
env_file: