mirror of
https://github.com/MHSanaei/3x-ui.git
synced 2026-01-13 01:02:46 +00:00
9.8 KiB
9.8 KiB
Multi-Node Architecture для 3x-ui
📋 Обзор
Реализована поддержка multi-node архитектуры для панели 3x-ui с возможностью переключения между режимами работы:
- single-mode (по умолчанию) - полностью совместим с текущей логикой
- multi-mode - распределённая архитектура с отдельными нодами
🏗️ Архитектура
Single-Mode (по умолчанию)
- Используется встроенный XRAY Core на том же сервере, что и панель
- Все инбаунды работают локально
- Полная совместимость с существующим функционалом
Multi-Mode
- Панель становится центральным сервером управления (Master)
- XRAY Core больше не используется локально
- Реальные XRAY инстансы работают на отдельных нодах (Workers)
- Панель хранит:
- Пользователей
- Инбаунды
- Правила маршрутизации
- Соответствие inbound → node
- Панель генерирует подписки с endpoint'ами нод
📦 Компоненты
1. Node-сервис (Worker)
Отдельный сервис, запускаемый в Docker на каждой ноде.
Расположение: node/
Функциональность:
- REST API для управления XRAY Core
- Применение конфигураций от панели
- Перезагрузка XRAY без остановки контейнера
- Проверка статуса и здоровья
API Endpoints:
GET /health- проверка здоровья (без аутентификации)POST /api/v1/apply-config- применить конфигурацию XRAYPOST /api/v1/reload- перезагрузить XRAYGET /api/v1/status- получить статус XRAY
Запуск:
cd node
NODE_API_KEY=your-secure-api-key docker-compose up -d
2. Изменения в панели
База данных
Добавлены новые модели:
Node- информация о ноде (id, name, address, api_key, status)InboundNodeMapping- соответствие inbound → node
Сервисы
SettingService:
GetMultiNodeMode()- получить режим работыSetMultiNodeMode(enabled)- установить режим работы
NodeService:
- Управление нодами (CRUD)
- Проверка здоровья нод
- Назначение инбаундов нодам
- Отправка конфигураций на ноды
XrayService:
- Автоматическое определение режима работы
- В single-mode: работает как раньше
- В multi-mode: отправляет конфигурации на ноды вместо запуска локального XRAY
SubService:
- В multi-mode: генерирует подписки с endpoint'ами нод
- В single-mode: работает как раньше
Контроллеры
NodeController:
GET /panel/node/list- список нодGET /panel/node/get/:id- получить нодуPOST /panel/node/add- добавить нодуPOST /panel/node/update/:id- обновить нодуPOST /panel/node/del/:id- удалить нодуPOST /panel/node/check/:id- проверить здоровье нодыPOST /panel/node/checkAll- проверить все нодыGET /panel/node/status/:id- получить статус ноды
🔄 Как это работает
Single-Mode
- Пользователь создаёт/изменяет инбаунд
- Панель генерирует конфигурацию XRAY
- Локальный XRAY Core перезапускается с новой конфигурацией
- Подписки генерируются с endpoint панели
Multi-Mode
- Пользователь создаёт/изменяет инбаунд
- Пользователь назначает инбаунд ноде (через UI)
- Панель генерирует конфигурацию XRAY для этой ноды
- Конфигурация отправляется на ноду через REST API
- Нода применяет конфигурацию и перезапускает свой XRAY Core
- Подписки генерируются с endpoint ноды
🚀 Установка и настройка
1. Настройка панели
- Включите multi-node mode в настройках панели (UI тумблер)
- Добавьте ноды через UI (вкладка "Nodes")
- Назначьте инбаунды нодам
2. Настройка ноды
- Скопируйте папку
node/на сервер ноды - Установите XRAY Core в
bin/директорию - Настройте
docker-compose.yml:environment: - NODE_API_KEY=your-secure-api-key - Запустите:
docker-compose up -d
3. Добавление ноды в панель
- Перейдите в раздел "Nodes"
- Нажмите "Add Node"
- Заполните:
- Name: имя ноды (например, "Node-1")
- Address: адрес API ноды (например, "http://192.168.1.100:8080")
- API Key: ключ, указанный в
NODE_API_KEYна ноде
- Сохраните
4. Назначение инбаунда ноде
- Перейдите в раздел "Inbounds"
- Откройте инбаунд для редактирования
- В выпадающем списке "Node" выберите ноду
- Сохраните
📝 Структура файлов
3x-ui/
├── node/ # Node-сервис (worker)
│ ├── main.go # Точка входа
│ ├── api/
│ │ └── server.go # REST API сервер
│ ├── xray/
│ │ └── manager.go # Управление XRAY процессом
│ ├── Dockerfile # Docker образ
│ ├── docker-compose.yml # Docker Compose конфигурация
│ └── README.md # Документация ноды
├── database/
│ └── model/
│ └── model.go # + Node, InboundNodeMapping
├── web/
│ ├── service/
│ │ ├── setting.go # + GetMultiNodeMode, SetMultiNodeMode
│ │ ├── node.go # NodeService (новый)
│ │ ├── xray.go # + поддержка multi-mode
│ └── controller/
│ ├── node.go # NodeController (новый)
│ └── xui.go # + маршрут /nodes
└── sub/
└── subService.go # + поддержка multi-mode для подписок
⚠️ Важные замечания
- Совместимость: Все изменения минимально инвазивны и сохраняют полную совместимость с single-mode
- Миграция: При переключении в multi-mode существующие инбаунды остаются без назначенных нод - их нужно назначить вручную
- Безопасность: API ключи нод должны быть надёжными и храниться в безопасности
- Сеть: Ноды должны быть доступны с панели по указанным адресам
🔧 Разработка
Запуск Node-сервиса в режиме разработки
cd node
go run main.go -port 8080 -api-key test-key
Тестирование
- Запустите панель в multi-mode
- Добавьте тестовую ноду
- Создайте инбаунд и назначьте его ноде
- Проверьте, что конфигурация отправляется на ноду
- Проверьте, что подписки содержат правильный endpoint
📚 API Документация
Node Service API
Все запросы (кроме /health) требуют заголовок:
Authorization: Bearer <api-key>
Apply Config
POST /api/v1/apply-config
Content-Type: application/json
{
"log": {...},
"inbounds": [...],
"outbounds": [...],
...
}
Reload
POST /api/v1/reload
Status
GET /api/v1/status
Response:
{
"running": true,
"version": "1.8.0",
"uptime": 3600
}
🐛 Troubleshooting
Нода не отвечает
- Проверьте, что нода запущена:
docker ps - Проверьте логи:
docker logs 3x-ui-node - Проверьте доступность:
curl http://node-address:8080/health - Проверьте API ключ в настройках панели
Конфигурация не применяется
- Проверьте логи ноды
- Проверьте, что XRAY Core установлен в
bin/ - Проверьте формат конфигурации
Подписки не работают
- Убедитесь, что инбаунд назначен ноде
- Проверьте, что endpoint ноды доступен из сети
- Проверьте, что порт инбаунда открыт на ноде