From 1a3fdf131c397f2bfd62e538b85272228e5969de Mon Sep 17 00:00:00 2001 From: arkonsadter Date: Wed, 21 Jan 2026 19:14:22 +0600 Subject: [PATCH] Fixed dockerfile --- .drone.yml | 123 +++++++++++--- .env.docker | 63 ------- .env.example | 40 ----- .env.production.example | 75 --------- .env.staging.example | 62 ------- CHANGELOG.md | 157 ------------------ CI_CD_README.md | 211 ------------------------ DAEMON_SETUP.md | 264 ------------------------------ DOCKER_FIX.md | 137 ---------------- DOCKER_README.md | 125 -------------- DOCKER_SEPARATE_README.md | 191 +++++++++++++++++++++ DRONE_CI_FIXED.md | 80 --------- Dockerfile | 105 ------------ backend/Dockerfile | 79 +++++++++ docker-build.sh | 49 ------ docker-compose.dev.yml | 61 +++++++ docker-compose.prod.yml | 80 --------- docker-compose.separate.local.yml | 65 ++++++++ docker-compose.staging.yml | 46 ------ docker-compose.yml | 53 +++--- docker-start.bat | 61 ------- docker-stop.bat | 23 --- frontend/Dockerfile | 207 +++++++++++++++++++++++ ОБНОВЛЕНИЯ.md | 174 -------------------- 24 files changed, 729 insertions(+), 1802 deletions(-) delete mode 100644 .env.docker delete mode 100644 .env.example delete mode 100644 .env.production.example delete mode 100644 .env.staging.example delete mode 100644 CHANGELOG.md delete mode 100644 CI_CD_README.md delete mode 100644 DAEMON_SETUP.md delete mode 100644 DOCKER_FIX.md delete mode 100644 DOCKER_README.md create mode 100644 DOCKER_SEPARATE_README.md delete mode 100644 DRONE_CI_FIXED.md delete mode 100644 Dockerfile create mode 100644 backend/Dockerfile delete mode 100644 docker-build.sh create mode 100644 docker-compose.dev.yml delete mode 100644 docker-compose.prod.yml create mode 100644 docker-compose.separate.local.yml delete mode 100644 docker-compose.staging.yml delete mode 100644 docker-start.bat delete mode 100644 docker-stop.bat create mode 100644 frontend/Dockerfile delete mode 100644 ОБНОВЛЕНИЯ.md diff --git a/.drone.yml b/.drone.yml index f13810c..9b54446 100644 --- a/.drone.yml +++ b/.drone.yml @@ -39,7 +39,7 @@ steps: --- kind: pipeline type: docker -name: build-and-publish +name: build-backend trigger: branch: @@ -54,7 +54,94 @@ depends_on: - code-quality 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 settings: registry: registry.nevetime.ru @@ -79,18 +166,6 @@ steps: - push - 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 type: docker @@ -103,10 +178,12 @@ trigger: - push depends_on: - - build-and-publish + - build-backend + - build-frontend + - build-monolith steps: - - name: deploy-to-staging + - name: deploy-separate-services image: alpine:latest environment: STAGING_HOST: @@ -117,10 +194,10 @@ steps: from_secret: staging_ssh_key commands: - apk add --no-cache openssh-client - - echo "Deploying to staging..." + - echo "Deploying separate services to staging..." - echo "$STAGING_KEY" | base64 -d > /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 @@ -134,10 +211,12 @@ trigger: - tag depends_on: - - build-and-publish + - build-backend + - build-frontend + - build-monolith steps: - - name: deploy-to-production + - name: deploy-separate-services image: alpine:latest environment: PROD_HOST: @@ -148,7 +227,7 @@ steps: from_secret: production_ssh_key commands: - apk add --no-cache openssh-client - - echo "Deploying to production..." + - echo "Deploying separate services to production..." - echo "$PROD_KEY" | base64 -d > /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}" \ No newline at end of file + - 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}" \ No newline at end of file diff --git a/.env.docker b/.env.docker deleted file mode 100644 index 8362ed7..0000000 --- a/.env.docker +++ /dev/null @@ -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 \ No newline at end of file diff --git a/.env.example b/.env.example deleted file mode 100644 index 47a4a33..0000000 --- a/.env.example +++ /dev/null @@ -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 diff --git a/.env.production.example b/.env.production.example deleted file mode 100644 index 036ca72..0000000 --- a/.env.production.example +++ /dev/null @@ -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 \ No newline at end of file diff --git a/.env.staging.example b/.env.staging.example deleted file mode 100644 index c1b4732..0000000 --- a/.env.staging.example +++ /dev/null @@ -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 \ No newline at end of file diff --git a/CHANGELOG.md b/CHANGELOG.md deleted file mode 100644 index d03a302..0000000 --- a/CHANGELOG.md +++ /dev/null @@ -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 включает полную систему демонов и значительные улучшения производительности!** 🚀 \ No newline at end of file diff --git a/CI_CD_README.md b/CI_CD_README.md deleted file mode 100644 index 695b741..0000000 --- a/CI_CD_README.md +++ /dev/null @@ -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 -- Минимальные базовые образы -- Очистка кеша пакетных менеджеров - -### Безопасность -- Регулярное сканирование уязвимостей -- Обновление базовых образов -- Ротация секретов \ No newline at end of file diff --git a/DAEMON_SETUP.md b/DAEMON_SETUP.md deleted file mode 100644 index f26aa77..0000000 --- a/DAEMON_SETUP.md +++ /dev/null @@ -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. Создайте тикет в системе поддержки diff --git a/DOCKER_FIX.md b/DOCKER_FIX.md deleted file mode 100644 index 85cead1..0000000 --- a/DOCKER_FIX.md +++ /dev/null @@ -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 для быстрого запуска.** \ No newline at end of file diff --git a/DOCKER_README.md b/DOCKER_README.md deleted file mode 100644 index 327e6b3..0000000 --- a/DOCKER_README.md +++ /dev/null @@ -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. Регулярно обновляйте образы \ No newline at end of file diff --git a/DOCKER_SEPARATE_README.md b/DOCKER_SEPARATE_README.md new file mode 100644 index 0000000..7c66fd8 --- /dev/null +++ b/DOCKER_SEPARATE_README.md @@ -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**: можно собирать образы отдельно и деплоить независимо \ No newline at end of file diff --git a/DRONE_CI_FIXED.md b/DRONE_CI_FIXED.md deleted file mode 100644 index 67b4067..0000000 --- a/DRONE_CI_FIXED.md +++ /dev/null @@ -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 -**Статус:** ✅ Исправлено diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 4770f73..0000000 --- a/Dockerfile +++ /dev/null @@ -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}"] \ No newline at end of file diff --git a/backend/Dockerfile b/backend/Dockerfile new file mode 100644 index 0000000..f773a60 --- /dev/null +++ b/backend/Dockerfile @@ -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}"] \ No newline at end of file diff --git a/docker-build.sh b/docker-build.sh deleted file mode 100644 index 2abeda7..0000000 --- a/docker-build.sh +++ /dev/null @@ -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 "🎉 Готово!" \ No newline at end of file diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml new file mode 100644 index 0000000..aaa6111 --- /dev/null +++ b/docker-compose.dev.yml @@ -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 \ No newline at end of file diff --git a/docker-compose.prod.yml b/docker-compose.prod.yml deleted file mode 100644 index fcdac1e..0000000 --- a/docker-compose.prod.yml +++ /dev/null @@ -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 \ No newline at end of file diff --git a/docker-compose.separate.local.yml b/docker-compose.separate.local.yml new file mode 100644 index 0000000..4eed803 --- /dev/null +++ b/docker-compose.separate.local.yml @@ -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 \ No newline at end of file diff --git a/docker-compose.staging.yml b/docker-compose.staging.yml deleted file mode 100644 index 3daf6b7..0000000 --- a/docker-compose.staging.yml +++ /dev/null @@ -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 \ No newline at end of file diff --git a/docker-compose.yml b/docker-compose.yml index b11670c..1f53211 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -1,53 +1,50 @@ version: '3.8' services: - mc-panel: - build: - context: . - dockerfile: Dockerfile - target: production - container_name: mc-panel + # Backend сервис + backend: + image: registry.nevetime.ru/mc-panel-backend:${IMAGE_TAG:-latest} + container_name: mc-panel-backend restart: unless-stopped ports: - "8000:8000" environment: - PORT=8000 - - WORKERS=1 + - WORKERS=2 - PYTHONPATH=/app + - DEBUG=false + env_file: + - ./backend/.env volumes: - # Персистентные данные - - mc_servers:/app/backend/servers - - mc_data:/app/backend/data + - mc_servers:/app/servers + - mc_data:/app/data - mc_logs:/app/logs - # Конфигурационные файлы (опционально) - - ./backend/.env:/app/backend/.env:ro - - ./daemon/.env:/app/daemon/.env:ro networks: - mc-panel-network healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:8000/"] - interval: 30 - timeout: 10 + test: ["CMD", "curl", "-f", "http://localhost:8000/health"] + interval: 30s + timeout: 10s retries: 3 - start_period: 60 + start_period: 60s - # Nginx reverse proxy (опционально) - nginx: - image: nginx:alpine - container_name: mc-panel-nginx + # Frontend сервис + frontend: + image: registry.nevetime.ru/mc-panel-frontend:${IMAGE_TAG:-latest} + container_name: mc-panel-frontend restart: unless-stopped ports: - "80:80" - - "443:443" - volumes: - - ./nginx/nginx.conf:/etc/nginx/nginx.conf:ro - - ./nginx/ssl:/etc/nginx/ssl:ro depends_on: - - mc-panel + - backend networks: - mc-panel-network - profiles: - - nginx + healthcheck: + test: ["CMD", "curl", "-f", "http://localhost/health"] + interval: 30s + timeout: 10s + retries: 3 + start_period: 30s volumes: mc_servers: diff --git a/docker-start.bat b/docker-start.bat deleted file mode 100644 index c8ab9ce..0000000 --- a/docker-start.bat +++ /dev/null @@ -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 \ No newline at end of file diff --git a/docker-stop.bat b/docker-stop.bat deleted file mode 100644 index e2ad16e..0000000 --- a/docker-stop.bat +++ /dev/null @@ -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 \ No newline at end of file diff --git a/frontend/Dockerfile b/frontend/Dockerfile new file mode 100644 index 0000000..0cb4491 --- /dev/null +++ b/frontend/Dockerfile @@ -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"] \ No newline at end of file diff --git a/ОБНОВЛЕНИЯ.md b/ОБНОВЛЕНИЯ.md deleted file mode 100644 index da344d3..0000000 --- a/ОБНОВЛЕНИЯ.md +++ /dev/null @@ -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} -``` - ---- - -**Все задачи выполнены! Система готова к использованию.**