# ================================ # MC Panel - Multi-Stage Production Dockerfile # ================================ # Stage 1: Frontend Build FROM node:18-alpine AS frontend-builder # Установка зависимостей для сборки RUN apk add --no-cache git WORKDIR /app/frontend # Копируем package files для кеширования зависимостей COPY frontend/package*.json ./ # Устанавливаем зависимости (включая dev для сборки) RUN npm ci --silent # Копируем исходники и конфиги COPY frontend/ ./ # Собираем продакшн версию RUN npm run build # ================================ # Stage 2: Python Dependencies # ================================ FROM python:3.11-slim AS python-deps # Устанавливаем системные зависимости для компиляции Python пакетов RUN apt-get update && apt-get install -y \ build-essential \ curl \ && rm -rf /var/lib/apt/lists/* # Обновляем pip и устанавливаем зависимости COPY backend/requirements.txt /tmp/ RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir --user -r /tmp/requirements.txt # ================================ # Stage 3: Daemon Dependencies (опционально) # ================================ FROM python:3.11-slim AS daemon-deps RUN apt-get update && apt-get install -y \ build-essential \ && rm -rf /var/lib/apt/lists/* COPY daemon/requirements.txt /tmp/daemon-requirements.txt RUN pip install --no-cache-dir --upgrade pip && \ pip install --no-cache-dir --user -r /tmp/daemon-requirements.txt # ================================ # Stage 4: Production Runtime # ================================ FROM python:3.11-slim AS production # Метаданные LABEL maintainer="MC Panel Team" LABEL version="1.0.0" LABEL description="MC Panel - Minecraft Server Management Panel" # Переменные окружения ENV PYTHONDONTWRITEBYTECODE=1 \ PYTHONUNBUFFERED=1 \ PYTHONPATH=/app \ PORT=8000 \ DEBIAN_FRONTEND=noninteractive # Устанавливаем только runtime зависимости RUN apt-get update && apt-get install -y \ curl \ procps \ ca-certificates \ && rm -rf /var/lib/apt/lists/* \ && apt-get clean # Создаем пользователя для безопасности RUN groupadd -r mcpanel && \ useradd -r -g mcpanel -d /app -s /bin/bash mcpanel # Создаем структуру директорий WORKDIR /app RUN mkdir -p \ /app/backend \ /app/frontend/dist \ /app/daemon \ /app/data \ /app/logs \ /app/backend/servers \ /app/backend/data # Копируем Python зависимости из предыдущих стадий COPY --from=python-deps /root/.local /home/mcpanel/.local COPY --from=daemon-deps /root/.local /home/mcpanel/.local-daemon # Копируем собранный frontend COPY --from=frontend-builder /app/frontend/dist ./frontend/dist # Копируем backend код COPY backend/ ./backend/ # Копируем daemon код COPY daemon/ ./daemon/ # Копируем дополнительные файлы COPY key.py ./ COPY users.json ./backend/ 2>/dev/null || true # Создаем конфигурационные файлы по умолчанию RUN echo '{}' > /app/backend/users.json && \ echo '{}' > /app/backend/tickets.json # Устанавливаем права доступа RUN chown -R mcpanel:mcpanel /app && \ chmod +x /app/backend/main.py # Переключаемся на непривилегированного пользователя USER mcpanel # Добавляем локальные Python пакеты в PATH ENV PATH="/home/mcpanel/.local/bin:$PATH" # Health check HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \ CMD curl -f http://localhost:${PORT}/api/auth/oidc/providers || exit 1 # Expose порты EXPOSE 8000 # Volumes для персистентных данных VOLUME ["/app/backend/servers", "/app/backend/data", "/app/logs"] # Рабочая директория для запуска WORKDIR /app/backend # Команда запуска CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"]