This commit is contained in:
2025-09-14 22:09:39 +05:00
parent 8ad2bfbe59
commit 3c418a97b4
30 changed files with 3404 additions and 0 deletions

63
Dockerfile Normal file
View File

@@ -0,0 +1,63 @@
# Многоступенчатая сборка для оптимизации размера образа
# Этап 1: Сборка зависимостей
FROM python:3.12-slim AS builder
WORKDIR /app
# Устанавливаем системные зависимости для сборки
RUN apt-get update && apt-get install -y \
gcc \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# Устанавливаем uv для управления зависимостями
RUN pip install uv
# Копируем файлы зависимостей
COPY pyproject.toml uv.lock* ./
# Устанавливаем зависимости
RUN uv sync --frozen
# Этап 2: Производственный образ
FROM python:3.12-slim AS production
WORKDIR /app
# Устанавливаем только необходимые runtime зависимости
RUN apt-get update && apt-get install -y \
libpq5 \
postgresql-client \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Копируем установленные зависимости из builder stage
COPY --from=builder /app/.venv /app/.venv
# Копируем исходный код приложения (единое приложение с API и database)
COPY api/ ./api/
COPY database/ ./database/
COPY run_api.py ./
COPY pyproject.toml ./
# Создаем непривилегированного пользователя для безопасности
RUN groupadd -r appuser && useradd -r -g appuser -s /bin/bash appuser
RUN chown -R appuser:appuser /app
USER appuser
# Открываем порт для API
EXPOSE 8000
# Устанавливаем переменные окружения
ENV PYTHONPATH=/app
ENV PYTHONUNBUFFERED=1
ENV PATH="/app/.venv/bin:$PATH"
# Проверка здоровья контейнера
HEALTHCHECK --interval=30s --timeout=30s --start-period=5s --retries=3 \
CMD python -c "import requests; requests.get('http://localhost:8000/health')" || exit 1
# Команда для запуска единого приложения (API + database логика)
CMD ["python", "run_api.py"]