FROM node:20-alpine AS frontend-builder RUN apk add --no-cache git python3 make g++ WORKDIR /app/frontend COPY frontend/package*.json ./ RUN npm ci --only=production --silent && \ npm ci --silent COPY frontend/ ./ RUN npm run build && \ npm prune --Production 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" RUN pip install --no-cache-dir --upgrade pip wheel setuptools COPY backend/requirements.txt /tmp/backend-requirements.txt RUN pip install --no-cache-dir -r /tmp/backend-requirements.txt COPY daemon/requirements.txt /tmp/daemon-requirements.txt RUN pip install --no-cache-dir -r /tmp/daemon-requirements.txt 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 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 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 COPY --from=frontend-builder /app/frontend/dist ./frontend/dist/ COPY --chown=mcpanel:mcpanel backend/ ./backend/ 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 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 8000 VOLUME ["/app/backend/servers", "/app/backend/data", "/app/logs"] WORKDIR /app/backend ENTRYPOINT ["/usr/bin/tini", "--"] CMD ["sh", "-c", "python -m uvicorn main:app --host 0.0.0.0 --port ${PORT} --workers ${WORKERS}"]