RE:NODE

Minecraft14 мин чтения

Модифицированный сервер Minecraft без вылетов

Forge, NeoForge и Fabric на сервере: установка сборки, таблица версий Java, чтение краш-репорта и настройки, из-за которых случается большинство сбоев.

Обновлено

2 прочтений

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

Forge, NeoForge и Fabric, и какие вылеты чьи#

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

  • Forge - самый старый, и на нём по-прежнему построено большинство крупных сборок для 1.12 и 1.16. Начиная с 1.17 установщик больше не создаёт единственный запускаемый jar: он записывает дерево libraries/, run.sh, run.bat и user_jvm_args.txt, а командой запуска служит скрипт, а не java -jar.
  • NeoForge - ответвление Forge, начавшееся с 1.20.1; на нём живёт большинство новых сборок линии Forge начиная с 1.20.2. Тот же шаблон установщика, та же структура файлов, другие координаты Maven. Мод для Forge 1.20.1 обычно не загрузится на NeoForge 1.21 без пересборки.
  • Fabric легче, обновляется до новых версий Minecraft за считаные дни, а не месяцы, и ожидает, что почти каждый мод зависит от отдельного мода Fabric API. Сбои самого Fabric обычно прямолинейны и читаемы; сбои Forge обычно выглядят как стектрейс.

Практическая разница для администратора сервера - в темпе версий. Сборки Fabric идут вплотную за игрой, а значит, ваш сервер редко застревает на старой версии, но моды обновляются часто. Сборки Forge и NeoForge отстают, а значит, сборка месяцами стабильна, а потом одно обновление сдвигает всё разом. Сам выбор разобран в статье Paper, Fabric или ванильный сервер; здесь предполагается, что выбор уже сделан и что-то горит.

Как доставить сборку на сервер#

Модпак - это не кнопка «установить». Серверу нужны серверные файлы сборки, а это не та же загрузка, что клиентский пакет. Три пути, по возрастанию объёма работы:

  1. Сборка публикует серверный пакет. Так делает большинство крупных сборок на CurseForge. Это zip с mods/, config/, иногда kubejs/ или scripts/ и скриптом запуска. Загрузите его, распакуйте на месте и задайте команду запуска в соответствии с тем, что делает скрипт.
  2. Сборка - это только манифест. Файл Modrinth .mrpack - это zip, в котором modrinth.index.json перечисляет адреса загрузки, а не сами файлы. Распакуйте его и разрешите список: вручную или одним из инструментов сообщества, которые читают индекс и собирают серверную папку.
  3. Вы собираете сборку сами. Установите загрузчик, затем добавляйте моды по одному. Медленнее, но в итоге вы знаете, для чего нужен каждый jar в папке, а это очень ценно, когда впервые что-то сломается.

Установка самого загрузчика на вашей собственной машине:

bash
# Forge / NeoForge - writes run.sh, libraries/ and user_jvm_args.txt$ java -jar forge-1.20.1-47.3.0-installer.jar --installServer# Fabric - writes a launch jar and downloads the vanilla server jar$ java -jar fabric-installer-1.0.1.jar server -mcversion 1.21.1 -downloadMinecraft

Дальше структура одинакова для любого загрузчика: в mods/ лежат jar-файлы, в config/ - их настройки после первого запуска, в logs/latest.log и logs/debug.log - улики, а в crash-reports/ - вскрытия.

На хостинге с панелью всё это загружается через файловый менеджер или по SFTP - параметры подключения есть в статье SFTP и файловый менеджер, а сборку из 200 модов гораздо быстрее загрузить одним архивом и распаковать на месте, чем 200 отдельными загрузками. Будьте честны с собой насчёт того, что хостинг здесь делает, а чего нет: линейка Minecraft в RE:NODE поставляется с Paper и подходящей Java, а модпак вы ставите поверх сами. Установщика модпаков в один клик нет и интеграции с сайтами модов тоже нет; файлы загружаете вы, и переменные запуска задаёте тоже вы.

Версия Java - не мелочь#

Модпаки привязаны к Java куда жёстче, чем ваниль, и ошибку при неверном выборе ни с чем не спутать, стоит увидеть её один раз:

code
java.lang.UnsupportedClassVersionError: com/example/Mod has been compiled by amore recent version of the Java Runtime (class file version 61.0), this versionof the Java Runtime only recognizes class file versions up to 52.0

