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

175 lines
6.2 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# Обновления системы
## Выполнено
### 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}
```
---
**Все задачи выполнены! Система готова к использованию.**