Ванильный сервер, который падает, почти всегда просто исчерпал память. Сервер с модпаком может упасть из-за нехватки памяти, недостающей зависимости, не той версии 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 или ванильный сервер; здесь предполагается, что выбор уже сделан и что-то горит.
Как доставить сборку на сервер#
Модпак - это не кнопка «установить». Серверу нужны серверные файлы сборки, а это не та же загрузка, что клиентский пакет. Три пути, по возрастанию объёма работы:
- Сборка публикует серверный пакет. Так делает большинство крупных сборок на CurseForge. Это zip с
mods/,config/, иногдаkubejs/илиscripts/и скриптом запуска. Загрузите его, распакуйте на месте и задайте команду запуска в соответствии с тем, что делает скрипт. - Сборка - это только манифест. Файл Modrinth
.mrpack- это zip, в которомmodrinth.index.jsonперечисляет адреса загрузки, а не сами файлы. Распакуйте его и разрешите список: вручную или одним из инструментов сообщества, которые читают индекс и собирают серверную папку. - Вы собираете сборку сами. Установите загрузчик, затем добавляйте моды по одному. Медленнее, но в итоге вы знаете, для чего нужен каждый jar в папке, а это очень ценно, когда впервые что-то сломается.
Установка самого загрузчика на вашей собственной машине:
# 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 куда жёстче, чем ваниль, и ошибку при неверном выборе ни с чем не спутать, стоит увидеть её один раз:
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, - обычно падает раньше и грязнее, с ошибками рефлексии о недоступных внутренних пакетах, а не с чистой жалобой на версию.
| Версия Minecraft | Java | Примечания |
|---|---|---|
| 1.7 - 1.16.5 | 8 | Сборки 1.12 особенно ломаются на всём, что новее |
| 1.17.x | 16 или 17 | Версия, которая подтолкнула вперёд всю экосистему |
| 1.18 - 1.20.4 | 17 | Долгая стабильная эпоха сборок Forge |
| 1.20.5 и новее, 1.21.x | 21 | Обязательно, а не рекомендуется |
Два правила, которые спасают целые вечера. Первое: подбирайте 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 dependencies | Forge называет мод и диапазон версий, который ему был нужен |
Incompatible mods found! | Версия того же у Fabric, с перечнем требуемых версий |
NoClassDefFoundError: net/minecraft/client/... | В папке mods сервера лежит мод только для клиента |
Последняя строка заслуживает отдельного абзаца. У модов рендеринга - Sodium, Iris, OptiFine, Embeddium, Rubidium, Oculus, миникарты, загрузчики шейдеров - серверной части нет вообще, и выделенный сервер, загрузивший такой мод, умирает, потянувшись за классом, который есть только в клиентском jar. Когда вы копируете папку mods клиентской сборки на сервер, в первую очередь уберите именно их.
Грубое правило за этой схемой: если сборка падает при первом запуске, это почти никогда не память, а если после часа игры - как правило, память. Сбои при запуске зависят от того, какие 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 в той же версии, что на практике означает раздачу сборки через лаунчер, а не через сообщение в чате.
Четыре настройки, из-за которых случается большинство остального#
Когда сборка запускается и игроки могут заходить, четыре вещи объясняют большую часть лагов и жалоб «вчера же всё работало».
view-distance=8simulation-distance=6max-tick-time=60000- Дальность прорисовки. Она умножает число загружаемых чанков на число игроков, а чанки с модами тяжелее ванильных. Сборка с дальностью 12 и пятнадцатью игроками - совсем другой сервер, чем та же сборка с 8. Начните с 8, а на большой технической сборке попробуйте 6.
- Генерация чанков во время игры. Генерация новой местности по требованию, пока люди играют, - источник большинства «случайных» скачков, а моды генерации мира усугубляют это в разы. Заранее сгенерируйте область, которая, по вашим расчётам, будет использоваться, с помощью Chunky (
/chunky radius 3000,/chunky start), прежде чем кто-либо зайдёт, и обнесите её границей мира. Вся процедура описана в статье граница мира и предгенерация. - Накопление сущностей. Фермы, спавнеры мобов и выпавшие предметы от карьера, съедающего чанки, - обычная причина сервера, который неделю работает нормально, а потом перестаёт. Ванильное игровое правило
maxEntityCramming(по умолчанию24) иrandomTickSpeed(по умолчанию3) - два рычага, которые есть в каждой сборке; в большинстве сборок есть ещё и мод контроля спавна с более удачными. - Загрузчики чанков. Технические сборки позволяют игрокам держать чанки загруженными постоянно - карьеры, механизмы, межмерные загрузчики чанков. Двадцать таких - и ваш сервер симулирует двадцать лишних областей, в которых никого нет. Выясните, какой мод вашей сборки их предоставляет, и ограничьте его до конца первой недели.
Чтобы понять, какая из четырёх ваша, профилируйте, а не гадайте. spark работает на Fabric, Forge и NeoForge, а также на Paper: /spark profiler start, поиграйте несколько минут, /spark profiler stop, откройте ссылку. Начиная с 1.20.3 в ванили есть ещё /tick query, который показывает время тика без установки чего-либо. О том, что говорит flame graph, рассказывает статья как читать отчёт spark.
Моды производительности, которые безопасно добавлять#
Небольшой набор модов надёжно ускоряет модифицированный сервер, не меняя поведения. Ни один из них не заменяет четыре настройки выше, но они почти бесплатны.
| Мод | Загрузчик | Что делает |
|---|---|---|
| Lithium | Fabric | Общая оптимизация игровой логики без изменения поведения |
| Canary или Radium | Forge, NeoForge | Порты той же работы для линии Forge |
| FerriteCore | Оба | Сокращает память, занимаемую состояниями блоков и данными чанков |
| ModernFix | Оба | Быстрее запуск, меньше памяти, куча мелких исправлений |
| Krypton | Fabric | Переписывает сетевой стек, помогает при большом числе игроков |
| C2ME | Fabric | Параллельная генерация чанков. Мощный и наименее стабильный здесь |
| Alternate Current | Оба | Гораздо более дешёвая реализация редстоуна |
| Clumps | Оба | Объединяет сферы опыта, из-за чего фермы боссов не плавят тик |
Добавляйте их по одному, перезапускайте и смотрите лог. C2ME в частности меняет то, как работает генерация мира, и его нужно проверять на копии мира, прежде чем подпускать к настоящему. И не добавляйте на сервер клиентский мод «оптимизации» только потому, что название звучит подходяще: Sodium и его ответвления - это рендереры, а на сервере рендерить нечего.
Обновление сборки без потери мира#
Каждый игровой патч и каждое обновление сборки что-нибудь ломают, пока авторы не подтянутся, поэтому модифицированный сервер никогда не должен автоматически обновляться в день релиза. Процедура, которая работает:
- Сделайте backup мира, `mods/` и `config/` вместе. Это единое целое; мир, восстановленный рядом с не теми версиями модов, - это не восстановление. Слоты backup есть в каждом тарифе, backup хранятся вне защищаемой машины, а один из них можно заблокировать, чтобы ротация его не удалила, - сделайте это перед обновлением.
- Запишите версии, на которых вы находитесь. Версия загрузчика, версия Minecraft, версия сборки, версия Java. Это состояние, к которому вы откатываетесь.
- Обновляйте, когда онлайн никого нет, запустите сервер и прочитайте
logs/latest.logс самого начала, а не следите за хвостом. Интересные строки находятся в первых тридцати секундах. - Ждите запроса реестра, когда вы удаляете мод. Forge замечает, что мир ссылается на блоки и предметы, которых больше нет, и отказывается загружаться, а не удаляет их молча. Принять потерю сознательно можно, добавив в аргументы JVM
-Dfml.queryResult=confirm, - и это именно потеря, так что сначала сделайте backup. - Зайдите и обойдите места, где строили игроки, прежде чем объявлять, что сервер вернулся. Пропавшие блоки видны сразу, и обсуждать их гораздо проще, пока тридцать человек их не увидели.
Откат подробно разобран в статье что делать, когда обновление мода всё ломает, почему непроверенный 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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.