Версия class-файла 52 - это Java 8, 61 - Java 17, 65 - Java 21. Это сообщение означает, что сборке нужна более новая Java, чем та, на которой она запущена. В обратном случае - сборка 1.12, запущенная на Java 17, - обычно падает раньше и грязнее, с ошибками рефлексии о недоступных внутренних пакетах, а не с чистой жалобой на версию.

Версия MinecraftJavaПримечания
1.7 - 1.16.58Сборки 1.12 особенно ломаются на всём, что новее
1.17.x16 или 17Версия, которая подтолкнула вперёд всю экосистему
1.18 - 1.20.417Долгая стабильная эпоха сборок Forge
1.20.5 и новее, 1.21.x21Обязательно, а не рекомендуется

Два правила, которые спасают целые вечера. Первое: подбирайте Java точно так, как указано в сборке, а не «что-нибудь новее» - Forge 1.16.5 и старше на Java 17 действительно не запустится. Второе: смена Java - это перезапуск, а не переустановка, поэтому её проще всего исключить. В панели версия - переменная запуска; на вашей собственной машине это вопрос того, какая java стоит в пути. Наборы флагов для каждой версии есть в статье флаги JVM и версии Java.

Читайте краш-репорт, а не последнюю строку#

Последняя строка вылета - симптом. Причина выше, в первом кадре стека, где назван не net.minecraft. Прокручивайте вверх, пока не найдёте пакет, принадлежащий какому-то моду; с этого мода и нужно начинать. Старые репорты Forge печатают поле Suspected Mods и часто в нём правы. Современные репорты Forge и NeoForge вместо этого перечисляют все моды в разделе -- System Details --, а Fabric печатает блок Fabric Mods:, так что сузить поиск можно только стектрейсом.

СообщениеЧто оно на самом деле означает
OutOfMemoryError: Java heap spaceКуча действительно кончилась. Увеличьте -Xmx или снизьте нагрузку
OutOfMemoryError: MetaspaceСлишком много классов для metaspace, а не слишком маленькая куча
NoSuchMethodError, NoClassDefFoundErrorМод собран под версию другого мода, которой у вас нет
Mixin apply failed, InvalidInjectionExceptionДва мода патчат один метод, либо мод для не той версии игры
UnsupportedClassVersionErrorНе та Java, см. выше
Missing or unsupported mandatory dependenciesForge называет мод и диапазон версий, который ему был нужен
Incompatible mods found!Версия того же у Fabric, с перечнем требуемых версий
NoClassDefFoundError: net/minecraft/client/...В папке mods сервера лежит мод только для клиента

Последняя строка заслуживает отдельного абзаца. У модов рендеринга - Sodium, Iris, OptiFine, Embeddium, Rubidium, Oculus, миникарты, загрузчики шейдеров - серверной части нет вообще, и выделенный сервер, загрузивший такой мод, умирает, потянувшись за классом, который есть только в клиентском jar. Когда вы копируете папку mods клиентской сборки на сервер, в первую очередь уберите именно их.

logs/latest.logread from the topDied before "Done"startup failureDied after playersruntime failureDependency or Javaversion mismatchMixin conflicttwo mods, one methodMemoryheap, metaspace, container
Какой вылет у вас на самом деле

Грубое правило за этой схемой: если сборка падает при первом запуске, это почти никогда не память, а если после часа игры - как правило, память. Сбои при запуске зависят от того, какие jar лежат в папке. Сбои во время работы зависят от того, что делает мир.

Память: куча, metaspace и убийство без стектрейса#

У модифицированного Minecraft есть три разных способа исчерпать память, и только один из них даёт ту ошибку, которую все ждут.

  • Исчерпание кучи даёт OutOfMemoryError: Java heap space, стектрейс и обычно краш-репорт. Именно здесь помогает увеличение -Xmx, если под лимитом контейнера есть запас.
  • Исчерпание metaspace - специфика модов. Триста модов - это десятки тысяч загруженных классов, а metaspace живёт вне кучи. Сборка, которая «должна влезать в 6 GB», умирает на тарифе 6 GB с -Xmx6G, потому что с кучей всё было в порядке, а процесс всё равно вышел за лимит.
  • Остановка контейнера не оставляет вообще ничего. Лог обрывается на полуслове, исключения и краш-репорта нет, потому что процесс был убит снаружи за превышение лимита памяти. В RE:NODE это сделано намеренно - на лимите сервер останавливается и чисто перезапускается, а не уходит в своп, - но диагностический признак везде одинаков: тишина.

