Я довольно давно хотел собрать Minecraft-сервер не в виде «вот контейнер с Minecraft, а дальше доделывай сам», а как более-менее законченный комплект.
Чтобы был сам сервер, нормальная регистрация игроков, web-страница с инструкциями, карта мира, готовый лаунчер, persistent-данные и возможность развернуть всё это через Docker Compose или Portainer.
В итоге получился MyMine.

На момент написания поста актуальный стабильный релиз — 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:
Там же находятся compose.yml, полный .env.example, nginx-конфигурация, список модов, исходники landing, патчи лаунчера и GitHub Actions.
Релизы и готовые сборки лаунчера:
github.com/mirivlad/mymine/releases
Моя текущая установка работает здесь:
В общем, если хотелось поднять свой Minecraft не просто как один контейнер, а сразу с регистрацией, картой, лендингом и готовым клиентским входом — теперь это можно сделать одним стеком.