Numdrassl

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.

160.0 загрузок
Обновлён 6 дней назад

Описание

Numdrasl - Hytale Proxy Server

Join Discord

Высокопроизводительный, расширяемый прокси-сервер 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

При первом запуске прокси будет:

  1. Сертификаты TLS в удостоверения/
  2. создавать config/proxy.yml конфигурационный файл
  3. Подтвердите подлинность с помощью 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 &lt;name&gt; /srv &lt;name&gt; Перевод на сервер
/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 &lt;player&gt; info Группы/разрешения игроков
/numdrasl perm user &lt;player&gt; add &lt;perm&gt; Дать разрешение
/numdrasl perm user &lt;player&gt; remove &lt;perm&gt; Удалить разрешение
/numdrasl perm user &lt;player&gt; addgroup &lt;group&gt; Добавить игрока в группу
/numdrasl perm user &lt;player&gt; removegroup &lt;group&gt; Удалить из группы
/numdrasl perm group &lt;group&gt; add &lt;perm&gt; Добавить разрешение в группу
/numdrasl perm group &lt;group&gt; remove &lt;perm&gt; Удалить из группы
/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» для бэкэнда

  1. Проверьте, работает ли сервер backend
  2. Проверить брандмауэр позволяет прокси IP
  3. Подтвердите, что адрес / порт в конфигурации правильный

«Cannot direct join numdrassl backend» (недоступная ссылка)

Игроки пытаются подключиться непосредственно к бэкэнду. Настройте правила брандмауэра для блокировки прямых соединений.

Клиент показывает «неожиданный пакет»

Бэкэнд-сервер может не иметь установленного плагина Bridge или не работать с ним. ненадежный режим.

Отказ соединения Redis (Cluster Mode)

  1. Сервер Verify Redis работает и доступен
  2. Проверить Redis.host и редиспорт в вашей конфигурации
  3. При использовании аутентификации убедитесь, что redis.password правильно
  4. Проверка брандмауэра позволяет подключаться к порту Redis

Игроки, не синхронизированные через прокси (Cluster Mode)

  1. Убедитесь, что все прокси Обсуждение cluster.enabled: True
  2. Проверьте, все ли прокси подключены к одному и тому же экземпляру Redis
  3. Проверьте. 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. Вперед │
│ │ │ │ │ │ │ │
??????????????????????????
  1. Игрок подключается к прокси со своими учетными данными Hytale
  2. Прокси-аутентификация Игрок с сеансовым сервисом Hytale
  3. Прокси-форварды Подключение к бэкэнду по умолчанию с подписанным рефералом
  4. Проверка подлинности Реферал с использованием общей тайны
  5. Поток пакетов двунаправленно через прокси
  6. В режиме кластераСостояние игрока и сообщения синхронизируются через 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 &lt;name&gt; Передача на сервер (работает через прокси)
/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: вещание Серверные объявления

сообщество

Discord Присоединяйтесь к раздору

Ссылки


Лицензия

Право собственности - все права защищены.

Показать оригинальное описание (English)

Numdrassl - Hytale Proxy Server

Join Discord

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 server
  • bridge-*.jar - Plugin for your backend servers

Step 2: Run the Proxy

java -jar proxy-1.0-SNAPSHOT.jar

On first run, the proxy will:

  1. Generate TLS certificates in certs/
  2. Create config/proxy.yml configuration file
  3. 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 insecure flag 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 &lt;name&gt; /srv &lt;name&gt; 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 &lt;player&gt; info Show player's groups/permissions
/numdrassl perm user &lt;player&gt; add &lt;perm&gt; Grant a permission
/numdrassl perm user &lt;player&gt; remove &lt;perm&gt; Remove a permission
/numdrassl perm user &lt;player&gt; addgroup &lt;group&gt; Add player to group
/numdrassl perm user &lt;player&gt; removegroup &lt;group&gt; Remove from group
/numdrassl perm group &lt;group&gt; add &lt;perm&gt; Add permission to group
/numdrassl perm group &lt;group&gt; remove &lt;perm&gt; 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

  1. Check the backend server is running
  2. Verify firewall allows the proxy IP
  3. 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)

  1. Verify Redis server is running and accessible
  2. Check redis.host and redis.port in your config
  3. If using authentication, ensure redis.password is correct
  4. Verify firewall allows connections to Redis port

Players not synced across proxies (Cluster Mode)

  1. Ensure all proxies have cluster.enabled: true
  2. Verify all proxies connect to the same Redis instance
  3. Check that cluster.proxyId is 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    │
    │               │              │                │───────────────►│
  1. Player connects to the proxy with their Hytale credentials
  2. Proxy authenticates the player with Hytale session service
  3. Proxy forwards the connection to the default backend with signed referral
  4. Backend validates the referral using the shared secret
  5. Packets flow bidirectionally through the proxy
  6. 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 &lt;name&gt; 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

Discord Join the Discord

Links


License

Proprietary - All rights reserved.

Последние версии

Numdrassl 2026.01.17-4b0f30090-build.1.zip

Early Access 18.01.2026 29.7 МБ
Скачать