Added Daemon system and fixed interface
All checks were successful
continuous-integration/drone/push Build is passing

This commit is contained in:
2026-01-16 18:56:21 +06:00
parent fbfddf3c7a
commit d188cec1f0
24 changed files with 1974 additions and 4985 deletions

174
ОБНОВЛЕНИЯ.md Normal file
View File

@@ -0,0 +1,174 @@
# Обновления системы
## Выполнено
### 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}
```
---
**Все задачи выполнены! Система готова к использованию.**