Compare commits

..

16 Commits

Author SHA1 Message Date
fd84094aa4 Another attempt to fix .drone.yml...
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-22 10:37:05 +07:00
7eb2ea5662 An attempt to fix .drone.yml, deleted python-security stage
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-22 10:32:21 +07:00
de8ad67038 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-21 19:34:36 +06:00
7b1fe32871 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-21 19:30:53 +06:00
1a3fdf131c Fixed dockerfile
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-21 19:14:22 +06:00
fea553df3d fixed drone.yml
All checks were successful
continuous-integration/drone/push Build is passing
2026-01-18 20:52:38 +06:00
b4b5bba562 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 20:48:52 +06:00
49affe3891 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-18 20:27:54 +06:00
e66ecbf178 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 20:23:19 +06:00
d8f7f108c7 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 20:18:54 +06:00
217804b011 fixed docker-compose file
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 20:06:58 +06:00
643987d211 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 20:03:34 +06:00
5868c4014b fixed dockerfile
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 19:59:20 +06:00
e7b2216c72 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 19:56:38 +06:00
e4bbf50725 fixed drone.yml
Some checks failed
continuous-integration/drone/push Build encountered an error
2026-01-18 19:48:21 +06:00
0ed8039644 Fixed dockerfile
Some checks failed
continuous-integration/drone/push Build is failing
2026-01-18 19:36:21 +06:00
16 changed files with 782 additions and 1046 deletions

View File

