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