Мой запредельно сложный сервер в Minecraft

Ежегодно в моем кругу друзей наступает традиционная «неделя Minecraft» — время, когда мы все откладываем дела ради совместной игры. И, по сложившейся традиции, именно мне выпадает роль технического администратора, ответственного за запуск и стабильную работу сервера.

Мы давно обсуждали идею сервера с модификациями, но реализация всегда казалась слишком трудоемкой. Основная проблема заключалась в пороге вхождения: каждому участнику пришлось бы объяснять процесс установки модов. Кроме того, существовал риск визитов незваных гостей и гриферства. Поскольку большинство моих друзей используют нелицензионные версии игры, стандартный «белый список» (whitelist) не решал проблему безопасности.

Решение нашлось, когда я открыл для себя Drasl. Этот инструмент стал отправной точкой, которая привела к созданию полноценной серверной экосистемы, которой мы пользуемся сегодня.

Для контекста: система аутентификации, которую Mojang применяла до интеграции с Microsoft, называлась Yggdrasil. Drasl — это открытая реализация данного протокола на языке Go. Говоря простыми словами, он позволяет развернуть собственный сервер авторизации, где пользователи могут регистрироваться, а сервер — проверять их подлинность.

Стоит отметить, что я уже поддерживаю несколько внутренних сервисов для нашей компании, включая VPN-решение, написанное на Go с использованием Pocketbase. Таким образом, база активных пользователей у меня уже была, и они привыкли к единой системе входа.

Синхронизация учетных записей

Drasl предоставляет административный API для управления аккаунтами. Я разработал отдельный модуль для своего существующего бэкенд-монолита на Go, который автоматически синхронизирует профили игроков Minecraft с моей основной базой пользователей. Drasl был развернут в закрытом сетевом контуре, а доступ к нему организован через Nginx с жесткими ограничениями:

  • внешний доступ открыт только для эндпоинтов протокола Yggdrasil;

  • административные запросы разрешены исключительно со стороны сервера Pocketbase.

Пример конфигурационного файла Nginx:

# /etc/nginx/conf.d/mc-auth.my-domain.conf

location ^~ /drasl/ {
  allow 192.168.1.0/24;
  allow ;
  deny all;
  
  proxy_pass http://192.168.1.132:25585;
  proxy_http_version 1.1;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}

location / {
  proxy_pass http://192.168.1.132:25585;
  
  proxy_http_version 1.1;
  proxy_set_header Host $host;
  proxy_set_header X-Real-IP $remote_addr;
  proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_set_header X-Forwarded-Proto $scheme;
}

В дальнейшем домен этого сервиса указывается в качестве параметра при запуске как серверной, так и клиентской части Minecraft. В итоге вместо официальных серверов Mojang игра обращается к моей системе.

Адаптация игрового клиента

Если с настройкой серверной части проблем не возникло, то подготовка клиента для обычного пользователя выглядела сложнее. Чтобы избавить друзей от ручных правок в конфигах, я решил модифицировать Helios Launcher (ранее проект назывался Electron Launcher).

Поскольку моя основная специализация — фронтенд-разработка, я полностью переработал визуальную составляющую лаунчера, приведя её к единому стилю с нашей панелью управления VPN. Также я переписал модуль авторизации под наше API.

Теперь процесс входа выглядит максимально просто: игрок авторизуется через наш привычный интерфейс, получает Yggdrasil-токен и автоматически попадает на сервер.

Обновленный лаунчер
Обновленный интерфейс лаунчера

Автоматизация сборки модов

Helios Launcher обладает отличной функцией — он умеет самостоятельно загружать и устанавливать модификации, если ему предоставить JSON-файл со списком ресурсов. Однако ручное составление такого файла — процесс монотонный и долгий, особенно при создании уникальной сборки без использования CurseForge.

Чтобы упростить эту задачу, я написал утилиту get-nebula-obj. Скрипт автоматически сканирует .jar файлы модов и генерирует необходимые объекты для конфигурации лаунчера.

Процесс работы get-nebula-obj
Использование утилиты get-nebula-obj

Сформировав стабильный модпак из почти 200 компонентов, я завершил основную часть работы над проектом.

Личный кабинет игрока

Дополнительным штрихом стала интеграция управления игровым профилем в нашу общую веб-панель. В личном кабинете каждый пользователь теперь может самостоятельно настроить свой никнейм, загрузить скин или добавить плащ.

Интерфейс управления профилем
Панель управления в веб-интерфейсе

В итоге пользовательский опыт свелся к минимуму действий: достаточно просто скачать лаунчер. Остальное происходит автоматически: предустановка модов, добавление сервера в список, конфигурация голосового чата, шейдеров и текстур.

Безопасность также вышла на новый уровень: любая попытка подключения через сторонний лаунчер блокируется на этапе авторизации. Анализ логов показал, что это эффективно отсеивает ботов, сканирующих открытые порты.

Весь процесс разработки занял около месяца. Хотя традиционная «неделя Minecraft» уже прошла, инфраструктура готова к будущим приключениям. Теперь осталось лишь снова найти время и собрать всю компанию вместе.

 

Источник

Читайте также