Numdrassl
Numdrassl is a high-performance, extensible Hytale proxy server written in Java that provides server-to-server transfers, plugin support, and external provider integration.
Описание
Numdrasl - Hytale Proxy Server
Высокопроизводительный, расширяемый прокси-сервер Hytale, написанный на Java, который обеспечивает многосерверные сети, передачу игроков, поддержку плагинов и гибкую систему разрешений.
Что такое Numdrassl?
Numdrassl является Прокси-сервер BungeeCord/Velocity Для Hytale. Он находится между игроками и вашими серверами, что позволяет вам:
- Соединить несколько Серверы Hytale в единую сеть
- Передача игроков между серверами
- Перехват и изменение пакетов
- Создание плагинов с пользовательскими командами и событиями
- Управление разрешениями с группами и wildcards
Особенности
- Многосерверная сеть Подключите несколько серверов Hytale (лобби, мини-игры и т. Д.)
- Игровые трансферы Бесшовное перемещение игроков между серверами
/server <name> - Система плагинов - Расширение функциональности с помощью пользовательских плагинов
- Система разрешений Встроенные разрешения на основе YAML с группами, wildcards и поддержкой внешних поставщиков
- Система событий - Нажмите на соединения игроков, чат, команды и многое другое
- Протокол QUIC - Родная поддержка транспорта Hytale QUIC с контролем загруженности BBR
- Безопасная аутентификация - HMAC-подписанные ссылки между прокси и бэкэндами
Требования
- Java 25 или выше
- Hytale Server(s) Использовать как backends
установка
Шаг 1: скачать
Скачать последнюю версию:
proxy*.jar- Прокси-серверbridge*.jar- Плагин для ваших серверов
Шаг 2: Запустите прокси
java -jar proxy-1.0-SNAPSHOT.jar
При первом запуске прокси будет:
- Сертификаты TLS в
удостоверения/ - создавать
config/proxy.ymlконфигурационный файл - Подтвердите подлинность с помощью Hytale
Шаг 3: Аутентификация с помощью Hytale
В прокси-консоли запустите:
auth login
Посетите показанный URL-адрес и введите код устройства, чтобы связать свою учетную запись Hytale.
Конфигурация Proxy
Редактировать config/proxy.yml:
# Настройки сети
bindAddress: "0.0.0.0"
bindPort: 45585
# Общественный адрес (для передачи сервера)
Публичный адрес: play.yourserver.com
Портал: 45585
# Общий секрет - ДОЛЖЕН соответствовать конфигурации плагина Bridge!
Оригинальное название: Change-this-to-a-secret
# Backend серверы
бэкэнды:
- название: "лобби"
Ведущий: "127.0.0.1"
Порт: 5520
по умолчанию Оригинальное название: True # Players join here first
- имя: "выживание"
Ведущий: "127.0.0.1"
Порт: 5521
по умолчанию Сервер: ложный
- название: "миниигры"
Ведущий: "192.168.1.100"
Порт: 5520
по умолчанию Сервер: ложный
Варианты конфигурации
| Вариант | Описание |
|---|---|
связной |
IP для прослушивания0,0.0.0 Для всех интерфейсов |
порт |
Порт для прослушивания (по умолчанию): 45585) |
общественный адрес |
Публичное имя хоста / IP для передачи сервера |
публичный Порт |
Публичный порт для передачи серверов |
Прокси-секрет |
Общий секрет для backend аутентификации |
бэкэнд |
Список серверов Backend |
отладчик |
Включить вербозу (по умолчанию): ложный) |
Настройка Backend Server
Каждый сервер нуждается в Плагин Bridge аутентифицировать соединения с прокси.
Шаг 1: Установите плагин Bridge
Копия Мост-1.0-SNAPSHOT.jar к твоему Сервер Hytale плагины/ папка.
Шаг 2: Запустите сервер в небезопасном режиме
java -jar HytaleServer.jar - ненадежный режим - транспорт Куик
Важно: The
ненадежный режимФлаг необходим, потому что прокси обрабатывает аутентификацию Hytale, а не бэкэнд.
Шаг 3: Настройка моста
На первом этапе мост создает плагины/Bridge/config.json:
{
"proxySecret": "изменить это в секрет",
«ServerName»: «Лобби»
?
| Вариант | Описание |
|---|---|
Прокси-секрет |
Должен быть матч тот Прокси-секрет В конфигурацию прокси! |
имя сервера |
Название этого сервера (для регистрации / идентификации) |
Шаг 4: Защитите свой бэкэнд (важно!)
Блокировать прямые соединения для ваших серверов. Разрешается только IP прокси:
# Пример: Только прокси (192.168.1.50) может подключаться к порту 5520.
iptables -A INPUT -p udp -dport 5520 -s 192.168.1.50 -j ACCEPT
iptables - A INPUT -p udp -dport 5520 -j DROP
Без этого игроки могли бы обойти прокси и подключиться напрямую!
Игровые команды
| Командование | алиасы | Описание |
|---|---|---|
/сервер |
/srv |
Список доступных серверов |
/server <name> |
/srv <name> |
Перевод на сервер |
/numdrassl |
/nd, /proxy |
Команды управления Proxy |
/numdrassl версия |
Показать прокси версию | |
/numdrasl perm... |
Управление разрешениями |
Система разрешений
Разрешения хранятся в файлах YAML данные/разрешения/:
данные/разрешения/
Игроки / Players
???????????? # Пер-игровые разрешения
─ ─ группы/
↑ default.yml # Default group (все игроки)
admin.yml # Пользовательские группы
─── player-groups.yml # Игрок-группа назначения
Разрешения игрока ()Игроки/{uuid.yml})
разрешения:
-numdrassl.command.server
-numdrassl.command.help
-numdrassl.command.stop # Отказано (приставка с -)
Групповые разрешения (Группы/admin.yml)
Имя: admin
Дефолт: ложный
разрешения:
-numdrassl.command.* Дикая карточка
-numdrassl.admin
Командование разрешениями
| Командование | Описание |
|---|---|
/numdrasl perm user <player> info |
Группы/разрешения игроков |
/numdrasl perm user <player> add <perm> |
Дать разрешение |
/numdrasl perm user <player> remove <perm> |
Удалить разрешение |
/numdrasl perm user <player> addgroup <group> |
Добавить игрока в группу |
/numdrasl perm user <player> removegroup <group> |
Удалить из группы |
/numdrasl perm group <group> add <perm> |
Добавить разрешение в группу |
/numdrasl perm group <group> remove <perm> |
Удалить из группы |
/numdrassl perm reload |
Перезагрузка разрешений с диска |
Консольные команды
| Командование | Описание |
|---|---|
auth login |
Подлинность с Hytale |
auth статус |
Показать статус аутентификации |
аут-лоут |
Чистые хранимые учетные данные |
сессии |
Список подключенных игроков |
останавливаться |
Закрыть прокси |
помочь |
Показать доступные команды |
Разработка плагинов
Создайте плагины для расширения прокси! Плагины могут:
- Слушайте события (вступление игрока, чат, команды и т.д.)
- Регистрация пользовательских команд
- Модифицировать пакеты
- Взаимодействие с игроками и серверами
API Зависимость:
зависимости {
compileOnly ("me.internalizable.numdrassl:api:1.0-SNAPSHOT")
?
Пример плагина:
@Plugin(id = "my-plugin", name = "My Plugin", version = "1.0.0")
Общественный класс MyPlugin {
@Подписаться
Публичная пустота onPlayer Chat (событие PlayerChat)
если (event.getMessage().contains("hello")) {
event.getPlayer().sendMessage("Привет вам тоже!");
?
?
?
Смотреть полный Руководство по разработке плагинов для более подробной информации.
устранение неполадок
«Прокси не аутентифицировано»
Беги. auth login в прокси-консоль и завершить поток кода устройства.
Недействительное информационное сообщение игрока (действителен ли ваш секрет прокси?)
The Прокси-секрет в конфигурации прокси не соответствует плагину Bridge Прокси-секрет.
«Connection Timed Out» для бэкэнда
- Проверьте, работает ли сервер backend
- Проверить брандмауэр позволяет прокси IP
- Подтвердите, что адрес / порт в конфигурации правильный
«Cannot direct join numdrassl backend» (недоступная ссылка)
Игроки пытаются подключиться непосредственно к бэкэнду. Настройте правила брандмауэра для блокировки прямых соединений.
Клиент показывает «неожиданный пакет»
Бэкэнд-сервер может не иметь установленного плагина Bridge или не работать с ним. ненадежный режим.
Отказ соединения Redis (Cluster Mode)
- Сервер Verify Redis работает и доступен
- Проверить
Redis.hostиредиспортв вашей конфигурации - При использовании аутентификации убедитесь, что
redis.passwordправильно - Проверка брандмауэра позволяет подключаться к порту Redis
Игроки, не синхронизированные через прокси (Cluster Mode)
- Убедитесь, что все прокси
Обсуждение cluster.enabled: True - Проверьте, все ли прокси подключены к одному и тому же экземпляру Redis
- Проверьте.
cluster.proxyУникальность каждого прокси
Обзор архитектуры
Одиночный прокси-режим
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
│ Игрок ????????????????????????????
│ Клиент │ │ Numdrassl │ │ Сервер │
????????????????????????????????
│
Лобби (дефолт)
Выживание - Survival
мини-игры
Кластерный режим (Multi-Proxy)
???????????????????????????????
│ Редис │
?????????????????????????
│ │ Pub/Sub Channels │ │
│ │ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │ │ │
│ │ │ │ │
??????????????????????????
?????????????????????????
│ │ Общий штат │ │
│ │ │ Местоположение игрока │ │
│ │ Прокси-регистр │ │
│ │ │ Игрок считает │ │
??????????????????????????
???????????????????????????????
│
????????????????????????????????????
│ │ │
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
│ Прокси (ЕС) │ Прокси (США) │ Прокси (Азия) │
│ proxy-eu-1 │ Трансфер ─ ─ ─ ► │ proxy-us-1 │ ─ ─ ─ ─ ► │ proxy-as-1 │
????????????????????????????????
│ │ │
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
│ Backends │ │ Backends │
│ │ лобби │ │ лобби │ │ лобби
│ │ игр │ игр │ игр │
????????????????????????????????
Поток аутентификации
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
│ Player │ │ Proxy │ │ Hytale │ │ Backend │
??????????????????????????????
??????????????????????
│ 1. │ Подключить │ │ │
│ (identity_token) │ │ │
???????????????????????
│ │ 2. Запросить аут │ │
│ │ грант │
????????????????????????
│ │ │ │
│ │ 3. auth_grant │ │
????????????????????????
│ 4. AuthGrant │ │ │
???????????????????????
│ │ │ │
│ 5. AuthToken │ │ │
????????????????????????? 6. Биржевой токен │ │
????????????????????????
????????????????????????
│ 7. ServerAuthToken │ │ │
???????????????????????
│ │ │ │
│ │ 8. Подключить + HMAC-подписанный реферал │
???????????????????????????
│ │ │ │
│ │ 9. ConnectAccept (секретно подтверждено)
????????????????????????????
│ │ │ │
Трансферный поток Cross-Proxy
* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *
│ Player │ │ Proxy A │ │ Proxy B │ Backend │
│ │ │ (источник) │ Redis │ (цель) │ │ Сервер │
?????????????????????????????
│ │ │ │
│/server hub │ │ │
?????????????????????
│ │ │ │
│ │ 1. Опубликовать │ │ │
│ │ TransferMsg │ │
??????????????????????
│ │ │ │
│ │ │ 2. Подписаться │ │
│ │ получает msg │ │
??????????????????????
│ │ │ │
│ 3. ClientReferral │ │ │
│ (переподключение к прокси B) │ │ │
?????????????????????
│ │ │ │
│ 4. Новое соединение │ │ │
????????????????????????????
│ │ │ │
│ │ │ 5. Вперед │
│ │ │ │ │ │ │ │
??????????????????????????
- Игрок подключается к прокси со своими учетными данными Hytale
- Прокси-аутентификация Игрок с сеансовым сервисом Hytale
- Прокси-форварды Подключение к бэкэнду по умолчанию с подписанным рефералом
- Проверка подлинности Реферал с использованием общей тайны
- Поток пакетов двунаправленно через прокси
- В режиме кластераСостояние игрока и сообщения синхронизируются через Redis pub/sub
Кластерный режим (многопрокси-сети)
Для больших сетей можно запускать несколько прокси-серверов Numdrassl в разных регионах с общим состоянием с помощью Redis.
Обзор
?????????????????????????
│ Редис │
│ (Pub/Sub Hub) │
???????????????????????????
????????????????????????????????
│ │ │
??????????????????????? ??????????????????????? ???????????????????????
│ Прокси (ЕС) │ Прокси (США) │ Прокси (Азия) │
│ Регион: │ Регион: │ Регион: │
??????????????????????? ??????????????????????? ???????????????????????
│ │ │
??????????????????????? ??????????????????????? ???????????????????????
│ Backends │ │ Backends │
???????????????????????? ???????????????????????? ????????????????????????
Особенности кластера
- Кросс-прокси отслеживание игроков Знайте, какие игроки онлайн во всех прокси
- Кросс-прокси сообщения Отправлять сообщения игрокам на других прокси
- Кросс-прокси переводы Передача игроков между серверами на разных прокси
- Балансировка нагрузки Маршрут игроков к наименее загруженному прокси в своем регионе
- Мониторинг здоровья - Автоматическое сердцебиение и несвежее обнаружение прокси
Конфигурация Redis
Добавить в свой config/proxy.yml:
# Кластерные настройки
группа:
Разрешено: истинно
Уникальный идентификатор для этого экземпляра прокси (автогенерированного, если не установленного)
прокси Id: "proxy-eu-1"
Идентификатор региона для географической балансировки нагрузки
Регион: «ЕС»
# Настройка соединения Redis
Реди:
хост: "redis.yourserver.com"
Порт: 6379
пароль: «your-redis-password» # Optional
База данных: 0
# Настройки бассейна подключения
размер: 10
тайм-аут: 5000 #миллисекунд
Опции конфигурации кластеров
| Вариант | Описание |
|---|---|
cluster.enabled |
Включить режим кластера (истинный/ложный) |
cluster.proxy |
Уникальный идентификатор этого экземпляра прокси |
кластерный регион |
Географический регион (например, ЕС, мы, Азия) |
Redis.host |
Имя сервера Redis |
редиспорт |
Порт сервера Redis (по умолчанию): 6379) |
redis.password |
Пароль аутентификации Redis (необязательно) |
Redis.database |
Номер базы данных Redis (по умолчанию): 0) |
redis.poolsize |
Размер бассейна (по умолчанию): 1010) |
redis-timeout |
Время ожидания соединения в мс (по умолчанию): 5000000000) |
Кросс-прокси команды
Когда включен режим кластера:
| Командование | Описание |
|---|---|
/server <name> |
Передача на сервер (работает через прокси) |
/numdrassl cluster info |
Показать статус кластера и связанные прокси |
/numdrasl кластер игроков |
Список игроков по всем прокси |
Plugin Messaging API
Плагины могут отправлять сообщения по всему кластеру:
@Plugin(id = "my-plugin", name = "My Plugin", version = "1.0.0")
Общественный класс MyPlugin {
@Inject
частная служба обмена сообщениями;
// Подписаться на пользовательские сообщения
@Subscribe (канал = "мой-канал")
Публичная пустота onCustomMessage (данные MyCustomData)
// Обработка сообщений от любого прокси
?
// Публиковать сообщения для всех прокси
Публичная трансляция ToCluster (струнное сообщение)
Messaging.publish («мой-канал», новые MyCustomData (сообщение));
?
?
Системные каналы
Кластер использует эти внутренние каналы (плагины могут подписываться):
| Канал | Цель |
|---|---|
Альбом: Heartbeat |
Прокси-мониторинг здоровья |
numdrassl:player_count |
Синхронизация подсчета игроков |
numdrassl:chat |
Кросс-прокси чат сообщения |
numdrassl:передача |
Передача кросс-прокси игроков |
numdrassl: вещание |
Серверные объявления |
сообщество
Ссылки
- Репозиторий GitHub
- API Документация
- Руководство по разработке плагинов
- выпуски
- раздор предрасположенность
Лицензия
Право собственности - все права защищены.
Показать оригинальное описание (English)
Numdrassl - Hytale Proxy Server
A high-performance, extensible Hytale proxy server written in Java that enables multi-server networks, player transfers, plugin support, and a flexible permission system.
What is Numdrassl?
Numdrassl is a BungeeCord/Velocity-style proxy for Hytale. It sits between players and your backend servers, allowing you to:
- Connect multiple Hytale servers into a single network
- Transfer players seamlessly between servers
- Intercept and modify packets
- Create plugins with custom commands and events
- Manage permissions with groups and wildcards
Features
- Multi-Server Network - Connect multiple backend Hytale servers (lobby, minigames, etc.)
- Player Transfers - Seamlessly move players between servers with
/server <name> - Plugin System - Extend functionality with custom plugins
- Permission System - Built-in YAML-based permissions with groups, wildcards, and external provider support
- Event System - Hook into player connections, chat, commands, and more
- QUIC Protocol - Native support for Hytale's QUIC transport with BBR congestion control
- Secure Authentication - HMAC-signed referrals between proxy and backends
Requirements
- Java 25 or higher
- Hytale Server(s) to use as backends
Installation
Step 1: Download
Download the latest release:
proxy-*.jar- The proxy serverbridge-*.jar- Plugin for your backend servers
Step 2: Run the Proxy
java -jar proxy-1.0-SNAPSHOT.jar
On first run, the proxy will:
- Generate TLS certificates in
certs/ - Create
config/proxy.ymlconfiguration file - Prompt you to authenticate with Hytale
Step 3: Authenticate with Hytale
In the proxy console, run:
auth login
Visit the URL shown and enter the device code to link your Hytale account.
Proxy Configuration
Edit config/proxy.yml:
# Network Settings
bindAddress: "0.0.0.0"
bindPort: 45585
# Public address (for server transfers)
publicAddress: "play.yourserver.com"
publicPort: 45585
# Shared secret - MUST match your Bridge plugin config!
proxySecret: "change-this-to-a-secure-secret"
# Backend Servers
backends:
- name: "lobby"
host: "127.0.0.1"
port: 5520
defaultServer: true # Players join here first
- name: "survival"
host: "127.0.0.1"
port: 5521
defaultServer: false
- name: "minigames"
host: "192.168.1.100"
port: 5520
defaultServer: false
Configuration Options
| Option | Description |
|---|---|
bindAddress |
IP to listen on (0.0.0.0 for all interfaces) |
bindPort |
Port to listen on (default: 45585) |
publicAddress |
Public hostname/IP for server transfers |
publicPort |
Public port for server transfers |
proxySecret |
Shared secret for backend authentication |
backends |
List of backend servers |
debugMode |
Enable verbose logging (default: false) |
Backend Server Setup
Each backend server needs the Bridge plugin to authenticate connections from the proxy.
Step 1: Install Bridge Plugin
Copy bridge-1.0-SNAPSHOT.jar to your Hytale server's plugins/ folder.
Step 2: Start Server in Insecure Mode
java -jar HytaleServer.jar --auth-mode insecure --transport QUIC
Important: The
--auth-mode insecureflag is required because the proxy handles Hytale authentication, not the backend.
Step 3: Configure Bridge
On first run, the Bridge creates plugins/Bridge/config.json:
{
"proxySecret": "change-this-to-a-secure-secret",
"serverName": "lobby"
}
| Option | Description |
|---|---|
proxySecret |
Must match the proxySecret in your proxy config! |
serverName |
Name of this server (for logging/identification) |
Step 4: Secure Your Backend (Important!)
Block direct connections to your backend servers. Only allow the proxy's IP:
# Example: Only allow proxy (192.168.1.50) to connect on port 5520
iptables -A INPUT -p udp --dport 5520 -s 192.168.1.50 -j ACCEPT
iptables -A INPUT -p udp --dport 5520 -j DROP
Without this, players could bypass the proxy and connect directly!
Player Commands
| Command | Aliases | Description |
|---|---|---|
/server |
/srv |
List available servers |
/server <name> |
/srv <name> |
Transfer to a server |
/numdrassl |
/nd, /proxy |
Proxy management commands |
/numdrassl version |
Show proxy version | |
/numdrassl perm ... |
Permission management |
Permission System
Permissions are stored in YAML files under data/permissions/:
data/permissions/
├── players/
│ └── {uuid}.yml # Per-player permissions
├── groups/
│ ├── default.yml # Default group (all players)
│ └── admin.yml # Custom groups
└── player-groups.yml # Player-to-group assignments
Player Permissions (players/{uuid}.yml)
permissions:
- numdrassl.command.server
- numdrassl.command.help
- -numdrassl.command.stop # Denied (prefix with -)
Group Permissions (groups/admin.yml)
name: admin
default: false
permissions:
- numdrassl.command.* # Wildcard
- numdrassl.admin
Permission Commands
| Command | Description |
|---|---|
/numdrassl perm user <player> info |
Show player's groups/permissions |
/numdrassl perm user <player> add <perm> |
Grant a permission |
/numdrassl perm user <player> remove <perm> |
Remove a permission |
/numdrassl perm user <player> addgroup <group> |
Add player to group |
/numdrassl perm user <player> removegroup <group> |
Remove from group |
/numdrassl perm group <group> add <perm> |
Add permission to group |
/numdrassl perm group <group> remove <perm> |
Remove from group |
/numdrassl perm reload |
Reload permissions from disk |
Console Commands
| Command | Description |
|---|---|
auth login |
Authenticate with Hytale |
auth status |
Show authentication status |
auth logout |
Clear stored credentials |
sessions |
List connected players |
stop |
Shut down the proxy |
help |
Show available commands |
Plugin Development
Create plugins to extend the proxy! Plugins can:
- Listen to events (player join, chat, commands, etc.)
- Register custom commands
- Modify packets
- Interact with players and servers
API Dependency:
dependencies {
compileOnly("me.internalizable.numdrassl:api:1.0-SNAPSHOT")
}
Example Plugin:
@Plugin(id = "my-plugin", name = "My Plugin", version = "1.0.0")
public class MyPlugin {
@Subscribe
public void onPlayerChat(PlayerChatEvent event) {
if (event.getMessage().contains("hello")) {
event.getPlayer().sendMessage("Hello to you too!");
}
}
}
See the full Plugin Development Guide for more details.
Troubleshooting
"Proxy not authenticated"
Run auth login in the proxy console and complete the device code flow.
"Invalid player info message (is your proxy secret valid?)"
The proxySecret in your proxy config doesn't match the Bridge plugin's proxySecret.
"Connection timed out" to backend
- Check the backend server is running
- Verify firewall allows the proxy IP
- Confirm the address/port in config is correct
"Cannot direct join numdrassl backend"
Players are trying to connect directly to the backend. Set up firewall rules to block direct connections.
Client shows "unexpected packet"
The backend server may not have the Bridge plugin installed, or isn't running with --auth-mode insecure.
Redis connection failed (Cluster Mode)
- Verify Redis server is running and accessible
- Check
redis.hostandredis.portin your config - If using authentication, ensure
redis.passwordis correct - Verify firewall allows connections to Redis port
Players not synced across proxies (Cluster Mode)
- Ensure all proxies have
cluster.enabled: true - Verify all proxies connect to the same Redis instance
- Check that
cluster.proxyIdis unique for each proxy
Architecture Overview
Single Proxy Mode
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
│ Player │ ──── QUIC/TLS ──── │ Proxy │ ──── QUIC/TLS ──── │ Backend │
│ Client │ │ Numdrassl │ │ Server │
└─────────────┘ └─────────────┘ └─────────────┘
│
├── lobby (default)
├── survival
└── minigames
Cluster Mode (Multi-Proxy)
┌──────────────────────────────────┐
│ Redis │
│ ┌────────────────────────┐ │
│ │ Pub/Sub Channels │ │
│ │ • numdrassl:heartbeat │ │
│ │ • numdrassl:chat │ │
│ │ • numdrassl:transfer │ │
│ │ • numdrassl:broadcast │ │
│ └────────────────────────┘ │
│ ┌────────────────────────┐ │
│ │ Shared State │ │
│ │ • Player locations │ │
│ │ • Proxy registry │ │
│ │ • Player counts │ │
│ └────────────────────────┘ │
└──────────────┬───────────────────┘
│
┌─────────────────────────────────┼─────────────────────────────────┐
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Proxy (EU) │ │ Proxy (US) │ │ Proxy (Asia)│
│ proxy-eu-1 │◄─── Transfer ────►│ proxy-us-1 │◄─── Transfer ────►│ proxy-as-1 │
└──────┬──────┘ └──────┬──────┘ └──────┬──────┘
│ │ │
┌──────▼──────┐ ┌──────▼──────┐ ┌──────▼──────┐
│ Backends │ │ Backends │ │ Backends │
│ • lobby │ │ • lobby │ │ • lobby │
│ • games │ │ • games │ │ • games │
└─────────────┘ └─────────────┘ └─────────────┘
Authentication Flow
┌────────┐ ┌───────────┐ ┌─────────────┐ ┌─────────┐
│ Player │ │ Proxy │ │ Hytale │ │ Backend │
└───┬────┘ └─────┬─────┘ │ Sessions │ └────┬────┘
│ │ └──────┬──────┘ │
│ 1. Connect │ │ │
│ (identity_token) │ │ │
│────────────────────►│ │ │
│ │ 2. Request auth │ │
│ │ grant │ │
│ │──────────────────────►│ │
│ │ │ │
│ │ 3. auth_grant │ │
│ │◄──────────────────────│ │
│ 4. AuthGrant │ │ │
│◄────────────────────│ │ │
│ │ │ │
│ 5. AuthToken │ │ │
│────────────────────►│ 6. Exchange token │ │
│ │──────────────────────►│ │
│ │◄──────────────────────│ │
│ 7. ServerAuthToken │ │ │
│◄────────────────────│ │ │
│ │ │ │
│ │ 8. Connect + HMAC-signed referral │
│ │─────────────────────────────────────────────►│
│ │ │ │
│ │ 9. ConnectAccept (secret validated) │
│ │◄─────────────────────────────────────────────│
│ │ │ │
Cross-Proxy Transfer Flow
┌────────┐ ┌──────────┐ ┌──────────┐ ┌─────────┐
│ Player │ │ Proxy A │ │ Proxy B │ │ Backend │
│ │ │ (source) │ Redis │ (target) │ │ Server │
└───┬────┘ └────┬─────┘ │ └────┬─────┘ └────┬────┘
│ │ │ │ │
│ /server hub │ │ │ │
│──────────────►│ │ │ │
│ │ │ │ │
│ │ 1. Publish │ │ │
│ │ TransferMsg │ │ │
│ │─────────────►│ │ │
│ │ │ │ │
│ │ │ 2. Subscribe │ │
│ │ │ receives msg │ │
│ │ │───────────────►│ │
│ │ │ │ │
│ 3. ClientReferral │ │ │
│ (reconnect to Proxy B) │ │ │
│◄──────────────│ │ │ │
│ │ │ │ │
│ 4. New connection │ │ │
│─────────────────────────────────────────────►│ │
│ │ │ │ │
│ │ │ │ 5. Forward │
│ │ │ │ to backend │
│ │ │ │───────────────►│
- Player connects to the proxy with their Hytale credentials
- Proxy authenticates the player with Hytale session service
- Proxy forwards the connection to the default backend with signed referral
- Backend validates the referral using the shared secret
- Packets flow bidirectionally through the proxy
- In cluster mode, player state and messages sync via Redis pub/sub
Cluster Mode (Multi-Proxy Networks)
For large networks, you can run multiple Numdrassl proxies across different regions with shared state using Redis.
Overview
┌─────────────────┐
│ Redis │
│ (Pub/Sub Hub) │
└────────┬────────┘
┌───────────────────────┼───────────────────────┐
│ │ │
┌───────▼───────┐ ┌───────▼───────┐ ┌───────▼───────┐
│ Proxy (EU) │ │ Proxy (US) │ │ Proxy (Asia) │
│ Region: eu │ │ Region: us │ │ Region: asia │
└───────┬───────┘ └───────┬───────┘ └───────┬───────┘
│ │ │
┌───────▼───────┐ ┌───────▼───────┐ ┌───────▼───────┐
│ Backends │ │ Backends │ │ Backends │
└───────────────┘ └───────────────┘ └───────────────┘
Cluster Features
- Cross-Proxy Player Tracking - Know which players are online across all proxies
- Cross-Proxy Messaging - Send messages to players on other proxies
- Cross-Proxy Transfers - Transfer players between servers on different proxies
- Load Balancing - Route players to the least loaded proxy in their region
- Health Monitoring - Automatic heartbeat and stale proxy detection
Redis Configuration
Add to your config/proxy.yml:
# Cluster Settings
cluster:
enabled: true
# Unique ID for this proxy instance (auto-generated if not set)
proxyId: "proxy-eu-1"
# Region identifier for geographic load balancing
region: "eu"
# Redis connection settings
redis:
host: "redis.yourserver.com"
port: 6379
password: "your-redis-password" # Optional
database: 0
# Connection pool settings
poolSize: 10
timeout: 5000 # milliseconds
Cluster Configuration Options
| Option | Description |
|---|---|
cluster.enabled |
Enable cluster mode (true/false) |
cluster.proxyId |
Unique identifier for this proxy instance |
cluster.region |
Geographic region (e.g., eu, us, asia) |
redis.host |
Redis server hostname |
redis.port |
Redis server port (default: 6379) |
redis.password |
Redis authentication password (optional) |
redis.database |
Redis database number (default: 0) |
redis.poolSize |
Connection pool size (default: 10) |
redis.timeout |
Connection timeout in ms (default: 5000) |
Cross-Proxy Commands
When cluster mode is enabled:
| Command | Description |
|---|---|
/server <name> |
Transfer to a server (works across proxies) |
/numdrassl cluster info |
Show cluster status and connected proxies |
/numdrassl cluster players |
List players across all proxies |
Plugin Messaging API
Plugins can send messages across the cluster:
@Plugin(id = "my-plugin", name = "My Plugin", version = "1.0.0")
public class MyPlugin {
@Inject
private MessagingService messaging;
// Subscribe to custom messages
@Subscribe(channel = "my-channel")
public void onCustomMessage(MyCustomData data) {
// Handle message from any proxy
}
// Publish messages to all proxies
public void broadcastToCluster(String message) {
messaging.publish("my-channel", new MyCustomData(message));
}
}
System Channels
The cluster uses these internal channels (plugins can subscribe):
| Channel | Purpose |
|---|---|
numdrassl:heartbeat |
Proxy health monitoring |
numdrassl:player_count |
Player count synchronization |
numdrassl:chat |
Cross-proxy chat messages |
numdrassl:transfer |
Cross-proxy player transfers |
numdrassl:broadcast |
Server-wide announcements |
Community
Links
License
Proprietary - All rights reserved.
Последние версии
Numdrassl 2026.01.17-4b0f30090-build.1.zip
Информация
Авторы:
Категории:
Версии игры:
Создан: 18.01.2026