61 lines
1.9 KiB
Docker
61 lines
1.9 KiB
Docker
# --- Stage 1: Сборка фронтенда (CodeMirror) ---
|
|
FROM node:20-slim as frontend-builder
|
|
|
|
WORKDIR /app/frontend
|
|
|
|
# Копируем файлы зависимостей
|
|
COPY frontend-assembly/package.json frontend-assembly/package-lock.json ./
|
|
|
|
# Устанавливаем зависимости (включая devDependencies для сборки)
|
|
RUN npm ci
|
|
|
|
# Копируем исходники
|
|
COPY frontend-assembly/ ./
|
|
|
|
# Собираем бандл через npm script
|
|
RUN npm run build
|
|
|
|
|
|
# --- Stage 2: Сборка бэкенда (Django) ---
|
|
FROM python:3.13-slim
|
|
|
|
# Настройки Python
|
|
ENV PYTHONDONTWRITEBYTECODE 1
|
|
ENV PYTHONUNBUFFERED 1
|
|
|
|
WORKDIR /app
|
|
|
|
# Установка Poetry
|
|
RUN pip install --no-cache-dir poetry
|
|
|
|
# Копируем файлы зависимостей
|
|
COPY pyproject.toml poetry.lock* /app/
|
|
|
|
# Настройка Poetry: не создавать venv и установка зависимостей (без dev-зависимостей для продакшена)
|
|
RUN poetry config virtualenvs.create false \
|
|
&& poetry install --no-interaction --no-ansi --no-root --only main
|
|
|
|
# Создаем непривилегированного пользователя
|
|
RUN useradd -m -r appuser
|
|
|
|
# Копируем код проекта
|
|
COPY . /app/
|
|
|
|
# Создаем папку для данных и статики, чтобы у appuser были права
|
|
RUN mkdir -p /app/data /app/public/static_collected
|
|
|
|
# Копируем собранный фронтенд из первого стейджа
|
|
COPY --from=frontend-builder /app/frontend/dist/editor.js /app/public/static/codemirror/editor.js
|
|
|
|
# Меняем владельца папки
|
|
RUN chown -R appuser:appuser /app
|
|
|
|
# Переключаемся на пользователя
|
|
USER appuser
|
|
|
|
# Порт
|
|
EXPOSE 8000
|
|
|
|
# Команда запуска через Gunicorn
|
|
CMD ["gunicorn", "--bind", "0.0.0.0:8000", "--chdir", "/app/etpgrf_site", "etpgrf_site.wsgi"]
|