MyMine: свой Minecraft-сервер с авторизацией, картой и лаунчером

Я довольно давно хотел собрать Minecraft-сервер не в виде «вот контейнер с Minecraft, а дальше доделывай сам», а как более-менее законченный комплект.

Чтобы был сам сервер, нормальная регистрация игроков, web-страница с инструкциями, карта мира, готовый лаунчер, persistent-данные и возможность развернуть всё это через Docker Compose или Portainer.

В итоге получился MyMine.

MyMine — Minecraft с шейдерами и радугой

На момент написания поста актуальный стабильный релиз — v0.4.5.

Что входит в MyMine

Стек состоит из нескольких частей:

  • Minecraft Java 26.2 / Fabric — сам игровой сервер;
  • server-side modpack — генерация мира, структуры, QoL и оптимизации без обязательной установки Fabric и модов игрокам;
  • Drasl — self-hosted Yggdrasil/authlib-совместимая система аккаунтов;
  • MyMine Landing — web-страница сервера, регистрация, инструкции и раздача лаунчера;
  • BlueMap — браузерная 3D-карта мира;
  • MyMine Launcher — сборка HMCL с уже настроенной авторизацией и адресом конкретного сервера.

То есть после установки администратор получает не только Minecraft-контейнер, а примерно такую схему:

Internet
   |
   +-- 80/443 --> nginx
   |                +-- mc.example.org ---------> landing
   |                +-- mc.example.org/map/ ----> BlueMap
   |                +-- auth.mc.example.org ----> Drasl
   |
   +-- 25565/TCP -----------------------------> Minecraft

Важное про клиент игры

Сервер работает на Fabric, но базовая сборка MyMine подобрана так, чтобы игроку не требовалось ставить Fabric, Forge, NeoForge или клиентский modpack.

Нужен обычный Minecraft Java той же версии — сейчас это 26.2.

Лаунчер MyMine сам знает адрес Drasl и адрес Minecraft-сервера. При первом запуске он также добавляет сервер в servers.dat. Существующие серверы игрока при этом не удаляются.

Регистрация игроков

Здесь есть два режима.

Проверять наличие существующего Minecraft-профиля

VERIFY_MINECRAFT_OWNERSHIP=true

Это режим по умолчанию. При регистрации Drasl требует подтвердить контроль над существующим Minecraft-профилем через skin challenge.

После регистрации игрок использует отдельный аккаунт MyMine/Drasl, поэтому постоянная Microsoft-авторизация при каждом запуске лаунчера не нужна.

Независимая регистрация

VERIFY_MINECRAFT_OWNERSHIP=false

В этом режиме можно создавать самостоятельные профили MyMine без автоматической проверки существующего Minecraft-профиля.

Я добавил этот режим в том числе для автономных и закрытых сетей и случаев, когда сервисы Microsoft/Mojang недоступны. Сам MyMine в таком режиме не проверяет наличие приобретённой копии игры — политика доступа и соблюдение применимых правил остаются на операторе конкретного сервера.

Для новой установки безопаснее оставить:

DRASL_REQUIRE_INVITE=true

Тогда на пустой базе Drasl создаст первоначальную invite-ссылку, которую можно увидеть в логах. Также заранее надо обязательно задать имя первого администратора:

DRASL_ADMIN=ваш_логин

Что понадобится для установки

  • Linux-сервер с Docker и Docker Compose либо Portainer;
  • примерно 6 ГБ RAM для контейнера Minecraft при стандартной конфигурации;
  • домен или поддомен для самого сервера;
  • отдельный домен или поддомен для Drasl;
  • reverse proxy с HTTPS — например nginx;
  • если сервер находится за NAT — возможность пробросить порты на роутере.

Например:

mc.example.org
 auth.mc.example.org

Обе DNS-записи должны указывать на внешний IP вашего сервера или роутера.

Установка через Docker Compose

Самый обычный вариант:

git clone https://github.com/mirivlad/mymine.git
cd mymine
cp .env.example .env

После этого открываем .env и меняем значения под себя.

Минимальный рабочий пример для production может выглядеть примерно так:

IMAGE_TAG=0.4.5

AUTH_DOMAIN=auth.mc.example.org
AUTH_BASE_URL=https://auth.mc.example.org
DRASL_ADMIN=myadmin
VERIFY_MINECRAFT_OWNERSHIP=true
DRASL_REQUIRE_INVITE=true

MC_ADDRESS=mc.example.org:25565
SERVER_NAME=MyMine
MC_PORT=25565

LANDING_PORT=44445
AUTH_PORT=44446
MAP_PORT=44447
WEB_BIND_ADDR=127.0.0.1

