From ebf87f39dadfbb1fdc2b40536141648c4686b02e Mon Sep 17 00:00:00 2001 From: Andrey Epifancev Date: Sun, 4 Oct 2026 02:35:48 +0400 Subject: [PATCH] =?UTF-8?q?chore:=20Dockerfile=20(python:3.11-slim),=20api?= =?UTF-8?q?/.env.example=20=D0=B8=20api/.env.test?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Fable 5.1 --- Dockerfile | 19 ++++++++++ api/.env.example | 37 +++++++++++++++++++ api/.env.test | 26 +++++++++++++ .../plans/2026-10-03-slice-0-skeleton.md | 2 +- openspec/changes/slice-0-skeleton/tasks.md | 2 +- 5 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 Dockerfile create mode 100644 api/.env.example create mode 100644 api/.env.test diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..cc4e97a --- /dev/null +++ b/Dockerfile @@ -0,0 +1,19 @@ +# Образ для dev и `make check-full`. Контекст сборки — корень репозитория tabular-parser. +# Платформенные пакеты raisa_* (Nexus) в образ не ставятся — та же логика, что в `make venv`. +FROM python:3.11-slim + +ENV PYTHONUNBUFFERED=1 \ + PIP_DISABLE_PIP_VERSION_CHECK=1 + +WORKDIR /app/api + +COPY api/requirements.txt ./requirements.txt +RUN grep -v '^raisa_' requirements.txt > /tmp/req.txt \ + && pip install --no-cache-dir -r /tmp/req.txt \ + && rm /tmp/req.txt + +COPY api/ ./ + +EXPOSE 8000 + +CMD ["python", "run_server.py"] diff --git a/api/.env.example b/api/.env.example new file mode 100644 index 0000000..ef59d5c --- /dev/null +++ b/api/.env.example @@ -0,0 +1,37 @@ +# Пример локального окружения. Скопируйте в api/.env: cp .env.example .env +# Порты и учётные данные — стандартные для docs/dev/docker-compose.yml (`make up`: NATS 4222, MinIO 9000). +# Сервис без БД: видит только NATS и S3. + +DEBUG=true + +# Dev-запуск слушает только loopback. По умолчанию приложения (без этих строк) — 0.0.0.0:8000, как в контейнере платформы. +SERVER__HOST=127.0.0.1 +SERVER__PORT=8000 + +# MinIO (адрес без схемы — так ждёт miniopy-async). Один бакет для входных файлов и результатов. +OPENBAO__MINIO__MINIO_URL=localhost:9000 +OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin +OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin +OPENBAO__MINIO__MINIO_BUCKET=arm-ka +# false — MinIO по http (docker compose); по умолчанию true (https, как на платформе) +OPENBAO__MINIO__MINIO_SECURE=false + +# NATS без JetStream; пустые NATS_SEED/NATS_JWT — подключение без nkeys +OPENBAO__NATS__NATS_URL=nats://localhost:4222 +OPENBAO__NATS__NATS_SEED= +OPENBAO__NATS__NATS_JWT= + +# Необязательные настройки (значения ниже — значения по умолчанию из src/core/config.py) +# Префикс путей приложения за прокси и версия в OpenAPI +ROOT_PATH=/ +VERSION=1.0.0 +# `service.name` конвертов контракта и имя queue group NATS; менять не нужно, пока контракт v1.x +SERVICE_NAME=tabular-parser +# false — не подключаться к NATS (воркер не стартует; /healthcheck отдаёт nats = down) +NATS_ENABLED=true +# Число заданий, обрабатываемых одновременно +WORKER_CONCURRENCY=1 +# Попытки публикации ack и результата в NATS +PUBLISH_RETRIES=3 +# Размер process-local LRU обработанных job_id (защита от дублей доставки) +DONE_CACHE_SIZE=1000 diff --git a/api/.env.test b/api/.env.test new file mode 100644 index 0000000..099d508 --- /dev/null +++ b/api/.env.test @@ -0,0 +1,26 @@ +# Окружение тестов (pytest.ini: ENV_FILE=.env.test). Только тестовые значения, секретов здесь нет. +# Порты и учётные данные — стандартные для docs/dev/docker-compose.yml (NATS 4222, MinIO 9000): +# после `make up` интеграционные тесты работают без правок. + +DEBUG=true + +# Как в .env.example (тесты сервер не запускают) +SERVER__HOST=127.0.0.1 +SERVER__PORT=8000 + +OPENBAO__MINIO__MINIO_URL=localhost:9000 +OPENBAO__MINIO__MINIO_ADMIN_LOGIN=minioadmin +OPENBAO__MINIO__MINIO_ADMIN_PASSWORD=minioadmin +OPENBAO__MINIO__MINIO_BUCKET=arm-ka +# false — MinIO по http (docker compose); по умолчанию true (https, как на платформе) +OPENBAO__MINIO__MINIO_SECURE=false + +OPENBAO__NATS__NATS_URL=nats://localhost:4222 +OPENBAO__NATS__NATS_SEED= +OPENBAO__NATS__NATS_JWT= + +# Unit-тесты поднимают приложение без NATS; интеграционные включают его сами (см. design D-6) +NATS_ENABLED=false +WORKER_CONCURRENCY=1 +PUBLISH_RETRIES=3 +DONE_CACHE_SIZE=1000 diff --git a/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md b/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md index ee785d7..ef0bfb1 100644 --- a/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md +++ b/docs/superpowers/plans/2026-10-03-slice-0-skeleton.md @@ -35,7 +35,7 @@ ### Task 5: [2.2] `Dockerfile` (`python -- [ ] `Dockerfile` (`python:3.11-slim`), `.env.example`, `.env.test`; проверка: `docker build -t tabular-parser .` успешен +- [x] `Dockerfile` (`python:3.11-slim`), `.env.example`, `.env.test`; проверка: `docker build -t tabular-parser .` успешен ### Task 6: [3.1] `api/contracts/` — копии трёх схем + `examples/` из `../docs/contracts` diff --git a/openspec/changes/slice-0-skeleton/tasks.md b/openspec/changes/slice-0-skeleton/tasks.md index 1ec1b1a..0880897 100644 --- a/openspec/changes/slice-0-skeleton/tasks.md +++ b/openspec/changes/slice-0-skeleton/tasks.md @@ -21,7 +21,7 @@ - [x] 2.1 `api/pyproject.toml` (ruff: line-length 120, E,F,I,UP,B,PL; mypy с плагином pydantic), `requirements-dev.txt` = `-r requirements.txt` + ruff, mypy, pytest, pytest-asyncio, pytest-env, httpx, jsonschema; `Makefile`: `venv` (python3.11), `lint`, `test`, `test-integration`, `check`, `check-full`, `up`; проверка: `make venv && make lint` зелёные -- [ ] 2.2 `Dockerfile` (`python:3.11-slim`), `.env.example`, `.env.test`; проверка: `docker build -t tabular-parser .` успешен +- [x] 2.2 `Dockerfile` (`python:3.11-slim`), `.env.example`, `.env.test`; проверка: `docker build -t tabular-parser .` успешен ## 3. Контракт