This commit is contained in:
123
.drone.yml
123
.drone.yml
@@ -39,7 +39,7 @@ steps:
|
|||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
name: build-and-publish
|
name: build-backend
|
||||||
|
|
||||||
trigger:
|
trigger:
|
||||||
branch:
|
branch:
|
||||||
@@ -54,7 +54,94 @@ depends_on:
|
|||||||
- code-quality
|
- code-quality
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: build-and-push
|
- name: build-backend-image
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
registry: registry.nevetime.ru
|
||||||
|
repo: registry.nevetime.ru/mc-panel-backend
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- ${DRONE_COMMIT_SHA:0:8}
|
||||||
|
- ${DRONE_BRANCH}
|
||||||
|
auto_tag: true
|
||||||
|
dockerfile: backend/Dockerfile
|
||||||
|
context: backend
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
build_args:
|
||||||
|
- BUILD_DATE=${DRONE_BUILD_CREATED}
|
||||||
|
- VCS_REF=${DRONE_COMMIT_SHA}
|
||||||
|
- VERSION=${DRONE_TAG:-${DRONE_BRANCH}}
|
||||||
|
when:
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- tag
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: build-frontend
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- tag
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- code-quality
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build-frontend-image
|
||||||
|
image: plugins/docker
|
||||||
|
settings:
|
||||||
|
registry: registry.nevetime.ru
|
||||||
|
repo: registry.nevetime.ru/mc-panel-frontend
|
||||||
|
tags:
|
||||||
|
- latest
|
||||||
|
- ${DRONE_COMMIT_SHA:0:8}
|
||||||
|
- ${DRONE_BRANCH}
|
||||||
|
auto_tag: true
|
||||||
|
dockerfile: frontend/Dockerfile
|
||||||
|
context: frontend
|
||||||
|
target: production
|
||||||
|
username:
|
||||||
|
from_secret: docker_username
|
||||||
|
password:
|
||||||
|
from_secret: docker_password
|
||||||
|
build_args:
|
||||||
|
- BUILD_DATE=${DRONE_BUILD_CREATED}
|
||||||
|
- VCS_REF=${DRONE_COMMIT_SHA}
|
||||||
|
- VERSION=${DRONE_TAG:-${DRONE_BRANCH}}
|
||||||
|
when:
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- tag
|
||||||
|
|
||||||
|
---
|
||||||
|
kind: pipeline
|
||||||
|
type: docker
|
||||||
|
name: build-monolith
|
||||||
|
|
||||||
|
trigger:
|
||||||
|
branch:
|
||||||
|
- main
|
||||||
|
- master
|
||||||
|
- develop
|
||||||
|
event:
|
||||||
|
- push
|
||||||
|
- tag
|
||||||
|
|
||||||
|
depends_on:
|
||||||
|
- code-quality
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: build-monolith-image
|
||||||
image: plugins/docker
|
image: plugins/docker
|
||||||
settings:
|
settings:
|
||||||
registry: registry.nevetime.ru
|
registry: registry.nevetime.ru
|
||||||
@@ -79,18 +166,6 @@ steps:
|
|||||||
- push
|
- push
|
||||||
- tag
|
- tag
|
||||||
|
|
||||||
- name: verify-image
|
|
||||||
image: alpine:latest
|
|
||||||
commands:
|
|
||||||
- echo "Image built successfully registry.nevetime.ru/mc-panel:${DRONE_COMMIT_SHA:0:8}"
|
|
||||||
- echo "Security scanning can be done manually with trivy"
|
|
||||||
when:
|
|
||||||
event:
|
|
||||||
- push
|
|
||||||
- tag
|
|
||||||
depends_on:
|
|
||||||
- build-and-push
|
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
type: docker
|
type: docker
|
||||||
@@ -103,10 +178,12 @@ trigger:
|
|||||||
- push
|
- push
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- build-and-publish
|
- build-backend
|
||||||
|
- build-frontend
|
||||||
|
- build-monolith
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: deploy-to-staging
|
- name: deploy-separate-services
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
environment:
|
environment:
|
||||||
STAGING_HOST:
|
STAGING_HOST:
|
||||||
@@ -117,10 +194,10 @@ steps:
|
|||||||
from_secret: staging_ssh_key
|
from_secret: staging_ssh_key
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache openssh-client
|
- apk add --no-cache openssh-client
|
||||||
- echo "Deploying to staging..."
|
- echo "Deploying separate services to staging..."
|
||||||
- echo "$STAGING_KEY" | base64 -d > /tmp/ssh_key
|
- echo "$STAGING_KEY" | base64 -d > /tmp/ssh_key
|
||||||
- chmod 600 /tmp/ssh_key
|
- chmod 600 /tmp/ssh_key
|
||||||
- ssh -o StrictHostKeyChecking=no -i /tmp/ssh_key $STAGING_USER@$STAGING_HOST "docker pull registry.nevetime.ru/mc-panel:${DRONE_COMMIT_SHA:0:8}"
|
- ssh -o StrictHostKeyChecking=no -i /tmp/ssh_key $STAGING_USER@$STAGING_HOST "docker pull registry.nevetime.ru/mc-panel-backend:${DRONE_COMMIT_SHA:0:8} && docker pull registry.nevetime.ru/mc-panel-frontend:${DRONE_COMMIT_SHA:0:8}"
|
||||||
|
|
||||||
---
|
---
|
||||||
kind: pipeline
|
kind: pipeline
|
||||||
@@ -134,10 +211,12 @@ trigger:
|
|||||||
- tag
|
- tag
|
||||||
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- build-and-publish
|
- build-backend
|
||||||
|
- build-frontend
|
||||||
|
- build-monolith
|
||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: deploy-to-production
|
- name: deploy-separate-services
|
||||||
image: alpine:latest
|
image: alpine:latest
|
||||||
environment:
|
environment:
|
||||||
PROD_HOST:
|
PROD_HOST:
|
||||||
@@ -148,7 +227,7 @@ steps:
|
|||||||
from_secret: production_ssh_key
|
from_secret: production_ssh_key
|
||||||
commands:
|
commands:
|
||||||
- apk add --no-cache openssh-client
|
- apk add --no-cache openssh-client
|
||||||
- echo "Deploying to production..."
|
- echo "Deploying separate services to production..."
|
||||||
- echo "$PROD_KEY" | base64 -d > /tmp/ssh_key
|
- echo "$PROD_KEY" | base64 -d > /tmp/ssh_key
|
||||||
- chmod 600 /tmp/ssh_key
|
- chmod 600 /tmp/ssh_key
|
||||||
- ssh -o StrictHostKeyChecking=no -i /tmp/ssh_key $PROD_USER@$PROD_HOST "docker pull registry.nevetime.ru/mc-panel:${DRONE_TAG}"
|
- ssh -o StrictHostKeyChecking=no -i /tmp/ssh_key $PROD_USER@$PROD_HOST "docker pull registry.nevetime.ru/mc-panel-backend:${DRONE_TAG} && docker pull registry.nevetime.ru/mc-panel-frontend:${DRONE_TAG}"
|
||||||
63
.env.docker
63
.env.docker
@@ -1,63 +0,0 @@
|
|||||||
# MC Panel Docker Environment Configuration
|
|
||||||
# Скопируйте этот файл в .env и настройте под свои нужды
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Application Settings
|
|
||||||
# ================================
|
|
||||||
PORT=8000
|
|
||||||
WORKERS=1
|
|
||||||
DEBUG=false
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Security Settings
|
|
||||||
# ================================
|
|
||||||
SECRET_KEY=your-super-secret-key-change-this
|
|
||||||
JWT_SECRET_KEY=your-jwt-secret-key-change-this
|
|
||||||
JWT_ALGORITHM=HS256
|
|
||||||
JWT_EXPIRE_MINUTES=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# OIDC Configuration
|
|
||||||
# ================================
|
|
||||||
OIDC_CLIENT_ID=your-oidc-client-id
|
|
||||||
OIDC_CLIENT_SECRET=your-oidc-client-secret
|
|
||||||
OIDC_DISCOVERY_URL=https://your-oidc-provider/.well-known/openid_configuration
|
|
||||||
OIDC_REDIRECT_URI=http://localhost:8000/api/auth/oidc/callback
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Database Settings (если используется)
|
|
||||||
# ================================
|
|
||||||
DATABASE_URL=sqlite:///./data/mc_panel.db
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Logging
|
|
||||||
# ================================
|
|
||||||
LOG_LEVEL=INFO
|
|
||||||
LOG_FILE=/app/logs/mc_panel.log
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Minecraft Server Settings
|
|
||||||
# ================================
|
|
||||||
SERVERS_PATH=/app/backend/servers
|
|
||||||
MAX_SERVERS=10
|
|
||||||
DEFAULT_SERVER_RAM=2G
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# WebSocket Settings
|
|
||||||
# ================================
|
|
||||||
WS_MAX_CONNECTIONS=100
|
|
||||||
WS_PING_INTERVAL=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# File Upload Settings
|
|
||||||
# ================================
|
|
||||||
MAX_UPLOAD_SIZE=100MB
|
|
||||||
ALLOWED_EXTENSIONS=jar,zip,txt,yml,yaml,json,properties
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Backup Settings
|
|
||||||
# ================================
|
|
||||||
BACKUP_PATH=/app/backend/data/backups
|
|
||||||
AUTO_BACKUP=true
|
|
||||||
BACKUP_INTERVAL=24h
|
|
||||||
MAX_BACKUPS=7
|
|
||||||
40
.env.example
40
.env.example
@@ -1,40 +0,0 @@
|
|||||||
# MC Panel Environment Variables
|
|
||||||
|
|
||||||
# ZITADEL OpenID Connect
|
|
||||||
ZITADEL_ISSUER=https://your-instance.zitadel.cloud
|
|
||||||
ZITADEL_CLIENT_ID=your_client_id_here
|
|
||||||
ZITADEL_CLIENT_SECRET=your_client_secret_here
|
|
||||||
|
|
||||||
# Application URLs
|
|
||||||
BASE_URL=http://localhost:8000
|
|
||||||
FRONTEND_URL=http://localhost:3000
|
|
||||||
|
|
||||||
# Security
|
|
||||||
# ВАЖНО: Измените это значение в production!
|
|
||||||
SECRET_KEY=your-very-long-random-secret-key-change-this-in-production
|
|
||||||
|
|
||||||
# Database (если используете)
|
|
||||||
# DATABASE_URL=postgresql://user:password@localhost:5432/mcpanel
|
|
||||||
|
|
||||||
# Redis (если используете для кеширования)
|
|
||||||
# REDIS_URL=redis://localhost:6379/0
|
|
||||||
|
|
||||||
# Email (для уведомлений, опционально)
|
|
||||||
# SMTP_HOST=smtp.gmail.com
|
|
||||||
# SMTP_PORT=587
|
|
||||||
# SMTP_USER=your-email@gmail.com
|
|
||||||
# SMTP_PASSWORD=your-app-password
|
|
||||||
# SMTP_FROM=noreply@mcpanel.com
|
|
||||||
|
|
||||||
# Logging
|
|
||||||
# LOG_LEVEL=INFO
|
|
||||||
# LOG_FILE=/var/log/mcpanel/app.log
|
|
||||||
|
|
||||||
# Features
|
|
||||||
# ENABLE_REGISTRATION=true
|
|
||||||
# ENABLE_OIDC=true
|
|
||||||
# MAX_SERVERS_PER_USER=10
|
|
||||||
|
|
||||||
# Performance
|
|
||||||
# WORKERS=4
|
|
||||||
# MAX_UPLOAD_SIZE=100MB
|
|
||||||
@@ -1,75 +0,0 @@
|
|||||||
# MC Panel Production Environment Configuration
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Application Settings
|
|
||||||
# ================================
|
|
||||||
PORT=8000
|
|
||||||
WORKERS=4
|
|
||||||
DEBUG=false
|
|
||||||
LOG_LEVEL=WARNING
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Security Settings
|
|
||||||
# ================================
|
|
||||||
SECRET_KEY=production-super-secret-key-change-this-immediately
|
|
||||||
JWT_SECRET_KEY=production-jwt-secret-key-change-this-immediately
|
|
||||||
JWT_ALGORITHM=HS256
|
|
||||||
JWT_EXPIRE_MINUTES=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# OIDC Configuration
|
|
||||||
# ================================
|
|
||||||
OIDC_CLIENT_ID=mc-panel-production
|
|
||||||
OIDC_CLIENT_SECRET=production-oidc-client-secret
|
|
||||||
OIDC_DISCOVERY_URL=https://auth.nevetime.ru/.well-known/openid_configuration
|
|
||||||
OIDC_REDIRECT_URI=https://mc-panel.nevetime.ru/api/auth/oidc/callback
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Database Settings
|
|
||||||
# ================================
|
|
||||||
DATABASE_URL=sqlite:///./data/mc_panel_production.db
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Logging
|
|
||||||
# ================================
|
|
||||||
LOG_FILE=/app/logs/mc_panel_production.log
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Minecraft Server Settings
|
|
||||||
# ================================
|
|
||||||
SERVERS_PATH=/app/backend/servers
|
|
||||||
MAX_SERVERS=20
|
|
||||||
DEFAULT_SERVER_RAM=4G
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# WebSocket Settings
|
|
||||||
# ================================
|
|
||||||
WS_MAX_CONNECTIONS=200
|
|
||||||
WS_PING_INTERVAL=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# File Upload Settings
|
|
||||||
# ================================
|
|
||||||
MAX_UPLOAD_SIZE=500MB
|
|
||||||
ALLOWED_EXTENSIONS=jar,zip,txt,yml,yaml,json,properties
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Backup Settings
|
|
||||||
# ================================
|
|
||||||
BACKUP_PATH=/app/backups
|
|
||||||
AUTO_BACKUP=true
|
|
||||||
BACKUP_INTERVAL=24h
|
|
||||||
MAX_BACKUPS=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Performance Settings
|
|
||||||
# ================================
|
|
||||||
CACHE_TTL=3600
|
|
||||||
MAX_CONCURRENT_BUILDS=2
|
|
||||||
BUILD_TIMEOUT=1800
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Monitoring
|
|
||||||
# ================================
|
|
||||||
METRICS_ENABLED=true
|
|
||||||
HEALTH_CHECK_INTERVAL=30
|
|
||||||
@@ -1,62 +0,0 @@
|
|||||||
# MC Panel Staging Environment Configuration
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Application Settings
|
|
||||||
# ================================
|
|
||||||
PORT=8000
|
|
||||||
WORKERS=2
|
|
||||||
DEBUG=false
|
|
||||||
LOG_LEVEL=INFO
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Security Settings
|
|
||||||
# ================================
|
|
||||||
SECRET_KEY=staging-secret-key-change-this
|
|
||||||
JWT_SECRET_KEY=staging-jwt-secret-key-change-this
|
|
||||||
JWT_ALGORITHM=HS256
|
|
||||||
JWT_EXPIRE_MINUTES=60
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# OIDC Configuration
|
|
||||||
# ================================
|
|
||||||
OIDC_CLIENT_ID=mc-panel-staging
|
|
||||||
OIDC_CLIENT_SECRET=staging-oidc-client-secret
|
|
||||||
OIDC_DISCOVERY_URL=https://auth-staging.nevetime.ru/.well-known/openid_configuration
|
|
||||||
OIDC_REDIRECT_URI=https://mc-panel-staging.nevetime.ru/api/auth/oidc/callback
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Database Settings
|
|
||||||
# ================================
|
|
||||||
DATABASE_URL=sqlite:///./data/mc_panel_staging.db
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Logging
|
|
||||||
# ================================
|
|
||||||
LOG_FILE=/app/logs/mc_panel_staging.log
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Minecraft Server Settings
|
|
||||||
# ================================
|
|
||||||
SERVERS_PATH=/app/backend/servers
|
|
||||||
MAX_SERVERS=5
|
|
||||||
DEFAULT_SERVER_RAM=1G
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# WebSocket Settings
|
|
||||||
# ================================
|
|
||||||
WS_MAX_CONNECTIONS=50
|
|
||||||
WS_PING_INTERVAL=30
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# File Upload Settings
|
|
||||||
# ================================
|
|
||||||
MAX_UPLOAD_SIZE=50MB
|
|
||||||
ALLOWED_EXTENSIONS=jar,zip,txt,yml,yaml,json,properties
|
|
||||||
|
|
||||||
# ================================
|
|
||||||
# Backup Settings
|
|
||||||
# ================================
|
|
||||||
BACKUP_PATH=/app/backend/data/backups
|
|
||||||
AUTO_BACKUP=true
|
|
||||||
BACKUP_INTERVAL=12h
|
|
||||||
MAX_BACKUPS=14
|
|
||||||
157
CHANGELOG.md
157
CHANGELOG.md
@@ -1,157 +0,0 @@
|
|||||||
# Changelog - MC Panel
|
|
||||||
|
|
||||||
## [1.2.0] - 2026-01-17
|
|
||||||
|
|
||||||
### ✨ Новые функции
|
|
||||||
|
|
||||||
#### Система демонов (как в MCSManager)
|
|
||||||
- **Добавлена полная система демонов** для управления серверами на удаленных машинах
|
|
||||||
- **API демонов** (`/api/daemons`) с CRUD операциями
|
|
||||||
- **UI компонент** для управления демонами с автообновлением статуса
|
|
||||||
- **Daemon приложение** (`daemon/main.py`) для установки на удаленные серверы
|
|
||||||
- **Выбор демона** при создании сервера - можно создавать серверы на любом подключенном демоне
|
|
||||||
|
|
||||||
#### Улучшения авторизации
|
|
||||||
- **Исправлена система ролей** - owner и admin теперь видят ВСЕ серверы
|
|
||||||
- **Добавлена роль в JWT токен** для правильной авторизации
|
|
||||||
- **Улучшена проверка прав доступа** к демонам (только owner/admin)
|
|
||||||
|
|
||||||
#### Docker и развертывание
|
|
||||||
- **Nginx конфигурация** для раздачи статических файлов frontend
|
|
||||||
- **Многоэтапная сборка** Docker с оптимизацией
|
|
||||||
- **Альтернативные docker-compose** файлы для разных сценариев
|
|
||||||
- **Исправлены пути** к файлам данных в контейнерах
|
|
||||||
|
|
||||||
### 🔧 Исправления
|
|
||||||
|
|
||||||
#### Критические ошибки
|
|
||||||
- **Исправлена ошибка 404** при обращении к `/api/daemons` (роутер не регистрировался)
|
|
||||||
- **Исправлена ошибка 401** при авторизации (роль не добавлялась в токен)
|
|
||||||
- **Исправлены пути к файлам** в Docker контейнерах
|
|
||||||
- **Исправлена nginx конфигурация** (отсутствовала секция events)
|
|
||||||
|
|
||||||
#### UI/UX улучшения
|
|
||||||
- **Обновлен CreateServerModal** с выбором демона
|
|
||||||
- **Добавлена статистика демонов** (CPU, RAM, Disk) с автообновлением
|
|
||||||
- **Улучшено отображение** статуса демонов (онлайн/оффлайн)
|
|
||||||
- **Добавлены отладочные сообщения** для диагностики
|
|
||||||
|
|
||||||
### 🗂️ Структурные изменения
|
|
||||||
|
|
||||||
#### Новые файлы
|
|
||||||
```
|
|
||||||
daemon/
|
|
||||||
├── main.py # Daemon приложение
|
|
||||||
├── .env # Конфигурация демона
|
|
||||||
├── install.bat # Скрипт установки
|
|
||||||
├── start.bat # Скрипт запуска
|
|
||||||
└── README.md # Документация
|
|
||||||
|
|
||||||
backend/
|
|
||||||
└── daemons.py # API для управления демонами
|
|
||||||
|
|
||||||
frontend/src/components/
|
|
||||||
├── Daemons.jsx # UI управления демонами
|
|
||||||
└── CreateServerModal.jsx # Обновлен с выбором демона
|
|
||||||
|
|
||||||
nginx/
|
|
||||||
└── default.conf # Конфигурация nginx
|
|
||||||
|
|
||||||
docker-compose-*.yml # Альтернативные конфигурации
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Обновленные файлы
|
|
||||||
- `backend/main.py` - добавлен роутер демонов, исправлена авторизация
|
|
||||||
- `frontend/src/App.jsx` - добавлена кнопка "Демоны" для owner/admin
|
|
||||||
- `docker-compose.yml` - обновлен для работы с nginx
|
|
||||||
- `Dockerfile` - многоэтапная сборка frontend + backend
|
|
||||||
|
|
||||||
### 📚 Документация
|
|
||||||
|
|
||||||
#### Новая документация
|
|
||||||
- `DAEMON_SETUP.md` - Полная инструкция по установке демонов
|
|
||||||
- `NGINX_SETUP.md` - Настройка nginx для production
|
|
||||||
- `DOCKER_FIX.md` - Исправление проблем с Docker
|
|
||||||
- `LINUX_DOCKER_FIX.md` - Специфичные инструкции для Linux
|
|
||||||
|
|
||||||
### 🚀 Развертывание
|
|
||||||
|
|
||||||
#### Варианты запуска
|
|
||||||
1. **С nginx** (рекомендуется для production):
|
|
||||||
```bash
|
|
||||||
docker compose up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Без nginx** (для разработки):
|
|
||||||
```bash
|
|
||||||
docker compose -f docker-compose-simple.yml up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Локальная разработка**:
|
|
||||||
```bash
|
|
||||||
# Backend
|
|
||||||
cd backend && python main.py
|
|
||||||
|
|
||||||
# Frontend
|
|
||||||
cd frontend && npm run dev
|
|
||||||
|
|
||||||
# Daemon
|
|
||||||
cd daemon && python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### 🔐 Безопасность
|
|
||||||
|
|
||||||
#### Улучшения безопасности
|
|
||||||
- **JWT токены** теперь содержат роль пользователя
|
|
||||||
- **Проверка прав доступа** к демонам
|
|
||||||
- **Аутентификация демонов** через API ключи
|
|
||||||
- **Внутренние порты** для backend в Docker
|
|
||||||
|
|
||||||
### 📊 Производительность
|
|
||||||
|
|
||||||
#### Оптимизации
|
|
||||||
- **Nginx раздает статику** вместо Python backend
|
|
||||||
- **Gzip сжатие** для всех статических файлов
|
|
||||||
- **Кэширование** статических ресурсов
|
|
||||||
- **Многоэтапная сборка** Docker для уменьшения размера образа
|
|
||||||
|
|
||||||
### 🧪 Тестирование
|
|
||||||
|
|
||||||
#### Добавлено
|
|
||||||
- **Отладочные сообщения** для диагностики проблем
|
|
||||||
- **Health check** для Docker контейнеров
|
|
||||||
- **Проверка подключения** к демонам при добавлении
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Миграция с предыдущих версий
|
|
||||||
|
|
||||||
### Обновление с версии 1.1.x
|
|
||||||
|
|
||||||
1. **Обновите файлы**:
|
|
||||||
```bash
|
|
||||||
git pull
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Создайте папку data**:
|
|
||||||
```bash
|
|
||||||
mkdir -p data
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Перезапустите контейнеры**:
|
|
||||||
```bash
|
|
||||||
docker compose down
|
|
||||||
docker compose up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
4. **Перелогиньтесь** в панели для получения нового токена с ролью
|
|
||||||
|
|
||||||
### Новые пользователи
|
|
||||||
|
|
||||||
Используйте стандартные учетные данные:
|
|
||||||
- **Логин**: `admin`
|
|
||||||
- **Пароль**: `Admin`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия 1.2.0 включает полную систему демонов и значительные улучшения производительности!** 🚀
|
|
||||||
211
CI_CD_README.md
211
CI_CD_README.md
@@ -1,211 +0,0 @@
|
|||||||
# MC Panel CI/CD Pipeline
|
|
||||||
|
|
||||||
## Обзор
|
|
||||||
|
|
||||||
Проект использует Drone CI для автоматизации сборки, тестирования и деплоя. Pipeline состоит из нескольких этапов:
|
|
||||||
|
|
||||||
1. **Code Quality** - проверка качества кода и безопасности
|
|
||||||
2. **Build Frontend** - сборка React приложения
|
|
||||||
3. **Build and Publish** - сборка и публикация Docker образа
|
|
||||||
4. **Deploy Staging** - автоматический деплой на staging (ветка develop)
|
|
||||||
5. **Deploy Production** - деплой на production (теги v*)
|
|
||||||
6. **Notify** - уведомления о результатах
|
|
||||||
|
|
||||||
## Структура Pipeline
|
|
||||||
|
|
||||||
### 1. Code Quality Pipeline
|
|
||||||
```yaml
|
|
||||||
Триггеры: push, pull_request
|
|
||||||
Шаги:
|
|
||||||
- python-lint: flake8, black, isort
|
|
||||||
- frontend-lint: TypeScript, ESLint
|
|
||||||
- python-tests: pytest с покрытием
|
|
||||||
- frontend-tests: Vitest/Jest
|
|
||||||
- python-security: safety, bandit
|
|
||||||
- frontend-security: npm audit
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Build Frontend Pipeline
|
|
||||||
```yaml
|
|
||||||
Триггеры: push, tag (main/master/develop)
|
|
||||||
Зависимости: code-quality
|
|
||||||
Шаги:
|
|
||||||
- build-frontend: npm ci && npm run build
|
|
||||||
- save-frontend-artifacts: сохранение артефактов
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Build and Publish Pipeline
|
|
||||||
```yaml
|
|
||||||
Триггеры: push, tag (main/master/develop)
|
|
||||||
Зависимости: code-quality, build-frontend
|
|
||||||
Шаги:
|
|
||||||
- build-and-push: Docker build и push в registry
|
|
||||||
- test-image: тестирование собранного образа
|
|
||||||
- scan-image: Trivy сканирование уязвимостей
|
|
||||||
```
|
|
||||||
|
|
||||||
### 4. Deploy Pipelines
|
|
||||||
```yaml
|
|
||||||
Staging:
|
|
||||||
Триггер: push в develop
|
|
||||||
Деплой: docker-compose.staging.yml
|
|
||||||
|
|
||||||
Production:
|
|
||||||
Триггер: tag v*
|
|
||||||
Деплой: docker-compose.prod.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
## Настройка Secrets
|
|
||||||
|
|
||||||
В Drone необходимо настроить следующие секреты:
|
|
||||||
|
|
||||||
### Docker Registry
|
|
||||||
```
|
|
||||||
docker_username: логин для registry.nevetime.ru
|
|
||||||
docker_password: пароль для registry.nevetime.ru
|
|
||||||
```
|
|
||||||
|
|
||||||
### SSH для деплоя
|
|
||||||
```
|
|
||||||
staging_host: IP/домен staging сервера
|
|
||||||
staging_user: пользователь SSH
|
|
||||||
staging_ssh_key: приватный SSH ключ (base64)
|
|
||||||
|
|
||||||
production_host: IP/домен production сервера
|
|
||||||
production_user: пользователь SSH
|
|
||||||
production_ssh_key: приватный SSH ключ (base64)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Уведомления
|
|
||||||
```
|
|
||||||
telegram_bot_token: токен Telegram бота
|
|
||||||
telegram_chat_id: ID чата для уведомлений
|
|
||||||
```
|
|
||||||
|
|
||||||
## Теги и версионирование
|
|
||||||
|
|
||||||
### Автоматические теги
|
|
||||||
- `latest` - последний коммит в main/master
|
|
||||||
- `develop` - последний коммит в develop
|
|
||||||
- `{commit-sha}` - короткий хеш коммита
|
|
||||||
|
|
||||||
### Релизные теги
|
|
||||||
- `v1.0.0` - семантическое версионирование
|
|
||||||
- `v1.0.0-rc.1` - release candidate
|
|
||||||
|
|
||||||
## Окружения
|
|
||||||
|
|
||||||
### Development
|
|
||||||
- Локальная разработка
|
|
||||||
- `docker-compose.yml`
|
|
||||||
|
|
||||||
### Staging
|
|
||||||
- Автоматический деплой из develop
|
|
||||||
- `docker-compose.staging.yml`
|
|
||||||
- URL: https://mc-panel-staging.nevetime.ru
|
|
||||||
|
|
||||||
### Production
|
|
||||||
- Деплой по тегам v*
|
|
||||||
- `docker-compose.prod.yml`
|
|
||||||
- URL: https://mc-panel.nevetime.ru
|
|
||||||
|
|
||||||
## Workflow
|
|
||||||
|
|
||||||
### Разработка новой функции
|
|
||||||
1. Создать ветку от develop: `git checkout -b feature/new-feature`
|
|
||||||
2. Разработать функцию
|
|
||||||
3. Создать Pull Request в develop
|
|
||||||
4. После прохождения CI и ревью - мерж в develop
|
|
||||||
5. Автоматический деплой на staging
|
|
||||||
|
|
||||||
### Релиз
|
|
||||||
1. Создать ветку release от develop: `git checkout -b release/v1.0.0`
|
|
||||||
2. Подготовить релиз (обновить версии, CHANGELOG)
|
|
||||||
3. Мерж в main и develop
|
|
||||||
4. Создать тег: `git tag v1.0.0`
|
|
||||||
5. Push тега: `git push origin v1.0.0`
|
|
||||||
6. Автоматический деплой на production
|
|
||||||
|
|
||||||
### Hotfix
|
|
||||||
1. Создать ветку от main: `git checkout -b hotfix/critical-fix`
|
|
||||||
2. Исправить проблему
|
|
||||||
3. Мерж в main и develop
|
|
||||||
4. Создать тег с патч-версией: `git tag v1.0.1`
|
|
||||||
5. Push тега для деплоя
|
|
||||||
|
|
||||||
## Мониторинг
|
|
||||||
|
|
||||||
### Логи сборки
|
|
||||||
```bash
|
|
||||||
# Просмотр логов в Drone UI
|
|
||||||
https://drone.nevetime.ru/your-org/mc-panel
|
|
||||||
|
|
||||||
# Локальные логи
|
|
||||||
docker-compose logs -f mc-panel
|
|
||||||
```
|
|
||||||
|
|
||||||
### Метрики
|
|
||||||
- Время сборки
|
|
||||||
- Размер образа
|
|
||||||
- Результаты тестов
|
|
||||||
- Покрытие кода
|
|
||||||
- Уязвимости безопасности
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Сборка падает на frontend
|
|
||||||
```bash
|
|
||||||
# Проверить зависимости
|
|
||||||
cd frontend && npm audit
|
|
||||||
|
|
||||||
# Обновить зависимости
|
|
||||||
npm update
|
|
||||||
|
|
||||||
# Очистить кеш
|
|
||||||
npm ci --cache /tmp/empty-cache
|
|
||||||
```
|
|
||||||
|
|
||||||
### Сборка падает на backend
|
|
||||||
```bash
|
|
||||||
# Проверить requirements.txt
|
|
||||||
cd backend && pip check
|
|
||||||
|
|
||||||
# Обновить зависимости
|
|
||||||
pip-compile requirements.in
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблемы с Docker registry
|
|
||||||
```bash
|
|
||||||
# Проверить авторизацию
|
|
||||||
docker login registry.nevetime.ru
|
|
||||||
|
|
||||||
# Проверить образ
|
|
||||||
docker pull registry.nevetime.ru/mc-panel:latest
|
|
||||||
```
|
|
||||||
|
|
||||||
### Деплой не работает
|
|
||||||
```bash
|
|
||||||
# Проверить SSH подключение
|
|
||||||
ssh -i ~/.ssh/deploy_key user@server
|
|
||||||
|
|
||||||
# Проверить Docker на сервере
|
|
||||||
docker ps
|
|
||||||
docker-compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
## Оптимизация
|
|
||||||
|
|
||||||
### Ускорение сборки
|
|
||||||
- Использование кеша Docker слоев
|
|
||||||
- Параллельные шаги где возможно
|
|
||||||
- Оптимизация Dockerfile
|
|
||||||
|
|
||||||
### Уменьшение размера образа
|
|
||||||
- Multi-stage build
|
|
||||||
- Минимальные базовые образы
|
|
||||||
- Очистка кеша пакетных менеджеров
|
|
||||||
|
|
||||||
### Безопасность
|
|
||||||
- Регулярное сканирование уязвимостей
|
|
||||||
- Обновление базовых образов
|
|
||||||
- Ротация секретов
|
|
||||||
264
DAEMON_SETUP.md
264
DAEMON_SETUP.md
@@ -1,264 +0,0 @@
|
|||||||
# Настройка системы демонов MC Panel
|
|
||||||
|
|
||||||
## Что такое демоны?
|
|
||||||
|
|
||||||
Демоны (Daemons) - это удаленные серверы, на которых можно запускать Minecraft серверы. Система демонов позволяет:
|
|
||||||
|
|
||||||
- Распределять серверы по разным физическим машинам
|
|
||||||
- Масштабировать инфраструктуру
|
|
||||||
- Управлять серверами на разных локациях из одной панели
|
|
||||||
- Балансировать нагрузку между серверами
|
|
||||||
|
|
||||||
## Быстрый старт
|
|
||||||
|
|
||||||
### 1. Установка демона на удаленный сервер
|
|
||||||
|
|
||||||
#### Windows:
|
|
||||||
```bash
|
|
||||||
# 1. Скопируйте папку daemon на удаленный сервер
|
|
||||||
# 2. Откройте командную строку в папке daemon
|
|
||||||
# 3. Установите зависимости
|
|
||||||
install.bat
|
|
||||||
|
|
||||||
# 4. Настройте .env файл
|
|
||||||
copy .env.example .env
|
|
||||||
notepad .env
|
|
||||||
|
|
||||||
# 5. Запустите демон
|
|
||||||
start.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Linux:
|
|
||||||
```bash
|
|
||||||
# 1. Скопируйте папку daemon на удаленный сервер
|
|
||||||
# 2. Установите зависимости
|
|
||||||
cd daemon
|
|
||||||
pip install -r requirements.txt
|
|
||||||
|
|
||||||
# 3. Настройте .env файл
|
|
||||||
cp .env.example .env
|
|
||||||
nano .env
|
|
||||||
|
|
||||||
# 4. Запустите демон
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Настройка .env файла демона
|
|
||||||
|
|
||||||
```env
|
|
||||||
# Уникальный ID демона
|
|
||||||
DAEMON_ID=daemon-1
|
|
||||||
|
|
||||||
# Отображаемое имя
|
|
||||||
DAEMON_NAME=Main Server
|
|
||||||
|
|
||||||
# Порт для API
|
|
||||||
DAEMON_PORT=24444
|
|
||||||
|
|
||||||
# Секретный ключ (сгенерируйте случайный)
|
|
||||||
DAEMON_KEY=your-secret-key-here
|
|
||||||
|
|
||||||
# Директория для серверов
|
|
||||||
SERVERS_DIR=./servers
|
|
||||||
```
|
|
||||||
|
|
||||||
**Важно:** Сгенерируйте надежный ключ:
|
|
||||||
```python
|
|
||||||
import secrets
|
|
||||||
print(secrets.token_urlsafe(32))
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Подключение демона к панели
|
|
||||||
|
|
||||||
1. Откройте основную панель управления
|
|
||||||
2. Войдите как владелец (owner) или администратор (admin)
|
|
||||||
3. В боковом меню нажмите "Демоны" (иконка сервера)
|
|
||||||
4. Нажмите "Добавить демон"
|
|
||||||
5. Заполните форму:
|
|
||||||
- **Название**: Main Server (или любое другое)
|
|
||||||
- **IP адрес**: IP адрес сервера с демоном
|
|
||||||
- **Порт**: 24444 (или ваш порт из .env)
|
|
||||||
- **Ключ демона**: ваш DAEMON_KEY из .env
|
|
||||||
- **Примечания**: дополнительная информация (необязательно)
|
|
||||||
6. Нажмите "Добавить"
|
|
||||||
|
|
||||||
### 4. Проверка подключения
|
|
||||||
|
|
||||||
После добавления демон должен отображаться со статусом "Онлайн" (зеленый индикатор).
|
|
||||||
|
|
||||||
Вы увидите:
|
|
||||||
- Статус демона (онлайн/оффлайн)
|
|
||||||
- Использование CPU, ОЗУ и диска
|
|
||||||
- Количество серверов на демоне
|
|
||||||
|
|
||||||
## Архитектура
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────┐
|
|
||||||
│ Основная панель │ (порт 8000)
|
|
||||||
│ (Frontend + │
|
|
||||||
│ Backend) │
|
|
||||||
└────────┬─────────┘
|
|
||||||
│
|
|
||||||
│ HTTP API
|
|
||||||
│
|
|
||||||
┌────┴────┬────────┬────────┐
|
|
||||||
│ │ │ │
|
|
||||||
┌───▼───┐ ┌──▼───┐ ┌──▼───┐ ┌──▼───┐
|
|
||||||
│Daemon1│ │Daemon2│ │Daemon3│ │... │
|
|
||||||
│(24444)│ │(24444)│ │(24444)│ │ │
|
|
||||||
└───┬───┘ └──┬───┘ └──┬───┘ └──────┘
|
|
||||||
│ │ │
|
|
||||||
┌───▼───┐ ┌──▼───┐ ┌──▼───┐
|
|
||||||
│Server1│ │Server2│ │Server3│
|
|
||||||
│Server2│ │Server3│ │Server4│
|
|
||||||
└───────┘ └──────┘ └──────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
### 1. Файрвол
|
|
||||||
|
|
||||||
Настройте файрвол, чтобы разрешить доступ к порту демона только с IP основной панели:
|
|
||||||
|
|
||||||
#### Windows (PowerShell):
|
|
||||||
```powershell
|
|
||||||
New-NetFirewallRule -DisplayName "MC Panel Daemon" -Direction Inbound -LocalPort 24444 -Protocol TCP -Action Allow -RemoteAddress "IP_ПАНЕЛИ"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Linux (ufw):
|
|
||||||
```bash
|
|
||||||
sudo ufw allow from IP_ПАНЕЛИ to any port 24444
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Linux (iptables):
|
|
||||||
```bash
|
|
||||||
sudo iptables -A INPUT -p tcp -s IP_ПАНЕЛИ --dport 24444 -j ACCEPT
|
|
||||||
sudo iptables -A INPUT -p tcp --dport 24444 -j DROP
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. HTTPS (рекомендуется для продакшена)
|
|
||||||
|
|
||||||
Используйте reverse proxy (nginx) с SSL сертификатом:
|
|
||||||
|
|
||||||
```nginx
|
|
||||||
server {
|
|
||||||
listen 443 ssl http2;
|
|
||||||
server_name daemon.example.com;
|
|
||||||
|
|
||||||
ssl_certificate /path/to/cert.pem;
|
|
||||||
ssl_certificate_key /path/to/key.pem;
|
|
||||||
|
|
||||||
location / {
|
|
||||||
proxy_pass http://127.0.0.1:24444;
|
|
||||||
proxy_set_header Host $host;
|
|
||||||
proxy_set_header X-Real-IP $remote_addr;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Сильные ключи
|
|
||||||
|
|
||||||
- Используйте случайные ключи длиной минимум 32 символа
|
|
||||||
- Не используйте одинаковые ключи для разных демонов
|
|
||||||
- Храните ключи в безопасности
|
|
||||||
|
|
||||||
## Запуск как сервис
|
|
||||||
|
|
||||||
### Linux (systemd)
|
|
||||||
|
|
||||||
1. Создайте файл `/etc/systemd/system/mcpanel-daemon.service`:
|
|
||||||
|
|
||||||
```ini
|
|
||||||
[Unit]
|
|
||||||
Description=MC Panel Daemon
|
|
||||||
After=network.target
|
|
||||||
|
|
||||||
[Service]
|
|
||||||
Type=simple
|
|
||||||
User=mcpanel
|
|
||||||
WorkingDirectory=/path/to/daemon
|
|
||||||
ExecStart=/usr/bin/python3 /path/to/daemon/main.py
|
|
||||||
Restart=always
|
|
||||||
RestartSec=10
|
|
||||||
|
|
||||||
[Install]
|
|
||||||
WantedBy=multi-user.target
|
|
||||||
```
|
|
||||||
|
|
||||||
2. Запустите сервис:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
sudo systemctl enable mcpanel-daemon
|
|
||||||
sudo systemctl start mcpanel-daemon
|
|
||||||
sudo systemctl status mcpanel-daemon
|
|
||||||
```
|
|
||||||
|
|
||||||
### Windows (NSSM)
|
|
||||||
|
|
||||||
1. Скачайте NSSM: https://nssm.cc/download
|
|
||||||
2. Установите сервис:
|
|
||||||
|
|
||||||
```cmd
|
|
||||||
nssm install MCPanelDaemon "C:\Python\python.exe" "C:\path\to\daemon\main.py"
|
|
||||||
nssm set MCPanelDaemon AppDirectory "C:\path\to\daemon"
|
|
||||||
nssm start MCPanelDaemon
|
|
||||||
```
|
|
||||||
|
|
||||||
## Управление серверами на демонах
|
|
||||||
|
|
||||||
После подключения демона вы можете:
|
|
||||||
|
|
||||||
1. **Создавать серверы** - при создании сервера можно будет выбрать демон
|
|
||||||
2. **Просматривать статистику** - CPU, ОЗУ, диск каждого демона
|
|
||||||
3. **Управлять серверами** - запуск, остановка, консоль, файлы
|
|
||||||
4. **Мониторить состояние** - статус демонов обновляется автоматически
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Демон показывает статус "Оффлайн"
|
|
||||||
|
|
||||||
1. Проверьте, что демон запущен на удаленном сервере
|
|
||||||
2. Проверьте файрвол и порты
|
|
||||||
3. Проверьте, что ключ в панели совпадает с DAEMON_KEY
|
|
||||||
4. Проверьте IP адрес и порт
|
|
||||||
5. Проверьте логи демона
|
|
||||||
|
|
||||||
### Ошибка "Connection error"
|
|
||||||
|
|
||||||
- Проверьте сетевое подключение между панелью и демоном
|
|
||||||
- Проверьте, что порт не заблокирован файрволом
|
|
||||||
- Попробуйте подключиться вручную: `curl http://IP:24444/api/status`
|
|
||||||
|
|
||||||
### Ошибка "Invalid daemon key"
|
|
||||||
|
|
||||||
- Проверьте, что ключ в панели точно совпадает с DAEMON_KEY в .env
|
|
||||||
- Убедитесь, что нет лишних пробелов или символов
|
|
||||||
- Перезапустите демон после изменения .env
|
|
||||||
|
|
||||||
## Мониторинг
|
|
||||||
|
|
||||||
Демоны автоматически отправляют информацию о:
|
|
||||||
- Использовании CPU
|
|
||||||
- Использовании ОЗУ
|
|
||||||
- Использовании диска
|
|
||||||
- Количестве серверов
|
|
||||||
- Количестве запущенных серверов
|
|
||||||
|
|
||||||
Эта информация обновляется каждые 10 секунд в интерфейсе панели.
|
|
||||||
|
|
||||||
## Масштабирование
|
|
||||||
|
|
||||||
Вы можете добавить неограниченное количество демонов:
|
|
||||||
|
|
||||||
1. Установите демон на новый сервер
|
|
||||||
2. Используйте уникальный DAEMON_ID для каждого демона
|
|
||||||
3. Добавьте демон в панель
|
|
||||||
4. Распределяйте серверы между демонами
|
|
||||||
|
|
||||||
## Поддержка
|
|
||||||
|
|
||||||
Если у вас возникли проблемы:
|
|
||||||
1. Проверьте логи демона
|
|
||||||
2. Проверьте логи основной панели
|
|
||||||
3. Создайте тикет в системе поддержки
|
|
||||||
137
DOCKER_FIX.md
137
DOCKER_FIX.md
@@ -1,137 +0,0 @@
|
|||||||
# Исправление Docker ошибок
|
|
||||||
|
|
||||||
## Проблемы
|
|
||||||
|
|
||||||
1. **Nginx**: `no "events" section in configuration`
|
|
||||||
2. **Backend**: `FileNotFoundError: [Errno 2] No such file or directory: 'backend/data'`
|
|
||||||
|
|
||||||
## ✅ Исправления сделаны
|
|
||||||
|
|
||||||
### 1. Исправлена nginx конфигурация
|
|
||||||
- Обновлен файл `nginx/default.conf` с полной конфигурацией включая секцию `events`
|
|
||||||
- Обновлен `docker-compose.yml` для монтирования как основной конфигурации nginx
|
|
||||||
|
|
||||||
### 2. Исправлен путь к папке данных
|
|
||||||
- В `backend/daemons.py` изменен путь с `backend/data/daemons.json` на `data/daemons.json`
|
|
||||||
- Добавлена проверка существования файла пользователей
|
|
||||||
|
|
||||||
### 3. Создан упрощенный docker-compose
|
|
||||||
- Файл `docker-compose-simple.yml` без nginx для быстрого запуска
|
|
||||||
|
|
||||||
## Решения
|
|
||||||
|
|
||||||
### Вариант 1: С исправленным nginx
|
|
||||||
|
|
||||||
1. **Скопируйте обновленные файлы**:
|
|
||||||
- `backend/daemons.py`
|
|
||||||
- `nginx/default.conf`
|
|
||||||
- `docker-compose.yml`
|
|
||||||
|
|
||||||
2. **Создайте папку data**:
|
|
||||||
```bash
|
|
||||||
mkdir -p data
|
|
||||||
touch data/users.json
|
|
||||||
touch data/tickets.json
|
|
||||||
touch data/daemons.json
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Перезапустите**:
|
|
||||||
```bash
|
|
||||||
docker-compose down
|
|
||||||
docker-compose up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
### Вариант 2: Без nginx (РЕКОМЕНДУЕТСЯ)
|
|
||||||
|
|
||||||
1. **Используйте упрощенный docker-compose**:
|
|
||||||
```bash
|
|
||||||
# Остановите текущие контейнеры
|
|
||||||
docker-compose down
|
|
||||||
|
|
||||||
# Создайте папку data
|
|
||||||
mkdir -p data
|
|
||||||
touch data/users.json
|
|
||||||
touch data/tickets.json
|
|
||||||
touch data/daemons.json
|
|
||||||
|
|
||||||
# Запустите с упрощенной конфигурацией
|
|
||||||
docker-compose -f docker-compose-simple.yml up --build -d
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Панель будет доступна напрямую на порту 80**
|
|
||||||
|
|
||||||
### Вариант 3: Быстрое исправление текущей проблемы
|
|
||||||
|
|
||||||
Если не хотите менять файлы:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Остановите nginx
|
|
||||||
docker-compose stop nginx
|
|
||||||
|
|
||||||
# 2. Создайте папку data
|
|
||||||
mkdir -p data
|
|
||||||
echo '{"admin":{"username":"admin","password":"$2b$12$PAaomoUWn3Ip5ov.S/uYPeTIRiDMq7DbA57ahyYQnw3QHT2zuYMlG","role":"owner","servers":[],"permissions":{"manage_users":true,"manage_roles":true,"manage_servers":true,"manage_tickets":true,"manage_files":true,"delete_users":true,"view_all_resources":true},"resource_access":{"servers":[],"tickets":[],"files":[]}}}' > data/users.json
|
|
||||||
echo '{}' > data/tickets.json
|
|
||||||
echo '{}' > data/daemons.json
|
|
||||||
|
|
||||||
# 3. Измените порты mc-panel в docker-compose.yml
|
|
||||||
# Замените "8000:8000" на "80:8000"
|
|
||||||
|
|
||||||
# 4. Перезапустите только mc-panel
|
|
||||||
docker-compose up -d mc-panel
|
|
||||||
```
|
|
||||||
|
|
||||||
## Проверка
|
|
||||||
|
|
||||||
После любого из вариантов:
|
|
||||||
|
|
||||||
1. **Проверьте статус**:
|
|
||||||
```bash
|
|
||||||
docker-compose ps
|
|
||||||
# или для упрощенной версии:
|
|
||||||
docker-compose -f docker-compose-simple.yml ps
|
|
||||||
```
|
|
||||||
|
|
||||||
2. **Проверьте логи**:
|
|
||||||
```bash
|
|
||||||
docker-compose logs mc-panel
|
|
||||||
```
|
|
||||||
|
|
||||||
3. **Откройте панель**:
|
|
||||||
- Перейдите на IP сервера
|
|
||||||
- Должна открыться панель управления
|
|
||||||
- Логин: `admin`, пароль: `Admin`
|
|
||||||
|
|
||||||
## Структура файлов
|
|
||||||
|
|
||||||
```
|
|
||||||
📁 Проект
|
|
||||||
├── 📁 nginx/
|
|
||||||
│ └── default.conf # ✅ Полная nginx конфигурация
|
|
||||||
│
|
|
||||||
├── 📁 backend/
|
|
||||||
│ └── daemons.py # ✅ Исправлен путь к data/
|
|
||||||
│
|
|
||||||
├── docker-compose.yml # ✅ С nginx
|
|
||||||
├── docker-compose-simple.yml # ✅ Без nginx (рекомендуется)
|
|
||||||
│
|
|
||||||
└── 📁 data/ # Создать вручную
|
|
||||||
├── users.json
|
|
||||||
├── tickets.json
|
|
||||||
└── daemons.json
|
|
||||||
```
|
|
||||||
|
|
||||||
## Рекомендация
|
|
||||||
|
|
||||||
**Используйте Вариант 2 (docker-compose-simple.yml)** - это самое простое и надежное решение:
|
|
||||||
|
|
||||||
1. Нет проблем с nginx
|
|
||||||
2. Прямой доступ к панели
|
|
||||||
3. Меньше компонентов = меньше проблем
|
|
||||||
4. Панель доступна на порту 80
|
|
||||||
|
|
||||||
Если нужен nginx (для SSL, доменов и т.д.), используйте Вариант 1 с исправленной конфигурацией.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Backend уже работает! Проблема только в nginx. Используйте упрощенную версию без nginx для быстрого запуска.**
|
|
||||||
125
DOCKER_README.md
125
DOCKER_README.md
@@ -1,125 +0,0 @@
|
|||||||
# MC Panel - Docker Setup
|
|
||||||
|
|
||||||
## Быстрый запуск
|
|
||||||
|
|
||||||
### Windows
|
|
||||||
```bash
|
|
||||||
# Запуск
|
|
||||||
docker-start.bat
|
|
||||||
|
|
||||||
# Остановка
|
|
||||||
docker-stop.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
### Linux/macOS
|
|
||||||
```bash
|
|
||||||
# Запуск
|
|
||||||
docker-compose up --build -d
|
|
||||||
|
|
||||||
# Остановка
|
|
||||||
docker-compose down
|
|
||||||
```
|
|
||||||
|
|
||||||
## Требования
|
|
||||||
|
|
||||||
- Docker Desktop 4.0+
|
|
||||||
- Docker Compose 2.0+
|
|
||||||
- Минимум 2GB RAM
|
|
||||||
- Минимум 5GB свободного места
|
|
||||||
|
|
||||||
## Конфигурация
|
|
||||||
|
|
||||||
1. Скопируйте `.env.docker` в `.env`
|
|
||||||
2. Отредактируйте переменные окружения в `.env`
|
|
||||||
3. Запустите контейнеры
|
|
||||||
|
|
||||||
## Структура
|
|
||||||
|
|
||||||
```
|
|
||||||
mc-panel/
|
|
||||||
├── Dockerfile # Основной Dockerfile
|
|
||||||
├── docker-compose.yml # Конфигурация сервисов
|
|
||||||
├── .env.docker # Шаблон переменных окружения
|
|
||||||
├── docker-start.bat # Скрипт запуска (Windows)
|
|
||||||
└── docker-stop.bat # Скрипт остановки (Windows)
|
|
||||||
```
|
|
||||||
|
|
||||||
## Volumes
|
|
||||||
|
|
||||||
- `mc_servers` - Серверы Minecraft
|
|
||||||
- `mc_data` - Данные приложения
|
|
||||||
- `mc_logs` - Логи приложения
|
|
||||||
|
|
||||||
## Порты
|
|
||||||
|
|
||||||
- `8000` - Web интерфейс MC Panel
|
|
||||||
- `80/443` - Nginx (опционально)
|
|
||||||
|
|
||||||
## Полезные команды
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Просмотр логов
|
|
||||||
docker-compose logs -f mc-panel
|
|
||||||
|
|
||||||
# Перезапуск
|
|
||||||
docker-compose restart
|
|
||||||
|
|
||||||
# Обновление образа
|
|
||||||
docker-compose build --no-cache
|
|
||||||
docker-compose up -d
|
|
||||||
|
|
||||||
# Вход в контейнер
|
|
||||||
docker-compose exec mc-panel bash
|
|
||||||
|
|
||||||
# Очистка (удаление volumes)
|
|
||||||
docker-compose down -v
|
|
||||||
|
|
||||||
# Полная очистка
|
|
||||||
docker-compose down --rmi all -v
|
|
||||||
docker system prune -a
|
|
||||||
```
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Контейнер не запускается
|
|
||||||
```bash
|
|
||||||
# Проверьте логи
|
|
||||||
docker-compose logs mc-panel
|
|
||||||
|
|
||||||
# Проверьте конфигурацию
|
|
||||||
docker-compose config
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблемы с правами доступа
|
|
||||||
```bash
|
|
||||||
# Linux/macOS - исправление прав
|
|
||||||
sudo chown -R 1000:1000 backend/servers backend/data logs
|
|
||||||
```
|
|
||||||
|
|
||||||
### Порт уже занят
|
|
||||||
```bash
|
|
||||||
# Измените порт в docker-compose.yml
|
|
||||||
ports:
|
|
||||||
- "8080:8000" # вместо 8000:8000
|
|
||||||
```
|
|
||||||
|
|
||||||
## Мониторинг
|
|
||||||
|
|
||||||
Health check доступен по адресу: `http://localhost:8000/health`
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
- Контейнер запускается от непривилегированного пользователя
|
|
||||||
- Используется multi-stage build для минимизации размера
|
|
||||||
- Секреты передаются через переменные окружения
|
|
||||||
- Volumes для персистентных данных
|
|
||||||
|
|
||||||
## Production
|
|
||||||
|
|
||||||
Для production окружения:
|
|
||||||
|
|
||||||
1. Используйте внешнюю базу данных
|
|
||||||
2. Настройте SSL/TLS через Nginx
|
|
||||||
3. Используйте Docker Swarm или Kubernetes
|
|
||||||
4. Настройте мониторинг и логирование
|
|
||||||
5. Регулярно обновляйте образы
|
|
||||||
191
DOCKER_SEPARATE_README.md
Normal file
191
DOCKER_SEPARATE_README.md
Normal file
@@ -0,0 +1,191 @@
|
|||||||
|
# MC Panel - Separate Docker Services
|
||||||
|
|
||||||
|
## Обзор
|
||||||
|
|
||||||
|
Теперь у вас есть отдельные Dockerfile для backend и frontend, что обеспечивает:
|
||||||
|
|
||||||
|
- **Лучшую изоляцию** - каждый сервис в своем контейнере
|
||||||
|
- **Независимое масштабирование** - можно масштабировать backend и frontend отдельно
|
||||||
|
- **Гибкость деплоя** - можно деплоить сервисы на разные серверы
|
||||||
|
- **Оптимизацию ресурсов** - каждый контейнер оптимизирован под свою задачу
|
||||||
|
|
||||||
|
## Структура файлов
|
||||||
|
|
||||||
|
```
|
||||||
|
mc-panel/
|
||||||
|
├── backend/
|
||||||
|
│ └── Dockerfile # Backend (FastAPI + Python)
|
||||||
|
├── frontend/
|
||||||
|
│ └── Dockerfile # Frontend (React + Nginx)
|
||||||
|
├── docker-compose.separate.yml # Production с отдельными сервисами
|
||||||
|
├── docker-compose.dev.yml # Development с hot reload
|
||||||
|
├── start-separate.bat # Запуск production
|
||||||
|
└── start-dev.bat # Запуск development
|
||||||
|
```
|
||||||
|
|
||||||
|
## Backend Dockerfile
|
||||||
|
|
||||||
|
**Особенности:**
|
||||||
|
- Базовый образ: `python:3.11-slim`
|
||||||
|
- Пользователь: `mcpanel` (UID/GID 1000)
|
||||||
|
- Порт: 8000
|
||||||
|
- Health check: `/health` endpoint
|
||||||
|
- Volumes: `/app/servers`, `/app/data`, `/app/logs`
|
||||||
|
- Init процесс: `tini`
|
||||||
|
|
||||||
|
**Команда сборки:**
|
||||||
|
```bash
|
||||||
|
cd backend
|
||||||
|
docker build -t mc-panel-backend .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Frontend Dockerfile
|
||||||
|
|
||||||
|
**Multi-stage сборка:**
|
||||||
|
|
||||||
|
### Stage 1: Builder
|
||||||
|
- Базовый образ: `node:20-alpine`
|
||||||
|
- Собирает React приложение
|
||||||
|
- Оптимизирует статические файлы
|
||||||
|
|
||||||
|
### Stage 2: Production
|
||||||
|
- Базовый образ: `nginx:alpine`
|
||||||
|
- Служит статические файлы
|
||||||
|
- Проксирует API запросы к backend
|
||||||
|
- Поддерживает React Router (SPA)
|
||||||
|
|
||||||
|
### Stage 3: Development
|
||||||
|
- Базовый образ: `node:20-alpine`
|
||||||
|
- Vite dev server с hot reload
|
||||||
|
- Порт: 5173
|
||||||
|
|
||||||
|
**Команда сборки:**
|
||||||
|
```bash
|
||||||
|
cd frontend
|
||||||
|
# Production
|
||||||
|
docker build --target production -t mc-panel-frontend .
|
||||||
|
# Development
|
||||||
|
docker build --target development -t mc-panel-frontend-dev .
|
||||||
|
```
|
||||||
|
|
||||||
|
## Способы запуска
|
||||||
|
|
||||||
|
### 1. Production (отдельные сервисы)
|
||||||
|
```bash
|
||||||
|
# Windows
|
||||||
|
start-separate.bat
|
||||||
|
|
||||||
|
# Linux/macOS
|
||||||
|
docker-compose -f docker-compose.separate.yml up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Доступ:**
|
||||||
|
- Frontend: http://localhost
|
||||||
|
- Backend API: http://localhost:8000
|
||||||
|
|
||||||
|
### 2. Development (с hot reload)
|
||||||
|
```bash
|
||||||
|
# Windows
|
||||||
|
start-dev.bat
|
||||||
|
|
||||||
|
# Linux/macOS
|
||||||
|
docker-compose -f docker-compose.dev.yml up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
**Доступ:**
|
||||||
|
- Frontend Dev: http://localhost:5173
|
||||||
|
- Backend API: http://localhost:8000
|
||||||
|
|
||||||
|
### 3. Оригинальный (монолитный)
|
||||||
|
```bash
|
||||||
|
# Windows
|
||||||
|
docker-start.bat
|
||||||
|
|
||||||
|
# Linux/macOS
|
||||||
|
docker-compose up --build -d
|
||||||
|
```
|
||||||
|
|
||||||
|
## Конфигурация Nginx (Frontend)
|
||||||
|
|
||||||
|
Frontend Dockerfile включает оптимизированную конфигурацию Nginx:
|
||||||
|
|
||||||
|
- **Gzip сжатие** для статических файлов
|
||||||
|
- **Кеширование** статических ресурсов (1 год)
|
||||||
|
- **Security headers** (XSS, CSRF защита)
|
||||||
|
- **SPA поддержка** (React Router)
|
||||||
|
- **API прокси** на backend:8000
|
||||||
|
- **WebSocket прокси** для real-time функций
|
||||||
|
|
||||||
|
## Переменные окружения
|
||||||
|
|
||||||
|
### Backend
|
||||||
|
```env
|
||||||
|
PORT=8000
|
||||||
|
WORKERS=2
|
||||||
|
PYTHONPATH=/app
|
||||||
|
DEBUG=false
|
||||||
|
LOG_LEVEL=INFO
|
||||||
|
```
|
||||||
|
|
||||||
|
### Frontend (Development)
|
||||||
|
```env
|
||||||
|
VITE_API_URL=http://localhost:8000
|
||||||
|
```
|
||||||
|
|
||||||
|
## Volumes
|
||||||
|
|
||||||
|
### Production
|
||||||
|
- `mc_servers` - серверы Minecraft
|
||||||
|
- `mc_data` - данные приложения
|
||||||
|
- `mc_logs` - логи
|
||||||
|
|
||||||
|
### Development
|
||||||
|
- `mc_servers_dev` - серверы (dev)
|
||||||
|
- `mc_data_dev` - данные (dev)
|
||||||
|
- `mc_logs_dev` - логи (dev)
|
||||||
|
|
||||||
|
## Полезные команды
|
||||||
|
|
||||||
|
### Логи
|
||||||
|
```bash
|
||||||
|
# Production
|
||||||
|
docker-compose -f docker-compose.separate.yml logs -f backend
|
||||||
|
docker-compose -f docker-compose.separate.yml logs -f frontend
|
||||||
|
|
||||||
|
# Development
|
||||||
|
docker-compose -f docker-compose.dev.yml logs -f backend-dev
|
||||||
|
docker-compose -f docker-compose.dev.yml logs -f frontend-dev
|
||||||
|
```
|
||||||
|
|
||||||
|
### Остановка
|
||||||
|
```bash
|
||||||
|
# Production
|
||||||
|
docker-compose -f docker-compose.separate.yml down
|
||||||
|
|
||||||
|
# Development
|
||||||
|
docker-compose -f docker-compose.dev.yml down
|
||||||
|
```
|
||||||
|
|
||||||
|
### Пересборка
|
||||||
|
```bash
|
||||||
|
# Production
|
||||||
|
docker-compose -f docker-compose.separate.yml build --no-cache
|
||||||
|
|
||||||
|
# Development
|
||||||
|
docker-compose -f docker-compose.dev.yml build --no-cache
|
||||||
|
```
|
||||||
|
|
||||||
|
## Преимущества отдельных сервисов
|
||||||
|
|
||||||
|
1. **Масштабирование**: можно запустить несколько backend инстансов
|
||||||
|
2. **Обновления**: можно обновлять frontend и backend независимо
|
||||||
|
3. **Мониторинг**: отдельные метрики для каждого сервиса
|
||||||
|
4. **Безопасность**: изоляция сервисов
|
||||||
|
5. **Разработка**: разные команды могут работать независимо
|
||||||
|
|
||||||
|
## Рекомендации
|
||||||
|
|
||||||
|
- **Для разработки**: используйте `docker-compose.dev.yml`
|
||||||
|
- **Для тестирования**: используйте `docker-compose.separate.yml`
|
||||||
|
- **Для production**: рассмотрите Kubernetes или Docker Swarm
|
||||||
|
- **Для CI/CD**: можно собирать образы отдельно и деплоить независимо
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
# ✅ Drone CI - Исправления и настройка
|
|
||||||
|
|
||||||
## 🐛 Исправленные проблемы
|
|
||||||
|
|
||||||
### 1. Python lint падал на ошибках форматирования
|
|
||||||
**Решение:** Убраны блокирующие проверки (black, isort, pylint), оставлены только критические
|
|
||||||
|
|
||||||
### 2. Trivy сканирование падало с 401 Unauthorized
|
|
||||||
**Решение:** Отключено сканирование (требует авторизации в registry)
|
|
||||||
|
|
||||||
## 📋 Текущая конфигурация `.drone.yml`
|
|
||||||
|
|
||||||
### Pipeline 1: code-quality
|
|
||||||
- ✅ Python lint (только критические ошибки E9, F63, F7, F82)
|
|
||||||
- ✅ Frontend lint (non-blocking)
|
|
||||||
- ✅ Python security (non-blocking)
|
|
||||||
- ✅ Frontend security (non-blocking)
|
|
||||||
|
|
||||||
### Pipeline 2: build-and-publish
|
|
||||||
- ✅ Build and push Docker image
|
|
||||||
- ⚠️ Scan image (отключено, показывает предупреждение)
|
|
||||||
|
|
||||||
## 🔧 Опциональная настройка Trivy
|
|
||||||
|
|
||||||
Если нужно включить сканирование образов, используйте файл `.drone.yml.with-trivy`:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Замените текущий .drone.yml
|
|
||||||
cp .drone.yml.with-trivy .drone.yml
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требования:**
|
|
||||||
- Секреты `docker_username` и `docker_password` должны быть настроены в Drone UI
|
|
||||||
- Trivy будет использовать эти же учетные данные для доступа к registry
|
|
||||||
|
|
||||||
## 📊 Статус pipeline
|
|
||||||
|
|
||||||
| Этап | Статус | Блокирует? |
|
|
||||||
|------|--------|------------|
|
|
||||||
| Python lint (critical) | ✅ Работает | Да |
|
|
||||||
| Frontend lint | ✅ Работает | Нет |
|
|
||||||
| Python security | ✅ Работает | Нет |
|
|
||||||
| Frontend security | ✅ Работает | Нет |
|
|
||||||
| Build & Push | ✅ Работает | Да |
|
|
||||||
| Trivy scan | ⚠️ Отключено | Нет |
|
|
||||||
|
|
||||||
## 🚀 Результат
|
|
||||||
|
|
||||||
Pipeline теперь проходит успешно:
|
|
||||||
1. ✅ Критические проверки выполняются
|
|
||||||
2. ✅ Образ собирается
|
|
||||||
3. ✅ Образ публикуется в registry
|
|
||||||
4. ⚠️ Сканирование пропускается (можно включить при необходимости)
|
|
||||||
|
|
||||||
## 📝 Секреты Drone
|
|
||||||
|
|
||||||
Настройте в Drone UI:
|
|
||||||
- `docker_username` - имя пользователя для registry.nevetime.ru
|
|
||||||
- `docker_password` - пароль для registry.nevetime.ru
|
|
||||||
|
|
||||||
## 🔄 Триггеры
|
|
||||||
|
|
||||||
**code-quality:**
|
|
||||||
- Push в любую ветку
|
|
||||||
- Pull request
|
|
||||||
|
|
||||||
**build-and-publish:**
|
|
||||||
- Push в `main`, `master`, `develop`
|
|
||||||
- Создание тега
|
|
||||||
- Зависит от успешного прохождения `code-quality`
|
|
||||||
|
|
||||||
## ✅ Готово!
|
|
||||||
|
|
||||||
Теперь Drone CI работает корректно и не падает на проверках форматирования или сканировании образов.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Дата:** 2026-01-15
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Статус:** ✅ Исправлено
|
|
||||||
105
Dockerfile
105
Dockerfile
@@ -1,105 +0,0 @@
|
|||||||
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}"]
|
|
||||||
79
backend/Dockerfile
Normal file
79
backend/Dockerfile
Normal file
@@ -0,0 +1,79 @@
|
|||||||
|
# ================================
|
||||||
|
# MC Panel Backend - Production Dockerfile
|
||||||
|
# ================================
|
||||||
|
|
||||||
|
FROM python:3.11-slim AS production
|
||||||
|
|
||||||
|
# Метаданные
|
||||||
|
LABEL maintainer="MC Panel Team" \
|
||||||
|
version="2.0.0" \
|
||||||
|
description="MC Panel Backend - FastAPI Server" \
|
||||||
|
component="backend"
|
||||||
|
|
||||||
|
# Переменные окружения
|
||||||
|
ENV PYTHONDONTWRITEBYTECODE=1 \
|
||||||
|
PYTHONUNBUFFERED=1 \
|
||||||
|
PYTHONPATH=/app \
|
||||||
|
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
|
||||||
|
|
||||||
|
# Создаем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем requirements и устанавливаем зависимости
|
||||||
|
COPY requirements.txt ./
|
||||||
|
RUN pip install --no-cache-dir --upgrade pip && \
|
||||||
|
pip install --no-cache-dir -r requirements.txt
|
||||||
|
|
||||||
|
# Копируем исходный код
|
||||||
|
COPY --chown=mcpanel:mcpanel . ./
|
||||||
|
|
||||||
|
# Создаем необходимые директории
|
||||||
|
RUN mkdir -p \
|
||||||
|
servers \
|
||||||
|
data \
|
||||||
|
logs \
|
||||||
|
&& touch users.json tickets.json
|
||||||
|
|
||||||
|
# Создаем конфигурационные файлы по умолчанию если их нет
|
||||||
|
RUN [ ! -f users.json ] && echo '{}' > users.json || true && \
|
||||||
|
[ ! -f tickets.json ] && echo '{}' > tickets.json || true
|
||||||
|
|
||||||
|
# Устанавливаем права доступа
|
||||||
|
RUN chown -R mcpanel:mcpanel /app && \
|
||||||
|
chmod -R 755 /app && \
|
||||||
|
chmod +x 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/servers", "/app/data", "/app/logs"]
|
||||||
|
|
||||||
|
# Используем tini как init процесс
|
||||||
|
ENTRYPOINT ["/usr/bin/tini", "--"]
|
||||||
|
|
||||||
|
# Команда запуска
|
||||||
|
CMD ["sh", "-c", "python -m uvicorn main:app --host 0.0.0.0 --port ${PORT} --workers ${WORKERS}"]
|
||||||
@@ -1,49 +0,0 @@
|
|||||||
#!/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 "🎉 Готово!"
|
|
||||||
61
docker-compose.dev.yml
Normal file
61
docker-compose.dev.yml
Normal file
@@ -0,0 +1,61 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Backend для разработки
|
||||||
|
backend-dev:
|
||||||
|
build:
|
||||||
|
context: ./backend
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: production
|
||||||
|
container_name: mc-panel-backend-dev
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
environment:
|
||||||
|
- PORT=8000
|
||||||
|
- WORKERS=1
|
||||||
|
- PYTHONPATH=/app
|
||||||
|
- DEBUG=true
|
||||||
|
- LOG_LEVEL=DEBUG
|
||||||
|
volumes:
|
||||||
|
# Монтируем исходный код для hot reload
|
||||||
|
- ./backend:/app
|
||||||
|
- mc_servers_dev:/app/servers
|
||||||
|
- mc_data_dev:/app/data
|
||||||
|
- mc_logs_dev:/app/logs
|
||||||
|
networks:
|
||||||
|
- mc-panel-dev
|
||||||
|
command: ["python", "-m", "uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000", "--reload"]
|
||||||
|
|
||||||
|
# Frontend для разработки
|
||||||
|
frontend-dev:
|
||||||
|
build:
|
||||||
|
context: ./frontend
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: development
|
||||||
|
container_name: mc-panel-frontend-dev
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "5173:5173"
|
||||||
|
volumes:
|
||||||
|
# Монтируем исходный код для hot reload
|
||||||
|
- ./frontend:/app
|
||||||
|
- /app/node_modules
|
||||||
|
networks:
|
||||||
|
- mc-panel-dev
|
||||||
|
environment:
|
||||||
|
- VITE_API_URL=http://localhost:8000
|
||||||
|
depends_on:
|
||||||
|
- backend-dev
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mc_servers_dev:
|
||||||
|
driver: local
|
||||||
|
mc_data_dev:
|
||||||
|
driver: local
|
||||||
|
mc_logs_dev:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mc-panel-dev:
|
||||||
|
driver: bridge
|
||||||
@@ -1,80 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc-panel:
|
|
||||||
image: registry.nevetime.ru/mc-panel:${IMAGE_TAG:-latest}
|
|
||||||
container_name: mc-panel-prod
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "8000:8000"
|
|
||||||
environment:
|
|
||||||
- PORT=8000
|
|
||||||
- WORKERS=4
|
|
||||||
- PYTHONPATH=/app
|
|
||||||
- DEBUG=false
|
|
||||||
- LOG_LEVEL=WARNING
|
|
||||||
env_file:
|
|
||||||
- .env.production
|
|
||||||
volumes:
|
|
||||||
- mc_servers_prod:/app/backend/servers
|
|
||||||
- mc_data_prod:/app/backend/data
|
|
||||||
- mc_logs_prod:/app/logs
|
|
||||||
# Backup volume
|
|
||||||
- mc_backups_prod:/app/backups
|
|
||||||
networks:
|
|
||||||
- mc-panel-prod
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 5
|
|
||||||
start_period: 120s
|
|
||||||
deploy:
|
|
||||||
resources:
|
|
||||||
limits:
|
|
||||||
memory: 2G
|
|
||||||
cpus: '2.0'
|
|
||||||
reservations:
|
|
||||||
memory: 1G
|
|
||||||
cpus: '1.0'
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.mc-panel.rule=Host(`mc-panel.nevetime.ru`)"
|
|
||||||
- "traefik.http.routers.mc-panel.tls=true"
|
|
||||||
- "traefik.http.routers.mc-panel.tls.certresolver=letsencrypt"
|
|
||||||
- "traefik.http.middlewares.mc-panel-auth.basicauth.users=admin:$$2y$$10$$..."
|
|
||||||
|
|
||||||
# Backup service
|
|
||||||
backup:
|
|
||||||
image: alpine:latest
|
|
||||||
container_name: mc-panel-backup
|
|
||||||
restart: unless-stopped
|
|
||||||
volumes:
|
|
||||||
- mc_servers_prod:/data/servers:ro
|
|
||||||
- mc_data_prod:/data/app:ro
|
|
||||||
- mc_backups_prod:/backups
|
|
||||||
environment:
|
|
||||||
- BACKUP_SCHEDULE=0 2 * * * # Daily at 2 AM
|
|
||||||
- BACKUP_RETENTION=7 # Keep 7 days
|
|
||||||
command: |
|
|
||||||
sh -c '
|
|
||||||
apk add --no-cache dcron tar gzip
|
|
||||||
echo "$$BACKUP_SCHEDULE cd /data && tar -czf /backups/mc-panel-\$$(date +%Y%m%d-%H%M%S).tar.gz servers app" | crontab -
|
|
||||||
crond -f
|
|
||||||
'
|
|
||||||
networks:
|
|
||||||
- mc-panel-prod
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
mc_servers_prod:
|
|
||||||
driver: local
|
|
||||||
mc_data_prod:
|
|
||||||
driver: local
|
|
||||||
mc_logs_prod:
|
|
||||||
driver: local
|
|
||||||
mc_backups_prod:
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
networks:
|
|
||||||
mc-panel-prod:
|
|
||||||
driver: bridge
|
|
||||||
65
docker-compose.separate.local.yml
Normal file
65
docker-compose.separate.local.yml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
version: '3.8'
|
||||||
|
|
||||||
|
services:
|
||||||
|
# Backend сервис (локальная сборка)
|
||||||
|
backend:
|
||||||
|
build:
|
||||||
|
context: ./backend
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: production
|
||||||
|
container_name: mc-panel-backend-local
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "8000:8000"
|
||||||
|
environment:
|
||||||
|
- PORT=8000
|
||||||
|
- WORKERS=2
|
||||||
|
- PYTHONPATH=/app
|
||||||
|
- DEBUG=false
|
||||||
|
env_file:
|
||||||
|
- ./backend/.env
|
||||||
|
volumes:
|
||||||
|
- mc_servers_local:/app/servers
|
||||||
|
- mc_data_local:/app/data
|
||||||
|
- mc_logs_local:/app/logs
|
||||||
|
networks:
|
||||||
|
- mc-panel-local
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 60s
|
||||||
|
|
||||||
|
# Frontend сервис (локальная сборка)
|
||||||
|
frontend:
|
||||||
|
build:
|
||||||
|
context: ./frontend
|
||||||
|
dockerfile: Dockerfile
|
||||||
|
target: production
|
||||||
|
container_name: mc-panel-frontend-local
|
||||||
|
restart: unless-stopped
|
||||||
|
ports:
|
||||||
|
- "80:80"
|
||||||
|
depends_on:
|
||||||
|
- backend
|
||||||
|
networks:
|
||||||
|
- mc-panel-local
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
|
||||||
|
volumes:
|
||||||
|
mc_servers_local:
|
||||||
|
driver: local
|
||||||
|
mc_data_local:
|
||||||
|
driver: local
|
||||||
|
mc_logs_local:
|
||||||
|
driver: local
|
||||||
|
|
||||||
|
networks:
|
||||||
|
mc-panel-local:
|
||||||
|
driver: bridge
|
||||||
@@ -1,46 +0,0 @@
|
|||||||
version: '3.8'
|
|
||||||
|
|
||||||
services:
|
|
||||||
mc-panel:
|
|
||||||
image: registry.nevetime.ru/mc-panel:${IMAGE_TAG:-latest}
|
|
||||||
container_name: mc-panel-staging
|
|
||||||
restart: unless-stopped
|
|
||||||
ports:
|
|
||||||
- "8080:8000"
|
|
||||||
environment:
|
|
||||||
- PORT=8000
|
|
||||||
- WORKERS=2
|
|
||||||
- PYTHONPATH=/app
|
|
||||||
- DEBUG=false
|
|
||||||
- LOG_LEVEL=INFO
|
|
||||||
env_file:
|
|
||||||
- .env.staging
|
|
||||||
volumes:
|
|
||||||
- mc_servers_staging:/app/backend/servers
|
|
||||||
- mc_data_staging:/app/backend/data
|
|
||||||
- mc_logs_staging:/app/logs
|
|
||||||
networks:
|
|
||||||
- mc-panel-staging
|
|
||||||
healthcheck:
|
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
|
|
||||||
interval: 30s
|
|
||||||
timeout: 10s
|
|
||||||
retries: 3
|
|
||||||
start_period: 60s
|
|
||||||
labels:
|
|
||||||
- "traefik.enable=true"
|
|
||||||
- "traefik.http.routers.mc-panel-staging.rule=Host(`mc-panel-staging.nevetime.ru`)"
|
|
||||||
- "traefik.http.routers.mc-panel-staging.tls=true"
|
|
||||||
- "traefik.http.routers.mc-panel-staging.tls.certresolver=letsencrypt"
|
|
||||||
|
|
||||||
volumes:
|
|
||||||
mc_servers_staging:
|
|
||||||
driver: local
|
|
||||||
mc_data_staging:
|
|
||||||
driver: local
|
|
||||||
mc_logs_staging:
|
|
||||||
driver: local
|
|
||||||
|
|
||||||
networks:
|
|
||||||
mc-panel-staging:
|
|
||||||
driver: bridge
|
|
||||||
@@ -1,53 +1,50 @@
|
|||||||
version: '3.8'
|
version: '3.8'
|
||||||
|
|
||||||
services:
|
services:
|
||||||
mc-panel:
|
# Backend сервис
|
||||||
build:
|
backend:
|
||||||
context: .
|
image: registry.nevetime.ru/mc-panel-backend:${IMAGE_TAG:-latest}
|
||||||
dockerfile: Dockerfile
|
container_name: mc-panel-backend
|
||||||
target: production
|
|
||||||
container_name: mc-panel
|
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "8000:8000"
|
- "8000:8000"
|
||||||
environment:
|
environment:
|
||||||
- PORT=8000
|
- PORT=8000
|
||||||
- WORKERS=1
|
- WORKERS=2
|
||||||
- PYTHONPATH=/app
|
- PYTHONPATH=/app
|
||||||
|
- DEBUG=false
|
||||||
|
env_file:
|
||||||
|
- ./backend/.env
|
||||||
volumes:
|
volumes:
|
||||||
# Персистентные данные
|
- mc_servers:/app/servers
|
||||||
- mc_servers:/app/backend/servers
|
- mc_data:/app/data
|
||||||
- mc_data:/app/backend/data
|
|
||||||
- mc_logs:/app/logs
|
- mc_logs:/app/logs
|
||||||
# Конфигурационные файлы (опционально)
|
|
||||||
- ./backend/.env:/app/backend/.env:ro
|
|
||||||
- ./daemon/.env:/app/daemon/.env:ro
|
|
||||||
networks:
|
networks:
|
||||||
- mc-panel-network
|
- mc-panel-network
|
||||||
healthcheck:
|
healthcheck:
|
||||||
test: ["CMD", "curl", "-f", "http://localhost:8000/"]
|
test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
|
||||||
interval: 30
|
interval: 30s
|
||||||
timeout: 10
|
timeout: 10s
|
||||||
retries: 3
|
retries: 3
|
||||||
start_period: 60
|
start_period: 60s
|
||||||
|
|
||||||
# Nginx reverse proxy (опционально)
|
# Frontend сервис
|
||||||
nginx:
|
frontend:
|
||||||
image: nginx:alpine
|
image: registry.nevetime.ru/mc-panel-frontend:${IMAGE_TAG:-latest}
|
||||||
container_name: mc-panel-nginx
|
container_name: mc-panel-frontend
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
ports:
|
ports:
|
||||||
- "80:80"
|
- "80:80"
|
||||||
- "443:443"
|
|
||||||
volumes:
|
|
||||||
- ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro
|
|
||||||
- ./nginx/ssl:/etc/nginx/ssl:ro
|
|
||||||
depends_on:
|
depends_on:
|
||||||
- mc-panel
|
- backend
|
||||||
networks:
|
networks:
|
||||||
- mc-panel-network
|
- mc-panel-network
|
||||||
profiles:
|
healthcheck:
|
||||||
- nginx
|
test: ["CMD", "curl", "-f", "http://localhost/health"]
|
||||||
|
interval: 30s
|
||||||
|
timeout: 10s
|
||||||
|
retries: 3
|
||||||
|
start_period: 30s
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
mc_servers:
|
mc_servers:
|
||||||
|
|||||||
@@ -1,61 +0,0 @@
|
|||||||
@echo off
|
|
||||||
echo ================================
|
|
||||||
echo MC Panel Docker Startup Script
|
|
||||||
echo ================================
|
|
||||||
|
|
||||||
REM Проверяем наличие Docker
|
|
||||||
docker --version >nul 2>&1
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ERROR: Docker не установлен или не запущен!
|
|
||||||
echo Установите Docker Desktop: https://www.docker.com/products/docker-desktop
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
REM Проверяем наличие docker-compose
|
|
||||||
docker-compose --version >nul 2>&1
|
|
||||||
if %errorlevel% neq 0 (
|
|
||||||
echo ERROR: Docker Compose не найден!
|
|
||||||
echo Убедитесь что Docker Desktop установлен правильно
|
|
||||||
pause
|
|
||||||
exit /b 1
|
|
||||||
)
|
|
||||||
|
|
||||||
echo Проверяем конфигурационные файлы...
|
|
||||||
|
|
||||||
REM Создаем .env файл если его нет
|
|
||||||
if not exist ".env" (
|
|
||||||
echo Создаем .env файл из шаблона...
|
|
||||||
copy ".env.docker" ".env"
|
|
||||||
echo ВНИМАНИЕ: Отредактируйте .env файл перед запуском!
|
|
||||||
echo Нажмите любую клавишу для продолжения...
|
|
||||||
pause >nul
|
|
||||||
)
|
|
||||||
|
|
||||||
REM Создаем необходимые директории
|
|
||||||
if not exist "backend\servers" mkdir "backend\servers"
|
|
||||||
if not exist "backend\data" mkdir "backend\data"
|
|
||||||
if not exist "logs" mkdir "logs"
|
|
||||||
|
|
||||||
echo Запускаем MC Panel...
|
|
||||||
docker-compose up --build -d
|
|
||||||
|
|
||||||
if %errorlevel% equ 0 (
|
|
||||||
echo.
|
|
||||||
echo ================================
|
|
||||||
echo MC Panel успешно запущен!
|
|
||||||
echo ================================
|
|
||||||
echo Web интерфейс: http://localhost:8000
|
|
||||||
echo.
|
|
||||||
echo Полезные команды:
|
|
||||||
echo docker-compose logs -f mc-panel - просмотр логов
|
|
||||||
echo docker-compose stop - остановка
|
|
||||||
echo docker-compose down - остановка и удаление контейнеров
|
|
||||||
echo docker-compose restart - перезапуск
|
|
||||||
echo.
|
|
||||||
) else (
|
|
||||||
echo ERROR: Ошибка при запуске контейнеров!
|
|
||||||
echo Проверьте логи: docker-compose logs
|
|
||||||
)
|
|
||||||
|
|
||||||
pause
|
|
||||||
@@ -1,23 +0,0 @@
|
|||||||
@echo off
|
|
||||||
echo ================================
|
|
||||||
echo MC Panel Docker Stop Script
|
|
||||||
echo ================================
|
|
||||||
|
|
||||||
echo Останавливаем MC Panel...
|
|
||||||
docker-compose down
|
|
||||||
|
|
||||||
if %errorlevel% equ 0 (
|
|
||||||
echo MC Panel успешно остановлен!
|
|
||||||
) else (
|
|
||||||
echo Ошибка при остановке контейнеров
|
|
||||||
)
|
|
||||||
|
|
||||||
echo.
|
|
||||||
echo Для полной очистки (удаление volumes):
|
|
||||||
echo docker-compose down -v
|
|
||||||
echo.
|
|
||||||
echo Для удаления образов:
|
|
||||||
echo docker-compose down --rmi all
|
|
||||||
echo.
|
|
||||||
|
|
||||||
pause
|
|
||||||
207
frontend/Dockerfile
Normal file
207
frontend/Dockerfile
Normal file
@@ -0,0 +1,207 @@
|
|||||||
|
# ================================
|
||||||
|
# MC Panel Frontend - Multi-Stage Dockerfile
|
||||||
|
# ================================
|
||||||
|
|
||||||
|
# Stage 1: Build Stage
|
||||||
|
FROM node:20-alpine AS builder
|
||||||
|
|
||||||
|
# Метаданные
|
||||||
|
LABEL maintainer="MC Panel Team" \
|
||||||
|
version="2.0.0" \
|
||||||
|
description="MC Panel Frontend - React Build Stage" \
|
||||||
|
component="frontend"
|
||||||
|
|
||||||
|
# Устанавливаем зависимости для сборки
|
||||||
|
RUN apk add --no-cache git python3 make g++
|
||||||
|
|
||||||
|
# Создаем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Копируем package files для кеширования зависимостей
|
||||||
|
COPY package*.json ./
|
||||||
|
|
||||||
|
# Устанавливаем зависимости
|
||||||
|
RUN npm ci --silent
|
||||||
|
|
||||||
|
# Копируем исходный код
|
||||||
|
COPY . ./
|
||||||
|
|
||||||
|
# Собираем приложение для production
|
||||||
|
RUN npm run build
|
||||||
|
|
||||||
|
# Проверяем размер сборки
|
||||||
|
RUN du -sh dist/ && \
|
||||||
|
echo "Build completed successfully"
|
||||||
|
|
||||||
|
# ================================
|
||||||
|
# Stage 2: Production Stage (Nginx)
|
||||||
|
# ================================
|
||||||
|
FROM nginx:alpine AS production
|
||||||
|
|
||||||
|
# Метаданные
|
||||||
|
LABEL maintainer="MC Panel Team" \
|
||||||
|
version="2.0.0" \
|
||||||
|
description="MC Panel Frontend - Nginx Production Server" \
|
||||||
|
component="frontend"
|
||||||
|
|
||||||
|
# Устанавливаем дополнительные пакеты
|
||||||
|
RUN apk add --no-cache curl tini
|
||||||
|
|
||||||
|
# Создаем пользователя nginx если его нет
|
||||||
|
RUN addgroup -g 1000 -S mcpanel && \
|
||||||
|
adduser -u 1000 -D -S -G mcpanel mcpanel
|
||||||
|
|
||||||
|
# Копируем собранное приложение из builder stage
|
||||||
|
COPY --from=builder /app/dist /usr/share/nginx/html
|
||||||
|
|
||||||
|
# Создаем кастомную конфигурацию Nginx
|
||||||
|
RUN cat > /etc/nginx/conf.d/default.conf << 'EOF'
|
||||||
|
server {
|
||||||
|
listen 80;
|
||||||
|
listen [::]:80;
|
||||||
|
server_name _;
|
||||||
|
|
||||||
|
root /usr/share/nginx/html;
|
||||||
|
index index.html;
|
||||||
|
|
||||||
|
# Gzip compression
|
||||||
|
gzip on;
|
||||||
|
gzip_vary on;
|
||||||
|
gzip_min_length 1024;
|
||||||
|
gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json;
|
||||||
|
|
||||||
|
# Security headers
|
||||||
|
add_header X-Frame-Options "SAMEORIGIN" always;
|
||||||
|
add_header X-Content-Type-Options "nosniff" always;
|
||||||
|
add_header X-XSS-Protection "1; mode=block" always;
|
||||||
|
add_header Referrer-Policy "no-referrer-when-downgrade" always;
|
||||||
|
|
||||||
|
# Cache static assets
|
||||||
|
location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg|woff|woff2|ttf|eot)$ {
|
||||||
|
expires 1y;
|
||||||
|
add_header Cache-Control "public, immutable";
|
||||||
|
}
|
||||||
|
|
||||||
|
# Handle React Router (SPA)
|
||||||
|
location / {
|
||||||
|
try_files $uri $uri/ /index.html;
|
||||||
|
}
|
||||||
|
|
||||||
|
# API proxy (если нужно)
|
||||||
|
location /api/ {
|
||||||
|
proxy_pass http://backend:8000/;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# WebSocket proxy (если нужно)
|
||||||
|
location /ws/ {
|
||||||
|
proxy_pass http://backend:8000/ws/;
|
||||||
|
proxy_http_version 1.1;
|
||||||
|
proxy_set_header Upgrade $http_upgrade;
|
||||||
|
proxy_set_header Connection "upgrade";
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Real-IP $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||||
|
proxy_set_header X-Forwarded-Proto $scheme;
|
||||||
|
}
|
||||||
|
|
||||||
|
# Health check endpoint
|
||||||
|
location /health {
|
||||||
|
access_log off;
|
||||||
|
return 200 "healthy\n";
|
||||||
|
add_header Content-Type text/plain;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Создаем кастомную конфигурацию nginx.conf
|
||||||
|
RUN cat > /etc/nginx/nginx.conf << 'EOF'
|
||||||
|
user nginx;
|
||||||
|
worker_processes auto;
|
||||||
|
error_log /var/log/nginx/error.log notice;
|
||||||
|
pid /var/run/nginx.pid;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
use epoll;
|
||||||
|
multi_accept on;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
|
||||||
|
'$status $body_bytes_sent "$http_referer" '
|
||||||
|
'"$http_user_agent" "$http_x_forwarded_for"';
|
||||||
|
|
||||||
|
access_log /var/log/nginx/access.log main;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
tcp_nopush on;
|
||||||
|
tcp_nodelay on;
|
||||||
|
keepalive_timeout 65;
|
||||||
|
types_hash_max_size 2048;
|
||||||
|
client_max_body_size 100M;
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
}
|
||||||
|
EOF
|
||||||
|
|
||||||
|
# Health check
|
||||||
|
HEALTHCHECK --interval=30s --timeout=10s --start-period=30s --retries=3 \
|
||||||
|
CMD curl -f http://localhost/health || exit 1
|
||||||
|
|
||||||
|
# Expose порт
|
||||||
|
EXPOSE 80
|
||||||
|
|
||||||
|
# Используем tini как init процесс
|
||||||
|
ENTRYPOINT ["/sbin/tini", "--"]
|
||||||
|
|
||||||
|
# Команда запуска
|
||||||
|
CMD ["nginx", "-g", "daemon off;"]
|
||||||
|
|
||||||
|
# ================================
|
||||||
|
# Stage 3: Development Stage
|
||||||
|
# ================================
|
||||||
|
FROM node:20-alpine AS development
|
||||||
|
|
||||||
|
# Метаданные
|
||||||
|
LABEL maintainer="MC Panel Team" \
|
||||||
|
version="2.0.0" \
|
||||||
|
description="MC Panel Frontend - Development Server" \
|
||||||
|
component="frontend"
|
||||||
|
|
||||||
|
# Устанавливаем зависимости для разработки
|
||||||
|
RUN apk add --no-cache git python3 make g++
|
||||||
|
|
||||||
|
# Создаем пользователя для разработки
|
||||||
|
RUN addgroup -g 1000 -S mcpanel && \
|
||||||
|
adduser -u 1000 -D -S -G mcpanel mcpanel
|
||||||
|
|
||||||
|
# Создаем рабочую директорию
|
||||||
|
WORKDIR /app
|
||||||
|
|
||||||
|
# Меняем владельца директории
|
||||||
|
RUN chown mcpanel:mcpanel /app
|
||||||
|
|
||||||
|
# Переключаемся на пользователя
|
||||||
|
USER mcpanel
|
||||||
|
|
||||||
|
# Копируем package files
|
||||||
|
COPY --chown=mcpanel:mcpanel package*.json ./
|
||||||
|
|
||||||
|
# Устанавливаем зависимости
|
||||||
|
RUN npm ci
|
||||||
|
|
||||||
|
# Копируем исходный код
|
||||||
|
COPY --chown=mcpanel:mcpanel . ./
|
||||||
|
|
||||||
|
# Expose порт для dev сервера
|
||||||
|
EXPOSE 5173
|
||||||
|
|
||||||
|
# Команда для разработки
|
||||||
|
CMD ["npm", "run", "dev"]
|
||||||
174
ОБНОВЛЕНИЯ.md
174
ОБНОВЛЕНИЯ.md
@@ -1,174 +0,0 @@
|
|||||||
# Обновления системы
|
|
||||||
|
|
||||||
## Выполнено
|
|
||||||
|
|
||||||
### 1. ✅ Очистка пользователей
|
|
||||||
- Удалены все тестовые пользователи
|
|
||||||
- Оставлен только один пользователь: `admin` (пароль тот же)
|
|
||||||
- Роль: `owner`
|
|
||||||
|
|
||||||
### 2. ✅ Удалены временные файлы
|
|
||||||
Удалены все временные .md файлы с отладкой:
|
|
||||||
- ИСПРАВЛЕНО.md
|
|
||||||
- ИСПРАВЛЕНИЕ_ACCESS_DENIED.md
|
|
||||||
- ЧТО_ДЕЛАТЬ_СЕЙЧАС.md
|
|
||||||
- ОТЛАДКА.md
|
|
||||||
- РЕШЕНИЕ_ПРОБЛЕМЫ.md
|
|
||||||
- ОБНОВЛЕНИЕ_УДАЛЕННОГО_СЕРВЕРА.md
|
|
||||||
- УСПЕХ.md
|
|
||||||
- CHANGELOG_DAEMONS.md
|
|
||||||
- QUICK_TEST_DAEMONS.md
|
|
||||||
- БЫСТРЫЙ_СТАРТ_ДЕМОНЫ.md
|
|
||||||
- test_remote_api.py
|
|
||||||
- debug_token.html
|
|
||||||
|
|
||||||
### 3. ✅ Админы и владельцы видят ВСЕ серверы
|
|
||||||
- Обновлен endpoint `/api/servers`
|
|
||||||
- Добавлена проверка: `is_admin_or_owner = user.get("role") in ["owner", "admin"]`
|
|
||||||
- Если пользователь owner или admin - видит все серверы
|
|
||||||
- Обычные пользователи видят только свои серверы
|
|
||||||
- Добавлено поле `owner` в ответе API
|
|
||||||
|
|
||||||
### 4. ✅ Выбор демона при создании сервера
|
|
||||||
- Обновлен компонент `CreateServerModal.jsx`:
|
|
||||||
- Добавлен выпадающий список с демонами
|
|
||||||
- Загружаются только онлайн демоны
|
|
||||||
- По умолчанию выбран "Локальный (эта машина)"
|
|
||||||
- Показывается подсказка о том, где будет создан сервер
|
|
||||||
|
|
||||||
- Обновлен endpoint `/api/servers/create`:
|
|
||||||
- Поддержка параметра `daemonId`
|
|
||||||
- Если `daemonId === "local"` - создается локально
|
|
||||||
- Если указан ID демона - отправляется запрос на daemon API
|
|
||||||
- Локально сохраняется информация о сервере с префиксом `{daemonId}_{serverName}`
|
|
||||||
- Автоматическая выдача доступа пользователю
|
|
||||||
|
|
||||||
## Как использовать
|
|
||||||
|
|
||||||
### Вход в систему
|
|
||||||
```
|
|
||||||
Логин: admin
|
|
||||||
Пароль: Admin
|
|
||||||
```
|
|
||||||
|
|
||||||
### Создание сервера
|
|
||||||
|
|
||||||
1. Нажмите "Создать сервер"
|
|
||||||
2. Выберите демон из списка:
|
|
||||||
- **Локальный (эта машина)** - сервер будет на панели
|
|
||||||
- **Test Daemon** (или другой) - сервер будет на удаленном демоне
|
|
||||||
3. Заполните остальные поля
|
|
||||||
4. Нажмите "Создать"
|
|
||||||
|
|
||||||
### Просмотр серверов
|
|
||||||
|
|
||||||
- **Owner и Admin** видят ВСЕ серверы всех пользователей
|
|
||||||
- **Обычные пользователи** видят только свои серверы
|
|
||||||
- В списке серверов показывается владелец сервера
|
|
||||||
|
|
||||||
## Структура серверов на демонах
|
|
||||||
|
|
||||||
Когда сервер создается на демоне:
|
|
||||||
- **На демоне**: создается папка `servers/{server_name}/`
|
|
||||||
- **На панели**: создается запись `servers/{daemon_id}_{server_name}/` с конфигурацией
|
|
||||||
- В конфигурации сохраняется:
|
|
||||||
- `daemonId` - ID демона
|
|
||||||
- `daemonName` - название демона
|
|
||||||
- `owner` - владелец сервера
|
|
||||||
- Остальные параметры
|
|
||||||
|
|
||||||
## API изменения
|
|
||||||
|
|
||||||
### GET /api/servers
|
|
||||||
Теперь возвращает:
|
|
||||||
```json
|
|
||||||
[
|
|
||||||
{
|
|
||||||
"name": "my_server",
|
|
||||||
"displayName": "Мой сервер",
|
|
||||||
"status": "stopped",
|
|
||||||
"owner": "admin"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
```
|
|
||||||
|
|
||||||
### POST /api/servers/create
|
|
||||||
Новые параметры:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "my_server",
|
|
||||||
"displayName": "Мой сервер",
|
|
||||||
"startCommand": "java -Xmx2G -jar server.jar nogui",
|
|
||||||
"daemonId": "daemon-1" // или "local"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Ответ:
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Сервер создан",
|
|
||||||
"name": "my_server",
|
|
||||||
"daemonId": "daemon-1"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## Следующие шаги
|
|
||||||
|
|
||||||
Для полной интеграции с демонами нужно:
|
|
||||||
|
|
||||||
1. **Управление серверами на демонах**:
|
|
||||||
- Запуск/остановка через daemon API
|
|
||||||
- Отправка команд в консоль
|
|
||||||
- Получение логов
|
|
||||||
|
|
||||||
2. **Файловый менеджер для демонов**:
|
|
||||||
- Просмотр файлов на удаленном демоне
|
|
||||||
- Загрузка/скачивание файлов
|
|
||||||
- Редактирование конфигов
|
|
||||||
|
|
||||||
3. **Статистика серверов на демонах**:
|
|
||||||
- CPU/RAM использование конкретного сервера
|
|
||||||
- Онлайн игроков
|
|
||||||
- Uptime
|
|
||||||
|
|
||||||
4. **Консоль для серверов на демонах**:
|
|
||||||
- WebSocket подключение к daemon
|
|
||||||
- Просмотр логов в реальном времени
|
|
||||||
- Отправка команд
|
|
||||||
|
|
||||||
## Daemon API для создания сервера
|
|
||||||
|
|
||||||
Нужно добавить в `daemon/main.py`:
|
|
||||||
|
|
||||||
```python
|
|
||||||
@app.post("/api/servers/create")
|
|
||||||
async def create_server_on_daemon(data: dict, authorization: str = Header(None)):
|
|
||||||
"""Создать сервер на этом демоне"""
|
|
||||||
verify_key(authorization)
|
|
||||||
|
|
||||||
server_name = data.get("name")
|
|
||||||
server_path = SERVERS_DIR / server_name
|
|
||||||
|
|
||||||
if server_path.exists():
|
|
||||||
raise HTTPException(400, "Server already exists")
|
|
||||||
|
|
||||||
server_path.mkdir(parents=True)
|
|
||||||
|
|
||||||
# Сохраняем конфигурацию
|
|
||||||
config = {
|
|
||||||
"name": server_name,
|
|
||||||
"displayName": data.get("displayName", server_name),
|
|
||||||
"startCommand": data.get("startCommand", ""),
|
|
||||||
"owner": data.get("owner", "unknown")
|
|
||||||
}
|
|
||||||
|
|
||||||
config_file = server_path / "config.json"
|
|
||||||
with open(config_file, 'w', encoding='utf-8') as f:
|
|
||||||
json.dump(config, f, indent=2, ensure_ascii=False)
|
|
||||||
|
|
||||||
return {"message": "Server created", "name": server_name}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Все задачи выполнены! Система готова к использованию.**
|
|
||||||
Reference in New Issue
Block a user