Исправление для второго и третьего случая одно и то же и противоречит интуиции: уменьшить `-Xmx`. На тарифе 10 GB со сборкой в 200 модов -Xmx8G оставляет 2 GB на metaspace, стеки потоков, кэш кода JIT и прямые буферы Netty, и сервер перестаёт умирать. Таблицу запаса и рассуждения вы найдёте в статье сколько RAM нужно серверу Minecraft.

Клиентские моды, серверные моды и экран несовпадения#

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

Forge и NeoForge проверяют это при подключении и показывают экран с заголовком Connection Closed - Mismatched Mod Channel List, где перечислены каналы, которые есть у сервера, но нет у клиента, и наоборот. Он прямолинеен, но честен: список на этом экране и есть ваш diff. Fabric мягче - он прямо отклоняет клиента, только когда мод регистрирует сетевой канал, а у клиента его нет, - так что несовпадение на Fabric часто проявляется позже: пропавшие блоки, фантомные предметы или рассинхронизированный инвентарь вместо чистого кика.

Три категории; если разобраться в них, предотвращается большинство таких проблем:

  • Только для сервера: моды производительности, контроль спавна, журнал блоков, моды backup, мосты в Discord, права. Игрокам ничего ставить не нужно.
  • Только для клиента: рендеринг, шейдеры, миникарты, улучшения инвентаря, интерфейсные моды. Эти никогда не должны попадать в папку mods сервера.
  • Для обеих сторон: всё, что добавляет контент или меняет правила. У каждого игрока должен быть тот же jar в той же версии, что на практике означает раздачу сборки через лаунчер, а не через сообщение в чате.

Четыре настройки, из-за которых случается большинство остального#

Когда сборка запускается и игроки могут заходить, четыре вещи объясняют большую часть лагов и жалоб «вчера же всё работало».

server.properties
view-distance=8simulation-distance=6max-tick-time=60000
  1. Дальность прорисовки. Она умножает число загружаемых чанков на число игроков, а чанки с модами тяжелее ванильных. Сборка с дальностью 12 и пятнадцатью игроками - совсем другой сервер, чем та же сборка с 8. Начните с 8, а на большой технической сборке попробуйте 6.
  2. Генерация чанков во время игры. Генерация новой местности по требованию, пока люди играют, - источник большинства «случайных» скачков, а моды генерации мира усугубляют это в разы. Заранее сгенерируйте область, которая, по вашим расчётам, будет использоваться, с помощью Chunky (/chunky radius 3000, /chunky start), прежде чем кто-либо зайдёт, и обнесите её границей мира. Вся процедура описана в статье граница мира и предгенерация.
  3. Накопление сущностей. Фермы, спавнеры мобов и выпавшие предметы от карьера, съедающего чанки, - обычная причина сервера, который неделю работает нормально, а потом перестаёт. Ванильное игровое правило maxEntityCramming (по умолчанию 24) и randomTickSpeed (по умолчанию 3) - два рычага, которые есть в каждой сборке; в большинстве сборок есть ещё и мод контроля спавна с более удачными.
  4. Загрузчики чанков. Технические сборки позволяют игрокам держать чанки загруженными постоянно - карьеры, механизмы, межмерные загрузчики чанков. Двадцать таких - и ваш сервер симулирует двадцать лишних областей, в которых никого нет. Выясните, какой мод вашей сборки их предоставляет, и ограничьте его до конца первой недели.

Чтобы понять, какая из четырёх ваша, профилируйте, а не гадайте. spark работает на Fabric, Forge и NeoForge, а также на Paper: /spark profiler start, поиграйте несколько минут, /spark profiler stop, откройте ссылку. Начиная с 1.20.3 в ванили есть ещё /tick query, который показывает время тика без установки чего-либо. О том, что говорит flame graph, рассказывает статья как читать отчёт spark.

Моды производительности, которые безопасно добавлять#

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

