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>
24 lines
750 B
Python
24 lines
750 B
Python
"""
|
|
Единая точка входа для Nuitka-сборки образа api: без аргументов — FastAPI-сервер (uvicorn), с первым
|
|
аргументом `dbcli` — админ-CLI клиентов и ключей (ранее `python -m db.cli`, см. db/cli.py). Один бинарник
|
|
вместо двух: standalone-сборка Nuitka не делит общий рантайм между несколькими точками входа.
|
|
"""
|
|
import sys
|
|
|
|
import uvicorn
|
|
|
|
import db.cli
|
|
from main import app
|
|
|
|
|
|
def main() -> None:
|
|
if len(sys.argv) > 1 and sys.argv[1] == "dbcli":
|
|
sys.argv = sys.argv[1:]
|
|
db.cli.main()
|
|
return
|
|
uvicorn.run(app, host="0.0.0.0", port=8000)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|