Fixed dockerfile
Some checks failed
continuous-integration/drone/push Build is failing

This commit is contained in:
2026-01-18 19:36:21 +06:00
parent 4d9dfddd5d
commit 0ed8039644
5 changed files with 257 additions and 117 deletions

View File

@@ -4,7 +4,7 @@
.gitattributes .gitattributes
# CI/CD # CI/CD
.drone.yml .drone.yml*
.github .github
# Documentation # Documentation
@@ -12,6 +12,7 @@
!README.md !README.md
CHANGELOG.md CHANGELOG.md
LICENSE LICENSE
ОБНОВЛЕНИЯ.md
# IDE # IDE
.vscode .vscode
@@ -24,9 +25,8 @@ LICENSE
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Node # Node.js
frontend/node_modules frontend/node_modules
frontend/dist
frontend/.vite frontend/.vite
frontend/npm-debug.log* frontend/npm-debug.log*
frontend/yarn-debug.log* frontend/yarn-debug.log*
@@ -46,25 +46,30 @@ backend/pip-delete-this-directory.txt
backend/.pytest_cache backend/.pytest_cache
backend/.coverage backend/.coverage
backend/htmlcov backend/htmlcov
daemon/__pycache__
# Data (будет монтироваться как volume) # Data (будет монтироваться как volume)
backend/servers/* backend/servers/*
backend/users.json !backend/servers/.gitkeep
backend/tickets.json backend/data/*
!backend/data/.gitkeep
# Logs # Logs
*.log *.log
logs logs/*
!logs/.gitkeep
# Environment # Environment files
.env .env
.env.local .env.local
.env.*.local .env.*.local
backend/.env*
frontend/.env*
daemon/.env*
# Docker # Docker
docker-compose.yml docker-compose.yml
docker-compose.*.yml docker-compose.*.yml
Dockerfile
.dockerignore .dockerignore
# Tests # Tests
@@ -72,8 +77,35 @@ tests
test test
*.test.js *.test.js
*.spec.js *.spec.js
__tests__
# Build artifacts # Build artifacts
build build
dist dist
*.egg-info *.egg-info
.pytest_cache
# Temporary files
tmp
temp
*.tmp
*.temp
# Batch files (Windows specific)
*.bat
# Postman collections
*.postman_collection.json
# Nginx configs (handled separately)
nginx/*
# Keys and certificates
*.key
*.pem
*.crt
*.p12
# Backup files
*.bak
*.backup

View File

@@ -1,63 +1,139 @@
# Multi-stage build для MC Panel # ================================
# MC Panel - Multi-Stage Production Dockerfile
# ================================
# Stage 1: Build Frontend # Stage 1: Frontend Build
FROM node:18-alpine AS frontend-builder FROM node:18-alpine AS frontend-builder
# Установка зависимостей для сборки
RUN apk add --no-cache git
WORKDIR /app/frontend WORKDIR /app/frontend
# Копируем package файлы # Копируем package files для кеширования зависимостей
COPY frontend/package*.json ./ COPY frontend/package*.json ./
# Устанавливаем ВСЕ зависимости (включая dev для сборки) # Устанавливаем зависимости (включая dev для сборки)
RUN npm ci RUN npm ci --silent
# Копируем исходники фронтенда # Копируем исходники и конфиги
COPY frontend/ ./ COPY frontend/ ./
# Собираем фронтенд # Собираем продакшн версию
RUN npm run build RUN npm run build
# Stage 2: Backend + Frontend # ================================
FROM python:3.11-slim # Stage 2: Python Dependencies
# ================================
FROM python:3.11-slim AS python-deps
# Устанавливаем системные зависимости # Устанавливаем системные зависимости для компиляции Python пакетов
RUN apt-get update && apt-get install -y \ RUN apt-get update && apt-get install -y \
build-essential \
curl \ curl \
&& rm -rf /var/lib/apt/lists/* && rm -rf /var/lib/apt/lists/*
# Создаем рабочую директорию # Обновляем pip и устанавливаем зависимости
WORKDIR /app COPY backend/requirements.txt /tmp/
RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir --user -r /tmp/requirements.txt
# Копируем requirements и устанавливаем Python зависимости # ================================
COPY backend/requirements.txt ./backend/ # Stage 3: Daemon Dependencies (опционально)
RUN pip install --no-cache-dir -r backend/requirements.txt # ================================
FROM python:3.11-slim AS daemon-deps
# Копируем backend RUN apt-get update && apt-get install -y \
COPY backend/ ./backend/ build-essential \
&& rm -rf /var/lib/apt/lists/*
# Копируем собранный frontend из первого stage COPY daemon/requirements.txt /tmp/daemon-requirements.txt
COPY --from=frontend-builder /app/frontend/dist ./frontend/dist RUN pip install --no-cache-dir --upgrade pip && \
pip install --no-cache-dir --user -r /tmp/daemon-requirements.txt
# Создаем необходимые директории # ================================
RUN mkdir -p /app/backend/servers # Stage 4: Production Runtime
# ================================
FROM python:3.11-slim AS production
# Создаем пользователя для запуска приложения # Метаданные
RUN useradd -m -u 1000 mcpanel && \ LABEL maintainer="MC Panel Team"
chown -R mcpanel:mcpanel /app LABEL version="1.0.0"
LABEL description="MC Panel - Minecraft Server Management Panel"
USER mcpanel
# Переменные окружения # Переменные окружения
ENV PYTHONUNBUFFERED=1 ENV PYTHONDONTWRITEBYTECODE=1 \
ENV PORT=8000 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 EXPOSE 8000
# Healthcheck # Volumes для персистентных данных
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \ VOLUME ["/app/backend/servers", "/app/backend/data", "/app/logs"]
CMD curl -f http://localhost:8000/api/auth/oidc/providers || exit 1
# Запускаем приложение # Рабочая директория для запуска
WORKDIR /app/backend WORKDIR /app/backend
CMD ["python", "main.py"]
# Команда запуска
CMD ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--workers", "1"]

49
docker-build.sh Normal file
View File

@@ -0,0 +1,49 @@
#!/bin/bash
# MC Panel Docker Build Script
set -e
echo "🚀 Сборка MC Panel Docker образа..."
# Проверяем наличие Docker
if ! command -v docker &> /dev/null; then
echo "❌ Docker не установлен!"
exit 1
fi
# Проверяем наличие docker-compose
if ! command -v docker-compose &> /dev/null; then
echo "⚠️ docker-compose не найден, используем docker compose"
COMPOSE_CMD="docker compose"
else
COMPOSE_CMD="docker-compose"
fi
# Создаем необходимые директории
echo "📁 Создание директорий..."
mkdir -p backend/servers backend/data logs
# Создаем .gitkeep файлы для пустых директорий
touch backend/servers/.gitkeep backend/data/.gitkeep logs/.gitkeep
# Сборка образа
echo "🔨 Сборка Docker образа..."
docker build -t mc-panel:latest .
echo "✅ Образ собран успешно!"
# Опционально запускаем контейнер
read -p "🤔 Запустить контейнер сейчас? (y/N): " -n 1 -r
echo
if [[ $REPLY =~ ^[Yy]$ ]]; then
echo "🚀 Запуск контейнера..."
$COMPOSE_CMD up -d
echo "✅ Контейнер запущен!"
echo "🌐 Панель доступна по адресу: http://localhost:8000"
echo "📊 Логи: $COMPOSE_CMD logs -f mcpanel"
echo "🛑 Остановка: $COMPOSE_CMD down"
fi
echo "🎉 Готово!"

View File

@@ -1,36 +0,0 @@
version: '3.8'
services:
mc-panel:
build:
context: .
dockerfile: Dockerfile
container_name: mc-panel
restart: unless-stopped
ports:
- "80:8000" # Прямой доступ через порт 80
environment:
- ZITADEL_ISSUER=${ZITADEL_ISSUER}
- ZITADEL_CLIENT_ID=${ZITADEL_CLIENT_ID}
- ZITADEL_CLIENT_SECRET=${ZITADEL_CLIENT_SECRET}
- BASE_URL=${BASE_URL:-http://localhost}
- FRONTEND_URL=${FRONTEND_URL:-http://localhost}
- SECRET_KEY=${SECRET_KEY:-change-this-in-production}
- PYTHONUNBUFFERED=1
volumes:
- ./data/servers:/app/backend/servers
- ./data/users.json:/app/backend/users.json
- ./data/tickets.json:/app/backend/tickets.json
- ./data:/app/data
networks:
- mc-panel-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/oidc/providers"]
interval: 30s
timeout: 10s
retries: 3
start_period: 40s
networks:
mc-panel-network:
driver: bridge

View File

@@ -1,36 +1,63 @@
version: '3.8' version: '3.8'
services: services:
mc-panel: mcpanel:
build: build:
context: . context: .
dockerfile: Dockerfile dockerfile: Dockerfile
container_name: mc-panel container_name: mc-panel
restart: unless-stopped restart: unless-stopped
expose: ports:
- "8000" - "8000:8000"
environment: environment:
- ZITADEL_ISSUER=${ZITADEL_ISSUER} # Основные настройки
- ZITADEL_CLIENT_ID=${ZITADEL_CLIENT_ID} - PORT=8000
- ZITADEL_CLIENT_SECRET=${ZITADEL_CLIENT_SECRET} - BASE_URL=http://localhost:8000
- BASE_URL=${BASE_URL:-http://localhost} - FRONTEND_URL=http://localhost:8000
- FRONTEND_URL=${FRONTEND_URL:-http://localhost}
- SECRET_KEY=${SECRET_KEY:-change-this-in-production} # Безопасность (ОБЯЗАТЕЛЬНО измените в продакшене!)
- PYTHONUNBUFFERED=1 - SECRET_KEY=your-very-long-random-secret-key-change-this-in-production
# OIDC настройки (раскомментируйте и настройте при необходимости)
# - ZITADEL_ISSUER=https://your-instance.zitadel.cloud
# - ZITADEL_CLIENT_ID=your_client_id_here
# - ZITADEL_CLIENT_SECRET=your_client_secret_here
# Логирование
- LOG_LEVEL=INFO
volumes: volumes:
- ./data/servers:/app/backend/servers # Персистентные данные
- ./data/users.json:/app/backend/users.json - mcpanel_servers:/app/backend/servers
- ./data/tickets.json:/app/backend/tickets.json - mcpanel_data:/app/backend/data
- ./data:/app/data - mcpanel_logs:/app/logs
# Конфигурационные файлы (опционально)
- ./backend/users.json:/app/backend/users.json
- ./backend/tickets.json:/app/backend/tickets.json
networks: networks:
- mc-panel-network - mcpanel-network
# Ограничения ресурсов
deploy:
resources:
limits:
memory: 1G
cpus: '0.5'
reservations:
memory: 512M
cpus: '0.25'
# Health check
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/oidc/providers"] test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/oidc/providers"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 40s start_period: 60s
# Nginx reverse proxy (опционально)
nginx: nginx:
image: nginx:alpine image: nginx:alpine
container_name: mc-panel-nginx container_name: mc-panel-nginx
@@ -39,31 +66,23 @@ services:
- "80:80" - "80:80"
- "443:443" - "443:443"
volumes: volumes:
- ./nginx/default.conf:/etc/nginx/nginx.conf:ro - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
- frontend-static:/usr/share/nginx/html:ro
- ./nginx/ssl:/etc/nginx/ssl:ro - ./nginx/ssl:/etc/nginx/ssl:ro
depends_on: depends_on:
- frontend-init - mcpanel
- mc-panel
networks: networks:
- mc-panel-network - mcpanel-network
profiles:
frontend-init: - with-nginx
build:
context: .
dockerfile: Dockerfile
container_name: mc-panel-frontend-init
volumes:
- frontend-static:/tmp/frontend
command: sh -c "cp -r /app/frontend/dist/* /tmp/frontend/ 2>/dev/null || echo 'No files to copy'; echo 'Frontend initialization complete'"
restart: "no"
networks:
- mc-panel-network
networks:
mc-panel-network:
driver: bridge
volumes: volumes:
frontend-static: mcpanel_servers:
driver: local driver: local
mcpanel_data:
driver: local
mcpanel_logs:
driver: local
networks:
mcpanel-network:
driver: bridge