Плагин веб-карты - это второй сервер внутри вашего сервера Minecraft. Он читает чанки мира, рендерит их в тайлы-изображения, записывает эти тайлы на диск и отдаёт их по HTTP на собственном порту - по умолчанию 8123 у Dynmap, 8100 у BlueMap, 8080 у squaremap. Именно на этом моменте большинство установок на хостинге застревает, потому что игровой тариф даёт одно выделение порта, и оно занято игрой. Нужен второй, и плагину надо сказать использовать тот номер, который выдала панель, а не свой по умолчанию. Всё остальное - вопрос того, сколько CPU и диска вы готовы потратить на картинки.
Что такое веб-карта на самом деле#
За одним словом «карта» стоят две разные работы.
Первая - рендеринг. Плагин обходит файлы регионов или загруженные чанки, вычисляет, как выглядит каждый столбец блоков сверху или под углом, и записывает результат тайлами нескольких уровней масштаба. Это дорого, в основном делается один раз, и именно эта часть заполняет диск.
Вторая - раздача. Небольшой встроенный HTTP-сервер отдаёт эти тайлы браузеру вместе с JSON-документом с позициями игроков, который обновляется каждую-две секунды. Это дёшево. Живая карта с дюжиной зрителей почти ничего не стоит серверу, когда тайлы уже есть.
После первого полного рендера плагин перерисовывает только те тайлы, чанки которых изменились, а на обычном выживательном сервере это несколько штук в минуту. Так что честная модель затрат такая: один крупный счёт в начале, а потом почти ничего.
Dynmap, BlueMap и squaremap в сравнении#
| Dynmap | BlueMap | squaremap | |
|---|---|---|---|
| Вид | 2D сверху плюс 3D изометрия | настоящее 3D в браузере | только 2D сверху |
| Порт по умолчанию | 8123 | 8100 | 8080 |
| Серверное ПО | Paper, Spigot, Fabric, Forge, NeoForge | Paper, Spigot, Fabric, Forge, NeoForge, Sponge | только Paper |
| Конфигурация | configuration.txt и worlds.txt | файлы HOCON .conf | config.yml |
| Первый рендер | самый тяжёлый | тяжёлый | самый лёгкий |
| Диск на область | больше всего при включённых 3D-картах | много | меньше всего |
| Маркеры и API | обширные, плюс веб-чат | маркеры, без чата | маркеры |
Dynmap - самый старый и самый функциональный. Из-за его API маркеров почти любой плагин, который хочет что-то нарисовать на карте - приваты, магазины, варпы, города, - интегрируется сначала с Dynmap. Его изометрическая карта «surface» - к тому же самая дорогая вещь в этой статье.
BlueMap ставят те, кого убедил его скриншот. Он отдаёт мир браузеру как 3D-геометрию, а не плоские картинки, так что по нему можно летать. Цена - более тяжёлый первый рендер и неожиданная зависимость: BlueMap нужен официальный клиентский jar Minecraft ради текстур блоков, и пока вы не разрешите это в конфиге, он его не скачает.
squaremap - форк Pl3xMap, только для Paper, только сверху и намеренно небольшой. Он рендерит быстрее двух других и создаёт самое маленькое дерево тайлов. На тарифе 2 ГБ или 4 ГБ это обычно правильный выбор, а единственный серьёзный довод против - плоские карты менее впечатляют.
Как ни странно, configuration.txt у Dynmap - это YAML, несмотря на расширение. Правьте его так же аккуратно, как любой файл YAML: пробелы, а не табы, и один неверный отступ не даст плагину загрузиться.
Дополнительный порт, имена хостов и чего DNS не умеет#
Тариф Minecraft на RE:NODE идёт с одним выделением, и это игровой порт. Веб-серверу плагина карты нужен собственный, и вы добавляете его на вкладке Network в панели. Из этого следуют две вещи, и на обеих спотыкаются:
- Номер выдаёт панель. Вы не выбираете
8123только потому, что так написано в документации плагина. Возьмите то, что покажет новое выделение, и впишите этот номер в конфиг плагина. - Невыделенный порт недоступен, даже изнутри. Оставьте Dynmap на
8123, и он спокойно запустится, напишет в лог, что его веб-сервер слушает, и будет невидим из интернета. Никакой ошибки искать не нужно, потому что со стороны сервера ничего не пошло не так.
Поэтому последовательность такая: добавьте выделение, запомните порт, поставьте в плагине такой же, укажите адрес привязки 0.0.0.0, а не 127.0.0.1, перезапустите и проверьте со своей машины:
$ curl -I http://203.0.113.10:25580/HTTP/1.1 200 OKНикогда не направляйте карту на игровой порт. Протокол Minecraft - это не HTTP, и делить порт между ними невозможно. В статье порты игровых серверов простыми словами объясняется, почему каждой службе нужен свой и для чего нужен query-порт.
Когда всё заработает, захочется адреса покрасивее, чем IP и пятизначный порт. DNS даёт половину. Запись A, указывающая map.example.com на адрес сервера, позволяет набирать http://map.example.com:25580, и это лучше. Но передать порт DNS не умеет: запись A сопоставляет имя адресу и ничему больше. Записи SRV порт передают, поэтому они так хорошо работают для самой игры - смотрите SRV-записи для Minecraft, - но браузеры не ищут SRV-записи для обычных веб-запросов, так что здесь они не помогут.
Чтобы убрать порт из URL и получить заодно HTTPS, впереди нужно что-то, что завершает TLS и пересылает запросы на карту. Это работа обратного прокси, и в тарифы для приложений и сайтов RE:NODE входит слот прокси, который выпускает и продлевает сертификат автоматически, как только на него указывает запись A. Веб-карта на игровом тарифе - это обычный HTTP на порту, и для большинства серверов этого достаточно. Только понимайте, что это значит:
Что делает обратный прокси и поддомены для серверов подробно разбирают сторону именования.
Установка и настройка Dynmap#
Загрузите jar в plugins/, один раз запустите сервер, чтобы он записал свои файлы, остановите его и правьте plugins/dynmap/configuration.txt. Настройки, важные на хостинге:
webserver-bindaddress: 0.0.0.0webserver-port: 25580disable-webserver: falsemax-sessions: 30image-format: jpg-q85timesliceinterval: 0.2maxchunkspertick: 120zoomoutperiod: 30tileupdatedelay: 30Основную работу делают три из них.
timesliceintervalиmaxchunkspertick- это дроссель. Первая вставляет паузу между срезами рендера, вторая ограничивает число чанков, обрабатываемых за тик. Значения по умолчанию подобраны для машины со свободными ядрами; на тарифе с 1-2 vCPU значения0.2и120не дают полному рендеру взять в заложники бюджет тика.image-format- самый большой рычаг расхода диска.pngбез потерь и огромен;jpg-q85для ландшафта визуально хорош и в разы меньше.zoomoutperiodиtileupdatedelayсобирают работу в пакеты, а не выполняют её в ту же секунду, когда блок изменился.
Определения карт для каждого мира живут в worlds.txt, собираются из шаблонов в папке templates. Набор по умолчанию даёт каждому миру плоскую 2D-карту, изометрическую карту «surface» и карту пещер. Изометрическая - самая дорогая из этого семейства и по времени рендера, и по числу тайлов на диске, так что если вам нужен только обзор, удалите её из определения мира и оставьте плоскую карту. Одно это решение может дать разницу между несколькими сотнями мегабайт и несколькими гигабайтами.
Рендером управляют из консоли:
$ dynmap fullrender world$ dynmap radiusrender 3000$ dynmap cancelrender world$ dynmap pause all$ dynmap statsradiusrender рендерит круг вокруг вашей позиции, и это почти всегда то, что вам на самом деле нужно: полный рендер мира без границ будет идти, пока не кончится диск. pause all останавливает и полный, и инкрементальный рендер, и это аварийный тормоз, когда рендер мешает живому серверу.
Dynmap умеет хранить тайлы и в базе данных, а не в файловой системе. На игровом тарифе, где один слот базы данных и миллионы мелких тайлов, это лишь переносит затраты, а не убирает их, и такой обмен редко оправдан. Его компонент веб-чата в большинстве сборок выключен по умолчанию, и так и стоит оставить, пока кто-то не займётся его модерацией: чат без авторизации по публичному URL привлекает именно то, что вы ожидаете.
Установка и настройка BlueMap#
BlueMap при первом запуске намеренно откажется что-либо делать. Ему нужен официальный клиентский jar Minecraft ради текстур блоков, и без разрешения он его не скачает:
accept-download: truerender-thread-count: 1metrics: trueПоставьте accept-download в true, перезапустите, и он скачает ресурсы и начнёт работу. render-thread-count определяет, сколько потоков занимаются рендером. По умолчанию значение подобрано для машины со множеством ядер, а в контейнере с жёстким лимитом CPU оно неверно: эти потоки тратят ту же долю CPU, которая нужна игровому потоку. На 1-2 vCPU поставьте 1 и смиритесь с тем, что первый рендер займёт больше времени.
Веб-сервер настраивается отдельно:
enabled: trueport: 25581webroot: "bluemap/web"Укажите порт вашего второго выделения и адрес привязки 0.0.0.0 - название ключа для этого менялось между крупными версиями, поэтому читайте комментарии в файле, а не копируйте с форума.
Каждый мир получает файл в maps/, и две настройки в нём экономят больше работы, чем всё остальное. min-inhabited-time пропускает чанки, в которых никто по-настоящему не проводил времени, а в исследованном, но пустом мире это убирает большую часть рендера. Ограничение вертикального диапазона настройками минимального и максимального Y не даёт BlueMap строить геометрию для бедрока и неба, на которые никто не посмотрит.
Команды находятся в пространстве имён /bluemap. Если запустить её без аргументов, она печатает ход рендера и список подкоманд, поддерживаемых вашей версией; чаще всего пригодятся reload, freeze (перестать обновлять карту, не удаляя её) и purge (удалить отрендеренные данные карты). Поскольку рендер идёт вне основного потока, BlueMap обычно не проявляется в MSPT, но проявляется в CPU - поэтому если TPS падает во время рендера, снимите профиль с --thread *, как описано в диагностика лагов Minecraft с помощью spark.
squaremap, дешёвый вариант#
squaremap работает только на Paper и только в плоском виде, а устанавливается как любой другой плагин. Его конфигурация - обычный YAML:
settings: internal-webserver: enabled: true bind: 0.0.0.0 port: 25582Настройки для отдельных миров лежат ниже в том же файле: блок по умолчанию плюс по одному блоку на мир, так что можно рендерить верхний мир и пропустить Энд. Команды строятся по тому же образцу, что у Dynmap:
$ squaremap fullrender world$ squaremap radiusrender 3000$ squaremap cancelrender world$ squaremap resetmap world$ squaremap reloadresetmap удаляет тайлы мира и сначала спрашивает подтверждения - это правильный способ оправиться от рендера, сделанного с неверными настройками. Если ваш тариф - Starter или Standard, а вам в основном нужно видеть, где все находятся и насколько разрослись базы, ставьте именно этот плагин. Он отрендерит ту же область за долю времени и оставит вам диск под мир.
Во что обходится рендер: CPU, память и диск#
Три отдельных бюджета, и обычно люди думают только об одном.
CPU. Первый рендер - дорогая часть. Dynmap рендерит в потоках сервера с настраиваемым дросселем; BlueMap и squaremap используют свои. В контейнере различие менее важно, чем кажется, потому что лимит CPU действует на весь процесс: всё, что берут потоки рендера, отнимается у той же доли, которая нужна игровому потоку. Это не повод отказываться от веб-карты, а повод рендерить, когда никто не играет.
Память. Все три работают внутри того же процесса Java, что и сервер, поэтому их рабочий набор берётся из той же кучи и того же лимита контейнера. На тарифе 2 ГБ для рендерера тайлов поверх мира и плагинов места нет, и отказ выглядит не как «карта тормозит», а как «сервер упёрся в лимит памяти и перезапустился». Оценки размеров - в сколько RAM нужно серверу Minecraft.
Диск. Вот кто кусается. Деревья тайлов растут вместе с отрендеренной площадью, а не с числом игроков, а у мира без границы верхнего предела нет. Область 10 000 на 10 000 блоков - это 400 файлов регионов; тайлы, отрендеренные из неё, могут оказаться где угодно между несколькими сотнями мегабайт для плоской JPEG-карты и несколькими гигабайтами для 3D-карт в качестве PNG. Диапазон действительно настолько широк, поэтому правильный ход - отрендерить небольшой радиус, посмотреть на размер папки и экстраполировать.
Порядок действий, который позволяет всего этого избежать:
- Задайте границу мира и предгенерируйте всё внутри неё, чтобы у самого мира был известный размер. В статье граница мира и предгенерация есть команды Chunky.
- Решите, какие карты вам действительно нужны. Только плоская, только для верхнего мира - вполне законный ответ.
- Запустите
radiusrenderна 1000 блоков и измерьте результат. - Расширяйте до границы в спокойный час, при включённом дросселе.
Как скрыть базы и игроков с карты#
Публичная живая карта - инструмент грифинга на сервере без приватов. Любому, у кого есть URL, она показывает, где находится каждая база и кто сейчас далеко от своей. Определите политику до рендера, а не после того, как чей-то склад опустеет.
Что даёт каждый плагин:
- У Dynmap есть
/dynmap hideи/dynmap showдля отдельных игроков, ограничения видимости и скрытых регионов по мирам вworlds.txt, чтобы полностью исключить область, и необязательный веб-вход, чтобы карта не была открыта всем. - У squaremap есть
/squaremap hideи/squaremap showи настройки по мирам, определяющие, какие игроки отображаются. - В
plugin.confBlueMap есть набор переключателей для скрытия игроков в ванише, крадущихся, наблюдающих и невидимых, а слой живых игроков можно отключить полностью.
Скрыть игроков - лёгкая половина. Скрыть ландшафт сложнее, потому что тайлы уже отрендерены и отдаются как статические файлы: скрытый регион нужно исключить до рендера или очистить после. Если вашему серверу нужно, чтобы базы оставались тайной, реалистичных вариантов три: плоская карта малого масштаба без деталей, карта, ограниченная областью спавна, или вообще никакой публичной карты, а только рендер для персонала, который вы смотрите у себя локально.
Лучший ответ для большинства сообществ - не секретность, а защита. Карта плюс плагин приватов плюс журнал блоков - здоровое сочетание; одна карта на незащищённом сервере - это проблема, которая ждёт плохой недели. Эту сторону разбирает защита от грифинга и античит, а общая гигиена списка плагинов описана в руководстве по оптимизации Paper.
FAQ#
Какую веб-карту поставить?
squaremap, если у вас небольшой тариф или нужен в основном обзор. BlueMap, если карта - это довод в пользу вашего сообщества и у вас хватает CPU и диска. Dynmap, если нужен его API маркеров, потому что другой плагин рисует на нём приваты, города или магазины.
Будет ли веб-карта лагать мой сервер?
Первый полный рендер будет, если его не ограничить и не запускать, когда никого нет. Инкрементальные обновления потом ничтожны, а раздача тайлов зрителям почти ничего не стоит. Долговременная цена - диск, а не время тика.
Можно ли запустить карту на порту 80, чтобы в URL не было порта?
На игровом тарифе нет. Вы получаете выделение из диапазона панели, и плагин обязан его использовать. Чтобы убрать порт из URL, нужно что-то впереди, что завершает HTTPS и пересылает запросы на карту, и именно для этого служит слот обратного прокси на тарифе для приложений или сайтов.
Можно ли направить поддомен на мою карту?
Да, записью A на адрес сервера, но порт в URL останется, потому что DNS порты не передаёт. SRV-записи передают, а браузеры их игнорируют.
Сколько диска займут тайлы?
Зависит от отрендеренной площади, от рендерера и от того, оставили ли вы 3D-карты. Отрендерьте радиус 1000 блоков, измерьте папку и умножьте. Сначала заданная граница мира превращает вопрос, на который нельзя ответить, в вопрос, на который можно.
Работают ли веб-карты с модами, а не с плагинами?
У Dynmap и BlueMap есть сборки для Fabric, Forge и NeoForge. squaremap - только плагин для Paper. На сервере Paper все три - плагины и ставятся одинаково, через файловый менеджер или SFTP.




Комментарии
Полностью анонимно: без аккаунта, без почты, без cookie. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.