This commit is contained in:
@@ -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
|
||||||
|
|||||||
144
Dockerfile
144
Dockerfile
@@ -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
49
docker-build.sh
Normal 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 "🎉 Готово!"
|
||||||
@@ -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
|
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user