From 622745487e9885c6f0d1aae6deafdf218101bb78 Mon Sep 17 00:00:00 2001 From: febux Date: Wed, 26 Aug 2026 20:24:22 +0300 Subject: [PATCH] Fix absolute path. --- Makefile | 2 +- src/contract_check/api/__main__.py | 2 +- srv/api/Dockerfile | 9 +++++---- srv/bot/Dockerfile | 9 +++++---- srv/prototype/Dockerfile | 9 +++++---- srv/worker-analyze/Dockerfile | 9 +++++---- srv/worker-billing/Dockerfile | 9 +++++---- srv/worker-extract/Dockerfile | 9 +++++---- srv/worker-notify/Dockerfile | 9 +++++---- srv/worker-prescreen/Dockerfile | 9 +++++---- 10 files changed, 42 insertions(+), 34 deletions(-) diff --git a/Makefile b/Makefile index 60f3366..9415323 100644 --- a/Makefile +++ b/Makefile @@ -161,7 +161,7 @@ admin-list: ## List current admin users # Auth / tokens # ───────────────────────────────────────────────────────────────────────────── seed-token: ## Generate bot service token (prints bearer token) - docker compose --profile services exec api python -m contract_check.api seed-token bot-prod bot + docker compose --profile services exec api python -m src.contract_check.api seed-token bot-prod bot jwt-secret: ## Generate a fresh JWT_SECRET for .env @openssl rand -hex 32 diff --git a/src/contract_check/api/__main__.py b/src/contract_check/api/__main__.py index 4e38ac5..8bd9388 100644 --- a/src/contract_check/api/__main__.py +++ b/src/contract_check/api/__main__.py @@ -40,7 +40,7 @@ def main() -> None: args = sys.argv[1:] if args and args[0] == "seed-token": if len(args) not in (3, 4): - print("Usage: python -m contract_check.api seed-token NAME ADAPTER [TOKEN]") + print("Usage: python -m src.contract_check.api seed-token NAME ADAPTER [TOKEN]") sys.exit(1) _, name, adapter, *provided = args asyncio.run(_seed_token(name, adapter, provided[0] if provided else None)) diff --git a/srv/api/Dockerfile b/srv/api/Dockerfile index 1712289..6808851 100644 --- a/srv/api/Dockerfile +++ b/srv/api/Dockerfile @@ -14,12 +14,10 @@ COPY pyproject.toml uv.lock ./ COPY README.md ./ COPY alembic.ini ./ COPY migrations ./migrations -COPY src ./src # Install only the api group (core + db/mq/s3/obs + fastapi/uvicorn). RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group api --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group api --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -31,8 +29,11 @@ ENV PYTHONDONTWRITEBYTECODE=1 \ WORKDIR /app COPY --from=builder /app/.venv /app/.venv + +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src COPY alembic.ini ./ COPY migrations ./migrations EXPOSE 8000 9100 -CMD ["python", "-m", "contract_check.api"] +CMD ["python", "-m", "src.contract_check.api"] diff --git a/srv/bot/Dockerfile b/srv/bot/Dockerfile index 466c82e..8770d17 100644 --- a/srv/bot/Dockerfile +++ b/srv/bot/Dockerfile @@ -12,13 +12,11 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the bot group (core + aiogram). No DB/MQ/S3/LLM/OCR drivers — # this is the leanest service image; it speaks HTTP to the api exclusively. RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group bot --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group bot --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -31,4 +29,7 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv -CMD ["python", "-m", "contract_check.bot"] +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + +CMD ["python", "-m", "src.contract_check.bot"] diff --git a/srv/prototype/Dockerfile b/srv/prototype/Dockerfile index 128fe17..5c3d2a2 100644 --- a/srv/prototype/Dockerfile +++ b/srv/prototype/Dockerfile @@ -14,12 +14,10 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the prototype group (core + pymupdf/python-docx). RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group prototype --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group prototype --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -32,4 +30,7 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv -CMD ["python", "-m", "contract_check.prototype"] +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + +CMD ["python", "-m", "src.contract_check.prototype"] diff --git a/srv/worker-analyze/Dockerfile b/srv/worker-analyze/Dockerfile index 69b8cae..6e59c80 100644 --- a/srv/worker-analyze/Dockerfile +++ b/srv/worker-analyze/Dockerfile @@ -12,13 +12,11 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the analyze group (core + db/mq/s3/obs + otel-httpx). No # tesseract/pymupdf — this image is the leanest LLM/I/O worker. RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group analyze --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group analyze --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -31,5 +29,8 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + EXPOSE 9102 -CMD ["python", "-m", "contract_check.worker_analyze"] +CMD ["python", "-m", "src.contract_check.worker_analyze"] diff --git a/srv/worker-billing/Dockerfile b/srv/worker-billing/Dockerfile index ea5f230..1e3ac9f 100644 --- a/srv/worker-billing/Dockerfile +++ b/srv/worker-billing/Dockerfile @@ -12,11 +12,9 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group billing --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group billing --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -29,5 +27,8 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + EXPOSE 9105 -CMD ["python", "-m", "contract_check.worker_billing"] +CMD ["python", "-m", "src.contract_check.worker_billing"] diff --git a/srv/worker-extract/Dockerfile b/srv/worker-extract/Dockerfile index b5aad82..ca76c14 100644 --- a/srv/worker-extract/Dockerfile +++ b/srv/worker-extract/Dockerfile @@ -12,12 +12,10 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the extract group (core + db/mq/s3/obs + pymupdf/tesseract). RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group extract --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group extract --no-install-project # ─── Stage 2: runtime with tesseract-ocr + language packs ──────────────────── FROM python:3.13-slim @@ -40,5 +38,8 @@ RUN apt-get update && apt-get install -y --no-install-recommends \ COPY --from=builder /app/.venv /app/.venv +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + EXPOSE 9101 -CMD ["python", "-m", "contract_check.worker_extract"] +CMD ["python", "-m", "src.contract_check.worker_extract"] diff --git a/srv/worker-notify/Dockerfile b/srv/worker-notify/Dockerfile index d380bcb..770989c 100644 --- a/srv/worker-notify/Dockerfile +++ b/srv/worker-notify/Dockerfile @@ -12,12 +12,10 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the notify group (core + db/mq/obs + aiosmtplib). RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group notify --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group notify --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -30,5 +28,8 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + EXPOSE 9103 -CMD ["python", "-m", "contract_check.worker_notify"] +CMD ["python", "-m", "src.contract_check.worker_notify"] diff --git a/srv/worker-prescreen/Dockerfile b/srv/worker-prescreen/Dockerfile index 376ec7c..d4d21a3 100644 --- a/srv/worker-prescreen/Dockerfile +++ b/srv/worker-prescreen/Dockerfile @@ -12,12 +12,10 @@ WORKDIR /app COPY pyproject.toml uv.lock ./ COPY README.md ./ -COPY src ./src # Install only the prescreen group (core + db/mq/s3/obs + regex engine). RUN --mount=type=cache,target=/root/.cache/uv \ - uv sync --frozen --no-default-groups --group prescreen --no-install-project && \ - uv pip install --no-deps . + uv sync --frozen --no-default-groups --group prescreen --no-install-project # ─── Stage 2: lean runtime ───────────────────────────────────────────────── FROM python:3.13-slim @@ -30,5 +28,8 @@ WORKDIR /app COPY --from=builder /app/.venv /app/.venv +# App source: internal imports use the absolute `src.contract_check.*` form. +COPY src ./src + EXPOSE 9104 -CMD ["python", "-m", "contract_check.worker_prescreen"] +CMD ["python", "-m", "src.contract_check.worker_prescreen"]