Epic #883 foundation. Provider-agnostic BrowserFetcher (camoufox headless Firefox): async ctx mgr + page-recycle + crash-recovery + proxy. camoufox/playwright lazy imports (won't break app import). scraper_fetch_mode defaults curl_cffi -> DORMANT (no parser/estimator/avito/cian change). config: 4 browser_* settings. Dockerfile: +5 Firefox libs + camoufox fetch layer. compose: mem_limit 2.5g. (uv.lock gitignored -> re-resolved at build.) 9 mocked tests pass, ruff clean. WARN: Docker build + container fetch UNVERIFIED (no local Docker); ~960MB image; merge auto-deploys to prod. MERGE-GATE post-demo + CI-build-verify. Refs #884, #883
68 lines
1.9 KiB
Docker
68 lines
1.9 KiB
Docker
# Trade-In MVP backend — lean image (FastAPI + WeasyPrint).
|
||
# Не содержит Playwright/Chromium/Celery/Redis — только то что нужно для trade-in feature.
|
||
|
||
# ---- builder ----
|
||
FROM python:3.12-slim AS builder
|
||
|
||
ENV PYTHONUNBUFFERED=1 \
|
||
PYTHONDONTWRITEBYTECODE=1 \
|
||
UV_COMPILE_BYTECODE=1 \
|
||
UV_LINK_MODE=copy
|
||
|
||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||
apt-get update && apt-get install -y --no-install-recommends \
|
||
build-essential \
|
||
libpq-dev
|
||
|
||
RUN pip install --no-cache-dir uv
|
||
|
||
WORKDIR /app
|
||
|
||
COPY pyproject.toml ./
|
||
RUN --mount=type=cache,target=/root/.cache/uv \
|
||
uv sync --no-dev
|
||
|
||
COPY app ./app
|
||
COPY scripts ./scripts
|
||
|
||
|
||
# ---- runner ----
|
||
FROM python:3.12-slim AS runner
|
||
|
||
ENV PYTHONUNBUFFERED=1 \
|
||
PYTHONDONTWRITEBYTECODE=1 \
|
||
PATH="/app/.venv/bin:$PATH"
|
||
|
||
RUN --mount=type=cache,target=/var/cache/apt,sharing=locked \
|
||
--mount=type=cache,target=/var/lib/apt,sharing=locked \
|
||
apt-get update && apt-get install -y --no-install-recommends \
|
||
libpq5 \
|
||
libcairo2 \
|
||
libpango-1.0-0 \
|
||
libpangoft2-1.0-0 \
|
||
fonts-dejavu-core \
|
||
curl \
|
||
libgtk-3-0 \
|
||
libasound2 \
|
||
libdbus-glib-1-2 \
|
||
libx11-xcb1 \
|
||
libxtst6 \
|
||
&& 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/scripts /app/scripts
|
||
|
||
# Загружаем Firefox-сборку для camoufox (#884).
|
||
# Слой кешируется: пересобирается только при изменении .venv (обновление camoufox).
|
||
# ~960MB. CI/devops-verify required — не запускать локально без намерения скачать.
|
||
RUN python -m camoufox fetch
|
||
|
||
USER app
|
||
|
||
EXPOSE 8000
|
||
|
||
CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|