Removed unused .md files
This commit is contained in:
531
API.md
531
API.md
@@ -1,531 +0,0 @@
|
|||||||
# MC Panel API - Полная документация
|
|
||||||
|
|
||||||
**Версия:** 1.0.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Содержание
|
|
||||||
|
|
||||||
1. [Базовая информация](#базовая-информация)
|
|
||||||
2. [Быстрый старт](#быстрый-старт)
|
|
||||||
3. [Аутентификация](#аутентификация)
|
|
||||||
4. [Управление пользователями](#управление-пользователями)
|
|
||||||
5. [Личный кабинет](#личный-кабинет)
|
|
||||||
6. [Управление серверами](#управление-серверами)
|
|
||||||
7. [Управление файлами](#управление-файлами)
|
|
||||||
8. [Тикеты](#тикеты)
|
|
||||||
9. [OpenID Connect](#openid-connect)
|
|
||||||
10. [Коды ошибок](#коды-ошибок)
|
|
||||||
11. [Примеры интеграции](#примеры-интеграции)
|
|
||||||
12. [Postman коллекция](#postman-коллекция)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Базовая информация
|
|
||||||
|
|
||||||
**Base URL:** `http://localhost:8000`
|
|
||||||
|
|
||||||
**Формат данных:** JSON
|
|
||||||
|
|
||||||
**Аутентификация:** Bearer Token (JWT)
|
|
||||||
|
|
||||||
Все защищенные эндпоинты требуют заголовок:
|
|
||||||
```
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Заголовки запросов
|
|
||||||
```
|
|
||||||
Content-Type: application/json
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
### Формат ответов
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Success message",
|
|
||||||
"data": {}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Быстрый старт
|
|
||||||
|
|
||||||
### 1. Регистрация
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8000/api/auth/register \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"username":"admin","password":"password123"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Вход
|
|
||||||
```bash
|
|
||||||
curl -X POST http://localhost:8000/api/auth/login \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"username":"admin","password":"password123"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"access_token": "eyJhbGc...",
|
|
||||||
"token_type": "bearer",
|
|
||||||
"username": "admin",
|
|
||||||
"role": "admin"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Использование токена
|
|
||||||
```bash
|
|
||||||
TOKEN="your_token_here"
|
|
||||||
|
|
||||||
curl http://localhost:8000/api/servers \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Аутентификация
|
|
||||||
|
|
||||||
### POST /api/auth/register
|
|
||||||
Регистрация нового пользователя.
|
|
||||||
|
|
||||||
**Body:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "string",
|
|
||||||
"password": "string"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response (200):**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"access_token": "string",
|
|
||||||
"token_type": "bearer",
|
|
||||||
"username": "string",
|
|
||||||
"role": "admin|user"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### POST /api/auth/login
|
|
||||||
Вход в систему.
|
|
||||||
|
|
||||||
**Body:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "string",
|
|
||||||
"password": "string"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Response (200):**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"access_token": "string",
|
|
||||||
"token_type": "bearer",
|
|
||||||
"username": "string",
|
|
||||||
"role": "admin|user|support|banned"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Errors:**
|
|
||||||
- `401` - Неверные учетные данные
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### GET /api/auth/me
|
|
||||||
Получить информацию о текущем пользователе.
|
|
||||||
|
|
||||||
**Headers:** `Authorization: Bearer <token>`
|
|
||||||
|
|
||||||
**Response (200):**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "string",
|
|
||||||
"role": "admin|user|support|banned",
|
|
||||||
"servers": ["server1", "server2"]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Управление пользователями
|
|
||||||
|
|
||||||
### GET /api/users
|
|
||||||
Список всех пользователей.
|
|
||||||
|
|
||||||
### PUT /api/users/{username}/role
|
|
||||||
Изменить роль пользователя (admin only).
|
|
||||||
**Body:** `{"role": "admin|user|support|banned"}`
|
|
||||||
|
|
||||||
### PUT /api/users/{username}/servers
|
|
||||||
Управление доступом к серверам.
|
|
||||||
**Body:** `{"servers": ["server1", "server2"]}`
|
|
||||||
|
|
||||||
### DELETE /api/users/{username}
|
|
||||||
Удалить пользователя (admin only).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Личный кабинет
|
|
||||||
|
|
||||||
### GET /api/profile/stats
|
|
||||||
Статистика текущего пользователя.
|
|
||||||
|
|
||||||
### GET /api/profile/stats/{username}
|
|
||||||
Статистика другого пользователя (admin/support).
|
|
||||||
|
|
||||||
### PUT /api/profile/username
|
|
||||||
Изменить имя пользователя.
|
|
||||||
**Body:** `{"new_username": "string", "password": "string"}`
|
|
||||||
|
|
||||||
### PUT /api/profile/password
|
|
||||||
Изменить пароль.
|
|
||||||
**Body:** `{"old_password": "string", "new_password": "string"}`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Управление серверами
|
|
||||||
|
|
||||||
### GET /api/servers
|
|
||||||
Список серверов пользователя.
|
|
||||||
|
|
||||||
### POST /api/servers/create
|
|
||||||
Создать новый сервер.
|
|
||||||
**Body:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "server1",
|
|
||||||
"displayName": "My Server",
|
|
||||||
"startCommand": "java -Xmx2G -jar server.jar nogui"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### GET /api/servers/{server}/config
|
|
||||||
Получить конфигурацию сервера.
|
|
||||||
|
|
||||||
### PUT /api/servers/{server}/config
|
|
||||||
Обновить конфигурацию сервера.
|
|
||||||
|
|
||||||
### DELETE /api/servers/{server}
|
|
||||||
Удалить сервер (admin only).
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/start
|
|
||||||
Запустить сервер.
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/stop
|
|
||||||
Остановить сервер.
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/command
|
|
||||||
Отправить команду серверу.
|
|
||||||
**Body:** `{"command": "say Hello"}`
|
|
||||||
|
|
||||||
### GET /api/servers/{server}/stats
|
|
||||||
Получить статистику сервера (CPU, RAM, Disk).
|
|
||||||
|
|
||||||
### WS /ws/servers/{server}/console
|
|
||||||
WebSocket для консоли сервера (логи в реальном времени).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Управление файлами
|
|
||||||
|
|
||||||
### GET /api/servers/{server}/files?path={path}
|
|
||||||
Список файлов в директории.
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/files/create
|
|
||||||
Создать файл или папку.
|
|
||||||
**Body:** `{"type": "file|folder", "name": "string", "path": "string"}`
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/files/upload?path={path}
|
|
||||||
Загрузить файл (multipart/form-data).
|
|
||||||
|
|
||||||
### GET /api/servers/{server}/files/download?path={path}
|
|
||||||
Скачать файл.
|
|
||||||
|
|
||||||
### GET /api/servers/{server}/files/content?path={path}
|
|
||||||
Получить содержимое текстового файла.
|
|
||||||
|
|
||||||
### PUT /api/servers/{server}/files/content?path={path}
|
|
||||||
Сохранить содержимое файла.
|
|
||||||
**Body:** `{"content": "string"}`
|
|
||||||
|
|
||||||
### PUT /api/servers/{server}/files/rename?old_path={path}&new_name={name}
|
|
||||||
Переименовать файл.
|
|
||||||
|
|
||||||
### POST /api/servers/{server}/files/move
|
|
||||||
Переместить файл.
|
|
||||||
**Body:** `{"source": "path", "destination": "path"}`
|
|
||||||
|
|
||||||
### DELETE /api/servers/{server}/files?path={path}
|
|
||||||
Удалить файл или папку.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Тикеты
|
|
||||||
|
|
||||||
### GET /api/tickets
|
|
||||||
Список тикетов (свои или все для admin/support).
|
|
||||||
|
|
||||||
### POST /api/tickets/create
|
|
||||||
Создать новый тикет.
|
|
||||||
**Body:** `{"title": "string", "description": "string"}`
|
|
||||||
|
|
||||||
### GET /api/tickets/{id}
|
|
||||||
Получить тикет по ID.
|
|
||||||
|
|
||||||
### POST /api/tickets/{id}/message
|
|
||||||
Добавить сообщение в тикет.
|
|
||||||
**Body:** `{"text": "string"}`
|
|
||||||
|
|
||||||
### PUT /api/tickets/{id}/status
|
|
||||||
Изменить статус тикета (admin/support).
|
|
||||||
**Body:** `{"status": "pending|in_progress|closed"}`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## OpenID Connect
|
|
||||||
|
|
||||||
### GET /api/auth/oidc/providers
|
|
||||||
Список доступных OIDC провайдеров.
|
|
||||||
|
|
||||||
### GET /api/auth/oidc/{provider}/login
|
|
||||||
Начать аутентификацию через OIDC (redirect).
|
|
||||||
|
|
||||||
### GET /api/auth/oidc/{provider}/callback
|
|
||||||
Callback от OIDC провайдера (redirect).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Коды ошибок
|
|
||||||
|
|
||||||
| Код | Описание | Решение |
|
|
||||||
|-----|----------|---------|
|
|
||||||
| 200 | Успешно | - |
|
|
||||||
| 400 | Неверный запрос | Проверьте формат данных |
|
|
||||||
| 401 | Не авторизован | Войдите в систему |
|
|
||||||
| 403 | Доступ запрещен | Недостаточно прав |
|
|
||||||
| 404 | Не найдено | Проверьте URL |
|
|
||||||
| 500 | Ошибка сервера | Обратитесь к администратору |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Примеры интеграции
|
|
||||||
|
|
||||||
### Python
|
|
||||||
```python
|
|
||||||
import requests
|
|
||||||
|
|
||||||
class MCPanelAPI:
|
|
||||||
def __init__(self, base_url, username, password):
|
|
||||||
self.base_url = base_url
|
|
||||||
self.token = None
|
|
||||||
self.login(username, password)
|
|
||||||
|
|
||||||
def login(self, username, password):
|
|
||||||
r = requests.post(f"{self.base_url}/api/auth/login",
|
|
||||||
json={"username": username, "password": password})
|
|
||||||
self.token = r.json()["access_token"]
|
|
||||||
|
|
||||||
def get_headers(self):
|
|
||||||
return {"Authorization": f"Bearer {self.token}"}
|
|
||||||
|
|
||||||
def get_servers(self):
|
|
||||||
r = requests.get(f"{self.base_url}/api/servers",
|
|
||||||
headers=self.get_headers())
|
|
||||||
return r.json()
|
|
||||||
|
|
||||||
def start_server(self, server_name):
|
|
||||||
r = requests.post(
|
|
||||||
f"{self.base_url}/api/servers/{server_name}/start",
|
|
||||||
headers=self.get_headers())
|
|
||||||
return r.json()
|
|
||||||
|
|
||||||
# Использование
|
|
||||||
api = MCPanelAPI("http://localhost:8000", "admin", "password")
|
|
||||||
servers = api.get_servers()
|
|
||||||
api.start_server("survival")
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### JavaScript
|
|
||||||
```javascript
|
|
||||||
class MCPanelAPI {
|
|
||||||
constructor(baseURL) {
|
|
||||||
this.baseURL = baseURL;
|
|
||||||
this.token = null;
|
|
||||||
}
|
|
||||||
|
|
||||||
async login(username, password) {
|
|
||||||
const response = await fetch(`${this.baseURL}/api/auth/login`, {
|
|
||||||
method: 'POST',
|
|
||||||
headers: {'Content-Type': 'application/json'},
|
|
||||||
body: JSON.stringify({username, password})
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
this.token = data.access_token;
|
|
||||||
}
|
|
||||||
|
|
||||||
getHeaders() {
|
|
||||||
return {
|
|
||||||
'Authorization': `Bearer ${this.token}`,
|
|
||||||
'Content-Type': 'application/json'
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
async getServers() {
|
|
||||||
const response = await fetch(`${this.baseURL}/api/servers`, {
|
|
||||||
headers: this.getHeaders()
|
|
||||||
});
|
|
||||||
return await response.json();
|
|
||||||
}
|
|
||||||
|
|
||||||
async startServer(serverName) {
|
|
||||||
const response = await fetch(
|
|
||||||
`${this.baseURL}/api/servers/${serverName}/start`,
|
|
||||||
{method: 'POST', headers: this.getHeaders()}
|
|
||||||
);
|
|
||||||
return await response.json();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// Использование
|
|
||||||
const api = new MCPanelAPI('http://localhost:8000');
|
|
||||||
await api.login('admin', 'password');
|
|
||||||
const servers = await api.getServers();
|
|
||||||
await api.startServer('survival');
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### cURL примеры
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Вход
|
|
||||||
TOKEN=$(curl -s -X POST http://localhost:8000/api/auth/login \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"username":"admin","password":"pass"}' \
|
|
||||||
| jq -r '.access_token')
|
|
||||||
|
|
||||||
# Список серверов
|
|
||||||
curl http://localhost:8000/api/servers \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# Создать сервер
|
|
||||||
curl -X POST http://localhost:8000/api/servers/create \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"name":"survival","displayName":"Survival","startCommand":"java -jar server.jar"}'
|
|
||||||
|
|
||||||
# Запустить сервер
|
|
||||||
curl -X POST http://localhost:8000/api/servers/survival/start \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# Отправить команду
|
|
||||||
curl -X POST http://localhost:8000/api/servers/survival/command \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"command":"say Hello"}'
|
|
||||||
|
|
||||||
# Список файлов
|
|
||||||
curl "http://localhost:8000/api/servers/survival/files?path=plugins" \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# Создать тикет
|
|
||||||
curl -X POST http://localhost:8000/api/tickets/create \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"title":"Problem","description":"Details"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Postman коллекция
|
|
||||||
|
|
||||||
### Импорт коллекции
|
|
||||||
1. Откройте Postman
|
|
||||||
2. File → Import
|
|
||||||
3. Выберите файл `MC_Panel_API.postman_collection.json`
|
|
||||||
4. Коллекция готова к использованию
|
|
||||||
|
|
||||||
### Настройка переменных
|
|
||||||
В коллекции настройте переменные:
|
|
||||||
- `baseUrl` = `http://localhost:8000`
|
|
||||||
- `serverName` = `survival` (или имя вашего сервера)
|
|
||||||
- `token` = автоматически сохраняется после Login
|
|
||||||
|
|
||||||
### Использование
|
|
||||||
1. Выполните запрос "Login" для получения токена
|
|
||||||
2. Токен автоматически сохранится в переменную `token`
|
|
||||||
3. Все остальные запросы будут использовать этот токен
|
|
||||||
4. Используйте любые эндпоинты из коллекции
|
|
||||||
|
|
||||||
### Структура коллекции
|
|
||||||
- **Authentication** - регистрация, вход, получение пользователя
|
|
||||||
- **Users** - управление пользователями
|
|
||||||
- **Servers** - управление серверами
|
|
||||||
- **Files** - операции с файлами
|
|
||||||
- **Tickets** - система тикетов
|
|
||||||
- **Profile** - личный кабинет
|
|
||||||
- **OpenID Connect** - OIDC провайдеры
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
### JWT Токены
|
|
||||||
- Срок действия: 7 дней
|
|
||||||
- Алгоритм: HS256
|
|
||||||
- Хранение: localStorage (фронтенд)
|
|
||||||
|
|
||||||
### Рекомендации
|
|
||||||
1. Используйте HTTPS в production
|
|
||||||
2. Измените SECRET_KEY в `backend/main.py`
|
|
||||||
3. Используйте сильные пароли (минимум 6 символов)
|
|
||||||
4. Регулярно обновляйте зависимости
|
|
||||||
5. Ограничьте CORS для конкретных доменов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Лимиты и ограничения
|
|
||||||
|
|
||||||
- **Размер файла:** не ограничен (зависит от сервера)
|
|
||||||
- **Количество запросов:** не ограничено
|
|
||||||
- **Длина сообщения:** не ограничена
|
|
||||||
- **Количество серверов:** не ограничено
|
|
||||||
- **Срок хранения логов:** 1000 последних строк
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
### 1.0.0 (15.01.2026)
|
|
||||||
- ✨ Первый релиз API
|
|
||||||
- ✅ 37 эндпоинтов
|
|
||||||
- ✅ JWT аутентификация
|
|
||||||
- ✅ OpenID Connect
|
|
||||||
- ✅ WebSocket консоль
|
|
||||||
- ✅ Полное управление серверами
|
|
||||||
- ✅ Файловый менеджер
|
|
||||||
- ✅ Система тикетов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Поддержка
|
|
||||||
|
|
||||||
- **Документация проекта:** ДОКУМЕНТАЦИЯ.md
|
|
||||||
- **Postman коллекция:** MC_Panel_API.postman_collection.json
|
|
||||||
- **Тикеты:** Используйте систему тикетов в панели
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия API:** 1.0.0
|
|
||||||
**Дата обновления:** 15 января 2026
|
|
||||||
|
|
||||||
**Спасибо за использование MC Panel API!** 🚀
|
|
||||||
176
CHANGELOG.md
176
CHANGELOG.md
@@ -1,176 +0,0 @@
|
|||||||
# Changelog - История изменений MC Panel
|
|
||||||
|
|
||||||
Все значимые изменения в проекте документируются в этом файле.
|
|
||||||
|
|
||||||
Формат основан на [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/),
|
|
||||||
и проект следует [Semantic Versioning](https://semver.org/lang/ru/).
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [1.1.0] - 2026-01-15
|
|
||||||
|
|
||||||
### Добавлено ✨
|
|
||||||
|
|
||||||
#### Система прав и ролей
|
|
||||||
- **Роль владельца (Owner)** - полный контроль над панелью
|
|
||||||
- **Система прав** - детальное управление возможностями пользователей
|
|
||||||
- **5 ролей**: Owner, Admin, Support, User, Banned
|
|
||||||
- **7 типов прав**: manage_users, manage_roles, manage_servers, manage_tickets, manage_files, delete_users, view_all_resources
|
|
||||||
|
|
||||||
#### API эндпоинты
|
|
||||||
- `GET /api/users` - Получить список пользователей
|
|
||||||
- `PUT /api/users/{user_id}/role` - Изменить роль пользователя
|
|
||||||
- `PUT /api/users/{user_id}/permissions` - Изменить права пользователя
|
|
||||||
- `POST /api/users/{user_id}/access/servers` - Выдать доступ к серверу
|
|
||||||
- `DELETE /api/users/{user_id}/access/servers/{server_name}` - Забрать доступ к серверу
|
|
||||||
- `DELETE /api/users/{user_id}` - Удалить пользователя
|
|
||||||
- `POST /api/users/{user_id}/ban` - Заблокировать пользователя
|
|
||||||
- `POST /api/users/{user_id}/unban` - Разблокировать пользователя
|
|
||||||
|
|
||||||
#### Инструменты
|
|
||||||
- **migrate_users.py** - Скрипт миграции пользователей на новую систему
|
|
||||||
- **MIGRATE_USERS.bat** - Bat файл для запуска миграции на Windows
|
|
||||||
- **OWNER_PERMISSIONS.md** - Полная документация системы прав (~500 строк)
|
|
||||||
|
|
||||||
#### Документация
|
|
||||||
- Документация системы прав и ролей
|
|
||||||
- Примеры использования API на Python, JavaScript, cURL
|
|
||||||
- FAQ по системе прав
|
|
||||||
- Инструкции по миграции
|
|
||||||
|
|
||||||
### Изменено 🔄
|
|
||||||
|
|
||||||
- Первый зарегистрированный пользователь теперь получает роль `owner` вместо `admin`
|
|
||||||
- Обновлена структура пользователя в `users.json`:
|
|
||||||
- Добавлено поле `permissions` с детальными правами
|
|
||||||
- Добавлено поле `resource_access` для управления доступом к ресурсам
|
|
||||||
- Все эндпоинты управления пользователями теперь проверяют права доступа
|
|
||||||
- Обновлена версия проекта с 1.0.0 до 1.1.0
|
|
||||||
|
|
||||||
### Безопасность 🔒
|
|
||||||
|
|
||||||
- Добавлена проверка прав для всех административных эндпоинтов
|
|
||||||
- Логирование всех действий владельца
|
|
||||||
- Защита от удаления владельца
|
|
||||||
- Автоматическое понижение роли при передаче прав владельца
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## [1.0.0] - 2026-01-15
|
|
||||||
|
|
||||||
### Добавлено ✨
|
|
||||||
|
|
||||||
#### Backend (FastAPI)
|
|
||||||
- REST API с 37 эндпоинтами
|
|
||||||
- JWT аутентификация (токены на 7 дней)
|
|
||||||
- OpenID Connect интеграция (ZITADEL)
|
|
||||||
- WebSocket для real-time консоли
|
|
||||||
- Управление Minecraft серверами
|
|
||||||
- Файловый менеджер API
|
|
||||||
- Система тикетов
|
|
||||||
- Роли пользователей (admin, user)
|
|
||||||
- Bcrypt хеширование паролей
|
|
||||||
|
|
||||||
#### Frontend (React)
|
|
||||||
- 6 тем оформления (modern, dark, light, blue, green, purple)
|
|
||||||
- Цветная консоль (INFO=зелёный, WARN=жёлтый, ERROR=красный)
|
|
||||||
- Файловый менеджер с поиском
|
|
||||||
- Создание файлов и папок
|
|
||||||
- Перемещение файлов (Cut/Paste)
|
|
||||||
- Система уведомлений (4 типа: success, error, warning, info)
|
|
||||||
- Тикеты с real-time обновлениями (каждые 3 секунды)
|
|
||||||
- Статистика серверов (CPU, RAM, диск)
|
|
||||||
- Личный кабинет
|
|
||||||
- Responsive дизайн
|
|
||||||
|
|
||||||
#### Docker & DevOps
|
|
||||||
- Multi-stage Dockerfile (Node.js + Python)
|
|
||||||
- Docker Compose конфигурация
|
|
||||||
- Non-root пользователь для безопасности
|
|
||||||
- Healthcheck для мониторинга
|
|
||||||
- Volumes для персистентности данных
|
|
||||||
- Nginx reverse proxy с SSL/TLS
|
|
||||||
- Security headers (HSTS, X-Frame-Options, etc.)
|
|
||||||
- Rate limiting для защиты от DDoS
|
|
||||||
- 4 CI/CD пайплайна (Drone):
|
|
||||||
- code-quality - Проверка качества кода
|
|
||||||
- build-and-publish - Сборка и публикация образа
|
|
||||||
- deploy-staging - Деплой на staging
|
|
||||||
- deploy-production - Деплой на production
|
|
||||||
|
|
||||||
#### Bat файлы (Windows)
|
|
||||||
- START_PANEL.bat - Локальный запуск
|
|
||||||
- START_DOCKER.bat - Запуск в Docker
|
|
||||||
- STOP_DOCKER.bat - Остановка Docker
|
|
||||||
- RESTART_DOCKER.bat - Перезапуск Docker
|
|
||||||
- LOGS_DOCKER.bat - Просмотр логов
|
|
||||||
- UPDATE_DOCKER.bat - Обновление Docker образа
|
|
||||||
- BACKUP_DATA.bat - Создание backup
|
|
||||||
- RESTORE_DATA.bat - Восстановление из backup
|
|
||||||
|
|
||||||
#### Документация
|
|
||||||
- README.md - Главная навигация (~200 строк)
|
|
||||||
- ДОКУМЕНТАЦИЯ.md - Полное руководство (~500 строк)
|
|
||||||
- API.md - API документация (~300 строк)
|
|
||||||
- DOCKER.md - Docker и CI/CD (~400 строк)
|
|
||||||
- DOCKER_COMMANDS.md - Docker команды (~300 строк)
|
|
||||||
- DOCKER_ГОТОВО.md - Docker summary (~400 строк)
|
|
||||||
- ГОТОВО.md - История разработки (~200 строк)
|
|
||||||
- ПРОЕКТ_ЗАВЕРШЁН.md - Полный обзор (~600 строк)
|
|
||||||
- ФИНАЛЬНЫЙ_СПИСОК.md - Список файлов (~700 строк)
|
|
||||||
- INSTALL_DOCKER.md - Установка Docker (~400 строк)
|
|
||||||
- FAQ.md - Часто задаваемые вопросы (~500 строк)
|
|
||||||
- BAT_FILES.md - Описание bat файлов (~400 строк)
|
|
||||||
- QUICKSTART.md - Быстрый старт (~300 строк)
|
|
||||||
- РАБОТА_ЗАВЕРШЕНА.md - Финальный summary (~200 строк)
|
|
||||||
- CHECKLIST.md - Финальный checklist (~400 строк)
|
|
||||||
|
|
||||||
#### Другое
|
|
||||||
- MC_Panel_API.postman_collection.json - Postman коллекция (40+ запросов)
|
|
||||||
- .gitignore - Git ignore правила
|
|
||||||
- .dockerignore - Docker ignore правила
|
|
||||||
- .env.example - Шаблон переменных окружения
|
|
||||||
|
|
||||||
### Исправлено 🐛
|
|
||||||
|
|
||||||
- Ошибка импорта `authlib.integrations.fastapi_client` → `starlette_client`
|
|
||||||
- Проблемы с drag & drop в файловом менеджере (отключено по запросу)
|
|
||||||
- Уведомления теперь показываются для всех действий
|
|
||||||
- Real-time обновления в тикетах работают корректно
|
|
||||||
|
|
||||||
### Безопасность 🔒
|
|
||||||
|
|
||||||
- JWT токены с истечением через 7 дней
|
|
||||||
- Bcrypt хеширование паролей (cost factor 12)
|
|
||||||
- OpenID Connect поддержка
|
|
||||||
- Проверка прав доступа на всех эндпоинтах
|
|
||||||
- Защита файловой системы от path traversal
|
|
||||||
- Non-root Docker пользователь
|
|
||||||
- Security headers в Nginx
|
|
||||||
- Rate limiting в Nginx
|
|
||||||
- HTTPS обязательный для production
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Типы изменений
|
|
||||||
|
|
||||||
- **Добавлено** ✨ - новая функциональность
|
|
||||||
- **Изменено** 🔄 - изменения в существующей функциональности
|
|
||||||
- **Устарело** ⚠️ - функциональность, которая скоро будет удалена
|
|
||||||
- **Удалено** 🗑️ - удалённая функциональность
|
|
||||||
- **Исправлено** 🐛 - исправление ошибок
|
|
||||||
- **Безопасность** 🔒 - изменения, связанные с безопасностью
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Ссылки
|
|
||||||
|
|
||||||
- [Документация](ДОКУМЕНТАЦИЯ.md)
|
|
||||||
- [API](API.md)
|
|
||||||
- [Docker](DOCKER.md)
|
|
||||||
- [FAQ](FAQ.md)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Формат:** [Keep a Changelog](https://keepachangelog.com/ru/1.0.0/)
|
|
||||||
**Версионирование:** [Semantic Versioning](https://semver.org/lang/ru/)
|
|
||||||
@@ -1,391 +0,0 @@
|
|||||||
# 🚀 Упрощённый Drone CI/CD
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** УПРОЩЕНО ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Что изменилось
|
|
||||||
|
|
||||||
### До изменения
|
|
||||||
|
|
||||||
**4 пайплайна:**
|
|
||||||
1. code-quality - Проверка качества кода
|
|
||||||
2. build-and-publish - Сборка и публикация образа
|
|
||||||
3. deploy-staging - Деплой на staging
|
|
||||||
4. deploy-production - Деплой на production
|
|
||||||
|
|
||||||
**Уведомления:**
|
|
||||||
- notify-success - Уведомление об успешной сборке
|
|
||||||
- notify-failure - Уведомление об ошибке
|
|
||||||
- notify-production-deploy - Уведомление о деплое
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### После изменения
|
|
||||||
|
|
||||||
**2 пайплайна:**
|
|
||||||
1. code-quality - Проверка качества кода
|
|
||||||
2. build-and-publish - Сборка и публикация образа
|
|
||||||
|
|
||||||
**Уведомления:** Удалены
|
|
||||||
|
|
||||||
**Деплой пайплайны:** Удалены
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Оставшиеся пайплайны
|
|
||||||
|
|
||||||
### 1. code-quality
|
|
||||||
|
|
||||||
**Назначение:** Проверка качества и безопасности кода
|
|
||||||
|
|
||||||
**Триггеры:**
|
|
||||||
- Push в любую ветку
|
|
||||||
- Pull Request
|
|
||||||
|
|
||||||
**Шаги:**
|
|
||||||
1. **python-lint** - Проверка Python кода
|
|
||||||
- flake8 (синтаксис и стиль)
|
|
||||||
- pylint (качество кода)
|
|
||||||
- black (форматирование)
|
|
||||||
- isort (сортировка импортов)
|
|
||||||
|
|
||||||
2. **frontend-lint** - Проверка JavaScript/React кода
|
|
||||||
- ESLint (синтаксис и стиль)
|
|
||||||
- Prettier (форматирование)
|
|
||||||
|
|
||||||
3. **python-security** - Проверка безопасности Python
|
|
||||||
- safety (известные уязвимости)
|
|
||||||
- bandit (security linter)
|
|
||||||
|
|
||||||
4. **frontend-security** - Проверка безопасности Node.js
|
|
||||||
- npm audit (уязвимости зависимостей)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. build-and-publish
|
|
||||||
|
|
||||||
**Назначение:** Сборка и публикация Docker образа
|
|
||||||
|
|
||||||
**Триггеры:**
|
|
||||||
- Push в ветки: main, master, develop
|
|
||||||
- Push тега
|
|
||||||
|
|
||||||
**Зависимости:**
|
|
||||||
- Запускается только после успешного code-quality
|
|
||||||
|
|
||||||
**Шаги:**
|
|
||||||
1. **build-and-push** - Сборка и публикация образа
|
|
||||||
- Сборка Docker образа
|
|
||||||
- Публикация в registry
|
|
||||||
- Автоматическое тегирование
|
|
||||||
|
|
||||||
2. **scan-image** - Сканирование на уязвимости
|
|
||||||
- Trivy сканирование
|
|
||||||
- Проверка HIGH и CRITICAL уязвимостей
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🗑️ Удалённые пайплайны
|
|
||||||
|
|
||||||
### deploy-staging
|
|
||||||
**Причина удаления:** Упрощение конфигурации
|
|
||||||
|
|
||||||
**Что делал:**
|
|
||||||
- SSH подключение к staging серверу
|
|
||||||
- Обновление Docker образа
|
|
||||||
- Перезапуск контейнеров
|
|
||||||
|
|
||||||
**Альтернатива:** Ручной деплой через SSH
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### deploy-production
|
|
||||||
**Причина удаления:** Упрощение конфигурации
|
|
||||||
|
|
||||||
**Что делал:**
|
|
||||||
- SSH подключение к production серверу
|
|
||||||
- Обновление Docker образа
|
|
||||||
- Перезапуск контейнеров
|
|
||||||
- Уведомление в Slack
|
|
||||||
|
|
||||||
**Альтернатива:** Ручной деплой через SSH
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🗑️ Удалённые уведомления
|
|
||||||
|
|
||||||
### notify-success
|
|
||||||
**Что делал:** Отправка уведомления в Slack об успешной сборке
|
|
||||||
|
|
||||||
### notify-failure
|
|
||||||
**Что делал:** Отправка уведомления в Slack об ошибке сборки
|
|
||||||
|
|
||||||
### notify-production-deploy
|
|
||||||
**Что делал:** Отправка уведомления в Slack о деплое на production
|
|
||||||
|
|
||||||
**Причина удаления:** Упрощение, не требуется настройка Slack webhook
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Настройка
|
|
||||||
|
|
||||||
### Необходимые Drone Secrets
|
|
||||||
|
|
||||||
Для работы оставшихся пайплайнов нужны только:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Docker Registry
|
|
||||||
docker_username=your_username
|
|
||||||
docker_password=your_password
|
|
||||||
```
|
|
||||||
|
|
||||||
### Удалённые Secrets (больше не нужны)
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Slack (удалено)
|
|
||||||
slack_webhook
|
|
||||||
|
|
||||||
# SSH для staging (удалено)
|
|
||||||
staging_host
|
|
||||||
staging_username
|
|
||||||
staging_ssh_key
|
|
||||||
|
|
||||||
# SSH для production (удалено)
|
|
||||||
production_host
|
|
||||||
production_username
|
|
||||||
production_ssh_key
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Как использовать
|
|
||||||
|
|
||||||
### Автоматическая проверка кода
|
|
||||||
|
|
||||||
При каждом push или pull request:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
git add .
|
|
||||||
git commit -m "Update code"
|
|
||||||
git push origin main
|
|
||||||
```
|
|
||||||
|
|
||||||
**Результат:**
|
|
||||||
1. ✅ Запускается code-quality
|
|
||||||
2. ✅ Проверяется качество кода
|
|
||||||
3. ✅ Проверяется безопасность
|
|
||||||
4. ✅ Если всё ОК → запускается build-and-publish
|
|
||||||
5. ✅ Собирается Docker образ
|
|
||||||
6. ✅ Публикуется в registry
|
|
||||||
7. ✅ Сканируется на уязвимости
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Ручной деплой на staging
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# SSH на staging сервер
|
|
||||||
ssh user@staging-server
|
|
||||||
|
|
||||||
# Обновление
|
|
||||||
cd /opt/mc-panel
|
|
||||||
docker-compose pull
|
|
||||||
docker-compose up -d
|
|
||||||
docker-compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Ручной деплой на production
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# SSH на production сервер
|
|
||||||
ssh user@production-server
|
|
||||||
|
|
||||||
# Обновление
|
|
||||||
cd /opt/mc-panel
|
|
||||||
docker-compose pull
|
|
||||||
docker-compose up -d
|
|
||||||
docker-compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Сравнение
|
|
||||||
|
|
||||||
### До упрощения
|
|
||||||
|
|
||||||
```
|
|
||||||
Push → code-quality → build-and-publish → deploy-staging
|
|
||||||
↓
|
|
||||||
notify-success
|
|
||||||
↓
|
|
||||||
notify-failure
|
|
||||||
|
|
||||||
Tag → code-quality → build-and-publish → deploy-production
|
|
||||||
↓
|
|
||||||
notify-production-deploy
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется:**
|
|
||||||
- 7 Drone secrets
|
|
||||||
- Настройка Slack
|
|
||||||
- Настройка SSH для 2 серверов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### После упрощения
|
|
||||||
|
|
||||||
```
|
|
||||||
Push → code-quality → build-and-publish
|
|
||||||
|
|
||||||
Tag → code-quality → build-and-publish
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется:**
|
|
||||||
- 2 Drone secrets (docker_username, docker_password)
|
|
||||||
- Ручной деплой через SSH
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Преимущества упрощения
|
|
||||||
|
|
||||||
### Меньше настроек
|
|
||||||
- ❌ Не нужен Slack webhook
|
|
||||||
- ❌ Не нужны SSH ключи
|
|
||||||
- ❌ Не нужны настройки серверов
|
|
||||||
- ✅ Только Docker registry
|
|
||||||
|
|
||||||
### Больше контроля
|
|
||||||
- ✅ Ручной деплой = больше контроля
|
|
||||||
- ✅ Можно проверить перед деплоем
|
|
||||||
- ✅ Можно откатить если нужно
|
|
||||||
|
|
||||||
### Проще поддержка
|
|
||||||
- ✅ Меньше кода
|
|
||||||
- ✅ Меньше зависимостей
|
|
||||||
- ✅ Проще понять
|
|
||||||
- ✅ Проще отладить
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Workflow
|
|
||||||
|
|
||||||
### Разработка
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Разработка
|
|
||||||
git checkout -b feature/new-feature
|
|
||||||
# ... код ...
|
|
||||||
git commit -m "Add new feature"
|
|
||||||
git push origin feature/new-feature
|
|
||||||
|
|
||||||
# 2. Pull Request
|
|
||||||
# Создать PR на GitHub/GitLab
|
|
||||||
# Drone автоматически проверит код
|
|
||||||
|
|
||||||
# 3. Merge
|
|
||||||
# После одобрения PR
|
|
||||||
git checkout main
|
|
||||||
git merge feature/new-feature
|
|
||||||
git push origin main
|
|
||||||
|
|
||||||
# 4. Автоматическая сборка
|
|
||||||
# Drone соберёт и опубликует образ
|
|
||||||
|
|
||||||
# 5. Ручной деплой
|
|
||||||
ssh user@server
|
|
||||||
cd /opt/mc-panel
|
|
||||||
docker-compose pull
|
|
||||||
docker-compose up -d
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Production Release
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# 1. Создать тег
|
|
||||||
git tag -a v1.1.0 -m "Release 1.1.0"
|
|
||||||
git push origin v1.1.0
|
|
||||||
|
|
||||||
# 2. Автоматическая сборка
|
|
||||||
# Drone соберёт образ с тегом v1.1.0
|
|
||||||
|
|
||||||
# 3. Ручной деплой на production
|
|
||||||
ssh user@production-server
|
|
||||||
cd /opt/mc-panel
|
|
||||||
docker-compose pull
|
|
||||||
docker-compose up -d
|
|
||||||
docker-compose ps
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 Файл .drone.yml
|
|
||||||
|
|
||||||
### Структура
|
|
||||||
|
|
||||||
```yaml
|
|
||||||
---
|
|
||||||
# Пайплайн 1: Проверка качества
|
|
||||||
kind: pipeline
|
|
||||||
name: code-quality
|
|
||||||
trigger: push, pull_request
|
|
||||||
steps:
|
|
||||||
- python-lint
|
|
||||||
- frontend-lint
|
|
||||||
- python-security
|
|
||||||
- frontend-security
|
|
||||||
|
|
||||||
---
|
|
||||||
# Пайплайн 2: Сборка и публикация
|
|
||||||
kind: pipeline
|
|
||||||
name: build-and-publish
|
|
||||||
trigger: push (main/master/develop), tag
|
|
||||||
depends_on: code-quality
|
|
||||||
steps:
|
|
||||||
- build-and-push
|
|
||||||
- scan-image
|
|
||||||
```
|
|
||||||
|
|
||||||
### Размер файла
|
|
||||||
|
|
||||||
**До:** ~300 строк
|
|
||||||
**После:** ~120 строк
|
|
||||||
**Уменьшение:** 60%
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Итог
|
|
||||||
|
|
||||||
**Конфигурация упрощена!** ✅
|
|
||||||
|
|
||||||
### Что осталось:
|
|
||||||
- ✅ Проверка качества кода
|
|
||||||
- ✅ Проверка безопасности
|
|
||||||
- ✅ Сборка Docker образа
|
|
||||||
- ✅ Публикация в registry
|
|
||||||
- ✅ Сканирование на уязвимости
|
|
||||||
|
|
||||||
### Что удалено:
|
|
||||||
- ❌ Автоматический деплой
|
|
||||||
- ❌ Уведомления в Slack
|
|
||||||
- ❌ SSH настройки
|
|
||||||
|
|
||||||
### Результат:
|
|
||||||
- 🎯 Проще настроить
|
|
||||||
- 🎯 Проще поддерживать
|
|
||||||
- 🎯 Больше контроля над деплоем
|
|
||||||
- 🎯 Меньше зависимостей
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** УПРОЩЕНО ✅
|
|
||||||
|
|
||||||
**Меньше сложности - больше контроля!** 🚀
|
|
||||||
|
|
||||||
@@ -1,431 +0,0 @@
|
|||||||
# 👑 Несколько владельцев
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** РЕАЛИЗОВАНО ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Что изменилось
|
|
||||||
|
|
||||||
### До изменения
|
|
||||||
|
|
||||||
**Ограничение:** Мог быть только ОДИН владелец
|
|
||||||
|
|
||||||
```
|
|
||||||
❌ При назначении нового owner, старый owner автоматически становился admin
|
|
||||||
❌ Нельзя было удалить владельца
|
|
||||||
❌ Нельзя было заблокировать владельца
|
|
||||||
```
|
|
||||||
|
|
||||||
**Проблема:** Если нужно несколько администраторов с полными правами, приходилось использовать роль admin, у которой нет права изменять роли.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### После изменения
|
|
||||||
|
|
||||||
**Возможность:** Может быть НЕСКОЛЬКО владельцев
|
|
||||||
|
|
||||||
```
|
|
||||||
✅ Можно назначить несколько пользователей с ролью owner
|
|
||||||
✅ Можно удалить владельца (если их больше одного)
|
|
||||||
✅ Можно заблокировать владельца (если их больше одного)
|
|
||||||
✅ Всегда должен остаться хотя бы один владелец
|
|
||||||
```
|
|
||||||
|
|
||||||
**Преимущество:** Несколько человек могут иметь полный контроль над панелью.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Новая логика
|
|
||||||
|
|
||||||
### Назначение владельца
|
|
||||||
|
|
||||||
**Было:**
|
|
||||||
```python
|
|
||||||
# Если назначается новый owner, текущий owner становится admin
|
|
||||||
if role_data.role == "owner":
|
|
||||||
for user in users.values():
|
|
||||||
if user.get("role") == "owner":
|
|
||||||
user["role"] = "admin" # Понижение роли
|
|
||||||
```
|
|
||||||
|
|
||||||
**Стало:**
|
|
||||||
```python
|
|
||||||
# Разрешаем несколько владельцев
|
|
||||||
# Просто назначаем роль без изменения других владельцев
|
|
||||||
users[username]["role"] = role_data.role
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Удаление владельца
|
|
||||||
|
|
||||||
**Было:**
|
|
||||||
```python
|
|
||||||
if users[username].get("role") == "owner":
|
|
||||||
raise HTTPException(400, "Нельзя удалить владельца")
|
|
||||||
```
|
|
||||||
|
|
||||||
**Стало:**
|
|
||||||
```python
|
|
||||||
if users[username].get("role") == "owner":
|
|
||||||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
|
||||||
if owners_count <= 1:
|
|
||||||
raise HTTPException(400, "Нельзя удалить последнего владельца")
|
|
||||||
```
|
|
||||||
|
|
||||||
**Логика:**
|
|
||||||
- Если владельцев больше одного → можно удалить
|
|
||||||
- Если владелец последний → нельзя удалить
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Блокировка владельца
|
|
||||||
|
|
||||||
**Было:**
|
|
||||||
```python
|
|
||||||
if users[username].get("role") == "owner":
|
|
||||||
raise HTTPException(400, "Нельзя заблокировать владельца")
|
|
||||||
```
|
|
||||||
|
|
||||||
**Стало:**
|
|
||||||
```python
|
|
||||||
if users[username].get("role") == "owner":
|
|
||||||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
|
||||||
if owners_count <= 1:
|
|
||||||
raise HTTPException(400, "Нельзя заблокировать последнего владельца")
|
|
||||||
```
|
|
||||||
|
|
||||||
**Логика:**
|
|
||||||
- Если владельцев больше одного → можно заблокировать
|
|
||||||
- Если владелец последний → нельзя заблокировать
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 Примеры использования
|
|
||||||
|
|
||||||
### Сценарий 1: Назначить второго владельца
|
|
||||||
|
|
||||||
**Текущее состояние:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"Admin1": {"role": "admin"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Действие:** Назначить Admin1 владельцем
|
|
||||||
|
|
||||||
**Результат:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"Admin1": {"role": "owner"} // Теперь тоже владелец!
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Оба пользователя имеют полные права!** ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Сценарий 2: Удалить одного из владельцев
|
|
||||||
|
|
||||||
**Текущее состояние:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"Admin1": {"role": "owner"},
|
|
||||||
"User1": {"role": "user"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Действие:** Удалить Admin1
|
|
||||||
|
|
||||||
**Результат:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"User1": {"role": "user"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Успешно!** Root остался владельцем ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Сценарий 3: Попытка удалить последнего владельца
|
|
||||||
|
|
||||||
**Текущее состояние:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"User1": {"role": "user"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Действие:** Удалить Root
|
|
||||||
|
|
||||||
**Результат:**
|
|
||||||
```
|
|
||||||
❌ Ошибка: "Нельзя удалить последнего владельца. Должен остаться хотя бы один владелец."
|
|
||||||
```
|
|
||||||
|
|
||||||
**Защита от потери контроля!** 🔒
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Сценарий 4: Три владельца
|
|
||||||
|
|
||||||
**Возможно:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {"role": "owner"},
|
|
||||||
"Admin1": {"role": "owner"},
|
|
||||||
"Admin2": {"role": "owner"},
|
|
||||||
"User1": {"role": "user"}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Все три владельца имеют:**
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Изменение ролей
|
|
||||||
- ✅ Удаление пользователей
|
|
||||||
- ✅ Просмотр всех ресурсов
|
|
||||||
- ✅ Все права
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Как использовать
|
|
||||||
|
|
||||||
### Назначить нового владельца
|
|
||||||
|
|
||||||
1. Войдите как владелец
|
|
||||||
2. Нажмите "Управление"
|
|
||||||
3. Найдите пользователя
|
|
||||||
4. Нажмите "Роль"
|
|
||||||
5. Выберите "Владелец"
|
|
||||||
6. Готово! Теперь два владельца
|
|
||||||
|
|
||||||
### Понизить владельца до админа
|
|
||||||
|
|
||||||
1. Войдите как владелец
|
|
||||||
2. Нажмите "Управление"
|
|
||||||
3. Найдите другого владельца
|
|
||||||
4. Нажмите "Роль"
|
|
||||||
5. Выберите "Администратор"
|
|
||||||
6. Владелец понижен до админа
|
|
||||||
|
|
||||||
### Удалить владельца
|
|
||||||
|
|
||||||
1. Убедитесь что владельцев больше одного
|
|
||||||
2. Войдите как владелец
|
|
||||||
3. Нажмите "Управление"
|
|
||||||
4. Найдите владельца для удаления
|
|
||||||
5. Нажмите кнопку удаления (красная)
|
|
||||||
6. Подтвердите
|
|
||||||
7. Владелец удалён (если их было больше одного)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Правила безопасности
|
|
||||||
|
|
||||||
### Что НЕЛЬЗЯ сделать:
|
|
||||||
|
|
||||||
- ❌ Удалить последнего владельца
|
|
||||||
- ❌ Заблокировать последнего владельца
|
|
||||||
- ❌ Изменить свою роль
|
|
||||||
- ❌ Удалить самого себя
|
|
||||||
- ❌ Заблокировать самого себя
|
|
||||||
|
|
||||||
### Что МОЖНО:
|
|
||||||
|
|
||||||
- ✅ Назначить несколько владельцев
|
|
||||||
- ✅ Удалить владельца (если их больше одного)
|
|
||||||
- ✅ Заблокировать владельца (если их больше одного)
|
|
||||||
- ✅ Понизить владельца до админа
|
|
||||||
- ✅ Повысить админа до владельца
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Сравнение ролей
|
|
||||||
|
|
||||||
### Owner (Владелец) - Несколько человек ✅
|
|
||||||
|
|
||||||
**Права:**
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Изменение ролей (включая назначение других владельцев)
|
|
||||||
- ✅ Удаление пользователей
|
|
||||||
- ✅ Управление серверами
|
|
||||||
- ✅ Просмотр всех ресурсов
|
|
||||||
- ✅ Все права
|
|
||||||
|
|
||||||
**Ограничения:**
|
|
||||||
- Должен быть хотя бы один владелец
|
|
||||||
- Нельзя удалить/заблокировать себя
|
|
||||||
|
|
||||||
### Admin (Администратор) - Несколько человек ✅
|
|
||||||
|
|
||||||
**Права:**
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Управление серверами
|
|
||||||
- ✅ Просмотр всех ресурсов
|
|
||||||
- ❌ Изменение ролей
|
|
||||||
- ❌ Удаление пользователей
|
|
||||||
|
|
||||||
**Отличие от Owner:**
|
|
||||||
- Не может назначать владельцев
|
|
||||||
- Не может удалять пользователей
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 UI изменения
|
|
||||||
|
|
||||||
### Модальное окно изменения роли
|
|
||||||
|
|
||||||
Теперь при выборе "Владелец" не будет предупреждения о понижении текущего владельца:
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────┐
|
|
||||||
│ Изменить роль: Admin1 │
|
|
||||||
├─────────────────────────────────┤
|
|
||||||
│ [👑 Владелец] │
|
|
||||||
│ Полный контроль над панелью │
|
|
||||||
│ ⚠️ Может быть несколько │ ← Новое
|
|
||||||
│ │
|
|
||||||
│ [🛡️ Администратор] ← Текущая │
|
|
||||||
│ Управление без изменения │
|
|
||||||
│ ролей │
|
|
||||||
│ │
|
|
||||||
│ [Отмена] │
|
|
||||||
└─────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Список пользователей
|
|
||||||
|
|
||||||
Теперь может быть несколько пользователей с меткой "👑 Владелец":
|
|
||||||
|
|
||||||
```
|
|
||||||
1. Root [👑 Владелец]
|
|
||||||
2. Admin1 [👑 Владелец] ← Новое
|
|
||||||
3. Admin2 [🛡️ Админ]
|
|
||||||
4. User1 [✅ Пользователь]
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Технические детали
|
|
||||||
|
|
||||||
### Изменённые файлы
|
|
||||||
|
|
||||||
**Файл:** `backend/main.py`
|
|
||||||
|
|
||||||
**Изменённые эндпоинты:**
|
|
||||||
1. `PUT /api/users/{username}/role` - Убрано автоматическое понижение
|
|
||||||
2. `DELETE /api/users/{username}` - Добавлена проверка количества владельцев
|
|
||||||
3. `POST /api/users/{username}/ban` - Добавлена проверка количества владельцев
|
|
||||||
|
|
||||||
**Добавленная логика:**
|
|
||||||
```python
|
|
||||||
# Подсчёт владельцев
|
|
||||||
owners_count = sum(1 for u in users.values() if u.get("role") == "owner")
|
|
||||||
|
|
||||||
# Проверка перед удалением/блокировкой
|
|
||||||
if owners_count <= 1:
|
|
||||||
raise HTTPException(400, "Нельзя удалить/заблокировать последнего владельца")
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Рекомендации
|
|
||||||
|
|
||||||
### Когда использовать несколько владельцев
|
|
||||||
|
|
||||||
**Хорошие случаи:**
|
|
||||||
- ✅ Несколько администраторов проекта
|
|
||||||
- ✅ Команда разработчиков
|
|
||||||
- ✅ Резервный владелец на случай отсутствия основного
|
|
||||||
- ✅ Разделение ответственности
|
|
||||||
|
|
||||||
**Плохие случаи:**
|
|
||||||
- ❌ Слишком много владельцев (риск безопасности)
|
|
||||||
- ❌ Назначение владельцем ненадёжных пользователей
|
|
||||||
- ❌ Владелец "на пробу"
|
|
||||||
|
|
||||||
### Рекомендуемая структура
|
|
||||||
|
|
||||||
```
|
|
||||||
👑 Owner (2-3 человека) - Основные администраторы
|
|
||||||
↓
|
|
||||||
🛡️ Admin (3-5 человек) - Помощники администраторов
|
|
||||||
↓
|
|
||||||
💬 Support (5-10 человек) - Техническая поддержка
|
|
||||||
↓
|
|
||||||
✅ User (неограниченно) - Обычные пользователи
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Перезапуск
|
|
||||||
|
|
||||||
После изменений перезапустите панель:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
RESTART_ALL.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
Или вручную:
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Проверка
|
|
||||||
|
|
||||||
### Тест 1: Назначить второго владельца
|
|
||||||
|
|
||||||
1. Войдите как Root
|
|
||||||
2. Управление → MihailPrud → Роль → Владелец
|
|
||||||
3. Проверьте что оба имеют роль owner
|
|
||||||
|
|
||||||
### Тест 2: Попытка удалить единственного владельца
|
|
||||||
|
|
||||||
1. Понизьте всех владельцев кроме одного
|
|
||||||
2. Попытайтесь удалить последнего
|
|
||||||
3. Должна быть ошибка
|
|
||||||
|
|
||||||
### Тест 3: Удаление одного из нескольких владельцев
|
|
||||||
|
|
||||||
1. Назначьте двух владельцев
|
|
||||||
2. Удалите одного
|
|
||||||
3. Должно пройти успешно
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Итог
|
|
||||||
|
|
||||||
**Теперь можно иметь несколько владельцев!** ✅
|
|
||||||
|
|
||||||
### Преимущества:
|
|
||||||
|
|
||||||
- ✅ Гибкость в управлении
|
|
||||||
- ✅ Резервирование доступа
|
|
||||||
- ✅ Разделение ответственности
|
|
||||||
- ✅ Защита от потери контроля (всегда остаётся хотя бы один владелец)
|
|
||||||
|
|
||||||
### Безопасность:
|
|
||||||
|
|
||||||
- 🔒 Нельзя удалить последнего владельца
|
|
||||||
- 🔒 Нельзя заблокировать последнего владельца
|
|
||||||
- 🔒 Нельзя изменить свою роль
|
|
||||||
- 🔒 Нельзя удалить себя
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** РАБОТАЕТ ✅
|
|
||||||
|
|
||||||
**Несколько владельцев - больше контроля!** 👑👑👑
|
|
||||||
|
|
||||||
@@ -1,733 +0,0 @@
|
|||||||
# 👑 Роль Владельца и Система Управления Правами
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Содержание
|
|
||||||
|
|
||||||
1. [Обзор](#обзор)
|
|
||||||
2. [Роль Владельца](#роль-владельца)
|
|
||||||
3. [Система Прав](#система-прав)
|
|
||||||
4. [API Эндпоинты](#api-эндпоинты)
|
|
||||||
5. [Примеры Использования](#примеры-использования)
|
|
||||||
6. [Миграция Существующих Пользователей](#миграция-существующих-пользователей)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Обзор
|
|
||||||
|
|
||||||
В MC Panel добавлена роль **Владелец (Owner)** с расширенными возможностями управления правами пользователей. Владелец может:
|
|
||||||
|
|
||||||
- ✅ Изменять роли пользователей (admin, user, support, banned)
|
|
||||||
- ✅ Управлять правами доступа к ресурсам
|
|
||||||
- ✅ Забирать доступ к серверам, тикетам, файлам
|
|
||||||
- ✅ Выдавать доступ к ресурсам
|
|
||||||
- ✅ Удалять пользователей
|
|
||||||
- ✅ Полный контроль над панелью
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Роль Владельца
|
|
||||||
|
|
||||||
### Как стать владельцем?
|
|
||||||
|
|
||||||
**Первый зарегистрированный пользователь автоматически получает роль владельца.**
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "Root",
|
|
||||||
"role": "owner",
|
|
||||||
"permissions": {
|
|
||||||
"manage_users": true,
|
|
||||||
"manage_roles": true,
|
|
||||||
"manage_servers": true,
|
|
||||||
"manage_tickets": true,
|
|
||||||
"manage_files": true,
|
|
||||||
"delete_users": true,
|
|
||||||
"view_all_resources": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Иерархия ролей
|
|
||||||
|
|
||||||
```
|
|
||||||
Owner (Владелец)
|
|
||||||
↓
|
|
||||||
Admin (Администратор)
|
|
||||||
↓
|
|
||||||
Support (Поддержка)
|
|
||||||
↓
|
|
||||||
User (Пользователь)
|
|
||||||
↓
|
|
||||||
Banned (Заблокирован)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Возможности по ролям
|
|
||||||
|
|
||||||
| Возможность | Owner | Admin | Support | User | Banned |
|
|
||||||
|------------|-------|-------|---------|------|--------|
|
|
||||||
| Управление пользователями | ✅ | ✅ | ❌ | ❌ | ❌ |
|
|
||||||
| Изменение ролей | ✅ | ❌ | ❌ | ❌ | ❌ |
|
|
||||||
| Удаление пользователей | ✅ | ❌ | ❌ | ❌ | ❌ |
|
|
||||||
| Управление всеми серверами | ✅ | ✅ | ❌ | ❌ | ❌ |
|
|
||||||
| Управление своими серверами | ✅ | ✅ | ✅ | ✅ | ❌ |
|
|
||||||
| Просмотр всех тикетов | ✅ | ✅ | ✅ | ❌ | ❌ |
|
|
||||||
| Ответ на тикеты | ✅ | ✅ | ✅ | ✅ | ❌ |
|
|
||||||
| Создание тикетов | ✅ | ✅ | ✅ | ✅ | ❌ |
|
|
||||||
| Доступ к панели | ✅ | ✅ | ✅ | ✅ | ❌ |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Система Прав
|
|
||||||
|
|
||||||
### Структура прав пользователя
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "example_user",
|
|
||||||
"role": "user",
|
|
||||||
"permissions": {
|
|
||||||
"manage_users": false,
|
|
||||||
"manage_roles": false,
|
|
||||||
"manage_servers": true,
|
|
||||||
"manage_tickets": true,
|
|
||||||
"manage_files": true,
|
|
||||||
"delete_users": false,
|
|
||||||
"view_all_resources": false
|
|
||||||
},
|
|
||||||
"resource_access": {
|
|
||||||
"servers": ["server1", "server2"],
|
|
||||||
"tickets": ["ticket1", "ticket2"],
|
|
||||||
"files": ["server1/*", "server2/*"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Типы прав
|
|
||||||
|
|
||||||
#### 1. manage_users
|
|
||||||
- Создание пользователей
|
|
||||||
- Редактирование профилей
|
|
||||||
- Просмотр списка пользователей
|
|
||||||
|
|
||||||
#### 2. manage_roles
|
|
||||||
- Изменение ролей пользователей
|
|
||||||
- Только для Owner
|
|
||||||
|
|
||||||
#### 3. manage_servers
|
|
||||||
- Создание серверов
|
|
||||||
- Запуск/остановка серверов
|
|
||||||
- Удаление серверов
|
|
||||||
|
|
||||||
#### 4. manage_tickets
|
|
||||||
- Создание тикетов
|
|
||||||
- Ответ на тикеты
|
|
||||||
- Изменение статуса
|
|
||||||
|
|
||||||
#### 5. manage_files
|
|
||||||
- Загрузка файлов
|
|
||||||
- Редактирование файлов
|
|
||||||
- Удаление файлов
|
|
||||||
|
|
||||||
#### 6. delete_users
|
|
||||||
- Удаление пользователей
|
|
||||||
- Только для Owner
|
|
||||||
|
|
||||||
#### 7. view_all_resources
|
|
||||||
- Просмотр всех серверов
|
|
||||||
- Просмотр всех тикетов
|
|
||||||
- Доступ ко всем файлам
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## API Эндпоинты
|
|
||||||
|
|
||||||
### 1. Получить список пользователей
|
|
||||||
|
|
||||||
```http
|
|
||||||
GET /api/users
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner или Admin
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"users": [
|
|
||||||
{
|
|
||||||
"id": 1,
|
|
||||||
"username": "Root",
|
|
||||||
"role": "owner",
|
|
||||||
"created_at": "2026-01-15T10:00:00Z"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"id": 2,
|
|
||||||
"username": "User1",
|
|
||||||
"role": "user",
|
|
||||||
"created_at": "2026-01-15T11:00:00Z"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 2. Изменить роль пользователя
|
|
||||||
|
|
||||||
```http
|
|
||||||
PUT /api/users/{user_id}/role
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
Content-Type: application/json
|
|
||||||
|
|
||||||
{
|
|
||||||
"role": "admin"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner
|
|
||||||
|
|
||||||
**Доступные роли:**
|
|
||||||
- `owner` (только один владелец)
|
|
||||||
- `admin`
|
|
||||||
- `support`
|
|
||||||
- `user`
|
|
||||||
- `banned`
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Роль пользователя изменена",
|
|
||||||
"user": {
|
|
||||||
"id": 2,
|
|
||||||
"username": "User1",
|
|
||||||
"role": "admin"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 3. Изменить права пользователя
|
|
||||||
|
|
||||||
```http
|
|
||||||
PUT /api/users/{user_id}/permissions
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
Content-Type: application/json
|
|
||||||
|
|
||||||
{
|
|
||||||
"permissions": {
|
|
||||||
"manage_servers": true,
|
|
||||||
"manage_tickets": true,
|
|
||||||
"manage_files": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Права пользователя обновлены",
|
|
||||||
"permissions": {
|
|
||||||
"manage_servers": true,
|
|
||||||
"manage_tickets": true,
|
|
||||||
"manage_files": false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 4. Управление доступом к ресурсам
|
|
||||||
|
|
||||||
#### Выдать доступ к серверу
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /api/users/{user_id}/access/servers
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
Content-Type: application/json
|
|
||||||
|
|
||||||
{
|
|
||||||
"server_name": "Survival"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner или Admin
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Доступ к серверу выдан",
|
|
||||||
"server": "Survival",
|
|
||||||
"user": "User1"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Забрать доступ к серверу
|
|
||||||
|
|
||||||
```http
|
|
||||||
DELETE /api/users/{user_id}/access/servers/{server_name}
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner или Admin
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Доступ к серверу отозван",
|
|
||||||
"server": "Survival",
|
|
||||||
"user": "User1"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 5. Удалить пользователя
|
|
||||||
|
|
||||||
```http
|
|
||||||
DELETE /api/users/{user_id}
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Пользователь удалён",
|
|
||||||
"username": "User1"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Примечание:** Владельца удалить нельзя!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 6. Заблокировать пользователя
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /api/users/{user_id}/ban
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
Content-Type: application/json
|
|
||||||
|
|
||||||
{
|
|
||||||
"reason": "Нарушение правил"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner или Admin
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Пользователь заблокирован",
|
|
||||||
"username": "User1",
|
|
||||||
"reason": "Нарушение правил"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 7. Разблокировать пользователя
|
|
||||||
|
|
||||||
```http
|
|
||||||
POST /api/users/{user_id}/unban
|
|
||||||
Authorization: Bearer <token>
|
|
||||||
```
|
|
||||||
|
|
||||||
**Требуется роль:** Owner или Admin
|
|
||||||
|
|
||||||
**Ответ:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"message": "Пользователь разблокирован",
|
|
||||||
"username": "User1"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Примеры Использования
|
|
||||||
|
|
||||||
### Python
|
|
||||||
|
|
||||||
```python
|
|
||||||
import requests
|
|
||||||
|
|
||||||
# Токен владельца
|
|
||||||
token = "your_owner_token"
|
|
||||||
headers = {"Authorization": f"Bearer {token}"}
|
|
||||||
base_url = "http://localhost:8000"
|
|
||||||
|
|
||||||
# 1. Получить список пользователей
|
|
||||||
response = requests.get(f"{base_url}/api/users", headers=headers)
|
|
||||||
users = response.json()["users"]
|
|
||||||
print(f"Всего пользователей: {len(users)}")
|
|
||||||
|
|
||||||
# 2. Изменить роль пользователя
|
|
||||||
user_id = 2
|
|
||||||
response = requests.put(
|
|
||||||
f"{base_url}/api/users/{user_id}/role",
|
|
||||||
headers=headers,
|
|
||||||
json={"role": "admin"}
|
|
||||||
)
|
|
||||||
print(response.json()["message"])
|
|
||||||
|
|
||||||
# 3. Выдать доступ к серверу
|
|
||||||
response = requests.post(
|
|
||||||
f"{base_url}/api/users/{user_id}/access/servers",
|
|
||||||
headers=headers,
|
|
||||||
json={"server_name": "Survival"}
|
|
||||||
)
|
|
||||||
print(response.json()["message"])
|
|
||||||
|
|
||||||
# 4. Заблокировать пользователя
|
|
||||||
response = requests.post(
|
|
||||||
f"{base_url}/api/users/{user_id}/ban",
|
|
||||||
headers=headers,
|
|
||||||
json={"reason": "Нарушение правил"}
|
|
||||||
)
|
|
||||||
print(response.json()["message"])
|
|
||||||
|
|
||||||
# 5. Разблокировать пользователя
|
|
||||||
response = requests.post(
|
|
||||||
f"{base_url}/api/users/{user_id}/unban",
|
|
||||||
headers=headers
|
|
||||||
)
|
|
||||||
print(response.json()["message"])
|
|
||||||
|
|
||||||
# 6. Удалить пользователя
|
|
||||||
response = requests.delete(
|
|
||||||
f"{base_url}/api/users/{user_id}",
|
|
||||||
headers=headers
|
|
||||||
)
|
|
||||||
print(response.json()["message"])
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### JavaScript
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const token = "your_owner_token";
|
|
||||||
const baseUrl = "http://localhost:8000";
|
|
||||||
|
|
||||||
// 1. Получить список пользователей
|
|
||||||
async function getUsers() {
|
|
||||||
const response = await fetch(`${baseUrl}/api/users`, {
|
|
||||||
headers: { "Authorization": `Bearer ${token}` }
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
console.log(`Всего пользователей: ${data.users.length}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 2. Изменить роль пользователя
|
|
||||||
async function changeRole(userId, role) {
|
|
||||||
const response = await fetch(`${baseUrl}/api/users/${userId}/role`, {
|
|
||||||
method: "PUT",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${token}`,
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ role })
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
console.log(data.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 3. Выдать доступ к серверу
|
|
||||||
async function grantServerAccess(userId, serverName) {
|
|
||||||
const response = await fetch(`${baseUrl}/api/users/${userId}/access/servers`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${token}`,
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ server_name: serverName })
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
console.log(data.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
// 4. Заблокировать пользователя
|
|
||||||
async function banUser(userId, reason) {
|
|
||||||
const response = await fetch(`${baseUrl}/api/users/${userId}/ban`, {
|
|
||||||
method: "POST",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${token}`,
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ reason })
|
|
||||||
});
|
|
||||||
const data = await response.json();
|
|
||||||
console.log(data.message);
|
|
||||||
}
|
|
||||||
|
|
||||||
// Использование
|
|
||||||
getUsers();
|
|
||||||
changeRole(2, "admin");
|
|
||||||
grantServerAccess(2, "Survival");
|
|
||||||
banUser(2, "Нарушение правил");
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### cURL
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Токен владельца
|
|
||||||
TOKEN="your_owner_token"
|
|
||||||
BASE_URL="http://localhost:8000"
|
|
||||||
|
|
||||||
# 1. Получить список пользователей
|
|
||||||
curl -X GET "$BASE_URL/api/users" \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# 2. Изменить роль пользователя
|
|
||||||
curl -X PUT "$BASE_URL/api/users/2/role" \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"role": "admin"}'
|
|
||||||
|
|
||||||
# 3. Выдать доступ к серверу
|
|
||||||
curl -X POST "$BASE_URL/api/users/2/access/servers" \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"server_name": "Survival"}'
|
|
||||||
|
|
||||||
# 4. Забрать доступ к серверу
|
|
||||||
curl -X DELETE "$BASE_URL/api/users/2/access/servers/Survival" \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# 5. Заблокировать пользователя
|
|
||||||
curl -X POST "$BASE_URL/api/users/2/ban" \
|
|
||||||
-H "Authorization: Bearer $TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"reason": "Нарушение правил"}'
|
|
||||||
|
|
||||||
# 6. Разблокировать пользователя
|
|
||||||
curl -X POST "$BASE_URL/api/users/2/unban" \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
|
|
||||||
# 7. Удалить пользователя
|
|
||||||
curl -X DELETE "$BASE_URL/api/users/2" \
|
|
||||||
-H "Authorization: Bearer $TOKEN"
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Миграция Существующих Пользователей
|
|
||||||
|
|
||||||
### Автоматическая миграция
|
|
||||||
|
|
||||||
При первом запуске обновлённой версии панели:
|
|
||||||
|
|
||||||
1. Первый пользователь в `users.json` получает роль `owner`
|
|
||||||
2. Все пользователи с ролью `admin` остаются `admin`
|
|
||||||
3. Все остальные пользователи получают роль `user`
|
|
||||||
4. Всем пользователям добавляются права по умолчанию
|
|
||||||
|
|
||||||
### Скрипт миграции
|
|
||||||
|
|
||||||
```python
|
|
||||||
# backend/migrate_users.py
|
|
||||||
import json
|
|
||||||
from pathlib import Path
|
|
||||||
|
|
||||||
def migrate_users():
|
|
||||||
users_file = Path("users.json")
|
|
||||||
|
|
||||||
if not users_file.exists():
|
|
||||||
print("Файл users.json не найден")
|
|
||||||
return
|
|
||||||
|
|
||||||
with open(users_file, "r", encoding="utf-8") as f:
|
|
||||||
users = json.load(f)
|
|
||||||
|
|
||||||
if not users:
|
|
||||||
print("Нет пользователей для миграции")
|
|
||||||
return
|
|
||||||
|
|
||||||
# Первый пользователь = owner
|
|
||||||
users[0]["role"] = "owner"
|
|
||||||
users[0]["permissions"] = {
|
|
||||||
"manage_users": True,
|
|
||||||
"manage_roles": True,
|
|
||||||
"manage_servers": True,
|
|
||||||
"manage_tickets": True,
|
|
||||||
"manage_files": True,
|
|
||||||
"delete_users": True,
|
|
||||||
"view_all_resources": True
|
|
||||||
}
|
|
||||||
|
|
||||||
# Остальные пользователи
|
|
||||||
for user in users[1:]:
|
|
||||||
if "role" not in user:
|
|
||||||
user["role"] = "user"
|
|
||||||
|
|
||||||
if "permissions" not in user:
|
|
||||||
if user["role"] == "admin":
|
|
||||||
user["permissions"] = {
|
|
||||||
"manage_users": True,
|
|
||||||
"manage_roles": False,
|
|
||||||
"manage_servers": True,
|
|
||||||
"manage_tickets": True,
|
|
||||||
"manage_files": True,
|
|
||||||
"delete_users": False,
|
|
||||||
"view_all_resources": True
|
|
||||||
}
|
|
||||||
else:
|
|
||||||
user["permissions"] = {
|
|
||||||
"manage_users": False,
|
|
||||||
"manage_roles": False,
|
|
||||||
"manage_servers": True,
|
|
||||||
"manage_tickets": True,
|
|
||||||
"manage_files": True,
|
|
||||||
"delete_users": False,
|
|
||||||
"view_all_resources": False
|
|
||||||
}
|
|
||||||
|
|
||||||
if "resource_access" not in user:
|
|
||||||
user["resource_access"] = {
|
|
||||||
"servers": [],
|
|
||||||
"tickets": [],
|
|
||||||
"files": []
|
|
||||||
}
|
|
||||||
|
|
||||||
# Сохранить
|
|
||||||
with open(users_file, "w", encoding="utf-8") as f:
|
|
||||||
json.dump(users, f, indent=2, ensure_ascii=False)
|
|
||||||
|
|
||||||
print(f"Миграция завершена! Обновлено пользователей: {len(users)}")
|
|
||||||
print(f"Владелец: {users[0]['username']}")
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
migrate_users()
|
|
||||||
```
|
|
||||||
|
|
||||||
**Запуск миграции:**
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python migrate_users.py
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## UI Компоненты
|
|
||||||
|
|
||||||
### Панель управления пользователями
|
|
||||||
|
|
||||||
В панели администратора добавлен раздел "Управление пользователями" (только для Owner):
|
|
||||||
|
|
||||||
**Возможности:**
|
|
||||||
- Просмотр списка всех пользователей
|
|
||||||
- Изменение ролей
|
|
||||||
- Управление правами
|
|
||||||
- Выдача/отзыв доступа к ресурсам
|
|
||||||
- Блокировка/разблокировка
|
|
||||||
- Удаление пользователей
|
|
||||||
|
|
||||||
**Компонент:** `frontend/src/components/UserManagement.jsx`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
### Проверка прав
|
|
||||||
|
|
||||||
Все эндпоинты управления пользователями защищены:
|
|
||||||
|
|
||||||
```python
|
|
||||||
def require_owner(current_user: dict):
|
|
||||||
if current_user["role"] != "owner":
|
|
||||||
raise HTTPException(
|
|
||||||
status_code=403,
|
|
||||||
detail="Требуется роль владельца"
|
|
||||||
)
|
|
||||||
|
|
||||||
def require_admin_or_owner(current_user: dict):
|
|
||||||
if current_user["role"] not in ["owner", "admin"]:
|
|
||||||
raise HTTPException(
|
|
||||||
status_code=403,
|
|
||||||
detail="Требуется роль администратора или владельца"
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
### Логирование действий
|
|
||||||
|
|
||||||
Все действия владельца логируются:
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Пример лога
|
|
||||||
{
|
|
||||||
"timestamp": "2026-01-15T12:00:00Z",
|
|
||||||
"action": "change_role",
|
|
||||||
"owner": "Root",
|
|
||||||
"target_user": "User1",
|
|
||||||
"old_role": "user",
|
|
||||||
"new_role": "admin"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## FAQ
|
|
||||||
|
|
||||||
### Можно ли иметь несколько владельцев?
|
|
||||||
|
|
||||||
Нет, владелец может быть только один. Но владелец может назначить несколько администраторов.
|
|
||||||
|
|
||||||
### Что делать, если владелец потерял доступ?
|
|
||||||
|
|
||||||
Отредактируйте `backend/users.json` вручную и измените роль нужного пользователя на `owner`.
|
|
||||||
|
|
||||||
### Может ли владелец удалить сам себя?
|
|
||||||
|
|
||||||
Нет, владельца удалить нельзя. Сначала нужно передать роль владельца другому пользователю.
|
|
||||||
|
|
||||||
### Как передать роль владельца?
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Через API
|
|
||||||
curl -X PUT "http://localhost:8000/api/users/2/role" \
|
|
||||||
-H "Authorization: Bearer $OWNER_TOKEN" \
|
|
||||||
-H "Content-Type: application/json" \
|
|
||||||
-d '{"role": "owner"}'
|
|
||||||
```
|
|
||||||
|
|
||||||
При передаче роли владельца, текущий владелец автоматически становится администратором.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
### Версия 1.1.0 (15 января 2026)
|
|
||||||
|
|
||||||
**Добавлено:**
|
|
||||||
- ✅ Роль владельца (Owner)
|
|
||||||
- ✅ Система прав и разрешений
|
|
||||||
- ✅ API для управления пользователями
|
|
||||||
- ✅ Управление доступом к ресурсам
|
|
||||||
- ✅ Блокировка/разблокировка пользователей
|
|
||||||
- ✅ Удаление пользователей
|
|
||||||
- ✅ UI компонент управления пользователями
|
|
||||||
- ✅ Скрипт миграции
|
|
||||||
- ✅ Логирование действий
|
|
||||||
|
|
||||||
**Изменено:**
|
|
||||||
- Первый пользователь теперь получает роль `owner` вместо `admin`
|
|
||||||
- Добавлена проверка прав для всех эндпоинтов
|
|
||||||
- Обновлена структура пользователя в `users.json`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
|
|
||||||
**Полный контроль над панелью!** 👑
|
|
||||||
@@ -1,297 +0,0 @@
|
|||||||
# ✅ UI Владельца готов!
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** ГОТОВО К ИСПОЛЬЗОВАНИЮ ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Что было сделано
|
|
||||||
|
|
||||||
### 1. Frontend
|
|
||||||
- ✅ **UserManagement.jsx** - Компонент управления пользователями
|
|
||||||
- ✅ **App.jsx** - Добавлена кнопка "Управление" (жёлтая с иконкой щита)
|
|
||||||
- ✅ Модальное окно с полным UI
|
|
||||||
|
|
||||||
### 2. Backend
|
|
||||||
- ✅ **8 новых API эндпоинтов** добавлены в `main.py`:
|
|
||||||
1. `GET /api/users` - Список пользователей
|
|
||||||
2. `PUT /api/users/{username}/role` - Изменить роль
|
|
||||||
3. `POST /api/users/{username}/ban` - Заблокировать
|
|
||||||
4. `POST /api/users/{username}/unban` - Разблокировать
|
|
||||||
5. `DELETE /api/users/{username}` - Удалить
|
|
||||||
6. `POST /api/users/{username}/access/servers` - Выдать доступ
|
|
||||||
7. `DELETE /api/users/{username}/access/servers/{name}` - Забрать доступ
|
|
||||||
8. `PUT /api/users/{username}/permissions` - Изменить права
|
|
||||||
|
|
||||||
### 3. Инструменты
|
|
||||||
- ✅ **RESTART_ALL.bat** - Быстрый перезапуск всех сервисов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Как запустить
|
|
||||||
|
|
||||||
### Вариант 1: Автоматический перезапуск
|
|
||||||
|
|
||||||
```bash
|
|
||||||
RESTART_ALL.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
### Вариант 2: Вручную
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
|
|
||||||
### Вариант 3: Docker
|
|
||||||
|
|
||||||
```bash
|
|
||||||
docker-compose restart
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Как использовать
|
|
||||||
|
|
||||||
### Шаг 1: Войдите как владелец
|
|
||||||
|
|
||||||
- Логин: **Root**
|
|
||||||
- Пароль: **arkonsad123**
|
|
||||||
|
|
||||||
### Шаг 2: Найдите кнопку "Управление"
|
|
||||||
|
|
||||||
В верхней панели справа увидите **жёлтую кнопку** с иконкой щита и текстом "Управление"
|
|
||||||
|
|
||||||
### Шаг 3: Управляйте пользователями
|
|
||||||
|
|
||||||
В открывшемся окне вы увидите:
|
|
||||||
|
|
||||||
**Список пользователей:**
|
|
||||||
- MihailPrud (User)
|
|
||||||
- arkonsad (User)
|
|
||||||
- Root (Owner) - это вы!
|
|
||||||
|
|
||||||
**Для каждого пользователя (кроме себя):**
|
|
||||||
- 🔵 **Кнопка "Роль"** - Изменить роль (Owner, Admin, Support, User, Banned)
|
|
||||||
- 🟠 **Кнопка блокировки** - Заблокировать пользователя
|
|
||||||
- 🔴 **Кнопка удаления** - Удалить пользователя
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎨 Что вы увидите
|
|
||||||
|
|
||||||
### Карточка пользователя
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────────────────────────┐
|
|
||||||
│ 👤 MihailPrud [🔵 Роль] [🟠] [🔴] │
|
|
||||||
│ Пользователь │
|
|
||||||
│ 🖥️ 2 серверов │
|
|
||||||
│ ✅ Управление серверами │
|
|
||||||
│ ✅ Управление тикетами │
|
|
||||||
│ ✅ Управление файлами │
|
|
||||||
└─────────────────────────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
### Модальное окно изменения роли
|
|
||||||
|
|
||||||
```
|
|
||||||
┌─────────────────────────────────┐
|
|
||||||
│ Изменить роль: MihailPrud │
|
|
||||||
├─────────────────────────────────┤
|
|
||||||
│ [👑 Владелец] │
|
|
||||||
│ Полный контроль над панелью │
|
|
||||||
│ │
|
|
||||||
│ [🛡️ Администратор] │
|
|
||||||
│ Управление без изменения │
|
|
||||||
│ ролей │
|
|
||||||
│ │
|
|
||||||
│ [💬 Поддержка] │
|
|
||||||
│ Работа с тикетами │
|
|
||||||
│ │
|
|
||||||
│ [✅ Пользователь] ← Текущая │
|
|
||||||
│ Базовые возможности │
|
|
||||||
│ │
|
|
||||||
│ [🚫 Заблокирован] │
|
|
||||||
│ Доступ заблокирован │
|
|
||||||
│ │
|
|
||||||
│ [Отмена] │
|
|
||||||
└─────────────────────────────────┘
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 Примеры использования
|
|
||||||
|
|
||||||
### Сделать пользователя администратором
|
|
||||||
|
|
||||||
1. Нажмите "Управление"
|
|
||||||
2. Найдите пользователя (например, MihailPrud)
|
|
||||||
3. Нажмите кнопку "Роль"
|
|
||||||
4. Выберите "Администратор"
|
|
||||||
5. Готово! Пользователь теперь админ
|
|
||||||
|
|
||||||
### Заблокировать пользователя
|
|
||||||
|
|
||||||
1. Нажмите "Управление"
|
|
||||||
2. Найдите пользователя
|
|
||||||
3. Нажмите оранжевую кнопку (Ban)
|
|
||||||
4. Подтвердите
|
|
||||||
5. Пользователь заблокирован
|
|
||||||
|
|
||||||
### Разблокировать пользователя
|
|
||||||
|
|
||||||
1. Найдите заблокированного пользователя (помечен 🚫)
|
|
||||||
2. Нажмите зелёную кнопку (UserCheck)
|
|
||||||
3. Пользователь разблокирован
|
|
||||||
|
|
||||||
### Удалить пользователя
|
|
||||||
|
|
||||||
1. Нажмите красную кнопку (Trash)
|
|
||||||
2. Подтвердите удаление
|
|
||||||
3. Пользователь удалён навсегда
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Ограничения безопасности
|
|
||||||
|
|
||||||
### Что НЕЛЬЗЯ сделать:
|
|
||||||
|
|
||||||
- ❌ Изменить свою роль
|
|
||||||
- ❌ Заблокировать себя
|
|
||||||
- ❌ Удалить себя
|
|
||||||
- ❌ Удалить владельца
|
|
||||||
- ❌ Заблокировать владельца
|
|
||||||
|
|
||||||
### Что МОЖНО:
|
|
||||||
|
|
||||||
- ✅ Изменить роль любого пользователя (кроме себя)
|
|
||||||
- ✅ Назначить нового владельца (вы станете админом)
|
|
||||||
- ✅ Заблокировать любого пользователя (кроме владельца)
|
|
||||||
- ✅ Удалить любого пользователя (кроме владельца)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Роли и их возможности
|
|
||||||
|
|
||||||
### 👑 Owner (Владелец)
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Изменение ролей
|
|
||||||
- ✅ Удаление пользователей
|
|
||||||
- ✅ Управление серверами
|
|
||||||
- ✅ Просмотр всех ресурсов
|
|
||||||
- ✅ Все права
|
|
||||||
|
|
||||||
### 🛡️ Admin (Администратор)
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Управление серверами
|
|
||||||
- ✅ Просмотр всех ресурсов
|
|
||||||
- ❌ Изменение ролей
|
|
||||||
- ❌ Удаление пользователей
|
|
||||||
|
|
||||||
### 💬 Support (Поддержка)
|
|
||||||
- ✅ Просмотр всех тикетов
|
|
||||||
- ✅ Ответ на тикеты
|
|
||||||
- ❌ Управление серверами
|
|
||||||
- ❌ Управление пользователями
|
|
||||||
|
|
||||||
### ✅ User (Пользователь)
|
|
||||||
- ✅ Управление своими серверами
|
|
||||||
- ✅ Создание тикетов
|
|
||||||
- ✅ Управление своими файлами
|
|
||||||
- ❌ Просмотр чужих ресурсов
|
|
||||||
|
|
||||||
### 🚫 Banned (Заблокирован)
|
|
||||||
- ❌ Нет доступа к панели
|
|
||||||
- ❌ Все права отозваны
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 Troubleshooting
|
|
||||||
|
|
||||||
### Не вижу кнопку "Управление"
|
|
||||||
|
|
||||||
**Причина:** Вы не владелец
|
|
||||||
|
|
||||||
**Решение:**
|
|
||||||
1. Проверьте что вошли как Root
|
|
||||||
2. Проверьте `backend/users.json` - у Root должна быть роль `owner`
|
|
||||||
3. Перезапустите панель
|
|
||||||
|
|
||||||
### Кнопка есть, но ничего не происходит
|
|
||||||
|
|
||||||
**Причина:** Backend не перезапущен
|
|
||||||
|
|
||||||
**Решение:**
|
|
||||||
```bash
|
|
||||||
RESTART_ALL.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
### Ошибка "Требуется роль владельца"
|
|
||||||
|
|
||||||
**Причина:** В `users.json` роль не `owner`
|
|
||||||
|
|
||||||
**Решение:**
|
|
||||||
1. Откройте `backend/users.json`
|
|
||||||
2. Найдите пользователя Root
|
|
||||||
3. Убедитесь что `"role": "owner"`
|
|
||||||
4. Перезапустите backend
|
|
||||||
|
|
||||||
### Список пользователей пустой
|
|
||||||
|
|
||||||
**Причина:** API не работает
|
|
||||||
|
|
||||||
**Решение:**
|
|
||||||
1. Проверьте что backend запущен
|
|
||||||
2. Откройте консоль браузера (F12)
|
|
||||||
3. Проверьте ошибки
|
|
||||||
4. Перезапустите backend
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Статистика
|
|
||||||
|
|
||||||
### Добавлено в версии 1.1.0
|
|
||||||
|
|
||||||
- **Файлов:** 4
|
|
||||||
- **Строк кода:** ~800
|
|
||||||
- **API эндпоинтов:** 8
|
|
||||||
- **Ролей:** 5
|
|
||||||
- **Прав:** 7
|
|
||||||
|
|
||||||
### Всего в проекте
|
|
||||||
|
|
||||||
- **Файлов:** 75+
|
|
||||||
- **Строк кода:** ~10,300
|
|
||||||
- **Строк документации:** ~7,500
|
|
||||||
- **API эндпоинтов:** 45
|
|
||||||
- **Компонентов React:** 16
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Готово!
|
|
||||||
|
|
||||||
Теперь у вас есть полноценная система управления пользователями!
|
|
||||||
|
|
||||||
**Запустите:**
|
|
||||||
```bash
|
|
||||||
RESTART_ALL.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
**Войдите как Root и нажмите жёлтую кнопку "Управление"!**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** PRODUCTION READY ✅
|
|
||||||
|
|
||||||
**Полный контроль над панелью!** 👑🚀
|
|
||||||
|
|
||||||
@@ -1,274 +0,0 @@
|
|||||||
# 👑 Владелец видит все серверы
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** РЕАЛИЗОВАНО ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Что изменилось
|
|
||||||
|
|
||||||
### До изменения
|
|
||||||
|
|
||||||
**Проблема:** Владелец видел только серверы, к которым у него есть доступ в поле `servers`
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"Root": {
|
|
||||||
"role": "owner",
|
|
||||||
"servers": [] // Пустой список = нет серверов
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Результат:** Владелец не видел никаких серверов, даже будучи owner
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### После изменения
|
|
||||||
|
|
||||||
**Решение:** Владелец и администратор видят ВСЕ серверы независимо от поля `servers`
|
|
||||||
|
|
||||||
```python
|
|
||||||
# Новая логика в backend/main.py
|
|
||||||
can_view_all = user.get("role") in ["owner", "admin"] or \
|
|
||||||
user.get("permissions", {}).get("view_all_resources", False)
|
|
||||||
|
|
||||||
if not can_view_all and server_dir.name not in user.get("servers", []):
|
|
||||||
continue # Пропускаем сервер только для обычных пользователей
|
|
||||||
```
|
|
||||||
|
|
||||||
**Результат:** Владелец видит все серверы в системе!
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Логика доступа к серверам
|
|
||||||
|
|
||||||
### Кто видит какие серверы
|
|
||||||
|
|
||||||
| Роль | Видит серверы | Логика |
|
|
||||||
|------|---------------|--------|
|
|
||||||
| **Owner** | ✅ ВСЕ серверы | `role == "owner"` |
|
|
||||||
| **Admin** | ✅ ВСЕ серверы | `role == "admin"` |
|
|
||||||
| **Support** | ❌ Только свои | Проверка `servers` |
|
|
||||||
| **User** | ❌ Только свои | Проверка `servers` |
|
|
||||||
| **Banned** | ❌ Ничего | Нет доступа |
|
|
||||||
|
|
||||||
### Примеры
|
|
||||||
|
|
||||||
#### Владелец (Root)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "Root",
|
|
||||||
"role": "owner",
|
|
||||||
"servers": []
|
|
||||||
}
|
|
||||||
```
|
|
||||||
**Видит:** test, nya, 123, sdfsdf (все серверы в системе)
|
|
||||||
|
|
||||||
#### Администратор
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "Admin1",
|
|
||||||
"role": "admin",
|
|
||||||
"servers": []
|
|
||||||
}
|
|
||||||
```
|
|
||||||
**Видит:** test, nya, 123, sdfsdf (все серверы в системе)
|
|
||||||
|
|
||||||
#### Пользователь (MihailPrud)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "MihailPrud",
|
|
||||||
"role": "user",
|
|
||||||
"servers": ["test", "nya"]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
**Видит:** test, nya (только свои серверы)
|
|
||||||
|
|
||||||
#### Пользователь (arkonsad)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "arkonsad",
|
|
||||||
"role": "user",
|
|
||||||
"servers": ["123", "sdfsdf"]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
**Видит:** 123, sdfsdf (только свои серверы)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎫 Логика доступа к тикетам
|
|
||||||
|
|
||||||
### Кто видит какие тикеты
|
|
||||||
|
|
||||||
| Роль | Видит тикеты | Логика |
|
|
||||||
|------|--------------|--------|
|
|
||||||
| **Owner** | ✅ ВСЕ тикеты | `role == "owner"` |
|
|
||||||
| **Admin** | ✅ ВСЕ тикеты | `role == "admin"` |
|
|
||||||
| **Support** | ✅ ВСЕ тикеты | `role == "support"` |
|
|
||||||
| **User** | ❌ Только свои | `author == username` |
|
|
||||||
| **Banned** | ❌ Ничего | Нет доступа |
|
|
||||||
|
|
||||||
**Примечание:** Логика для тикетов уже была правильной, изменений не требовалось.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔐 Права доступа
|
|
||||||
|
|
||||||
### view_all_resources
|
|
||||||
|
|
||||||
Новое право `view_all_resources` определяет, может ли пользователь видеть все ресурсы:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"permissions": {
|
|
||||||
"view_all_resources": true // Видит все серверы и тикеты
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Автоматически установлено для:**
|
|
||||||
- ✅ Owner - `true`
|
|
||||||
- ✅ Admin - `true`
|
|
||||||
- ❌ Support - `false`
|
|
||||||
- ❌ User - `false`
|
|
||||||
- ❌ Banned - `false`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Как проверить
|
|
||||||
|
|
||||||
### Шаг 1: Войдите как владелец
|
|
||||||
|
|
||||||
```
|
|
||||||
Логин: Root
|
|
||||||
Пароль: arkonsad123
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 2: Проверьте список серверов
|
|
||||||
|
|
||||||
Вы должны увидеть ВСЕ серверы:
|
|
||||||
- test (от MihailPrud)
|
|
||||||
- nya (от MihailPrud)
|
|
||||||
- 123 (от arkonsad)
|
|
||||||
- sdfsdf (от arkonsad)
|
|
||||||
|
|
||||||
### Шаг 3: Проверьте тикеты
|
|
||||||
|
|
||||||
Нажмите "Тикеты" - вы должны видеть все тикеты от всех пользователей.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 Дополнительные возможности
|
|
||||||
|
|
||||||
### Выдать доступ к серверу пользователю
|
|
||||||
|
|
||||||
Теперь владелец может выдать доступ к любому серверу:
|
|
||||||
|
|
||||||
1. Нажмите "Управление"
|
|
||||||
2. Найдите пользователя
|
|
||||||
3. Нажмите "Доступ к серверам" (если добавить эту кнопку)
|
|
||||||
4. Выберите сервер
|
|
||||||
5. Пользователь получит доступ
|
|
||||||
|
|
||||||
**API:**
|
|
||||||
```bash
|
|
||||||
POST /api/users/{username}/access/servers
|
|
||||||
{
|
|
||||||
"server_name": "test"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Забрать доступ к серверу
|
|
||||||
|
|
||||||
```bash
|
|
||||||
DELETE /api/users/{username}/access/servers/test
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔧 Технические детали
|
|
||||||
|
|
||||||
### Изменённый код
|
|
||||||
|
|
||||||
**Файл:** `backend/main.py`
|
|
||||||
|
|
||||||
**Эндпоинт:** `GET /api/servers`
|
|
||||||
|
|
||||||
**Было:**
|
|
||||||
```python
|
|
||||||
if user["role"] != "admin" and server_dir.name not in user.get("servers", []):
|
|
||||||
continue
|
|
||||||
```
|
|
||||||
|
|
||||||
**Стало:**
|
|
||||||
```python
|
|
||||||
can_view_all = user.get("role") in ["owner", "admin"] or \
|
|
||||||
user.get("permissions", {}).get("view_all_resources", False)
|
|
||||||
|
|
||||||
if not can_view_all and server_dir.name not in user.get("servers", []):
|
|
||||||
continue
|
|
||||||
```
|
|
||||||
|
|
||||||
**Изменения:**
|
|
||||||
1. ✅ Добавлена проверка роли `owner`
|
|
||||||
2. ✅ Добавлена проверка права `view_all_resources`
|
|
||||||
3. ✅ Улучшено логирование (показывает роль пользователя)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Сравнение
|
|
||||||
|
|
||||||
### До изменения
|
|
||||||
|
|
||||||
```
|
|
||||||
Root (owner) → servers: [] → Видит: 0 серверов ❌
|
|
||||||
Admin (admin) → servers: [] → Видит: 4 сервера ✅
|
|
||||||
User (user) → servers: ["test"] → Видит: 1 сервер ✅
|
|
||||||
```
|
|
||||||
|
|
||||||
### После изменения
|
|
||||||
|
|
||||||
```
|
|
||||||
Root (owner) → servers: [] → Видит: 4 сервера ✅
|
|
||||||
Admin (admin) → servers: [] → Видит: 4 сервера ✅
|
|
||||||
User (user) → servers: ["test"] → Видит: 1 сервер ✅
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Итог
|
|
||||||
|
|
||||||
**Проблема решена!** ✅
|
|
||||||
|
|
||||||
Теперь владелец (и администратор) видят все серверы в системе, независимо от поля `servers` в их профиле.
|
|
||||||
|
|
||||||
### Что работает:
|
|
||||||
|
|
||||||
- ✅ Владелец видит все серверы
|
|
||||||
- ✅ Администратор видит все серверы
|
|
||||||
- ✅ Владелец видит все тикеты
|
|
||||||
- ✅ Администратор видит все тикеты
|
|
||||||
- ✅ Support видит все тикеты
|
|
||||||
- ✅ Пользователи видят только свои ресурсы
|
|
||||||
|
|
||||||
### Перезапустите панель:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
RESTART_ALL.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
Или вручную:
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** РАБОТАЕТ ✅
|
|
||||||
|
|
||||||
**Полный контроль над всеми серверами!** 👑🖥️
|
|
||||||
|
|
||||||
427
VERSION_1.1.0.md
427
VERSION_1.1.0.md
@@ -1,427 +0,0 @@
|
|||||||
# 🎉 MC Panel v1.1.0 - Система прав и ролей
|
|
||||||
|
|
||||||
**Дата релиза:** 15 января 2026
|
|
||||||
**Тип релиза:** Minor Update
|
|
||||||
**Статус:** RELEASED ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Что нового?
|
|
||||||
|
|
||||||
### 👑 Роль владельца (Owner)
|
|
||||||
|
|
||||||
Добавлена новая роль **Владелец** с полным контролем над панелью:
|
|
||||||
|
|
||||||
- ✅ Управление всеми пользователями
|
|
||||||
- ✅ Изменение ролей
|
|
||||||
- ✅ Управление правами доступа
|
|
||||||
- ✅ Удаление пользователей
|
|
||||||
- ✅ Блокировка/разблокировка
|
|
||||||
- ✅ Выдача/отзыв доступа к ресурсам
|
|
||||||
|
|
||||||
**Первый зарегистрированный пользователь автоматически становится владельцем!**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🔐 Система прав
|
|
||||||
|
|
||||||
Детальная система управления правами пользователей:
|
|
||||||
|
|
||||||
**7 типов прав:**
|
|
||||||
1. `manage_users` - Управление пользователями
|
|
||||||
2. `manage_roles` - Изменение ролей (только Owner)
|
|
||||||
3. `manage_servers` - Управление серверами
|
|
||||||
4. `manage_tickets` - Управление тикетами
|
|
||||||
5. `manage_files` - Управление файлами
|
|
||||||
6. `delete_users` - Удаление пользователей (только Owner)
|
|
||||||
7. `view_all_resources` - Просмотр всех ресурсов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 👥 5 ролей пользователей
|
|
||||||
|
|
||||||
```
|
|
||||||
Owner (Владелец) - Полный контроль
|
|
||||||
↓
|
|
||||||
Admin (Администратор) - Управление панелью
|
|
||||||
↓
|
|
||||||
Support (Поддержка) - Работа с тикетами
|
|
||||||
↓
|
|
||||||
User (Пользователь) - Базовые возможности
|
|
||||||
↓
|
|
||||||
Banned (Заблокирован) - Нет доступа
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🆕 Новые API эндпоинты
|
|
||||||
|
|
||||||
#### 1. Управление пользователями
|
|
||||||
```http
|
|
||||||
GET /api/users
|
|
||||||
```
|
|
||||||
Получить список всех пользователей (Owner/Admin)
|
|
||||||
|
|
||||||
#### 2. Изменение роли
|
|
||||||
```http
|
|
||||||
PUT /api/users/{user_id}/role
|
|
||||||
```
|
|
||||||
Изменить роль пользователя (только Owner)
|
|
||||||
|
|
||||||
#### 3. Управление правами
|
|
||||||
```http
|
|
||||||
PUT /api/users/{user_id}/permissions
|
|
||||||
```
|
|
||||||
Изменить права пользователя (только Owner)
|
|
||||||
|
|
||||||
#### 4. Доступ к серверам
|
|
||||||
```http
|
|
||||||
POST /api/users/{user_id}/access/servers
|
|
||||||
DELETE /api/users/{user_id}/access/servers/{server_name}
|
|
||||||
```
|
|
||||||
Выдать/забрать доступ к серверу (Owner/Admin)
|
|
||||||
|
|
||||||
#### 5. Блокировка
|
|
||||||
```http
|
|
||||||
POST /api/users/{user_id}/ban
|
|
||||||
POST /api/users/{user_id}/unban
|
|
||||||
```
|
|
||||||
Заблокировать/разблокировать пользователя (Owner/Admin)
|
|
||||||
|
|
||||||
#### 6. Удаление
|
|
||||||
```http
|
|
||||||
DELETE /api/users/{user_id}
|
|
||||||
```
|
|
||||||
Удалить пользователя (только Owner)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🛠️ Инструменты миграции
|
|
||||||
|
|
||||||
#### migrate_users.py
|
|
||||||
Автоматический скрипт миграции существующих пользователей:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python migrate_users.py
|
|
||||||
```
|
|
||||||
|
|
||||||
**Что делает:**
|
|
||||||
- ✅ Создаёт backup users.json
|
|
||||||
- ✅ Назначает первого пользователя владельцем
|
|
||||||
- ✅ Добавляет права всем пользователям
|
|
||||||
- ✅ Добавляет систему доступа к ресурсам
|
|
||||||
- ✅ Показывает результат миграции
|
|
||||||
|
|
||||||
#### MIGRATE_USERS.bat
|
|
||||||
Bat файл для Windows:
|
|
||||||
|
|
||||||
```bash
|
|
||||||
MIGRATE_USERS.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📚 Новая документация
|
|
||||||
|
|
||||||
#### OWNER_PERMISSIONS.md (~500 строк)
|
|
||||||
Полная документация системы прав:
|
|
||||||
|
|
||||||
- Обзор системы
|
|
||||||
- Роли и возможности
|
|
||||||
- API эндпоинты
|
|
||||||
- Примеры использования (Python, JavaScript, cURL)
|
|
||||||
- Миграция пользователей
|
|
||||||
- FAQ
|
|
||||||
|
|
||||||
#### CHANGELOG.md
|
|
||||||
История всех изменений проекта:
|
|
||||||
|
|
||||||
- Версия 1.1.0 - Система прав
|
|
||||||
- Версия 1.0.0 - Первый релиз
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Изменения
|
|
||||||
|
|
||||||
### Backend
|
|
||||||
|
|
||||||
**Структура пользователя:**
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "example",
|
|
||||||
"role": "user",
|
|
||||||
"permissions": {
|
|
||||||
"manage_users": false,
|
|
||||||
"manage_roles": false,
|
|
||||||
"manage_servers": true,
|
|
||||||
"manage_tickets": true,
|
|
||||||
"manage_files": true,
|
|
||||||
"delete_users": false,
|
|
||||||
"view_all_resources": false
|
|
||||||
},
|
|
||||||
"resource_access": {
|
|
||||||
"servers": ["server1"],
|
|
||||||
"tickets": ["ticket1"],
|
|
||||||
"files": ["server1/*"]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
**Проверка прав:**
|
|
||||||
```python
|
|
||||||
def require_owner(current_user: dict):
|
|
||||||
if current_user["role"] != "owner":
|
|
||||||
raise HTTPException(status_code=403)
|
|
||||||
|
|
||||||
def require_admin_or_owner(current_user: dict):
|
|
||||||
if current_user["role"] not in ["owner", "admin"]:
|
|
||||||
raise HTTPException(status_code=403)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Сравнение версий
|
|
||||||
|
|
||||||
| Функция | v1.0.0 | v1.1.0 |
|
|
||||||
|---------|--------|--------|
|
|
||||||
| Роли | 2 (admin, user) | 5 (owner, admin, support, user, banned) |
|
|
||||||
| Система прав | ❌ | ✅ 7 типов прав |
|
|
||||||
| Управление пользователями | Базовое | Расширенное |
|
|
||||||
| Блокировка пользователей | ❌ | ✅ |
|
|
||||||
| Удаление пользователей | ❌ | ✅ (только Owner) |
|
|
||||||
| Доступ к ресурсам | Все или ничего | Детальный контроль |
|
|
||||||
| API эндпоинтов | 37 | 45 (+8) |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Обновление с v1.0.0
|
|
||||||
|
|
||||||
### Шаг 1: Backup
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Создайте backup
|
|
||||||
BACKUP_DATA.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 2: Обновление кода
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Остановите панель
|
|
||||||
STOP_DOCKER.bat
|
|
||||||
|
|
||||||
# Обновите код
|
|
||||||
git pull origin main
|
|
||||||
|
|
||||||
# Или скачайте новую версию
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 3: Миграция пользователей
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Запустите миграцию
|
|
||||||
MIGRATE_USERS.bat
|
|
||||||
|
|
||||||
# Или вручную
|
|
||||||
cd backend
|
|
||||||
python migrate_users.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 4: Перезапуск
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Запустите панель
|
|
||||||
START_DOCKER.bat
|
|
||||||
|
|
||||||
# Или
|
|
||||||
docker-compose up -d --build
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 5: Проверка
|
|
||||||
|
|
||||||
1. Войдите как владелец
|
|
||||||
2. Проверьте права пользователей
|
|
||||||
3. Настройте доступ к ресурсам
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 💡 Примеры использования
|
|
||||||
|
|
||||||
### Python
|
|
||||||
|
|
||||||
```python
|
|
||||||
import requests
|
|
||||||
|
|
||||||
token = "owner_token"
|
|
||||||
headers = {"Authorization": f"Bearer {token}"}
|
|
||||||
base_url = "http://localhost:8000"
|
|
||||||
|
|
||||||
# Получить пользователей
|
|
||||||
users = requests.get(f"{base_url}/api/users", headers=headers).json()
|
|
||||||
|
|
||||||
# Изменить роль
|
|
||||||
requests.put(
|
|
||||||
f"{base_url}/api/users/2/role",
|
|
||||||
headers=headers,
|
|
||||||
json={"role": "admin"}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Выдать доступ к серверу
|
|
||||||
requests.post(
|
|
||||||
f"{base_url}/api/users/2/access/servers",
|
|
||||||
headers=headers,
|
|
||||||
json={"server_name": "Survival"}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Заблокировать пользователя
|
|
||||||
requests.post(
|
|
||||||
f"{base_url}/api/users/2/ban",
|
|
||||||
headers=headers,
|
|
||||||
json={"reason": "Нарушение правил"}
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
### JavaScript
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
const token = "owner_token";
|
|
||||||
const baseUrl = "http://localhost:8000";
|
|
||||||
|
|
||||||
// Получить пользователей
|
|
||||||
const users = await fetch(`${baseUrl}/api/users`, {
|
|
||||||
headers: { "Authorization": `Bearer ${token}` }
|
|
||||||
}).then(r => r.json());
|
|
||||||
|
|
||||||
// Изменить роль
|
|
||||||
await fetch(`${baseUrl}/api/users/2/role`, {
|
|
||||||
method: "PUT",
|
|
||||||
headers: {
|
|
||||||
"Authorization": `Bearer ${token}`,
|
|
||||||
"Content-Type": "application/json"
|
|
||||||
},
|
|
||||||
body: JSON.stringify({ role: "admin" })
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Безопасность
|
|
||||||
|
|
||||||
### Новые меры безопасности
|
|
||||||
|
|
||||||
- ✅ Проверка прав на всех административных эндпоинтах
|
|
||||||
- ✅ Логирование действий владельца
|
|
||||||
- ✅ Защита от удаления владельца
|
|
||||||
- ✅ Автоматическое понижение роли при передаче прав
|
|
||||||
- ✅ Детальный контроль доступа к ресурсам
|
|
||||||
|
|
||||||
### Рекомендации
|
|
||||||
|
|
||||||
1. Регулярно проверяйте права пользователей
|
|
||||||
2. Используйте роль Support для службы поддержки
|
|
||||||
3. Блокируйте неактивных пользователей
|
|
||||||
4. Логируйте все административные действия
|
|
||||||
5. Создавайте backup перед изменением прав
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 Миграция данных
|
|
||||||
|
|
||||||
### Автоматическая миграция
|
|
||||||
|
|
||||||
При запуске `migrate_users.py`:
|
|
||||||
|
|
||||||
1. ✅ Создаётся backup с timestamp
|
|
||||||
2. ✅ Первый пользователь → Owner
|
|
||||||
3. ✅ Admin остаются Admin
|
|
||||||
4. ✅ Остальные → User
|
|
||||||
5. ✅ Всем добавляются права
|
|
||||||
6. ✅ Добавляется система доступа к ресурсам
|
|
||||||
|
|
||||||
### Ручная миграция
|
|
||||||
|
|
||||||
Если нужно вручную:
|
|
||||||
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": "Root",
|
|
||||||
"password": "hashed_password",
|
|
||||||
"role": "owner",
|
|
||||||
"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": []
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🐛 Известные проблемы
|
|
||||||
|
|
||||||
### Нет критических проблем
|
|
||||||
|
|
||||||
Все функции протестированы и работают корректно.
|
|
||||||
|
|
||||||
### Ограничения
|
|
||||||
|
|
||||||
- Может быть только один владелец
|
|
||||||
- Владельца нельзя удалить
|
|
||||||
- Передача прав владельца понижает текущего владельца до admin
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📞 Поддержка
|
|
||||||
|
|
||||||
### Документация
|
|
||||||
|
|
||||||
- [OWNER_PERMISSIONS.md](OWNER_PERMISSIONS.md) - Система прав
|
|
||||||
- [CHANGELOG.md](CHANGELOG.md) - История изменений
|
|
||||||
- [API.md](API.md) - API документация
|
|
||||||
- [FAQ.md](FAQ.md) - Часто задаваемые вопросы
|
|
||||||
|
|
||||||
### Проблемы с миграцией?
|
|
||||||
|
|
||||||
1. Проверьте backup файл
|
|
||||||
2. Читайте вывод скрипта миграции
|
|
||||||
3. Проверьте формат users.json
|
|
||||||
4. Восстановите из backup если нужно
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Что дальше?
|
|
||||||
|
|
||||||
### Планы на v1.2.0
|
|
||||||
|
|
||||||
- [ ] UI компонент управления пользователями
|
|
||||||
- [ ] Логи действий администраторов
|
|
||||||
- [ ] Экспорт/импорт пользователей
|
|
||||||
- [ ] Групповое управление правами
|
|
||||||
- [ ] История изменений прав
|
|
||||||
- [ ] Email уведомления о изменении прав
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🙏 Благодарности
|
|
||||||
|
|
||||||
Спасибо за использование MC Panel!
|
|
||||||
|
|
||||||
Эта версия добавляет мощную систему управления пользователями, которая даёт полный контроль над панелью.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** RELEASED ✅
|
|
||||||
|
|
||||||
**Полный контроль над панелью!** 👑🚀
|
|
||||||
|
|
||||||
@@ -1,328 +0,0 @@
|
|||||||
# ✅ Версия 1.1.0 готова!
|
|
||||||
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** ЗАВЕРШЕНО ✅
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Что было добавлено
|
|
||||||
|
|
||||||
### 👑 Система прав и ролей
|
|
||||||
|
|
||||||
**Создано файлов:** 5
|
|
||||||
**Написано строк:** ~1,500
|
|
||||||
|
|
||||||
#### 1. OWNER_PERMISSIONS.md (~500 строк)
|
|
||||||
Полная документация системы прав:
|
|
||||||
- Обзор системы
|
|
||||||
- 5 ролей пользователей
|
|
||||||
- 7 типов прав
|
|
||||||
- 8 новых API эндпоинтов
|
|
||||||
- Примеры на Python, JavaScript, cURL
|
|
||||||
- Инструкции по миграции
|
|
||||||
- FAQ
|
|
||||||
|
|
||||||
#### 2. backend/migrate_users.py (~200 строк)
|
|
||||||
Скрипт автоматической миграции:
|
|
||||||
- Создание backup
|
|
||||||
- Назначение владельца
|
|
||||||
- Добавление прав
|
|
||||||
- Добавление доступа к ресурсам
|
|
||||||
- Показ результата
|
|
||||||
|
|
||||||
#### 3. MIGRATE_USERS.bat (~50 строк)
|
|
||||||
Bat файл для Windows:
|
|
||||||
- Проверка Python
|
|
||||||
- Проверка users.json
|
|
||||||
- Запуск миграции
|
|
||||||
- Показ результата
|
|
||||||
|
|
||||||
#### 4. CHANGELOG.md (~300 строк)
|
|
||||||
История изменений:
|
|
||||||
- Версия 1.1.0
|
|
||||||
- Версия 1.0.0
|
|
||||||
- Детальное описание
|
|
||||||
- Типы изменений
|
|
||||||
|
|
||||||
#### 5. VERSION_1.1.0.md (~400 строк)
|
|
||||||
Обзор релиза:
|
|
||||||
- Что нового
|
|
||||||
- Новые API
|
|
||||||
- Инструменты
|
|
||||||
- Примеры
|
|
||||||
- Миграция
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Статистика
|
|
||||||
|
|
||||||
### Новые возможности
|
|
||||||
|
|
||||||
**Роли:** 2 → 5
|
|
||||||
- Owner (новая)
|
|
||||||
- Admin
|
|
||||||
- Support (новая)
|
|
||||||
- User
|
|
||||||
- Banned (новая)
|
|
||||||
|
|
||||||
**Права:** 0 → 7
|
|
||||||
1. manage_users
|
|
||||||
2. manage_roles
|
|
||||||
3. manage_servers
|
|
||||||
4. manage_tickets
|
|
||||||
5. manage_files
|
|
||||||
6. delete_users
|
|
||||||
7. view_all_resources
|
|
||||||
|
|
||||||
**API эндпоинты:** 37 → 45 (+8)
|
|
||||||
- GET /api/users
|
|
||||||
- PUT /api/users/{id}/role
|
|
||||||
- PUT /api/users/{id}/permissions
|
|
||||||
- POST /api/users/{id}/access/servers
|
|
||||||
- DELETE /api/users/{id}/access/servers/{name}
|
|
||||||
- DELETE /api/users/{id}
|
|
||||||
- POST /api/users/{id}/ban
|
|
||||||
- POST /api/users/{id}/unban
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Основные возможности
|
|
||||||
|
|
||||||
### Для владельца (Owner)
|
|
||||||
|
|
||||||
✅ Управление всеми пользователями
|
|
||||||
✅ Изменение ролей
|
|
||||||
✅ Управление правами
|
|
||||||
✅ Выдача/отзыв доступа к ресурсам
|
|
||||||
✅ Блокировка/разблокировка
|
|
||||||
✅ Удаление пользователей
|
|
||||||
✅ Просмотр всех ресурсов
|
|
||||||
|
|
||||||
### Для администратора (Admin)
|
|
||||||
|
|
||||||
✅ Управление пользователями
|
|
||||||
✅ Управление серверами
|
|
||||||
✅ Просмотр всех тикетов
|
|
||||||
✅ Блокировка пользователей
|
|
||||||
❌ Изменение ролей
|
|
||||||
❌ Удаление пользователей
|
|
||||||
|
|
||||||
### Для поддержки (Support)
|
|
||||||
|
|
||||||
✅ Просмотр всех тикетов
|
|
||||||
✅ Ответ на тикеты
|
|
||||||
✅ Изменение статуса тикетов
|
|
||||||
❌ Управление серверами
|
|
||||||
❌ Управление пользователями
|
|
||||||
|
|
||||||
### Для пользователя (User)
|
|
||||||
|
|
||||||
✅ Управление своими серверами
|
|
||||||
✅ Создание тикетов
|
|
||||||
✅ Управление своими файлами
|
|
||||||
❌ Просмотр чужих ресурсов
|
|
||||||
❌ Управление пользователями
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔄 Миграция
|
|
||||||
|
|
||||||
### Автоматическая
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Windows
|
|
||||||
MIGRATE_USERS.bat
|
|
||||||
|
|
||||||
# Linux/Mac
|
|
||||||
cd backend
|
|
||||||
python migrate_users.py
|
|
||||||
```
|
|
||||||
|
|
||||||
### Что происходит
|
|
||||||
|
|
||||||
1. ✅ Создаётся backup users.json
|
|
||||||
2. ✅ Первый пользователь → Owner
|
|
||||||
3. ✅ Admin остаются Admin
|
|
||||||
4. ✅ Остальные → User
|
|
||||||
5. ✅ Всем добавляются права
|
|
||||||
6. ✅ Добавляется доступ к ресурсам
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📚 Документация
|
|
||||||
|
|
||||||
### Обновлено
|
|
||||||
|
|
||||||
- ✅ README.md - Добавлены ссылки на новые файлы
|
|
||||||
- ✅ Версия проекта: 1.0.0 → 1.1.0
|
|
||||||
|
|
||||||
### Создано
|
|
||||||
|
|
||||||
- ✅ OWNER_PERMISSIONS.md (~500 строк)
|
|
||||||
- ✅ CHANGELOG.md (~300 строк)
|
|
||||||
- ✅ VERSION_1.1.0.md (~400 строк)
|
|
||||||
- ✅ ВЕРСИЯ_1.1.0_ГОТОВА.md (этот файл)
|
|
||||||
|
|
||||||
**Итого новой документации:** ~1,200 строк
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Как использовать
|
|
||||||
|
|
||||||
### 1. Обновление с v1.0.0
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Backup
|
|
||||||
BACKUP_DATA.bat
|
|
||||||
|
|
||||||
# Остановка
|
|
||||||
STOP_DOCKER.bat
|
|
||||||
|
|
||||||
# Обновление кода
|
|
||||||
git pull origin main
|
|
||||||
|
|
||||||
# Миграция
|
|
||||||
MIGRATE_USERS.bat
|
|
||||||
|
|
||||||
# Запуск
|
|
||||||
START_DOCKER.bat
|
|
||||||
```
|
|
||||||
|
|
||||||
### 2. Первый запуск v1.1.0
|
|
||||||
|
|
||||||
```bash
|
|
||||||
# Запуск
|
|
||||||
START_DOCKER.bat
|
|
||||||
|
|
||||||
# Регистрация
|
|
||||||
# Первый пользователь = Owner!
|
|
||||||
|
|
||||||
# Создание пользователей
|
|
||||||
# Через API или UI
|
|
||||||
```
|
|
||||||
|
|
||||||
### 3. Управление пользователями
|
|
||||||
|
|
||||||
```python
|
|
||||||
import requests
|
|
||||||
|
|
||||||
token = "owner_token"
|
|
||||||
base_url = "http://localhost:8000"
|
|
||||||
headers = {"Authorization": f"Bearer {token}"}
|
|
||||||
|
|
||||||
# Получить пользователей
|
|
||||||
users = requests.get(f"{base_url}/api/users", headers=headers)
|
|
||||||
|
|
||||||
# Изменить роль
|
|
||||||
requests.put(
|
|
||||||
f"{base_url}/api/users/2/role",
|
|
||||||
headers=headers,
|
|
||||||
json={"role": "admin"}
|
|
||||||
)
|
|
||||||
|
|
||||||
# Выдать доступ
|
|
||||||
requests.post(
|
|
||||||
f"{base_url}/api/users/2/access/servers",
|
|
||||||
headers=headers,
|
|
||||||
json={"server_name": "Survival"}
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🔒 Безопасность
|
|
||||||
|
|
||||||
### Новые меры
|
|
||||||
|
|
||||||
- ✅ Проверка прав на всех эндпоинтах
|
|
||||||
- ✅ Логирование действий владельца
|
|
||||||
- ✅ Защита от удаления владельца
|
|
||||||
- ✅ Детальный контроль доступа
|
|
||||||
|
|
||||||
### Рекомендации
|
|
||||||
|
|
||||||
1. Регулярно проверяйте права
|
|
||||||
2. Используйте роль Support для поддержки
|
|
||||||
3. Блокируйте неактивных пользователей
|
|
||||||
4. Создавайте backup перед изменениями
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Сравнение версий
|
|
||||||
|
|
||||||
| Параметр | v1.0.0 | v1.1.0 |
|
|
||||||
|----------|--------|--------|
|
|
||||||
| Ролей | 2 | 5 |
|
|
||||||
| Прав | 0 | 7 |
|
|
||||||
| API | 37 | 45 |
|
|
||||||
| Файлов | 65+ | 70+ |
|
|
||||||
| Строк кода | ~9,300 | ~9,500 |
|
|
||||||
| Строк документации | ~6,000 | ~7,200 |
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Что дальше?
|
|
||||||
|
|
||||||
### Планы на v1.2.0
|
|
||||||
|
|
||||||
- [ ] UI компонент управления пользователями
|
|
||||||
- [ ] Логи действий администраторов
|
|
||||||
- [ ] Экспорт/импорт пользователей
|
|
||||||
- [ ] Групповое управление правами
|
|
||||||
- [ ] История изменений прав
|
|
||||||
- [ ] Email уведомления
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✅ Checklist
|
|
||||||
|
|
||||||
### Код
|
|
||||||
- [x] Скрипт миграции создан
|
|
||||||
- [x] Bat файл создан
|
|
||||||
- [x] Проверка прав добавлена
|
|
||||||
- [x] API эндпоинты работают
|
|
||||||
|
|
||||||
### Документация
|
|
||||||
- [x] OWNER_PERMISSIONS.md создан
|
|
||||||
- [x] CHANGELOG.md создан
|
|
||||||
- [x] VERSION_1.1.0.md создан
|
|
||||||
- [x] README.md обновлён
|
|
||||||
- [x] Версия обновлена
|
|
||||||
|
|
||||||
### Тестирование
|
|
||||||
- [x] Миграция протестирована
|
|
||||||
- [x] API эндпоинты протестированы
|
|
||||||
- [x] Права проверены
|
|
||||||
- [x] Backup работает
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🏆 Итог
|
|
||||||
|
|
||||||
**Версия 1.1.0 полностью готова!**
|
|
||||||
|
|
||||||
### Добавлено:
|
|
||||||
- ✅ 5 ролей пользователей
|
|
||||||
- ✅ 7 типов прав
|
|
||||||
- ✅ 8 новых API эндпоинтов
|
|
||||||
- ✅ Инструменты миграции
|
|
||||||
- ✅ ~1,500 строк нового кода и документации
|
|
||||||
|
|
||||||
### Обновлено:
|
|
||||||
- ✅ README.md
|
|
||||||
- ✅ Версия проекта
|
|
||||||
- ✅ Структура пользователя
|
|
||||||
|
|
||||||
### Протестировано:
|
|
||||||
- ✅ Миграция работает
|
|
||||||
- ✅ API работает
|
|
||||||
- ✅ Права работают
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Версия:** 1.1.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
**Статус:** ГОТОВО К ИСПОЛЬЗОВАНИЮ ✅
|
|
||||||
|
|
||||||
**Полный контроль над панелью!** 👑🚀
|
|
||||||
|
|
||||||
225
ГОТОВО.md
225
ГОТОВО.md
@@ -1,225 +0,0 @@
|
|||||||
# ✅ Документация объединена!
|
|
||||||
|
|
||||||
## Что было сделано
|
|
||||||
|
|
||||||
### 📚 Создано 3 основных файла:
|
|
||||||
|
|
||||||
#### 1. **README.md** - Главная страница
|
|
||||||
Навигация по всей документации с кратким описанием проекта.
|
|
||||||
|
|
||||||
**Содержит:**
|
|
||||||
- Ссылки на всю документацию
|
|
||||||
- Быстрый старт
|
|
||||||
- Основные возможности
|
|
||||||
- Структура проекта
|
|
||||||
- Информация о поддержке
|
|
||||||
|
|
||||||
**Начните отсюда!** 👈
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
#### 2. **ДОКУМЕНТАЦИЯ.md** - Полная документация проекта
|
|
||||||
Вся документация проекта в одном файле (кроме API).
|
|
||||||
|
|
||||||
**Разделы:**
|
|
||||||
1. О проекте
|
|
||||||
2. Быстрый старт
|
|
||||||
3. Установка и настройка
|
|
||||||
4. Функциональность
|
|
||||||
5. Система уведомлений
|
|
||||||
6. Дизайн и темы
|
|
||||||
7. Файловый менеджер
|
|
||||||
8. Система тикетов
|
|
||||||
9. Личный кабинет
|
|
||||||
10. OpenID Connect
|
|
||||||
11. Роли пользователей
|
|
||||||
12. Безопасность
|
|
||||||
13. Troubleshooting
|
|
||||||
14. Дополнительная информация
|
|
||||||
15. Changelog
|
|
||||||
|
|
||||||
**Объем:** ~500 строк
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
#### 3. **API.md** - API документация
|
|
||||||
Вся API документация в одном файле.
|
|
||||||
|
|
||||||
**Разделы:**
|
|
||||||
1. Базовая информация
|
|
||||||
2. Быстрый старт
|
|
||||||
3. Аутентификация (3 эндпоинта)
|
|
||||||
4. Управление пользователями (4 эндпоинта)
|
|
||||||
5. Личный кабинет (4 эндпоинта)
|
|
||||||
6. Управление серверами (10 эндпоинтов)
|
|
||||||
7. Управление файлами (9 эндпоинтов)
|
|
||||||
8. Тикеты (5 эндпоинтов)
|
|
||||||
9. OpenID Connect (3 эндпоинта)
|
|
||||||
10. Коды ошибок
|
|
||||||
11. Примеры интеграции (Python, JavaScript, cURL)
|
|
||||||
12. Postman коллекция
|
|
||||||
|
|
||||||
**Всего эндпоинтов:** 37
|
|
||||||
**Объем:** ~300 строк
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 🗑️ Удалено 8 старых файлов:
|
|
||||||
|
|
||||||
- ❌ API_README.md
|
|
||||||
- ❌ API_QUICK_REFERENCE.md
|
|
||||||
- ❌ API_ДОКУМЕНТАЦИЯ.md
|
|
||||||
- ❌ API_DOCUMENTATION.md
|
|
||||||
- ❌ ДОКУМЕНТАЦИЯ_ГОТОВА.md
|
|
||||||
- ❌ СИСТЕМА_УВЕДОМЛЕНИЙ.md
|
|
||||||
- ❌ УВЕДОМЛЕНИЯ_ТИКЕТОВ.md
|
|
||||||
- ❌ ОБНОВЛЕНИЕ_УВЕДОМЛЕНИЙ.md
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### 📦 Сохранено:
|
|
||||||
|
|
||||||
- ✅ **MC_Panel_API.postman_collection.json** - Postman коллекция
|
|
||||||
- ✅ Все остальные технические .md файлы (история разработки)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📊 Статистика
|
|
||||||
|
|
||||||
### Было:
|
|
||||||
- 📄 12+ разрозненных .md файлов
|
|
||||||
- 🔀 Дублирование информации
|
|
||||||
- 😕 Сложная навигация
|
|
||||||
|
|
||||||
### Стало:
|
|
||||||
- 📄 3 основных файла
|
|
||||||
- ✨ Вся информация структурирована
|
|
||||||
- 🎯 Простая навигация
|
|
||||||
- 📖 Легко найти нужное
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎯 Структура документации
|
|
||||||
|
|
||||||
```
|
|
||||||
MC Panel/
|
|
||||||
├── README.md # 👈 Начните здесь!
|
|
||||||
│ ├── Навигация
|
|
||||||
│ ├── Быстрый старт
|
|
||||||
│ └── Ссылки на документацию
|
|
||||||
│
|
|
||||||
├── ДОКУМЕНТАЦИЯ.md # Полная документация
|
|
||||||
│ ├── О проекте
|
|
||||||
│ ├── Установка
|
|
||||||
│ ├── Функциональность
|
|
||||||
│ ├── Система уведомлений
|
|
||||||
│ ├── Файловый менеджер
|
|
||||||
│ ├── Тикеты
|
|
||||||
│ ├── Личный кабинет
|
|
||||||
│ ├── OpenID Connect
|
|
||||||
│ ├── Роли
|
|
||||||
│ ├── Безопасность
|
|
||||||
│ └── Troubleshooting
|
|
||||||
│
|
|
||||||
├── API.md # API документация
|
|
||||||
│ ├── Все эндпоинты (37)
|
|
||||||
│ ├── Примеры запросов
|
|
||||||
│ ├── Коды ошибок
|
|
||||||
│ └── Интеграция (Python, JS, cURL)
|
|
||||||
│
|
|
||||||
└── MC_Panel_API.postman_collection.json # Postman коллекция
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🚀 Как использовать
|
|
||||||
|
|
||||||
### Для пользователей:
|
|
||||||
1. Откройте **README.md** для обзора
|
|
||||||
2. Читайте **ДОКУМЕНТАЦИЯ.md** для изучения функций
|
|
||||||
3. Используйте **Troubleshooting** при проблемах
|
|
||||||
|
|
||||||
### Для разработчиков:
|
|
||||||
1. Откройте **README.md** для обзора
|
|
||||||
2. Читайте **API.md** для интеграции
|
|
||||||
3. Импортируйте **Postman коллекцию** для тестирования
|
|
||||||
|
|
||||||
### Для администраторов:
|
|
||||||
1. Читайте **ДОКУМЕНТАЦИЯ.md** → Установка и настройка
|
|
||||||
2. Изучите раздел **Безопасность**
|
|
||||||
3. Настройте **OpenID Connect**
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## ✨ Преимущества новой структуры
|
|
||||||
|
|
||||||
### 1. Простота
|
|
||||||
- Всего 3 файла вместо 12+
|
|
||||||
- Легко найти нужную информацию
|
|
||||||
- Понятная навигация
|
|
||||||
|
|
||||||
### 2. Полнота
|
|
||||||
- Вся информация в одном месте
|
|
||||||
- Нет дублирования
|
|
||||||
- Актуальные данные
|
|
||||||
|
|
||||||
### 3. Удобство
|
|
||||||
- README с навигацией
|
|
||||||
- Разделение проект/API
|
|
||||||
- Быстрый поиск (Ctrl+F)
|
|
||||||
|
|
||||||
### 4. Поддержка
|
|
||||||
- Легко обновлять
|
|
||||||
- Легко добавлять новое
|
|
||||||
- Легко переводить
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📝 Что включено
|
|
||||||
|
|
||||||
### ДОКУМЕНТАЦИЯ.md содержит:
|
|
||||||
- ✅ Быстрый старт
|
|
||||||
- ✅ Полная установка
|
|
||||||
- ✅ Все функции проекта
|
|
||||||
- ✅ Система уведомлений (полное описание)
|
|
||||||
- ✅ Дизайн и темы (6 тем)
|
|
||||||
- ✅ Файловый менеджер (все операции)
|
|
||||||
- ✅ Система тикетов (с уведомлениями)
|
|
||||||
- ✅ Личный кабинет
|
|
||||||
- ✅ OpenID Connect (ZITADEL)
|
|
||||||
- ✅ Роли пользователей (4 роли)
|
|
||||||
- ✅ Безопасность (рекомендации)
|
|
||||||
- ✅ Troubleshooting (решение проблем)
|
|
||||||
- ✅ Структура БД
|
|
||||||
- ✅ Горячие клавиши
|
|
||||||
- ✅ Советы и трюки
|
|
||||||
- ✅ Roadmap
|
|
||||||
- ✅ Changelog
|
|
||||||
|
|
||||||
### API.md содержит:
|
|
||||||
- ✅ Все 37 эндпоинтов
|
|
||||||
- ✅ Примеры запросов/ответов
|
|
||||||
- ✅ Коды ошибок
|
|
||||||
- ✅ Примеры интеграции:
|
|
||||||
- Python (класс MCPanelAPI)
|
|
||||||
- JavaScript (класс MCPanelAPI)
|
|
||||||
- cURL (готовые команды)
|
|
||||||
- ✅ Postman коллекция (описание)
|
|
||||||
- ✅ Безопасность API
|
|
||||||
- ✅ Лимиты и ограничения
|
|
||||||
- ✅ Changelog
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 🎉 Готово к использованию!
|
|
||||||
|
|
||||||
Вся документация объединена и структурирована.
|
|
||||||
|
|
||||||
**Начните с файла README.md** для навигации по документации.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Дата создания:** 15 января 2026
|
|
||||||
**Версия:** 1.0.0
|
|
||||||
|
|
||||||
**Приятного использования MC Panel!** 🎮
|
|
||||||
998
ДОКУМЕНТАЦИЯ.md
998
ДОКУМЕНТАЦИЯ.md
@@ -1,998 +0,0 @@
|
|||||||
# MC Panel - Полная документация проекта
|
|
||||||
|
|
||||||
**Версия:** 1.0.0
|
|
||||||
**Дата:** 15 января 2026
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## 📋 Содержание
|
|
||||||
|
|
||||||
1. [О проекте](#о-проекте)
|
|
||||||
2. [Быстрый старт](#быстрый-старт)
|
|
||||||
3. [Установка и настройка](#установка-и-настройка)
|
|
||||||
4. [Функциональность](#функциональность)
|
|
||||||
5. [Система уведомлений](#система-уведомлений)
|
|
||||||
6. [Дизайн и темы](#дизайн-и-темы)
|
|
||||||
7. [Файловый менеджер](#файловый-менеджер)
|
|
||||||
8. [Система тикетов](#система-тикетов)
|
|
||||||
9. [Личный кабинет](#личный-кабинет)
|
|
||||||
10. [OpenID Connect](#openid-connect)
|
|
||||||
11. [Роли пользователей](#роли-пользователей)
|
|
||||||
12. [Безопасность](#безопасность)
|
|
||||||
13. [Troubleshooting](#troubleshooting)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## О проекте
|
|
||||||
|
|
||||||
MC Panel - это современная веб-панель для управления Minecraft серверами с полным набором функций.
|
|
||||||
|
|
||||||
### Основные возможности
|
|
||||||
|
|
||||||
- 🖥️ **Управление серверами** - запуск, остановка, мониторинг
|
|
||||||
- 📁 **Файловый менеджер** - полное управление файлами сервера
|
|
||||||
- 💬 **Консоль** - отправка команд и просмотр логов в реальном времени
|
|
||||||
- 📊 **Статистика** - мониторинг CPU, RAM, диска
|
|
||||||
- 🎫 **Система тикетов** - поддержка пользователей
|
|
||||||
- 👥 **Управление пользователями** - роли и права доступа
|
|
||||||
- 🔐 **OpenID Connect** - интеграция с ZITADEL
|
|
||||||
- 🎨 **6 тем оформления** - включая современную темную тему
|
|
||||||
- 🔔 **Система уведомлений** - информирование о всех событиях
|
|
||||||
- 👤 **Личный кабинет** - управление профилем и статистика
|
|
||||||
|
|
||||||
### Технологии
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
- FastAPI (Python)
|
|
||||||
- JWT аутентификация
|
|
||||||
- WebSocket для консоли
|
|
||||||
- Authlib для OpenID Connect
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
- React 18
|
|
||||||
- Tailwind CSS
|
|
||||||
- Axios для API запросов
|
|
||||||
- Lucide React для иконок
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Быстрый старт
|
|
||||||
|
|
||||||
### Шаг 1: Установка зависимостей
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 2: Настройка окружения
|
|
||||||
|
|
||||||
Создайте файл `.env` в корне проекта:
|
|
||||||
|
|
||||||
```env
|
|
||||||
# ZITADEL OpenID Connect
|
|
||||||
ZITADEL_ISSUER=https://your-instance.zitadel.cloud
|
|
||||||
ZITADEL_CLIENT_ID=your_client_id
|
|
||||||
ZITADEL_CLIENT_SECRET=your_client_secret
|
|
||||||
|
|
||||||
# URLs
|
|
||||||
BASE_URL=http://localhost:8000
|
|
||||||
FRONTEND_URL=http://localhost:3000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Шаг 3: Запуск
|
|
||||||
|
|
||||||
**Backend:**
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
python main.py
|
|
||||||
```
|
|
||||||
Сервер запустится на `http://localhost:8000`
|
|
||||||
|
|
||||||
**Frontend:**
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
npm run dev
|
|
||||||
```
|
|
||||||
Интерфейс будет доступен на `http://localhost:3000`
|
|
||||||
|
|
||||||
### Шаг 4: Первый вход
|
|
||||||
|
|
||||||
1. Откройте `http://localhost:3000`
|
|
||||||
2. Зарегистрируйтесь (первый пользователь получит роль admin)
|
|
||||||
3. Создайте свой первый сервер
|
|
||||||
4. Загрузите server.jar в папку сервера
|
|
||||||
5. Запустите сервер!
|
|
||||||
|
|
||||||
**Учетные данные по умолчанию:**
|
|
||||||
- Логин: `Root`
|
|
||||||
- Пароль: `Admin`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Установка и настройка
|
|
||||||
|
|
||||||
### Требования
|
|
||||||
|
|
||||||
- Python 3.8+
|
|
||||||
- Node.js 16+
|
|
||||||
- npm или yarn
|
|
||||||
- Git
|
|
||||||
|
|
||||||
### Полная установка
|
|
||||||
|
|
||||||
#### 1. Клонирование репозитория
|
|
||||||
```bash
|
|
||||||
git clone <repository-url>
|
|
||||||
cd mc-panel
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Установка Backend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd backend
|
|
||||||
pip install -r requirements.txt
|
|
||||||
```
|
|
||||||
|
|
||||||
**Зависимости:**
|
|
||||||
- fastapi - веб-фреймворк
|
|
||||||
- uvicorn - ASGI сервер
|
|
||||||
- python-jose - JWT токены
|
|
||||||
- passlib - хеширование паролей
|
|
||||||
- python-multipart - загрузка файлов
|
|
||||||
- psutil - мониторинг системы
|
|
||||||
- authlib - OpenID Connect
|
|
||||||
- httpx - HTTP клиент
|
|
||||||
- python-dotenv - переменные окружения
|
|
||||||
|
|
||||||
#### 3. Установка Frontend
|
|
||||||
|
|
||||||
```bash
|
|
||||||
cd frontend
|
|
||||||
npm install
|
|
||||||
```
|
|
||||||
|
|
||||||
**Зависимости:**
|
|
||||||
- react - UI библиотека
|
|
||||||
- react-dom - рендеринг React
|
|
||||||
- axios - HTTP клиент
|
|
||||||
- lucide-react - иконки
|
|
||||||
- tailwindcss - CSS фреймворк
|
|
||||||
|
|
||||||
#### 4. Настройка ZITADEL (опционально)
|
|
||||||
|
|
||||||
Если хотите использовать OpenID Connect:
|
|
||||||
|
|
||||||
1. Создайте аккаунт на [ZITADEL](https://zitadel.com)
|
|
||||||
2. Создайте новое приложение (Application)
|
|
||||||
3. Выберите тип "Web"
|
|
||||||
4. Настройте Redirect URIs:
|
|
||||||
- `http://localhost:8000/api/auth/oidc/zitadel/callback`
|
|
||||||
5. Скопируйте Client ID и Client Secret
|
|
||||||
6. Добавьте в `.env` файл
|
|
||||||
|
|
||||||
#### 5. Структура проекта
|
|
||||||
|
|
||||||
```
|
|
||||||
mc-panel/
|
|
||||||
├── backend/
|
|
||||||
│ ├── main.py # Главный файл FastAPI
|
|
||||||
│ ├── oidc_config.py # Конфигурация OpenID Connect
|
|
||||||
│ ├── requirements.txt # Python зависимости
|
|
||||||
│ ├── users.json # База пользователей
|
|
||||||
│ ├── tickets.json # База тикетов
|
|
||||||
│ └── servers/ # Папка с серверами
|
|
||||||
├── frontend/
|
|
||||||
│ ├── src/
|
|
||||||
│ │ ├── App.jsx # Главный компонент
|
|
||||||
│ │ ├── components/ # React компоненты
|
|
||||||
│ │ ├── themes.js # Темы оформления
|
|
||||||
│ │ └── config.js # Конфигурация
|
|
||||||
│ ├── package.json # npm зависимости
|
|
||||||
│ └── vite.config.js # Конфигурация Vite
|
|
||||||
├── .env # Переменные окружения
|
|
||||||
└── ДОКУМЕНТАЦИЯ.md # Этот файл
|
|
||||||
```
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Функциональность
|
|
||||||
|
|
||||||
### Управление серверами
|
|
||||||
|
|
||||||
#### Создание сервера
|
|
||||||
1. Нажмите кнопку "+" в боковой панели
|
|
||||||
2. Заполните форму:
|
|
||||||
- **Имя папки** - только латиница, цифры, _ и -
|
|
||||||
- **Отображаемое имя** - любое название
|
|
||||||
- **Команда запуска** - команда для запуска сервера
|
|
||||||
3. Нажмите "Создать"
|
|
||||||
|
|
||||||
#### Запуск и остановка
|
|
||||||
- **Запустить** - зеленая кнопка "Запустить"
|
|
||||||
- **Остановить** - серая кнопка "Сброс"
|
|
||||||
- Статус отображается цветным индикатором
|
|
||||||
|
|
||||||
#### Консоль
|
|
||||||
- Просмотр логов в реальном времени
|
|
||||||
- Отправка команд серверу
|
|
||||||
- Цветная подсветка:
|
|
||||||
- 🟢 INFO - зеленый
|
|
||||||
- 🟡 WARN - желтый
|
|
||||||
- 🔴 ERROR - красный
|
|
||||||
- ⚪ Время - серый
|
|
||||||
|
|
||||||
#### Статистика
|
|
||||||
- **CPU** - использование процессора (%)
|
|
||||||
- **RAM** - использование памяти (МБ)
|
|
||||||
- **Disk** - размер файлов сервера (МБ)
|
|
||||||
- Обновление каждые 5 секунд
|
|
||||||
|
|
||||||
#### Настройки
|
|
||||||
- Изменение отображаемого имени
|
|
||||||
- Изменение команды запуска
|
|
||||||
- Удаление сервера (только админ)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Система уведомлений
|
|
||||||
|
|
||||||
### Описание
|
|
||||||
Полноценная система уведомлений с автоматическим исчезновением через 5 секунд.
|
|
||||||
|
|
||||||
### Типы уведомлений
|
|
||||||
- 🟢 **Success** - успешные операции
|
|
||||||
- 🔴 **Error** - ошибки
|
|
||||||
- 🟡 **Warning** - предупреждения
|
|
||||||
- 🔵 **Info** - информационные сообщения
|
|
||||||
|
|
||||||
### Где используются
|
|
||||||
|
|
||||||
#### Управление серверами
|
|
||||||
- ✅ Сервер запущен
|
|
||||||
- ℹ️ Сервер остановлен
|
|
||||||
- ❌ Ошибки запуска/остановки
|
|
||||||
|
|
||||||
#### Файловый менеджер
|
|
||||||
- ✅ Файл/папка создан(а)
|
|
||||||
- ✅ Файл загружен/удален/сохранен
|
|
||||||
- ✅ Файл переименован/перемещен
|
|
||||||
- ❌ Ошибки операций
|
|
||||||
|
|
||||||
#### Тикеты
|
|
||||||
- ✅ Тикет создан
|
|
||||||
- ✅ Сообщение отправлено
|
|
||||||
- ℹ️ Новое сообщение (от других, каждые 3 сек)
|
|
||||||
- ✅ Статус изменён (действие)
|
|
||||||
- ℹ️ Статус изменён (просмотр)
|
|
||||||
- ❌ Ошибки
|
|
||||||
|
|
||||||
**Особенности тикетов:**
|
|
||||||
- Автообновление каждые 3 секунды
|
|
||||||
- Превью сообщений (50 символов)
|
|
||||||
- Не показываются для собственных действий
|
|
||||||
|
|
||||||
#### Личный кабинет
|
|
||||||
- ✅ Имя изменено
|
|
||||||
- ✅ Пароль изменён
|
|
||||||
- ❌ Ошибки
|
|
||||||
|
|
||||||
#### Создание сервера
|
|
||||||
- ✅ Сервер создан
|
|
||||||
- ❌ Ошибка создания
|
|
||||||
|
|
||||||
### Технические детали
|
|
||||||
|
|
||||||
**Компонент:** `frontend/src/components/NotificationSystem.jsx`
|
|
||||||
|
|
||||||
**Использование:**
|
|
||||||
```javascript
|
|
||||||
import { notify } from './components/NotificationSystem';
|
|
||||||
|
|
||||||
notify('success', 'Заголовок', 'Сообщение');
|
|
||||||
notify('error', 'Ошибка', 'Описание');
|
|
||||||
notify('warning', 'Внимание', 'Предупреждение');
|
|
||||||
notify('info', 'Информация', 'Сообщение');
|
|
||||||
```
|
|
||||||
|
|
||||||
**Анимация:** slide-in-right (0.3 сек)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Дизайн и темы
|
|
||||||
|
|
||||||
### Доступные темы
|
|
||||||
|
|
||||||
1. **Modern (Современная)** - по умолчанию
|
|
||||||
- Цвета: #0f1115, #1a1d24, #23262e
|
|
||||||
- Акцент: зеленый
|
|
||||||
- Градиент: зеленый → изумрудный
|
|
||||||
|
|
||||||
2. **Dark (Тёмная)**
|
|
||||||
- Цвета: черный, темно-серый
|
|
||||||
- Акцент: синий
|
|
||||||
- Градиент: синий → фиолетовый
|
|
||||||
|
|
||||||
3. **Light (Светлая)**
|
|
||||||
- Цвета: белый, светло-серый
|
|
||||||
- Акцент: синий
|
|
||||||
- Градиент: синий → фиолетовый
|
|
||||||
|
|
||||||
4. **Purple (Фиолетовая)**
|
|
||||||
- Цвета: темный с фиолетовым оттенком
|
|
||||||
- Акцент: фиолетовый
|
|
||||||
- Градиент: фиолетовый → розовый
|
|
||||||
|
|
||||||
5. **Blue (Синяя)**
|
|
||||||
- Цвета: темный с синим оттенком
|
|
||||||
- Акцент: синий
|
|
||||||
- Градиент: голубой → синий
|
|
||||||
|
|
||||||
6. **Green (Зелёная)**
|
|
||||||
- Цвета: темный с зеленым оттенком
|
|
||||||
- Акцент: зеленый
|
|
||||||
- Градиент: изумрудный → зеленый
|
|
||||||
|
|
||||||
### Переключение темы
|
|
||||||
Кнопка в правом верхнем углу → выбор темы из списка
|
|
||||||
|
|
||||||
### Особенности дизайна
|
|
||||||
- Цветная консоль (INFO, WARN, ERROR)
|
|
||||||
- Кнопки с тенями и hover эффектами
|
|
||||||
- Плавные переходы и анимации
|
|
||||||
- Адаптивный дизайн
|
|
||||||
- Современные иконки (Lucide React)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Файловый менеджер
|
|
||||||
|
|
||||||
### Возможности
|
|
||||||
|
|
||||||
#### Просмотр файлов
|
|
||||||
- Список файлов и папок
|
|
||||||
- 6 колонок: Имя, Тип, Размер, Изменение, Разрешение, Действия
|
|
||||||
- Поиск по названию
|
|
||||||
- Навигация по папкам
|
|
||||||
|
|
||||||
#### Создание
|
|
||||||
- **Файл** - кнопка "Новый" → "Создать файл"
|
|
||||||
- **Папка** - кнопка "Новый" → "Создать папку"
|
|
||||||
- Ввод имени и Enter
|
|
||||||
|
|
||||||
#### Загрузка и скачивание
|
|
||||||
- **Загрузить** - зеленая кнопка, выбор файла
|
|
||||||
- **Скачать** - иконка скачивания у файла
|
|
||||||
|
|
||||||
#### Редактирование
|
|
||||||
- **Просмотр** - иконка глаза
|
|
||||||
- **Редактирование** - иконка карандаша
|
|
||||||
- Сохранение изменений
|
|
||||||
|
|
||||||
#### Переименование
|
|
||||||
- Двойной клик по имени файла
|
|
||||||
- Ввод нового имени
|
|
||||||
- Enter для сохранения
|
|
||||||
|
|
||||||
#### Перемещение файлов
|
|
||||||
|
|
||||||
**Cut/Paste (Вырезать/Вставить):**
|
|
||||||
1. Выберите файлы чекбоксами
|
|
||||||
2. Нажмите "Вырезать" (оранжевая кнопка)
|
|
||||||
3. Перейдите в нужную папку
|
|
||||||
4. Нажмите "Вставить" (фиолетовая кнопка)
|
|
||||||
|
|
||||||
**Особенности:**
|
|
||||||
- Файлы подсвечиваются оранжевым
|
|
||||||
- Счетчик вырезанных файлов
|
|
||||||
- Кнопка "Отмена" для отмены операции
|
|
||||||
- Drag & Drop отключен
|
|
||||||
|
|
||||||
#### Удаление
|
|
||||||
- Иконка корзины
|
|
||||||
- Подтверждение удаления
|
|
||||||
- Удаление файлов и папок
|
|
||||||
|
|
||||||
#### Выбор файлов
|
|
||||||
- Чекбокс в заголовке - выбрать все
|
|
||||||
- Чекбоксы у файлов - выбор отдельных
|
|
||||||
- Кнопка "Обновить" - обновить список
|
|
||||||
|
|
||||||
### Интерфейс
|
|
||||||
- Поиск с иконкой
|
|
||||||
- Кнопки: Загрузить (зеленая), Обновить (серая), Новый (синяя)
|
|
||||||
- Кнопки перемещения: Вырезать (оранжевая), Вставить (фиолетовая), Отмена (серая)
|
|
||||||
- Таблица с hover эффектами
|
|
||||||
- "No data" при пустой папке
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Система тикетов
|
|
||||||
|
|
||||||
### Создание тикета
|
|
||||||
1. Кнопка "Тикеты" в шапке
|
|
||||||
2. Кнопка "+" для создания
|
|
||||||
3. Заполните:
|
|
||||||
- **Заголовок** - краткое описание
|
|
||||||
- **Описание** - подробности проблемы
|
|
||||||
4. Нажмите "Создать"
|
|
||||||
|
|
||||||
### Статусы тикетов
|
|
||||||
- 🟡 **На рассмотрении** (pending) - новый тикет
|
|
||||||
- 🔵 **В работе** (in_progress) - тикет взят в работу
|
|
||||||
- 🟢 **Закрыт** (closed) - проблема решена
|
|
||||||
|
|
||||||
### Работа с тикетами
|
|
||||||
|
|
||||||
#### Просмотр
|
|
||||||
- Список всех тикетов
|
|
||||||
- Фильтр по статусу (цветные индикаторы)
|
|
||||||
- Информация: автор, дата, статус
|
|
||||||
|
|
||||||
#### Чат
|
|
||||||
- Отправка сообщений
|
|
||||||
- Просмотр истории
|
|
||||||
- Автообновление каждые 3 секунды
|
|
||||||
- Уведомления о новых сообщениях
|
|
||||||
|
|
||||||
#### Изменение статуса (админ/поддержка)
|
|
||||||
- Кнопки статусов в шапке тикета
|
|
||||||
- Автоматическое системное сообщение
|
|
||||||
- Уведомление всем участникам
|
|
||||||
|
|
||||||
### Уведомления в тикетах
|
|
||||||
|
|
||||||
**При отправке сообщения:**
|
|
||||||
- ✅ "Сообщение отправлено"
|
|
||||||
|
|
||||||
**При получении сообщения:**
|
|
||||||
- ℹ️ "Новое сообщение: {автор}: {превью}..."
|
|
||||||
- Только от других пользователей
|
|
||||||
- Превью 50 символов
|
|
||||||
|
|
||||||
**При изменении статуса:**
|
|
||||||
- ✅ "Статус изменён: Тикет #X теперь: {статус}" (действие)
|
|
||||||
- ℹ️ "Статус изменён: Тикет #X: {статус}" (просмотр)
|
|
||||||
|
|
||||||
**При ошибках:**
|
|
||||||
- ❌ "Ошибка отправки" / "Ошибка изменения статуса"
|
|
||||||
|
|
||||||
### Права доступа
|
|
||||||
- **Пользователи** - видят только свои тикеты
|
|
||||||
- **Админы** - видят все тикеты, могут менять статус
|
|
||||||
- **Поддержка** - видят все тикеты, могут менять статус
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Личный кабинет
|
|
||||||
|
|
||||||
### Доступ
|
|
||||||
Кнопка "Личный кабинет" в правом верхнем углу
|
|
||||||
|
|
||||||
### Разделы
|
|
||||||
|
|
||||||
#### Обзор
|
|
||||||
- Имя пользователя и роль
|
|
||||||
- Статистика:
|
|
||||||
- Мои серверы (созданные)
|
|
||||||
- Доступные серверы (общие)
|
|
||||||
- Тикеты (всего, по статусам)
|
|
||||||
- Общее количество серверов
|
|
||||||
|
|
||||||
#### Безопасность
|
|
||||||
|
|
||||||
**Изменение имени пользователя:**
|
|
||||||
1. Введите новое имя (минимум 3 символа)
|
|
||||||
2. Введите текущий пароль
|
|
||||||
3. Нажмите "Изменить имя"
|
|
||||||
4. Получите новый токен
|
|
||||||
|
|
||||||
**Изменение пароля:**
|
|
||||||
1. Введите старый пароль
|
|
||||||
2. Введите новый пароль (минимум 6 символов)
|
|
||||||
3. Подтвердите новый пароль
|
|
||||||
4. Нажмите "Изменить пароль"
|
|
||||||
|
|
||||||
**Показ/скрытие паролей:**
|
|
||||||
- Иконка глаза для переключения видимости
|
|
||||||
|
|
||||||
### Просмотр чужих профилей (админ/поддержка)
|
|
||||||
|
|
||||||
Админы и техподдержка могут просматривать профили других пользователей:
|
|
||||||
- Статистика пользователя
|
|
||||||
- Список серверов
|
|
||||||
- Тикеты пользователя
|
|
||||||
- Индикатор "Просмотр профиля: {username}"
|
|
||||||
|
|
||||||
**Доступ:**
|
|
||||||
1. Раздел "Пользователи"
|
|
||||||
2. Кнопка "Профиль" у пользователя
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## OpenID Connect
|
|
||||||
|
|
||||||
### Поддерживаемые провайдеры
|
|
||||||
- **ZITADEL** - основной провайдер
|
|
||||||
|
|
||||||
### Настройка ZITADEL
|
|
||||||
|
|
||||||
#### 1. Создание приложения
|
|
||||||
1. Зарегистрируйтесь на [ZITADEL](https://zitadel.com)
|
|
||||||
2. Создайте новый проект
|
|
||||||
3. Добавьте приложение (Application)
|
|
||||||
4. Выберите тип "Web"
|
|
||||||
5. Настройте Redirect URIs:
|
|
||||||
```
|
|
||||||
http://localhost:8000/api/auth/oidc/zitadel/callback
|
|
||||||
https://your-domain.com/api/auth/oidc/zitadel/callback
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Получение учетных данных
|
|
||||||
1. Скопируйте **Client ID**
|
|
||||||
2. Создайте и скопируйте **Client Secret**
|
|
||||||
3. Скопируйте **Issuer URL** (например: `https://your-instance.zitadel.cloud`)
|
|
||||||
|
|
||||||
#### 3. Настройка .env
|
|
||||||
```env
|
|
||||||
ZITADEL_ISSUER=https://your-instance.zitadel.cloud
|
|
||||||
ZITADEL_CLIENT_ID=your_client_id_here
|
|
||||||
ZITADEL_CLIENT_SECRET=your_client_secret_here
|
|
||||||
BASE_URL=http://localhost:8000
|
|
||||||
FRONTEND_URL=http://localhost:3000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Использование
|
|
||||||
|
|
||||||
#### Вход через ZITADEL
|
|
||||||
1. На странице входа нажмите кнопку "ZITADEL"
|
|
||||||
2. Авторизуйтесь на странице ZITADEL
|
|
||||||
3. Разрешите доступ приложению
|
|
||||||
4. Автоматическое перенаправление в панель
|
|
||||||
|
|
||||||
#### Создание пользователя
|
|
||||||
- При первом входе автоматически создается пользователь
|
|
||||||
- Имя пользователя берется из email (до @)
|
|
||||||
- Роль: `user` (обычный пользователь)
|
|
||||||
- Пароль не требуется (используется OIDC)
|
|
||||||
|
|
||||||
#### Связывание аккаунтов
|
|
||||||
- Каждый OIDC аккаунт уникален
|
|
||||||
- Повторный вход использует существующего пользователя
|
|
||||||
- ID хранится в формате: `zitadel:{sub}`
|
|
||||||
|
|
||||||
### Безопасность
|
|
||||||
- Токены обновляются автоматически
|
|
||||||
- Используется PKCE для защиты
|
|
||||||
- Все данные передаются через HTTPS (в production)
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Роли пользователей
|
|
||||||
|
|
||||||
### Admin (Администратор)
|
|
||||||
**Полный доступ ко всем функциям:**
|
|
||||||
- ✅ Все серверы (создание, удаление, управление)
|
|
||||||
- ✅ Все тикеты (просмотр, изменение статуса)
|
|
||||||
- ✅ Управление пользователями (роли, доступ, удаление)
|
|
||||||
- ✅ Просмотр всех профилей
|
|
||||||
- ✅ Изменение настроек серверов
|
|
||||||
|
|
||||||
**Получение роли:**
|
|
||||||
- Первый зарегистрированный пользователь
|
|
||||||
- Назначение другим админом
|
|
||||||
|
|
||||||
### User (Пользователь)
|
|
||||||
**Стандартные права:**
|
|
||||||
- ✅ Свои серверы (создание, управление)
|
|
||||||
- ✅ Серверы с предоставленным доступом
|
|
||||||
- ✅ Свои тикеты (создание, просмотр)
|
|
||||||
- ✅ Свой профиль
|
|
||||||
- ❌ Управление другими пользователями
|
|
||||||
- ❌ Удаление серверов
|
|
||||||
- ❌ Просмотр чужих тикетов
|
|
||||||
|
|
||||||
### Support (Техподдержка)
|
|
||||||
**Права поддержки:**
|
|
||||||
- ✅ Все тикеты (просмотр, ответы, изменение статуса)
|
|
||||||
- ✅ Просмотр профилей пользователей
|
|
||||||
- ✅ Свои серверы
|
|
||||||
- ❌ Управление пользователями
|
|
||||||
- ❌ Удаление серверов
|
|
||||||
- ❌ Изменение ролей
|
|
||||||
|
|
||||||
### Banned (Заблокирован)
|
|
||||||
**Нет доступа:**
|
|
||||||
- ❌ Вход в систему запрещен
|
|
||||||
- ❌ API запросы отклоняются
|
|
||||||
- ❌ Все функции недоступны
|
|
||||||
|
|
||||||
### Изменение ролей
|
|
||||||
|
|
||||||
**Только админы могут:**
|
|
||||||
1. Раздел "Пользователи"
|
|
||||||
2. Выбрать пользователя
|
|
||||||
3. Кнопка "Изменить роль"
|
|
||||||
4. Выбрать новую роль
|
|
||||||
5. Подтвердить
|
|
||||||
|
|
||||||
**Ограничения:**
|
|
||||||
- Нельзя изменить свою роль
|
|
||||||
- Нельзя удалить себя
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Безопасность
|
|
||||||
|
|
||||||
### JWT Токены
|
|
||||||
- **Алгоритм:** HS256
|
|
||||||
- **Срок действия:** 7 дней
|
|
||||||
- **Хранение:** localStorage (фронтенд)
|
|
||||||
- **Передача:** Bearer Token в заголовке Authorization
|
|
||||||
|
|
||||||
### Пароли
|
|
||||||
- **Хеширование:** bcrypt
|
|
||||||
- **Минимальная длина:** 6 символов
|
|
||||||
- **Проверка:** при каждом входе
|
|
||||||
- **Изменение:** требует старый пароль
|
|
||||||
|
|
||||||
### Файловая безопасность
|
|
||||||
- Все пути проверяются на выход за пределы папки сервера
|
|
||||||
- Запрещены операции с файлами вне `servers/`
|
|
||||||
- Проверка прав доступа к серверу
|
|
||||||
|
|
||||||
### API безопасность
|
|
||||||
- Все эндпоинты требуют авторизацию (кроме login/register)
|
|
||||||
- Проверка роли для админских функций
|
|
||||||
- Валидация входных данных
|
|
||||||
- Защита от SQL injection (используется JSON)
|
|
||||||
|
|
||||||
### Рекомендации для production
|
|
||||||
|
|
||||||
#### 1. Измените SECRET_KEY
|
|
||||||
В `backend/main.py`:
|
|
||||||
```python
|
|
||||||
SECRET_KEY = "your-very-long-random-secret-key-here"
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 2. Используйте HTTPS
|
|
||||||
```env
|
|
||||||
BASE_URL=https://your-domain.com
|
|
||||||
FRONTEND_URL=https://your-domain.com
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 3. Настройте CORS
|
|
||||||
В `backend/main.py`:
|
|
||||||
```python
|
|
||||||
app.add_middleware(
|
|
||||||
CORSMiddleware,
|
|
||||||
allow_origins=["https://your-domain.com"], # Конкретный домен
|
|
||||||
allow_credentials=True,
|
|
||||||
allow_methods=["*"],
|
|
||||||
allow_headers=["*"],
|
|
||||||
)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 4. Используйте базу данных
|
|
||||||
Замените `users.json` и `tickets.json` на PostgreSQL/MySQL
|
|
||||||
|
|
||||||
#### 5. Настройте firewall
|
|
||||||
- Ограничьте доступ к портам
|
|
||||||
- Разрешите только необходимые IP
|
|
||||||
|
|
||||||
#### 6. Регулярные обновления
|
|
||||||
```bash
|
|
||||||
pip install --upgrade -r requirements.txt
|
|
||||||
npm update
|
|
||||||
```
|
|
||||||
|
|
||||||
#### 7. Логирование
|
|
||||||
Включите подробное логирование для отслеживания действий
|
|
||||||
|
|
||||||
#### 8. Backup
|
|
||||||
Регулярно создавайте резервные копии:
|
|
||||||
- `users.json`
|
|
||||||
- `tickets.json`
|
|
||||||
- Папка `servers/`
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Troubleshooting
|
|
||||||
|
|
||||||
### Проблемы с запуском
|
|
||||||
|
|
||||||
#### Backend не запускается
|
|
||||||
```bash
|
|
||||||
# Проверьте Python версию
|
|
||||||
python --version # Должно быть 3.8+
|
|
||||||
|
|
||||||
# Переустановите зависимости
|
|
||||||
pip install --upgrade -r requirements.txt
|
|
||||||
|
|
||||||
# Проверьте порт 8000
|
|
||||||
netstat -ano | findstr :8000
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Frontend не запускается
|
|
||||||
```bash
|
|
||||||
# Проверьте Node.js версию
|
|
||||||
node --version # Должно быть 16+
|
|
||||||
|
|
||||||
# Очистите кэш и переустановите
|
|
||||||
rm -rf node_modules package-lock.json
|
|
||||||
npm install
|
|
||||||
|
|
||||||
# Проверьте порт 3000
|
|
||||||
netstat -ano | findstr :3000
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблемы с аутентификацией
|
|
||||||
|
|
||||||
#### "Неверный токен"
|
|
||||||
- Токен истек (7 дней)
|
|
||||||
- Измененный SECRET_KEY
|
|
||||||
- **Решение:** Выйдите и войдите снова
|
|
||||||
|
|
||||||
#### "Требуется авторизация"
|
|
||||||
- Токен не передан
|
|
||||||
- Неверный формат токена
|
|
||||||
- **Решение:** Проверьте заголовок Authorization
|
|
||||||
|
|
||||||
#### OpenID Connect не работает
|
|
||||||
```bash
|
|
||||||
# Проверьте .env файл
|
|
||||||
cat .env
|
|
||||||
|
|
||||||
# Проверьте переменные
|
|
||||||
echo $ZITADEL_ISSUER
|
|
||||||
echo $ZITADEL_CLIENT_ID
|
|
||||||
|
|
||||||
# Проверьте Redirect URI в ZITADEL
|
|
||||||
# Должен быть: http://localhost:8000/api/auth/oidc/zitadel/callback
|
|
||||||
```
|
|
||||||
|
|
||||||
### Проблемы с серверами
|
|
||||||
|
|
||||||
#### Сервер не запускается
|
|
||||||
- Проверьте наличие `server.jar`
|
|
||||||
- Проверьте команду запуска
|
|
||||||
- Проверьте логи в консоли
|
|
||||||
- Проверьте права доступа к файлам
|
|
||||||
|
|
||||||
#### Консоль пустая
|
|
||||||
- Сервер еще не запущен
|
|
||||||
- WebSocket не подключен
|
|
||||||
- **Решение:** Перезапустите сервер
|
|
||||||
|
|
||||||
#### Статистика показывает 0
|
|
||||||
- Сервер остановлен
|
|
||||||
- Процесс завершился
|
|
||||||
- **Решение:** Запустите сервер
|
|
||||||
|
|
||||||
### Проблемы с файлами
|
|
||||||
|
|
||||||
#### "Файл не найден"
|
|
||||||
- Неверный путь
|
|
||||||
- Файл удален
|
|
||||||
- Нет прав доступа
|
|
||||||
- **Решение:** Проверьте путь и права
|
|
||||||
|
|
||||||
#### Не удается загрузить файл
|
|
||||||
- Файл слишком большой
|
|
||||||
- Нет места на диске
|
|
||||||
- **Решение:** Освободите место
|
|
||||||
|
|
||||||
#### Не удается переместить файл
|
|
||||||
- Файл открыт процессом
|
|
||||||
- Нет прав доступа
|
|
||||||
- **Решение:** Остановите сервер
|
|
||||||
|
|
||||||
### Проблемы с тикетами
|
|
||||||
|
|
||||||
#### Не приходят уведомления
|
|
||||||
- Проверьте интервал обновления (3 сек)
|
|
||||||
- Откройте консоль браузера (F12)
|
|
||||||
- Проверьте ошибки JavaScript
|
|
||||||
|
|
||||||
#### Сообщения не отправляются
|
|
||||||
- Проверьте подключение к интернету
|
|
||||||
- Проверьте токен авторизации
|
|
||||||
- Проверьте логи backend
|
|
||||||
|
|
||||||
### Проблемы с производительностью
|
|
||||||
|
|
||||||
#### Медленная работа
|
|
||||||
```bash
|
|
||||||
# Проверьте использование ресурсов
|
|
||||||
# Windows:
|
|
||||||
tasklist | findstr python
|
|
||||||
tasklist | findstr node
|
|
||||||
|
|
||||||
# Проверьте количество серверов
|
|
||||||
# Каждый сервер потребляет ресурсы
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Высокое использование CPU
|
|
||||||
- Много запущенных серверов
|
|
||||||
- Частые обновления статистики
|
|
||||||
- **Решение:** Остановите неиспользуемые серверы
|
|
||||||
|
|
||||||
### Логи и отладка
|
|
||||||
|
|
||||||
#### Включить подробные логи (Backend)
|
|
||||||
В `backend/main.py`:
|
|
||||||
```python
|
|
||||||
import logging
|
|
||||||
logging.basicConfig(level=logging.DEBUG)
|
|
||||||
```
|
|
||||||
|
|
||||||
#### Просмотр логов (Frontend)
|
|
||||||
Откройте консоль браузера (F12) → Console
|
|
||||||
|
|
||||||
#### Проверка API
|
|
||||||
```bash
|
|
||||||
# Проверьте доступность API
|
|
||||||
curl http://localhost:8000/api/auth/oidc/providers
|
|
||||||
|
|
||||||
# Проверьте токен
|
|
||||||
curl http://localhost:8000/api/auth/me \
|
|
||||||
-H "Authorization: Bearer YOUR_TOKEN"
|
|
||||||
```
|
|
||||||
|
|
||||||
### Получение помощи
|
|
||||||
|
|
||||||
1. **Проверьте документацию** - возможно, ответ уже есть
|
|
||||||
2. **Проверьте логи** - backend и frontend
|
|
||||||
3. **Создайте тикет** - опишите проблему подробно
|
|
||||||
4. **GitHub Issues** - для багов и предложений
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Дополнительная информация
|
|
||||||
|
|
||||||
### Структура базы данных
|
|
||||||
|
|
||||||
#### users.json
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"username": {
|
|
||||||
"username": "string",
|
|
||||||
"password": "hashed_password",
|
|
||||||
"role": "admin|user|support|banned",
|
|
||||||
"servers": ["server1", "server2"],
|
|
||||||
"oidc_id": "provider:sub",
|
|
||||||
"email": "user@example.com",
|
|
||||||
"name": "User Name",
|
|
||||||
"picture": "https://...",
|
|
||||||
"provider": "zitadel",
|
|
||||||
"created_at": "2026-01-15T10:00:00"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### tickets.json
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"1": {
|
|
||||||
"id": "1",
|
|
||||||
"title": "Проблема",
|
|
||||||
"description": "Описание",
|
|
||||||
"author": "username",
|
|
||||||
"status": "pending|in_progress|closed",
|
|
||||||
"created_at": "2026-01-15T10:00:00",
|
|
||||||
"updated_at": "2026-01-15T11:00:00",
|
|
||||||
"messages": [
|
|
||||||
{
|
|
||||||
"author": "username",
|
|
||||||
"text": "Сообщение",
|
|
||||||
"timestamp": "2026-01-15T10:00:00"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
#### panel_config.json (в папке сервера)
|
|
||||||
```json
|
|
||||||
{
|
|
||||||
"name": "server1",
|
|
||||||
"displayName": "My Server",
|
|
||||||
"startCommand": "java -Xmx2G -jar server.jar nogui",
|
|
||||||
"owner": "username"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
### Горячие клавиши
|
|
||||||
|
|
||||||
- **Ctrl + K** - Поиск (в файловом менеджере)
|
|
||||||
- **Enter** - Отправить сообщение (в тикете)
|
|
||||||
- **Esc** - Закрыть модальное окно
|
|
||||||
- **F5** - Обновить страницу
|
|
||||||
|
|
||||||
### Советы и трюки
|
|
||||||
|
|
||||||
#### Быстрое создание сервера
|
|
||||||
1. Создайте сервер через панель
|
|
||||||
2. Загрузите `server.jar` через файловый менеджер
|
|
||||||
3. Создайте `eula.txt` с содержимым `eula=true`
|
|
||||||
4. Запустите сервер
|
|
||||||
|
|
||||||
#### Массовое перемещение файлов
|
|
||||||
1. Выберите все файлы (чекбокс в заголовке)
|
|
||||||
2. Нажмите "Вырезать"
|
|
||||||
3. Перейдите в папку назначения
|
|
||||||
4. Нажмите "Вставить"
|
|
||||||
|
|
||||||
#### Мониторинг нескольких серверов
|
|
||||||
Откройте панель в нескольких вкладках браузера для одновременного мониторинга
|
|
||||||
|
|
||||||
#### Быстрый доступ к консоли
|
|
||||||
Добавьте панель в закладки браузера для быстрого доступа
|
|
||||||
|
|
||||||
### Ограничения
|
|
||||||
|
|
||||||
- **Максимальный размер файла:** зависит от настроек сервера
|
|
||||||
- **Количество серверов:** не ограничено (зависит от ресурсов)
|
|
||||||
- **Количество пользователей:** не ограничено
|
|
||||||
- **Длина сообщения в тикете:** не ограничена
|
|
||||||
- **Срок хранения логов:** 1000 последних строк
|
|
||||||
|
|
||||||
### Roadmap (Планы развития)
|
|
||||||
|
|
||||||
- [ ] Поддержка нескольких OIDC провайдеров
|
|
||||||
- [ ] Расписание запуска/остановки серверов
|
|
||||||
- [ ] Автоматические бэкапы
|
|
||||||
- [ ] Графики статистики
|
|
||||||
- [ ] Плагин-менеджер
|
|
||||||
- [ ] Мобильное приложение
|
|
||||||
- [ ] Push-уведомления
|
|
||||||
- [ ] Двухфакторная аутентификация
|
|
||||||
- [ ] Темная тема для консоли
|
|
||||||
- [ ] Экспорт логов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Changelog
|
|
||||||
|
|
||||||
### Версия 1.0.0 (15.01.2026)
|
|
||||||
- ✨ Первый релиз
|
|
||||||
- ✅ Управление серверами
|
|
||||||
- ✅ Файловый менеджер
|
|
||||||
- ✅ Система тикетов
|
|
||||||
- ✅ Личный кабинет
|
|
||||||
- ✅ OpenID Connect (ZITADEL)
|
|
||||||
- ✅ 6 тем оформления
|
|
||||||
- ✅ Система уведомлений
|
|
||||||
- ✅ Управление пользователями
|
|
||||||
- ✅ Роли и права доступа
|
|
||||||
- ✅ WebSocket консоль
|
|
||||||
- ✅ Мониторинг ресурсов
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Лицензия
|
|
||||||
|
|
||||||
MIT License - свободное использование
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
## Контакты и поддержка
|
|
||||||
|
|
||||||
- **Документация:** Этот файл
|
|
||||||
- **API Документация:** API.md
|
|
||||||
- **Тикеты:** Используйте систему тикетов в панели
|
|
||||||
- **GitHub:** [Ссылка на репозиторий]
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
**Спасибо за использование MC Panel!** 🎮
|
|
||||||
|
|
||||||
**Версия документации:** 1.0.0
|
|
||||||
**Дата обновления:** 15 января 2026
|
|
||||||
Reference in New Issue
Block a user