@@ -4,7 +4,7 @@
.gitattributes .gitattributes
# CI/CD # CI/CD
.drone.yml .drone.yml*
.github .github
# Documentation # Documentation
@@ -12,6 +12,7 @@
!README.md !README.md
CHANGELOG.md CHANGELOG.md
LICENSE LICENSE
ОБНОВЛЕНИЯ.md
# IDE # IDE
.vscode .vscode
@@ -24,9 +25,8 @@ LICENSE
.DS_Store .DS_Store
Thumbs.db Thumbs.db
# Node # Node.js
frontend/node_modules frontend/node_modules
frontend/dist
frontend/.vite frontend/.vite
frontend/npm-debug.log* frontend/npm-debug.log*
frontend/yarn-debug.log* frontend/yarn-debug.log*
@@ -46,34 +46,68 @@ 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
docker-start.bat
docker-stop.bat
# Tests # Tests
tests tests
test test
*.test.js *.test.js
*.spec.js *.spec.js
__tests__
# Build artifacts # Build artifacts
build build
dist dist
*.egg-info *.egg-info
.pytest_cache
# Temporary files
tmp
temp
*.tmp
*.temp
# Batch files (Windows specific)
*.bat
# Postman collections
*.postman_collection.json
# Nginx configs (handled separately)
nginx/*
# Keys and certificates
*.key
*.pem
*.crt
*.p12
# Backup files
*.bak
*.backup

View File

@@ -1,4 +1,3 @@
---
kind: pipeline kind: pipeline
type: docker type: docker
name: code-quality name: code-quality
@@ -14,62 +13,136 @@ steps:
commands: commands:
- cd backend - cd backend
- pip install flake8 - pip install flake8
- echo "Running flake8 (critical errors only)..."
- flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics - flake8 . --count --select=E9,F63,F7,F82 --show-source --statistics
- echo "✅ Critical checks passed"
- name: frontend-lint - name: frontend-lint
image: node:18-alpine image: node:20-alpine
commands: commands:
- cd frontend - cd frontend
- npm ci - npm ci --silent
- echo "Running ESLint (non-blocking)..." - npm run lint || echo "ESLint warnings found"
- npm run lint || echo "⚠️ ESLint warnings found (non-blocking)"
- echo "✅ Frontend checks completed"
- name: python-security
image: python:3.11-slim
commands:
- cd backend
- pip install safety
- echo "Checking for known security vulnerabilities..."
- safety check --file=requirements.txt --exit-zero || echo "⚠️ Security warnings found (non-blocking)"
- echo "✅ Security checks completed"
- name: frontend-security - name: frontend-security
image: node:18-alpine image: node:20-alpine
commands: commands:
- cd frontend - cd frontend
- npm ci - npm ci --silent
- echo "Running npm audit..." - npm audit --audit-level=moderate || echo "Security warnings found"
- npm audit --audit-level=moderate || true
--- ---
kind: pipeline kind: pipeline
type: docker type: docker
name: build-and-publish name: build-backend
trigger: trigger:
event:
- push
- tag
branch: branch:
- main - main
- master - master
- develop - develop
event:
- push
- tag
depends_on: 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
repo: registry.nevetime.ru/mc-panel repo: registry.nevetime.ru/mc-panel
tags: tags:
- latest - latest
- ${DRONE_COMMIT_SHA:0:8} - "${DRONE_COMMIT_SHA:0:8}"
- "${DRONE_BRANCH}"
auto_tag: true auto_tag: true
dockerfile: Dockerfile dockerfile: Dockerfile
context: . context: .
@@ -80,21 +153,8 @@ steps:
build_args: build_args:
- BUILD_DATE=${DRONE_BUILD_CREATED} - BUILD_DATE=${DRONE_BUILD_CREATED}
- VCS_REF=${DRONE_COMMIT_SHA} - VCS_REF=${DRONE_COMMIT_SHA}
- VERSION=1.1.0 - VERSION=${DRONE_TAG:-${DRONE_BRANCH}}
when: when:
event: event:
- push - push
- tag - tag
- name: scan-image
image: aquasec/trivy
commands:
- echo "⚠️ Image scanning skipped (requires registry authentication)"
- echo "To enable scanning, configure registry credentials for Trivy"
- echo "Image published registry.nevetime.ru/mc-panel"
when:
event:
- push
- tag
depends_on:
- build-and-push

View File

@@ -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

View File

@@ -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 включает полную систему демонов и значительные улучшения производительности!** 🚀

View File

@@ -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. Создайте тикет в системе поддержки

View File

@@ -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 для быстрого запуска.**

191
DOCKER_SEPARATE_README.md Normal file
View 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**: можно собирать образы отдельно и деплоить независимо

View File

@@ -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
**Статус:** ✅ Исправлено

View File

@@ -1,63 +0,0 @@
# Multi-stage build для MC Panel
# Stage 1: Build Frontend
FROM node:18-alpine AS frontend-builder
WORKDIR /app/frontend
# Копируем package файлы
COPY frontend/package*.json ./
# Устанавливаем ВСЕ зависимости (включая dev для сборки)
RUN npm ci
# Копируем исходники фронтенда
COPY frontend/ ./
# Собираем фронтенд
RUN npm run build
# Stage 2: Backend + Frontend
FROM python:3.11-slim
# Устанавливаем системные зависимости
RUN apt-get update && apt-get install -y \
curl \
&& rm -rf /var/lib/apt/lists/*
# Создаем рабочую директорию
WORKDIR /app
# Копируем requirements и устанавливаем Python зависимости
COPY backend/requirements.txt ./backend/
RUN pip install --no-cache-dir -r backend/requirements.txt
# Копируем backend
COPY backend/ ./backend/
# Копируем собранный frontend из первого stage
COPY --from=frontend-builder /app/frontend/dist ./frontend/dist
# Создаем необходимые директории
RUN mkdir -p /app/backend/servers
# Создаем пользователя для запуска приложения
RUN useradd -m -u 1000 mcpanel && \
chown -R mcpanel:mcpanel /app
USER mcpanel
# Переменные окружения
ENV PYTHONUNBUFFERED=1
ENV PORT=8000
# Открываем порт
EXPOSE 8000
# Healthcheck
HEALTHCHECK --interval=30s --timeout=10s --start-period=5s --retries=3 \
CMD curl -f http://localhost:8000/api/auth/oidc/providers || exit 1
# Запускаем приложение
WORKDIR /app/backend
CMD ["python", "main.py"]

79
backend/Dockerfile Normal file
View 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}"]

View File

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

61
docker-compose.dev.yml Normal file
View 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

View 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

View File

@@ -1,69 +1,59 @@
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
container_name: mc-panel
restart: unless-stopped restart: unless-stopped
expose: ports:
- "8000" - "8000:8000"
environment: environment:
- ZITADEL_ISSUER=${ZITADEL_ISSUER} - PORT=8000
- ZITADEL_CLIENT_ID=${ZITADEL_CLIENT_ID} - WORKERS=2
- ZITADEL_CLIENT_SECRET=${ZITADEL_CLIENT_SECRET} - PYTHONPATH=/app
- BASE_URL=${BASE_URL:-http://localhost} - DEBUG=false
- FRONTEND_URL=${FRONTEND_URL:-http://localhost} env_file:
- SECRET_KEY=${SECRET_KEY:-change-this-in-production} - ./backend/.env
- PYTHONUNBUFFERED=1
volumes: volumes:
- ./data/servers:/app/backend/servers - mc_servers:/app/servers
- ./data/users.json:/app/backend/users.json - mc_data:/app/data
- ./data/tickets.json:/app/backend/tickets.json - mc_logs:/app/logs
- ./data:/app/data
networks: networks:
- mc-panel-network - mc-panel-network
healthcheck: healthcheck:
test: ["CMD", "curl", "-f", "http://localhost:8000/api/auth/oidc/providers"] test: ["CMD", "curl", "-f", "http://localhost:8000/health"]
interval: 30s interval: 30s
timeout: 10s timeout: 10s
retries: 3 retries: 3
start_period: 40s start_period: 60s
nginx: # Frontend сервис
image: nginx:alpine frontend:
container_name: mc-panel-nginx image: registry.nevetime.ru/mc-panel-frontend:${IMAGE_TAG:-latest}
container_name: mc-panel-frontend
restart: unless-stopped restart: unless-stopped
ports: ports:
- "80:80" - "80:80"
- "443:443"
volumes:
- ./nginx/default.conf:/etc/nginx/nginx.conf:ro
- frontend-static:/usr/share/nginx/html:ro
- ./nginx/ssl:/etc/nginx/ssl:ro
depends_on: depends_on:
- frontend-init - backend
- mc-panel
networks: networks:
- mc-panel-network - mc-panel-network
healthcheck:
test: ["CMD", "curl", "-f", "http://localhost/health"]
interval: 30s
timeout: 10s
retries: 3
start_period: 30s
frontend-init: volumes:
build: mc_servers:
context: . driver: local
dockerfile: Dockerfile mc_data:
container_name: mc-panel-frontend-init driver: local
volumes: mc_logs:
- frontend-static:/tmp/frontend driver: local
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: networks:
mc-panel-network: mc-panel-network:
driver: bridge driver: bridge
volumes:
frontend-static:
driver: local

207
frontend/Dockerfile Normal file
View 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"]

View File

@@ -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}
```
---
**Все задачи выполнены! Система готова к использованию.**