Как запустить сервер Minecraft на VPS Ubuntu
Настройка Paper Minecraft на Ubuntu 24.04: использование Java 21, создание systemd unit и открытие порта 25565. Инструкция по резервному копированию мира.
Что вы создаете
Вы создаете отказоустойчивый сервер Minecraft Java Edition: Paper на Ubuntu 24.04, работающий от выделенного пользователя minecraft через systemd с использованием Restart=on-failure. Порт 25565 должен быть открыт в обоих брандмауэрах, находящихся между игроками и JVM. Также будет настроено резервное копирование, которое не приводит к повреждению игрового мира. Сам сервер состоит из одного jar-файла и одной команды java. Разница между сервером, на котором друзья играют годами, и сервером, который упадет в первые выходные, заключается именно в настройке этой команды. Данное руководство посвящено именно этому.
Два важных предупреждения перед началом работы. Во-первых, Minecraft потребляет много оперативной памяти и в основном использует один поток: VPS с 1 GB памяти не обеспечит игровую производительность; один быстрое ядро лучше четырех медленных. Во-вторых, это Java Edition. Игроки Bedrock (консоли, телефоны, приложение Windows Bedrock) не могут подключиться к Java-серверу. Для Bedrock требуется другое серверное ПО на порту UDP 19132 или плагин Geyser, который не рассматривается в этом руководстве.
Вам потребуется чистый KVM VPS на Ubuntu 24.04 с правами root или sudo и около тридцати минут времени.
Аппаратные требования: что на самом деле нужно серверу для игры с друзьями
Ключевым параметром является объем RAM. Реальные требования ниже, чем указывают на форумах модпаков:
- 2 GB достаточно для vanilla-сервера на 2–5 игроков с умеренной дальностью прорисовки. Играть можно, но запаса ресурсов нет.
- 4 GB — оптимальный объем для сервера с друзьями: около десяти одновременных игроков на Paper с небольшим количеством плагинов, и достаточно памяти для работы ОС.
- 8 GB и выше — это уровень для модпаков и серверов на 20+ игроков. В этом случае также следует обратить внимание на частоту одного ядра CPU, так как основной игровой цикл выполняется в одном потоке.
Размер файлов мира на диске также растет по мере исследования карты игроками — хорошо исследованный мир в режиме survival может занимать несколько гигабайт. Оставляйте свободное место под файлы мира и его резервные копии.
Vanilla или Paper? Paper является полной заменой официального jar-файла: те же миры, те же клиенты, дополнительные моды на стороне клиента не требуются. Paper переписывает самые медленные процессы сервера — загрузку чанков, тики сущностей, работу воронки (hoppers) — и добавляет API для плагинов. Единственная причина использовать vanilla — если вам нужны абсолютно точные механики vanilla для технических ферм на редстоуне, которые оптимизации Paper могут изменить. Для всех остальных Paper обеспечивает больше игроков на один гигабайт памяти. Все перечисленные ниже параметры подходят для обоих вариантов.
Шаг 1: установка Java 21
Для Minecraft 1.20.5 и всех последующих версий (все 1.21.x) требуется Java 21. В Ubuntu 24.04 она доступна в стандартных репозиториях. Версия headless не содержит графических библиотек, которые не требуются серверу:
sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -versionВерный результат: первая строка содержит openjdk version "21.0.x". Если указано 17 или 11, установлена другая JRE с более высоким приоритетом; исправьте это с помощью sudo update-alternatives --config java и выберите запись, содержащую java-21.
Пропуск этой проверки приводит к самой частой ошибке Minecraft-серверов, которую ищут в Google. При использовании Java 17 серверный jar-файл немедленно завершает работу с ошибкой:
Error: LinkageError occurred while loading main class net.minecraft.bundler.Main
java.lang.UnsupportedClassVersionError: net/minecraft/bundler/Main has been
compiled by a more recent version of the Java Runtime (class file version 65.0),
this version of the Java Runtime only recognizes class file versions up to 61.0Числа указывают на несоответствие: версия class file 65.0 соответствует Java 21, 61.0 — Java 17, 60.0 — Java 16. Какая бы пара чисел ни встретилась, решение одинаково — установите более новую JRE и снова запустите update-alternatives.
Шаг 2: выделенный пользователь, никогда не root
Сервер выполняет код плагинов и обрабатывает сетевые данные от любого пользователя, имеющего доступ к порту. Если произойдет ошибка, взлом системы под учетной записью root даст полный контроль над вашим VPS; взлом под учетной записью minecraft даст контроль только над игровым миром.
sudo adduser --system --group --home /opt/minecraft minecraft--system создает учетную запись без пароля, которая не может войти через SSH, с /opt/minecraft в качестве домашнего и рабочего каталога. Все последующие команды, взаимодействующие с сервером, будут выполняться от имени этого пользователя.
Шаг 3: загрузка server jar из официального источника
Получить server jar можно только из двух источников: на официальной странице загрузки vanilla на minecraft.net или на странице загрузок Paper на papermc.io. Сторонние «центры загрузки», перепаковывающие server jar, являются известным каналом распространения вредоносного ПО. Файл server jar — это произвольный код, который вы будете запускать в режиме 24/7 на устройстве, имеющем доступ к интернету.
Скопируйте ссылку на загрузку текущей сборки с официальной страницы (URL меняется с каждой версией и сборкой, поэтому использование статической ссылки здесь нецелесообразно), затем:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Верный результат: server.jar размером около 50 MB от minecraft, подтвержденная с помощью ls -lh /opt/minecraft/server.jar.
Шаг 4: первый запуск, EULA и получение прав администратора
Запустите сервер в интерактивном режиме один раз, прежде чем настраивать systemd. Первый запуск выполняет две задачи, которые можно успешно завершить только через живую консоль.
cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar noguiПрограмма завершит работу через несколько секунд — Paper требуется дополнительное время на применение патчей — и лог завершится строкой, с которой сталкиваются все:
[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.Это не ошибка, а проверка лицензионного соглашения. При запуске рядом с jar-файлом был создан файл eula.txt. Если вы еще не читали EULA по ссылке, прочитайте его, а затем установите флаг:
sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txtСнова запустите ту же команду java. На этот раз сервер создаст мир (это займет одну-две минуты при первом запуске) и остановится на строке:
[Server thread/INFO]: Done (9.204s)! For help, type "help"Теперь у вас есть доступ к консоли. Используйте её для второй задачи: введите op YourMinecraftName (ваш точный игровой никнейм), и сервер запишет вас в ops.json. Это позволит вам использовать любые административные команды внутри игры, когда консоль будет отключена. Затем введите stop, чтобы сохранить данные и корректно выйти.
Шаг 5: server.properties и почему online-mode должен быть true
При первом запуске также был создан файл server.properties. Большинство настроек по умолчанию подходят; однако следующие параметры требуют осознанного выбора:
online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually knowonline-mode=true заставляет сервер проверять каждое имя пользователя через сессионные серверы Mojang, чтобы подтвердить владение аккаунтом. Установка значения false (режим «пиратского сервера») означает, что сервер доверяет любым данным клиента о личности игрока. Любой пользователь может зайти под любым именем, включая ваше. Поскольку права оператора (ops) и белые списки (whitelists) привязаны к именам, злоумышленник может получить ваши права оператора. Единственная допустимая причина для установки false — использование аутентифицирующего прокси, например Velocity, который сам проверяет игроков. На обычном сервере этот параметр должен оставаться true.
view-distance — основной параметр для настройки производительности в этом файле. Нагрузка на CPU и RAM растет примерно пропорционально квадрату этого значения. Значение 8 является разумным стандартом для VPS; значение 10 является стандартным для vanilla-версии и требует заметно больше ресурсов.
white-list=true в сочетании с enforce-whitelist=true закрывает сервер для посторонних. В разделе по безопасности ниже поясняется, что это не является опциональным. Чтобы добавить игроков, используйте команду /whitelist add TheirName в игре, имея права оператора.
Шаг 6: флаги памяти — почему значения -Xms и -Xmx должны совпадать
JVM выделяет кучу (heap) в диапазоне между -Xms (начальный размер) и -Xmx (максимальный размер). На выделенном игровом сервере установите их одинаковыми. Куча все равно достигнет максимального значения, а поэтапное увеличение размера создает лишнюю нагрузку на сборщик мусора во время игры. Для VPS с 4 GB RAM подходит следующая пара:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx — это не общий объем памяти, используемый процессом. JVM требует дополнительные ресурсы вне кучи (off-heap) — стеки потоков, кэши JIT, прямые буферы — примерно в полгигабайта или более; также память нужна самой ОС Ubuntu. Правило: -Xmx — это максимум объем RAM вашего VPS минус 1 GB. Если превысить этот лимит, возникнет одна из двух проблем. Если выделение памяти не удастся на старте, сервер не запустится с ошибкой:
Error: Could not reserve enough space for object heapЭтот вариант ошибки проявляется сразу. Более сложная ситуация: сервер запускается нормально, но через несколько часов работы аварийно завершается. Это происходит, когда куча заполняется под нагрузкой, и OOM killer ядра выбирает самый крупный процесс в системе — JVM. В логах сервера ничего не появится; следы ошибки будут в sudo dmesg | grep -i oom, например, в строке Out of memory: Killed process 1234 (java). Если ваш сервис перезапускается «случайно», сначала проверьте этот лог и уменьшите -Xmx.
Для Paper проект рекомендует флаги Aikar — оптимизированный набор для G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 и другие), который сглаживает паузы сборщика мусора на больших кучах. Сформируйте полную строку команд согласно документации Paper; на куче размером 2–4 GB прирост будет небольшим, но эти флаги безопасны.
Шаг 7: unit-файл systemd с параметром Restart=on-failure
Сервер, запущенный вручную, завершает работу вместе с вашей SSH-сессией и не запускается автоматически после перезагрузки. Создайте /etc/systemd/system/minecraft.service:
[Unit]
Description=Minecraft server (Paper)
After=network-online.target
Wants=network-online.target
[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft
ExecStart=/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui
Restart=on-failure
RestartSec=10
TimeoutStopSec=120
[Install]
WantedBy=multi-user.targetsudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -fВерный результат: status отображает active (running), а журнал (journal), который теперь содержит вывод консоли сервера, снова заканчивается на строке Done.
В этом unit-файле сделаны два намеренных выбора. Restart=on-failure перезапускает сервер после сбоя, но не после корректного stop, что позволяет проводить техническое обслуживание. Параметр TimeoutStopSec=120 важнее, чем кажется: systemctl stop отправляет сигнал SIGTERM, сервер Minecraft перехватывает его и сохраняет все миры перед выходом; на больших мирах это сохранение занимает время. Стандартный таймаут systemd может отправить SIGKILL процессу JVM во время сохранения, что приводит к повреждению файлов регионов. Установите время ожидания в две минуты.
Если сервис постоянно перезапускается (flapping) и в журнале отображается:
[Server thread/WARN]: **** FAILED TO BIND TO PORT!
[Server thread/WARN]: The exception was: io.netty.channel.unix.Errors$NativeIoException: bind(..) failed: Address already in use
[Server thread/WARN]: Perhaps a server is already running on that port?значит, порт 25565 уже занят. Чаще всего это происходит из-за предыдущего процесса, запущенного в другой SSH-сессии. Найдите его с помощью sudo ss -tlnp | grep 25565 и завершите этот процесс; нельзя запускать два сервера на одном порту.
Шаг 8: откройте порт 25565 на обоих брандмауэрах
Minecraft Java использует только TCP 25565 (UDP используется только для опционального протокола query и отключен по умолчанию). На VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableЭто первый брандмауэр. Большинство провайдеров VPS используют второй брандмауэр на уровне сети в панели управления; именно о нем часто забывают. Также откройте TCP 25565 там. Симптом при открытии только одного из двух портов крайне неопределенный: клиент зависает на этапе "Connecting to the server..." и выдает ошибку Connection timed out: no further information — без отказа в соединении, без ошибки сервера и без записей в журнале, так как пакеты не доходят до цели. Проверьте доступность с устройства вне VPS с помощью nc -vz your.server.ip 25565; результат succeeded означает, что оба брандмауэра открыты, а зависание означает, что как минимум один из них закрыт.
Пока вы настраиваете ufw, помните: на этом же сервере работает SSH с публичным IP. Логи брутфорса начнут заполняться уже через несколько часов — настройте Fail2ban для SSH на Ubuntu 24.04, пока вы не забыли.
Теперь подключайтесь: Multiplayer, Direct Connection, IP-адрес сервера. Поскольку на шаге 4 вы предоставили себе права оператора, игровые команды будут работать сразу — /whitelist add FriendName для каждого игрока, /gamemode creative, если это предусмотрено планом.
Шаг 9: добавление в whitelist, так как интернет сканирует порт 25565
Открытый доступ к серверу Minecraft через интернет представляет реальный риск. Сканеры постоянно проверяют весь IPv4-адресный диапазон на наличие открытого порта 25565. С помощью этого метода проекты по гриферству обнаружили сотни тысяч открытых серверов. Сервер без whitelist получает нежелательных посетителей в течение нескольких дней или даже часов. Решение — использование whitelist из шага 5: online-mode=true подтверждает личность, а whitelist ограничивает доступ только выбранными вами пользователями. Эта комбинация составляет всю модель безопасности, и её достаточно для сервера для друзей.
Для доступа к консоли без запуска игры (например, для автоматического резервного копирования через cron) включите RCON в server.properties (enable-rcon=true, надежный rcon.password, порт 25575) и соберите клиент mcrcon из исходного кода на GitHub непосредственно на VPS; в репозиториях Ubuntu его нет. Не открывайте порт 25575 в брандмауэре: RCON передает пароль в открытом виде, поэтому доступ должен быть только через loopback.
Шаг 10: резервное копирование без повреждения данных
Единственное правило: никогда не копируйте директорию мира, пока сервер выполняет запись. Файлы регионов постоянно перезаписываются во время игры; tar, выполняемый одновременно с записью, создает архив с наполовину записанными чанками. При последующем восстановлении — в тот единственный момент, когда бэкап должен сработать — лог заполнится ошибками загрузки чанков, а в ландшафте появятся дыры. Существует два метода избежать этого.
Stop-copy-start — простой метод, требующий одной минуты простоя:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world world_nether world_the_end
sudo systemctl start minecraft(Paper разделяет измерения на world, world_nether и world_the_end; vanilla-сервер хранит всё в world, поэтому остальные два измерения нужно переместить туда.)
Save-off — резервное копирование работающего сервера: через RCON выполните save-off (остановите автосохранение), затем save-all flush (принудительно запишите всё на диск и подождите), создайте tar-архив, затем выполните save-on. Этот метод подходит для настройки в cron на 5 утра.
В любом случае, бэкап, хранящийся на том же VPS, что и сервер, не является полноценным резервным копированием — используйте scp или rclone для выгрузки архивов с машины и храните более одной копии. Поскольку вы не будете следить за консолью в момент сбоя, настройте внешнюю проверку порта: Uptime Kuma на другом узле, выполняющий TCP-проверку порта 25565, сообщит вам о падении сервера раньше, чем это сделают игроки.
Плагины и обновления
В Paper установка плагина заключается в копировании jar-файла в /opt/minecraft/plugins/ с последующим перезапуском. Загружайте плагины только со официальных страниц проектов (Hangar, Modrinth, SpigotMC). Это необходимо по той же причине, что и для jar-файла сервера: каждый плагин представляет собой произвольный код, выполняемый от имени пользователя minecraft.
Процесс обновления сервера: остановка, создание резервной копии, замена server.jar на сборку для новой версии Minecraft, запуск. Следует учитывать два момента. Обновление мира происходит в одну сторону: мир, открытый в более новой версии, не откроется в старой. Для этого необходимы резервные копии. Также плагины часто отстают от новых релизов Minecraft на дни или недели. Проверяйте совместимость, прежде чем устанавливать обновление в день его выхода.
Если вы предпочитаете управлять всеми параметрами через контейнер — фиксировать версии, принимать EULA и передавать флаги памяти как переменные окружения — используйте популярный образ itzg/minecraft-server. Он позволяет запустить тот же сервер Paper через Docker Compose на вашем VPS с соблюдением тех же правил настройки firewall и резервного копирования.
FAQ
Сколько RAM требуется серверу Minecraft?
2 GB достаточно для vanilla-сервера на 2–5 игроков; 4 GB оптимально для сервера на Paper с несколькими плагинами для группы из десяти друзей; для модпаков и 20+ игроков требуется 8 GB или больше. Каким бы ни был размер VPS, установите -Xmx не более чем на (общий объем RAM минус 1 GB) — JVM использует память помимо heap, и превышение лимита приведет к Error: Could not reserve enough space for object heap или скрытому OOM kill.
Почему мои друзья не могут подключиться к серверу Minecraft?
Зависание клиента, заканчивающееся Connection timed out: no further information, почти всегда означает проблему с firewall. Существует два уровня: ufw на VPS и сетевой firewall провайдера в панели управления. В обоих случаях должен быть открыт TCP 25565. Сначала подтвердите, что сервер прослушивает порт, используя sudo ss -tlnp | grep 25565 на машине, а затем проверьте доступность снаружи с помощью nc -vz your.server.ip 25565.
Стоит ли устанавливать online-mode=false в server.properties?
Нет. При значении online-mode=false сервер полностью пропускает аутентификацию Mojang. Это позволяет любому игроку зайти под любым именем, включая имя администратора с его правами, а также ломает скины и стабильные UUID. Единственный допустимый вариант — использование прокси-сервера (например, Velocity), который берет на себя проверку игроков. Для обычного сервера это значение должно оставаться true.
Paper лучше, чем vanilla Minecraft server?
Для большинства — да: Paper — это готовый jar-файл, который загружает vanilla-миры и принимает стандартные клиенты. Он гораздо эффективнее обрабатывает тики сущностей и загрузку чанков, а также предоставляет экосистему плагинов. Исключение составляют сообщества, занимающиеся техническим редстоуном, которым требуется точное соответствие поведению vanilla, так как некоторые оптимизации Paper его изменяют. На слабом VPS эффективность Paper фактически дает дополнительную свободную RAM.
Как сделать резервную копию мира Minecraft без повреждения данных?
Никогда не архивируйте директорию мира, пока сервер выполняет запись. Копирование во время записи region-файлов приводит к повреждению чанков, которое обнаружится только при восстановлении. Либо остановите сервер, архивируйте директории мира через tar и запустите сервер снова, либо используйте save-off, save-all flush, tar и save-on через RCON, чтобы сохранить сервер в рабочем состоянии. После этого переместите архив с VPS.