Files
NeveTimePanel/Dockerfile
arkonsadter e4bbf50725
Some checks failed
continuous-integration/drone/push Build encountered an error
fixed drone.yml
2026-01-18 19:48:21 +06:00

144 lines
4.7 KiB
Docker
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# ================================
# MC Panel - Optimized Multi-Stage Dockerfile
# ================================
# Stage 1: Frontend Build
FROM node:20-alpine AS frontend-builder
# Установка зависимостей для сборки
RUN apk add --no-cache git python3 make g++
WORKDIR /app/frontend
# Копируем package files для кеширования зависимостей
COPY frontend/package*.json ./
# Устанавливаем зависимости с оптимизацией
RUN npm ci --only=production --silent && \
npm ci --silent
# Копируем исходники и конфиги
COPY frontend/ ./
# Собираем продакшн версию
RUN npm run build && \
npm prune --production
# ================================
# Stage 2: Python Dependencies Builder
# ================================
FROM python:3.11-slim AS python-builder
# Устанавливаем системные зависимости для компиляции
RUN apt-get update && apt-get install -y \
build-essential \
gcc \
g++ \
&& rm -rf /var/lib/apt/lists/*
# Создаем виртуальное окружение
RUN python -m venv /opt/venv
ENV PATH="/opt/venv/bin:$PATH"
# Обновляем pip и wheel
RUN pip install --no-cache-dir --upgrade pip wheel setuptools
# Устанавливаем backend зависимости
COPY backend/requirements.txt /tmp/backend-requirements.txt
RUN pip install --no-cache-dir -r /tmp/backend-requirements.txt
# Устанавливаем daemon зависимости
COPY daemon/requirements.txt /tmp/daemon-requirements.txt
RUN pip install --no-cache-dir -r /tmp/daemon-requirements.txt
# ================================
# Stage 3: Production Runtime
# ================================
FROM python:3.11-slim AS production
# Метаданные
LABEL maintainer="MC Panel Team" \
version="2.0.0" \
description="MC Panel - Minecraft Server Management Panel" \
org.opencontainers.image.source="https://github.com/your-repo/mc-panel"
# Переменные окружения
ENV PYTHONDONTWRITEBYTECODE=1 \
PYTHONUNBUFFERED=1 \
PYTHONPATH=/app \
PATH="/opt/venv/bin:$PATH" \
PORT=8000 \
WORKERS=1 \
DEBIAN_FRONTEND=noninteractive
# Устанавливаем только runtime зависимости
RUN apt-get update && apt-get install -y --no-install-recommends \
curl \
procps \
ca-certificates \
tini \
&& rm -rf /var/lib/apt/lists/* \
&& apt-get clean
# Создаем пользователя для безопасности
RUN groupadd -r -g 1000 mcpanel && \
useradd -r -u 1000 -g mcpanel -d /app -s /bin/bash mcpanel
# Копируем виртуальное окружение из builder stage
COPY --from=python-builder /opt/venv /opt/venv
# Создаем структуру директорий
WORKDIR /app
RUN mkdir -p \
backend \
frontend/dist \
daemon \
data \
logs \
backend/servers \
backend/data \
&& touch backend/users.json backend/tickets.json
# Копируем собранный frontend
COPY --from=frontend-builder /app/frontend/dist ./frontend/dist/
# Копируем backend код
COPY --chown=mcpanel:mcpanel backend/ ./backend/
# Копируем daemon код
COPY --chown=mcpanel:mcpanel daemon/ ./daemon/
# Копируем дополнительные файлы
COPY --chown=mcpanel:mcpanel key.py ./
# Создаем конфигурационные файлы по умолчанию если их нет
RUN [ ! -f backend/users.json ] && echo '{}' > backend/users.json || true && \
[ ! -f backend/tickets.json ] && echo '{}' > backend/tickets.json || true
# Устанавливаем права доступа
RUN chown -R mcpanel:mcpanel /app && \
chmod -R 755 /app && \
chmod +x backend/main.py
# Переключаемся на непривилегированного пользователя
USER mcpanel
# Health check с улучшенной проверкой
HEALTHCHECK --interval=30s --timeout=10s --start-period=60s --retries=3 \
CMD curl -f http://localhost:${PORT}/health 2>/dev/null || \
curl -f http://localhost:${PORT}/ 2>/dev/null || exit 1
# Expose порты
EXPOSE 8000
# Volumes для персистентных данных
VOLUME ["/app/backend/servers", "/app/backend/data", "/app/logs"]
# Рабочая директория для запуска
WORKDIR /app/backend
# Используем tini как init процесс для правильной обработки сигналов
ENTRYPOINT ["/usr/bin/tini", "--"]
# Команда запуска с переменными окружения
CMD ["sh", "-c", "python -m uvicorn main:app --host 0.0.0.0 --port ${PORT} --workers ${WORKERS}"]