Модовый сервер - это совсем другая история по сравнению с ванильным. Здесь мир обрастает дополнительными измерениями, тысячами новых блоков, замысловатыми механизмами и существами, которых придумали разработчики из разных уголков планеты. Forge остаётся главной модовой платформой Minecraft с 2011 года, хотя у него и появился молодой соперник в лице NeoForge для свежих версий игры. Сборка такого сервера на Linux требует осмысленного подхода, потому что моды съедают оперативку гораздо охотнее ванильного клиента, генерируют десятки лаг-спайков на ровном месте и поднимают планку требований к JVM. Ниже разложен путь от голой Ubuntu до сервера, который уверенно тянет двести модов на сотне игроков и не падает каждые пять минут.
Требования к железу под модовый сервер и подготовка чистой Ubuntu
Первое и самое важное правило модового сервера звучит просто. Память важнее всего остального. Ванильный сервер на двух гигабайтах оперативки спокойно обслуживает десяток друзей, а вот сборка на сто пятьдесят модов начинает захлёбываться уже на восьми гигабайтах при пяти игроках. Реальные цифры выглядят примерно так. Лёгкая сборка на 30-50 модов комфортно живёт в 4-6 ГБ. Среднестатистическая сборка на 100-150 модов требует 8-12 ГБ. Тяжёлые модпаки уровня FTB Infinity Evolved или All The Mods просят 16-24 ГБ и заметно нагружают процессор при генерации новых чанков.
Процессор для модового сервера выбирается по принципу высокой одноядерной производительности. Сам Minecraft исторически работает преимущественно в одном потоке для главного игрового цикла, а моды лишь усугубляют эту нагрузку. Современный шестиядерный CPU с частотой 4,5 ГГц и выше обслуживает модовый сервер заметно лучше двадцатиядерного серверного зверя с частотой 2,8 ГГц. Хранилище однозначно NVMe или SATA SSD, потому что моды читают и пишут массу мелких файлов конфигурации и сохранений. HDD под модовый сервер - билет в мир бесконечных задержек.
Базовая подготовка системы стандартна и занимает несколько минут:
sudo apt update && sudo apt upgrade -y
sudo apt install -y curl wget screen tmux htop nano unzip
Создание отдельного системного пользователя обязательно. Запускать игровой процесс от root - всё равно что доверить ключи от квартиры случайному гостю:
sudo useradd -r -m -U -d /opt/forge -s /bin/bash mcuser
Полезно сразу настроить лимиты на открытые файлы для этого пользователя. Forge с большой сборкой модов легко упирается в стандартный лимит 1024 файловых дескриптора и крашится без внятных сообщений. В файл /etc/security/limits.conf добавляются строки:
mcuser soft nofile 65536
mcuser hard nofile 65536
После этого нужен повторный вход или перезагрузка, чтобы лимиты применились.
Установка правильной версии Java под конкретный релиз Forge
Совместимость Minecraft с версиями Java - тема, на которой спотыкаются буквально все начинающие администраторы. Каждый релиз Minecraft требует строго определённой версии Java, и попытка запустить новую сборку на старой Java встречается ошибкой UnsupportedClassVersionError. Карта совместимости запоминается раз и навсегда:
- Minecraft 1.7.10 - 1.16.5 работает на Java 8
- Minecraft 1.17 - 1.17.1 требует Java 16
- Minecraft 1.18 - 1.20.4 нуждается в Java 17
- Minecraft 1.20.5 и выше требует Java 21
Установка нужной версии для современных сборок:
sudo apt install -y openjdk-21-jre-headless
Если на сервере одновременно живут несколько версий, переключение между ними делается через update-alternatives:
sudo update-alternatives --config java
Для модовых серверов разумно отказаться от стандартного OpenJDK в пользу более производительных дистрибутивов. Eclipse Temurin от Adoptium считается эталоном для игровых серверов и не имеет известных утечек памяти. Amazon Corretto - другой популярный выбор с долгосрочной поддержкой. GraalVM от Oracle на серверной нагрузке вроде генерации чанков даёт прирост в 20+ процентов, но требует тонкой настройки и не всем модам нравится. Установка Temurin делается через официальный репозиторий Adoptium:
wget -qO- https://packages.adoptium.net/artifactory/api/gpg/key/public | sudo tee /etc/apt/keyrings/adoptium.asc
echo "deb [signed-by=/etc/apt/keyrings/adoptium.asc] https://packages.adoptium.net/artifactory/deb $(awk -F= '/^VERSION_CODENAME/{print$2}' /etc/os-release) main" | sudo tee /etc/apt/sources.list.d/adoptium.list
sudo apt update && sudo apt install -y temurin-21-jdk
Проверка версии классическая - java -version. В выводе должна появиться строка вроде Temurin или OpenJDK с правильным номером.
Скачивание установщика Forge и развёртывание серверной части
Forge поставляется в виде универсального установщика, который сам подтягивает нужные библиотеки и формирует структуру серверных файлов. Актуальные версии лежат на официальном сайте проекта files.minecraftforge.net. Там же есть выбор версии Minecraft и канал стабильности - recommended для проверенных сборок и latest для свежих, но потенциально с багами. Установщик скачивается прямой ссылкой:
su - mcuser
mkdir -p ~/server && cd ~/server
wget https://maven.minecraftforge.net/net/minecraftforge/forge/1.20.1-47.3.0/forge-1.20.1-47.3.0-installer.jar
Запуск установщика с флагом installServer создаёт всю структуру серверной части в текущей папке:
java -jar forge-1.20.1-47.3.0-installer.jar --installServer
Процесс длится несколько минут. Установщик скачивает нужную версию vanilla-сервера, библиотеки Forge, MCP-маппинги и формирует папки libraries, mods и набор конфигов. После завершения сам файл установщика можно удалить, он больше не пригодится.
Первый запуск создаст файл eula.txt, который нужно отредактировать вручную. Лицензия Mojang принимается осознанно, поменяв false на true:
echo 'eula=true' > eula.txt
В свежих версиях Forge стартовый скрипт уже создаётся автоматически и называется run.sh. Старые версии требуют ручного создания. Папка mods - это место, куда складываются jar-файлы модов, скачанные с CurseForge или Modrinth. Главное правило - на сервере и у каждого игрока должен быть идентичный набор серверных модов с теми же версиями. Расхождение хотя бы в одном файле приводит к отказу подключения.
Альтернатива классическому Forge для современных версий Minecraft - NeoForge. Это форк, появившийся в 2023 году после разногласий в сообществе разработчиков, и для версий 1.20.5+ он постепенно становится основной модовой платформой. Установка NeoForge практически идентична - тот же установщик, та же структура файлов, отличается лишь URL дистрибутива.
Настройка Aikar's flags и тонкая оптимизация JVM под модовую нагрузку
Стандартные настройки JVM для модового сервера - это путь к лагам и спайкам сборщика мусора. Java по умолчанию настроена усреднённо и понятия не имеет, что обслуживает игровой сервер с резкими всплесками аллокации. Набор флагов, известный как Aikar's flags, остаётся золотым стандартом серверной оптимизации с 2018 года. Разработчик PaperMC исследовал поведение JVM неделями и собрал параметры, которые делают паузы сборщика G1GC короче и предсказуемее.
Главное правило при работе с памятью звучит безжалостно. Никогда не отдавать всю оперативку под Java. JVM требует накладных расходов поверх heap, плюс системе нужна память на дисковый кеш и фоновые процессы. Если на сервере 16 ГБ - под Minecraft выделяется максимум 12-14 ГБ. Если 8 ГБ - не больше 6 ГБ. Иначе при первом всплеске нагрузки в дело вступает OOM killer и убивает процесс без предупреждения.
Стартовый скрипт start.sh для типичной модовой сборки на 8 ГБ heap:
#!/bin/bash
cd /opt/forge/server
exec java -server -Xms8G -Xmx8G \
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 -XX:G1HeapRegionSize=8M \
-XX:G1ReservePercent=20 -XX:G1HeapWastePercent=5 -XX:G1MixedGCCountTarget=4 \
-XX:InitiatingHeapOccupancyPercent=15 -XX:G1MixedGCLiveThresholdPercent=90 \
-XX:G1RSetUpdatingPauseTimePercent=5 -XX:SurvivorRatio=32 \
-XX:+PerfDisableSharedMem -XX:MaxTenuringThreshold=1 \
-Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true \
-Dfml.queryResult=confirm \
@user_jvm_args.txt @libraries/net/minecraftforge/forge/1.20.1-47.3.0/unix_args.txt nogui
Каждый флаг здесь несёт смысл. Параметр AlwaysPreTouch заставляет JVM при старте занять всю запрошенную память сразу, а не аллоцировать её постепенно. Это убирает рывки производительности в первые часы работы сервера. DisableExplicitGC отключает явные вызовы System.gc() из мод-кода, который иногда грешит ненужными остановками сборщика. Параметры группы G1 настраивают сам сборщик мусора G1GC так, чтобы паузы укладывались в 200 миллисекунд и не вызывали заметных замираний мира.
При объёмах кучи свыше 12 ГБ значения корректируются. G1NewSizePercent поднимается до 40, G1MaxNewSizePercent до 50, G1HeapRegionSize увеличивается до 16M. Это даёт сборщику больше пространства для манёвра при работе с большими heap, где default-значения уже становятся узким местом. Для модовых серверов с heap больше 20 ГБ имеет смысл смотреть в сторону ZGC или Shenandoah - оба сборщика дают паузы менее десяти миллисекунд, но требуют свежих версий Java и запасов CPU.
Дополнительно на Linux рекомендуется включить поддержку Transparent Huge Pages флагом -XX:+UseTransparentHugePages. Это снижает накладные расходы на трансляцию страниц памяти и заметно ускоряет работу с большими heap. Включается на уровне системы:
echo always | sudo tee /sys/kernel/mm/transparent_hugepage/enabled
Для постоянного применения после перезагрузки настройка прописывается в /etc/rc.local или через systemd-tmpfiles.
Подбор модов для производительности и устранение типовых проблем сборок
Кроме настройки JVM есть отдельный пласт оптимизации - моды, которые повышают производительность самого сервера. Современный модовый стек обычно включает несколько проверенных оптимизаторов:
- Lithium - переписывает узкие места ванильного кода для скорости работы движка и AI существ
- Starlight - радикально ускоряет вычисления освещения, особенно при загрузке новых чанков
- FerriteCore - снижает потребление памяти за счёт оптимизации хранения BlockState
- Krypton - оптимизирует сетевой стек и сжатие пакетов между сервером и клиентами
- Spark - инструмент профилирования, который показывает, какие моды тормозят сервер
- ServerCore - специализированный набор серверных оптимизаций, безопасных для модов
Установка Spark обязательна на любом серьёзном модовом сервере. Команда /spark profiler --timeout 300 в консоли запускает пятиминутное профилирование и выдаёт подробный отчёт с разбивкой по модам, тикам и узким местам. Без этого инструмента поиск причины лагов превращается в гадание на гуще.
Типичные проблемы модовых сборок имеют свои характерные симптомы. Если RAM съедается до отказа за несколько часов - виноват мод с утечкой памяти, чаще всего связанный с дополнительными измерениями, которые не выгружаются после визита игроков. Лечится либо обновлением мода, либо настройкой параметра ticks-til-unload в конфиге Forge на меньшее значение. Если TPS проседает при наплыве существ - помогают моды вроде In Control или Mob Defaults, ограничивающие максимум сущностей в чанке. Если генерация чанков занимает секунды - поможет Chunk Pregenerator, который заранее создаёт игровой мир в нужном радиусе от спавна.
Один важный нюанс с конфигами модов. Каждый мод создаёт собственный файл в папке config после первого запуска, и многие из них содержат критичные для производительности параметры. Например, мод Twilight Forest по умолчанию агрессивно генерирует структуры, что нагружает диск. Уменьшение значения структурной плотности в конфиге снижает нагрузку без потери игрового опыта. Просмотр и правка конфигов вручную после первого старта - это не паранойя, а нормальная практика администрирования.
Создание systemd-сервиса автоматического резервного копирования и сетевой защиты
Запуск сервера через screen после каждой перезагрузки - это путь, на котором быстро устаёт даже терпеливый администратор. Юнит systemd решает вопрос раз и навсегда. Файл /etc/systemd/system/forge.service создаётся со следующим содержимым:
[Unit]
Description=Minecraft Forge Server
Wants=network-online.target
After=network-online.target
[Service]
Type=simple
User=mcuser
Group=mcuser
WorkingDirectory=/opt/forge/server
ExecStart=/opt/forge/server/start.sh
Restart=on-failure
RestartSec=30
TimeoutStartSec=900
TimeoutStopSec=120
StandardInput=null
LimitNOFILE=65536
[Install]
WantedBy=multi-user.target
Активация и контроль идут стандартным набором команд - sudo systemctl daemon-reload, sudo systemctl enable forge, sudo systemctl start forge. Параметр TimeoutStartSec=900 даёт пятнадцать минут на старт, потому что инициализация сервера со ста пятьюдесятью модами действительно может занять десять-двенадцать минут. На слабом железе и того дольше.
Резервное копирование критичных папок world, config и mods делается через простой скрипт на cron. Раз в сутки папки упаковываются tar-архивом и складываются в отдельное место, желательно на другой физический диск или удалённое хранилище через rsync. Папка world у активной модовой сборки растёт быстро - десятки гигабайт за несколько недель не редкость, поэтому ротация старых архивов с удалением через find -mtime +14 спасает от переполнения диска.
Сетевая защита для модового сервера тоже не повредит. Открытие игрового порта через UFW делается строкой sudo ufw allow 25565/tcp. Порт 22 для SSH стоит закрыть или ограничить доверенными адресами, аутентификацию по паролю заменить на SSH-ключи. Установка fail2ban отбивает грубый перебор, а правила nftables с ограничением скорости новых соединений на игровой порт защищают от мелких сетевых атак, которые иногда устраивают обиженные забаненные игроки.
Что в итоге собирается у того, кто прошёл этот путь. Полноценный модовый сервер на Forge с правильной версией Java под конкретный релиз Minecraft, тонко настроенной JVM под особенности модовой нагрузки, набором оптимизационных модов и автоматическим запуском через systemd. Такая система выдерживает активную игру десятков людей с тяжёлыми сборками, переживает падения через автоматический рестарт, бэкапится по расписанию и не теряет миры при сбоях диска. Главное преимущество ручной сборки в том, что каждый параметр прозрачен. Когда что-то ломается, администратор знает, в какой именно конфиг смотреть и какой флаг JVM крутить, а не пишет в поддержку хостинга в надежде на ответ к вечеру следующего дня.