diff --git a/backend/Dockerfile b/backend/Dockerfile index f1dc70a..6fbf50d 100644 --- a/backend/Dockerfile +++ b/backend/Dockerfile @@ -1,12 +1,43 @@ -FROM python:3.12-slim +# --- build stage: собираем wheels для runtime-образа --- +FROM python:3.12-slim AS builder +WORKDIR /build -WORKDIR /app +# Системные пакеты нужны только на этапе сборки (для сборки psycopg2-binary и т.п.). +RUN apt-get update && apt-get install -y --no-install-recommends \ + build-essential gcc libpq-dev \ + && rm -rf /var/lib/apt/lists/* COPY requirements.txt . -RUN pip install --no-cache-dir -r requirements.txt +RUN pip wheel --no-cache-dir --wheel-dir /wheels -r requirements.txt + + +# --- runtime stage --- +FROM python:3.12-slim AS runtime +WORKDIR /app + +# Только libpq для psycopg2-binary (не dev-headers). +RUN apt-get update && apt-get install -y --no-install-recommends \ + libpq5 curl \ + && rm -rf /var/lib/apt/lists/* \ + && groupadd --system --gid 1000 panel \ + && useradd --system --uid 1000 --gid panel --home-dir /app panel + +# Ставим заранее собранные wheels. +COPY --from=builder /wheels /wheels +COPY requirements.txt . +RUN pip install --no-cache-dir --no-index --find-links=/wheels -r requirements.txt \ + && rm -rf /wheels COPY app ./app +# Раздаём права и переключаемся на непривилегированного пользователя. +RUN chown -R panel:panel /app +USER panel + EXPOSE 8000 +# curl нужен для healthcheck. +HEALTHCHECK --interval=15s --timeout=5s --retries=3 --start-period=20s \ + CMD curl -fsS http://localhost:8000/health || exit 1 + CMD ["uvicorn", "app.main:app", "--host", "0.0.0.0", "--port", "8000"]