gendesign/backend/Dockerfile
lekss361 522ecca5c4 ship #13-16: multi-target Dockerfile, per-object drill-in, CRM pipeline,
442-sweep instructions
#16 Dockerfile: runner (lean, 1.6 GB) + runner-with-chromium (2.9 GB).
   Compose + deploy.yml pushes 2 GHCR images. Backend saves 1.3 GB.
#15 5 backend object endpoints + /analytics/objects/[id] page (gallery,
   POI table, sale chart) + sparkline-driven PrinzipObjectsTable.
#14 prinzip_leads/deals + 2 MVs. Import script with PII-hashing &
   --inspect-only mode. 3 funnel endpoints + Sankey/Monthly charts.
#13 README section with UI/CLI/SQL for 442-object sweep.
2026-04-27 19:32:37 +03:00

103 lines
2.8 KiB
Docker

# syntax=docker/dockerfile:1.7
#
# Multi-target build:
# target=runner — lean image для backend (uvicorn) и beat. ~1.4 ГБ.
# target=runner-with-chromium — image для worker (Playwright fetch). ~1.6 ГБ.
#
# Local: docker compose сам выбирает target по сервису (см. docker-compose.yml).
# Prod: CI пушит 2 GHCR-образа: gendesign-backend (lean) и gendesign-worker (chromium).
# ---- builder ----
FROM python:3.12-slim AS builder
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
UV_COMPILE_BYTECODE=1 \
UV_LINK_MODE=copy
RUN apt-get update && apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
libgdal-dev \
libproj-dev \
libgeos-dev \
&& rm -rf /var/lib/apt/lists/*
RUN pip install --no-cache-dir uv
WORKDIR /app
COPY pyproject.toml uv.lock* ./
RUN if [ -f uv.lock ]; then uv sync --frozen --no-dev; else uv sync --no-dev; fi
COPY app ./app
COPY alembic.ini ./
COPY alembic ./alembic
# ---- runner (lean — без Chromium) ----
FROM python:3.12-slim AS runner
ENV PYTHONUNBUFFERED=1 \
PYTHONDONTWRITEBYTECODE=1 \
PATH="/app/.venv/bin:$PATH"
RUN apt-get update && apt-get install -y --no-install-recommends \
libpq5 \
libgdal36 \
libproj25 \
libgeos-c1t64 \
libcairo2 \
libpango-1.0-0 \
libpangoft2-1.0-0 \
fonts-dejavu-core \
curl \
&& rm -rf /var/lib/apt/lists/* \
&& useradd --create-home --uid 1000 app
WORKDIR /app
COPY --from=builder --chown=app:app /app/.venv /app/.venv
COPY --from=builder --chown=app:app /app/app /app/app
COPY --from=builder --chown=app:app /app/alembic.ini /app/alembic.ini
COPY --from=builder --chown=app:app /app/alembic /app/alembic
USER app
EXPOSE 8000
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]
# ---- runner-with-chromium (для worker) ----
# Наследуется от lean runner, добавляет Chromium-libs + Playwright-binary (~200 MB).
FROM runner AS runner-with-chromium
USER root
RUN apt-get update && apt-get install -y --no-install-recommends \
# Chromium runtime libs (раньше заходили через `playwright install --with-deps`)
libnss3 \
libnspr4 \
libdbus-1-3 \
libatk1.0-0 \
libatk-bridge2.0-0 \
libcups2 \
libdrm2 \
libxkbcommon0 \
libxcomposite1 \
libxdamage1 \
libxfixes3 \
libxrandr2 \
libgbm1 \
libasound2t64 \
libatspi2.0-0
# Playwright Chromium binary под root → shared dir, чтобы и app-user мог использовать.
ENV PLAYWRIGHT_BROWSERS_PATH=/opt/playwright
RUN mkdir -p $PLAYWRIGHT_BROWSERS_PATH \
&& /app/.venv/bin/playwright install chromium \
&& chmod -R a+rX $PLAYWRIGHT_BROWSERS_PATH \
&& rm -rf /var/lib/apt/lists/*
USER app