DATA_DIR=/srv/mymine/data
AUTH_DATA_DIR=/srv/mymine/auth-data

MEMORY=4G
CONTAINER_MEMORY_LIMIT=6g

LANDING_TEMPLATE=adventure

После настройки:

docker compose pull
docker compose up -d

Состояние можно проверить так:

docker compose ps
docker compose logs -f

На первом старте отдельно стоит посмотреть лог Drasl и найти первоначальную invite-ссылку:

docker compose logs drasl

Установка через Portainer

Корневой compose.yml специально сделан переносимым, поэтому его можно использовать как Git stack.

В Portainer создаём новый Stack из репозитория:

https://github.com/mirivlad/mymine.git

Compose path:

compose.yml

А значения из .env добавляем в Environment variables самого stack.

Для обновления достаточно поменять IMAGE_TAG на новую версию и сделать redeploy. Мир, игроки и база Drasl находятся в persistent-каталогах и не живут внутри Docker image.

Какие порты нужно пробросить

Если сервер стоит за NAT, наружу реально нужны только следующие порты:

Порт Протокол Для чего
80 TCP HTTP / Let’s Encrypt / редирект на HTTPS
443 TCP Landing, регистрация Drasl и BlueMap через reverse proxy
25565 TCP Minecraft Java

Порты Landing, Drasl и BlueMap напрямую в интернет открывать не надо.

В примере выше это 44445, 44446 и 44447. Они слушают только 127.0.0.1, а снаружи к ним ходит nginx.

Пример nginx

Для основного домена можно сделать landing на корне и BlueMap в /map/:

server {
    listen 443 ssl;
    server_name mc.example.org;

    ssl_certificate /etc/letsencrypt/live/mc.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mc.example.org/privkey.pem;

    location = /map {
        return 301 /map/;
    }

    location /map/ {
        proxy_pass http://127.0.0.1:44447/;
        proxy_http_version 1.1;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
        proxy_buffering off;
        proxy_read_timeout 1h;
    }

    location / {
        proxy_pass http://127.0.0.1:44445;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Для Drasl — отдельный virtual host:

server {
    listen 443 ssl;
    server_name auth.mc.example.org;

    ssl_certificate /etc/letsencrypt/live/auth.mc.example.org/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/auth.mc.example.org/privkey.pem;

    client_max_body_size 10m;

    location / {
        proxy_pass http://127.0.0.1:44446;
        proxy_set_header Host $host;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
}

Плюс обычные HTTP virtual host’ы на 80 порту для ACME challenge и редиректа на HTTPS.

Что ещё можно настроить

В .env.example параметров заметно больше. В частности:

  • MAX_PLAYERS — количество игроков;
  • DIFFICULTY — сложность;
  • PVP — PvP;
  • VIEW_DISTANCE и SIMULATION_DISTANCE;
  • ENABLE_WHITELIST и ENFORCE_WHITELIST;
  • MOTD;
  • MEMORY и CONTAINER_MEMORY_LIMIT;
  • BLUEMAP_RENDER_THREADS;
  • LANDING_TEMPLATE.

У лендинга сейчас есть несколько тем: showcase, adventure, atlas, modern, terminal и classic.

Где лежат данные

Это, на мой взгляд, один из важных моментов.

Мир Minecraft, player data и конфигурация лежат отдельно от контейнера:

/srv/mymine/data

Данные аккаунтов Drasl отдельно:

/srv/mymine/auth-data

Поэтому контейнеры можно обновлять и пересоздавать без потери мира и пользователей. Эти два каталога стоит обязательно включить в резервное копирование.

А что с модами?

В публичной сборке сейчас используются Terralith, Tectonic, Incendium, Nullscape, Moog’s Voyager Structures, Repurposed Structures, Universal Graves, FallingTree, BlueMap, Chunky, spark и набор серверных оптимизаций вроде Lithium, FerriteCore, ServerCore, Krypton и Alternate Current.

Прямые версии закреплены в репозитории, зависимости разрешаются при сборке image.

Я отдельно старался не тащить в публичный образ моды, условия которых плохо подходят для нормального открытого redistributable-проекта.

Исходники

MyMine открыт и лежит на GitHub:

github.com/mirivlad/mymine

Там же находятся compose.yml, полный .env.example, nginx-конфигурация, список модов, исходники landing, патчи лаунчера и GitHub Actions.

Релизы и готовые сборки лаунчера:

github.com/mirivlad/mymine/releases

Моя текущая установка работает здесь:

mymine.mirv.top

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

Оставить комментарий

Email не публикуется. Поля, отмеченные *, обязательны.