Files
NeveTimePanel/ОБНОВЛЕНИЯ.md
arkonsadter d188cec1f0
All checks were successful
continuous-integration/drone/push Build is passing
Added Daemon system and fixed interface
2026-01-16 18:56:21 +06:00

6.2 KiB
Raw Blame History

Обновления системы

Выполнено

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

Теперь возвращает:

[
  {
    "name": "my_server",
    "displayName": "Мой сервер",
    "status": "stopped",
    "owner": "admin"
  }
]

POST /api/servers/create

Новые параметры:

{
  "name": "my_server",
  "displayName": "Мой сервер",
  "startCommand": "java -Xmx2G -jar server.jar nogui",
  "daemonId": "daemon-1"  // или "local"
}

Ответ:

{
  "message": "Сервер создан",
  "name": "my_server",
  "daemonId": "daemon-1"
}

Следующие шаги

Для полной интеграции с демонами нужно:

  1. Управление серверами на демонах:

    • Запуск/остановка через daemon API
    • Отправка команд в консоль
    • Получение логов
  2. Файловый менеджер для демонов:

    • Просмотр файлов на удаленном демоне
    • Загрузка/скачивание файлов
    • Редактирование конфигов
  3. Статистика серверов на демонах:

    • CPU/RAM использование конкретного сервера
    • Онлайн игроков
    • Uptime
  4. Консоль для серверов на демонах:

    • WebSocket подключение к daemon
    • Просмотр логов в реальном времени
    • Отправка команд

Daemon API для создания сервера

Нужно добавить в daemon/main.py:

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

Все задачи выполнены! Система готова к использованию.