МодЗагрузчикЧто делает
LithiumFabricОбщая оптимизация игровой логики без изменения поведения
Canary или RadiumForge, NeoForgeПорты той же работы для линии Forge
FerriteCoreОбаСокращает память, занимаемую состояниями блоков и данными чанков
ModernFixОбаБыстрее запуск, меньше памяти, куча мелких исправлений
KryptonFabricПереписывает сетевой стек, помогает при большом числе игроков
C2MEFabricПараллельная генерация чанков. Мощный и наименее стабильный здесь
Alternate CurrentОбаГораздо более дешёвая реализация редстоуна
ClumpsОбаОбъединяет сферы опыта, из-за чего фермы боссов не плавят тик

Добавляйте их по одному, перезапускайте и смотрите лог. C2ME в частности меняет то, как работает генерация мира, и его нужно проверять на копии мира, прежде чем подпускать к настоящему. И не добавляйте на сервер клиентский мод «оптимизации» только потому, что название звучит подходяще: Sodium и его ответвления - это рендереры, а на сервере рендерить нечего.

Обновление сборки без потери мира#

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

  1. Сделайте backup мира, `mods/` и `config/` вместе. Это единое целое; мир, восстановленный рядом с не теми версиями модов, - это не восстановление. Слоты backup есть в каждом тарифе, backup хранятся вне защищаемой машины, а один из них можно заблокировать, чтобы ротация его не удалила, - сделайте это перед обновлением.
  2. Запишите версии, на которых вы находитесь. Версия загрузчика, версия Minecraft, версия сборки, версия Java. Это состояние, к которому вы откатываетесь.
  3. Обновляйте, когда онлайн никого нет, запустите сервер и прочитайте logs/latest.log с самого начала, а не следите за хвостом. Интересные строки находятся в первых тридцати секундах.
  4. Ждите запроса реестра, когда вы удаляете мод. Forge замечает, что мир ссылается на блоки и предметы, которых больше нет, и отказывается загружаться, а не удаляет их молча. Принять потерю сознательно можно, добавив в аргументы JVM -Dfml.queryResult=confirm, - и это именно потеря, так что сначала сделайте backup.
  5. Зайдите и обойдите места, где строили игроки, прежде чем объявлять, что сервер вернулся. Пропавшие блоки видны сразу, и обсуждать их гораздо проще, пока тридцать человек их не увидели.

Откат подробно разобран в статье что делать, когда обновление мода всё ломает, почему непроверенный backup - не backup, - в статье backup, которые действительно восстанавливаются, а безопасность при запуске чужого кода - в статье как держать модифицированный сервер в порядке.

FAQ#

Сколько RAM нужно серверу Minecraft с модами?

Рассчитывайте на сборку, а не на число игроков: моды, реестры и генерация мира оплачиваются независимо от того, играет один человек или восемь. Сборка Fabric из 30-80 модов работает в 6 GB, сборке Forge или NeoForge из 150 и более модов нужно 8-10 GB, а старым сборкам 1.12 «всё и сразу» нужно 10 GB и Java 8. Затем оставьте 20-25% контейнера ниже вашего -Xmx под metaspace.

Почему моя сборка вылетает сразу, а ваниль работает?

Потому что сбои при запуске связаны с jar в папке, а не с лимитом памяти. По убыванию вероятности: не та версия Java, клиентский мод на сервере, недостающая зависимость, конфликт mixin. Все четыре называются в первых тридцати секундах logs/latest.log.

Нужно ли игрокам ставить те же моды, что и на сервере?

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

Можно ли запускать плагины на сервере Forge или Fabric?

Напрямую нет: плагины рассчитаны на API Bukkit и Paper, которого нет ни у одного из этих загрузчиков. Гибридные серверы вроде Mohist и Arclight скрепляют одно с другим и заметно менее стабильны, чем любая из половин; если вам нужны плагины, запускайте Paper и смиритесь, что новые блоки добавить нельзя. У Fabric есть серверные порты некоторых привычных инструментов, включая реализацию прав.

Что значит «Mixin apply failed»?

Мод попытался пропатчить метод, устроенный не так, как он ожидал, - обычно потому, что его уже пропатчил другой мод или потому, что мод собран под другую версию Minecraft. Лог называет mixin и целевой класс; мод, которому принадлежит этот mixin, и нужно обновить или убрать.

Безопасно ли менять конфигурационные файлы сборки?

Да, а на сервере часто и необходимо: сборки настроены под одиночную игру. Меняйте по одному файлу, храните оригинал и помните, что некоторые моды читают конфигурацию только при запуске. Файлы в config/ создаются заново, если их удалить, - это удобный способ сбросить тот, что вы сломали.


Комментарии

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

0/2000