Как разместить сервер Minecraft на VPS
Настройте Paper на Ubuntu 24.04: подберите RAM, установите Java 25, systemd и firewall для 25565, включите whitelist и делайте безопасные бэкапы мира.
Что вы создаете
Сервер Minecraft Java Edition, который работает стабильно: Paper на Ubuntu 24.04, запущенный от имени выделенного пользователя minecraft через systemd с Restart=on-failure, с включенным списком разрешенных (whitelist), открытым портом 25565 в ufw и сетевом файрволе провайдера (если он включен), а также с резервным копированием, которое не повреждает мир, который оно должно защищать. Сам сервер представляет собой один jar-файл и одну команду java; все, что отличает сервер, на котором ваши друзья играют год, от того, который «умирает» в первые выходные, сосредоточено вокруг этой команды, и именно это рассматривается в данном руководстве.
Два честных предупреждения перед тем, как вы потратите деньги. Во-первых, Minecraft требователен к оперативной памяти и преимущественно однопоточен: VPS с 1 ГБ RAM не потянет играбельный сервер, а одно быстрое ядро лучше четырех медленных. Во-вторых, это Java Edition. Игроки Bedrock, консолей, телефонов и приложения Windows Bedrock не смогут подключиться к Java-серверу; для Bedrock требуется другое серверное ПО на порту UDP 19132 или плагин Geyser, что выходит за рамки данного руководства.
Вам потребуется чистый VPS с Ubuntu 24.04 (KVM) с доступом root или sudo и около тридцати минут времени.
Размер: что действительно нужно серверу для друзей
Оперативная память — главный параметр. Реальные значения ниже, чем обычно указывают на форумах модпаков:
- 2 GB достаточно для vanilla на 2–5 игроков при умеренной дальности прорисовки. Играть можно, но запаса нет.
- 4 GB — комфортный объём для сервера друзей: около десяти игроков одновременно на Paper с несколькими плагинами, а также достаточный запас для ОС.
- 8 GB и больше — вариант для модпаков и более чем 20 игроков. В этом случае также важна производительность одного ядра CPU, поскольку основной игровой цикл выполняется в одном потоке.
Мир также занимает больше места на диске по мере исследования игроками. Хорошо исследованный мир в режиме выживания может занимать несколько гигабайт, поэтому оставьте запас для самого мира и его резервных копий.
Vanilla или Paper? Paper — это замена официальному jar без дополнительных изменений: используются те же миры и клиенты, а моды на стороне клиента не требуются. Paper оптимизирует самые медленные участки работы сервера: загрузку чанков, обработку сущностей и воронок, а также предоставляет API для плагинов. Единственная причина использовать vanilla — необходимость полного соответствия механикам vanilla для технических ферм на редстоуне, работу которых могут изменить оптимизации Paper. Во всех остальных случаях Paper поддерживает больше игроков при том же объёме памяти. Всё ниже применимо к обоим вариантам.
Шаг 1: установка Java 25
Minecraft 26.1 и каждый последующий релиз требуют Java 25; Java 21 подходит только для старой линейки версий с 1.20 по 1.21.11. Ubuntu 24.04 поставляет Java 25 через свои репозитории обновлений и безопасности. Установите полную версию JRE, а не сборку -headless: руководство по установке Java для Paper предостерегает от использования headless-вариантов, так как в них отсутствуют зависимости, необходимые для работы Paper.
sudo apt update && sudo apt install -y openjdk-25-jre
java -versionПравильный результат: первая строка содержит openjdk version "25.0.x". Если там указаны 21, 17 или 11, значит, установлена и используется другая JRE; исправьте это с помощью sudo update-alternatives --config java и выберите запись, содержащую java-25.
Пропуск этой проверки приводит к самой частой ошибке сервера Minecraft, которую ищут в поисковиках. При использовании Java 21 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 69.0),
this version of the Java Runtime only recognizes class file versions up to 65.0Эти числа расшифровывают несоответствие: версия class file 69.0 соответствует Java 25, 65.0 — Java 21, 61.0 — Java 17. Какую бы пару вы ни увидели, решение одно: установите более новую JRE и повторно выполните update-alternatives.
Шаг 2: отдельная учетная запись, никогда не root
Сервер выполняет код плагинов и обрабатывает сетевые данные от любого, кто может подключиться к порту. Если что-то пойдет не так, взлом с правами root полностью скомпрометирует VPS, а взлом с правами minecraft затронет игровой мир.
sudo adduser --system --group --home /opt/minecraft minecraft--system создает учетную запись без пароля, которая не может подключаться по SSH. Каталог /opt/minecraft используется как ее домашний и рабочий каталог. С этого момента каждая команда, взаимодействующая с сервером, выполняется от имени этого пользователя.
Шаг 3: загрузка jar-файла сервера из официального источника
Существует только два доверенных источника для получения jar-файла сервера: официальная страница загрузки minecraft.net для vanilla-версии и страница загрузки papermc.io для Paper. Сторонние «центры загрузки», переупаковывающие серверные файлы, являются давним каналом распространения вредоносного ПО. Помните, что jar-файл сервера — это произвольный код, который вы собираетесь запускать в режиме 24/7 на сервере, имеющем доступ к сети Интернет.
Скопируйте ссылку на скачивание актуальной сборки с официальной страницы (URL меняется с каждой версией и сборкой, поэтому жесткое указание ссылки здесь быстро устареет), а затем выполните:
cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'Ожидаемый результат: файл server.jar размером около 60 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, то есть параметр «cracked server», означает, что сервер принимает на веру имя клиента. Любой пользователь сможет войти под любым именем, в том числе под вашим. Поскольку права ops и списки разрешенных игроков привязаны к именам, злоумышленник сможет войти с вашими правами оператора. Единственная допустимая причина установить это значение в false — работа за аутентифицирующим прокси, например Velocity, который самостоятельно проверяет игроков. На обычном сервере это значение всегда остается равным true.
view-distance — самый важный параметр производительности в этом файле. Затраты CPU и RAM примерно пропорциональны его квадрату. Значение 8 подходит для VPS по умолчанию. Значение 10 используется в vanilla по умолчанию и заметно увеличивает нагрузку.
white-list=true вместе с enforce-whitelist=true закрывает сервер для посторонних пользователей. В разделе о безопасности ниже объясняется, почему это обязательно. Добавляйте игроков в игре с помощью /whitelist add TheirName, имея права ops.
Шаг 6: параметры памяти, почему -Xms и -Xmx должны совпадать
JVM выделяет память в куче от -Xms (начальный размер) до -Xmx (предельный размер). На выделенном игровом сервере задайте одинаковое значение: куча всё равно достигнет предельного размера, а её поэтапное расширение только увеличивает нагрузку на сборщик мусора во время игры. Для VPS с 4 GB подходит следующая пара:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx — это не общий объём памяти, используемый процессом. JVM дополнительно использует память вне кучи, стеки потоков, кэши JIT и прямые буферы. В сумме это занимает примерно полгигабайта или больше. Кроме того, Ubuntu требуется свободная память. Практическое правило: задавайте -Xmx не более чем как объём оперативной памяти VPS минус 1 GB. Если превысить это значение, возможна одна из двух ошибок. Если выделить память не удаётся сразу, сервер отказывается запускаться и выводит:
Error: Could not reserve enough space for object heapЭта ошибка однозначна и возникает сразу. Более опасный вариант: сервер запускается нормально, но через несколько часов завершается, когда под нагрузкой куча заполняется, а убийца процессов OOM в ядре выбирает самый крупный процесс на сервере — 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: модуль 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), а журнал, в котором теперь сохраняется вывод консоли сервера, снова заканчивается строкой Done.
В этом модуле есть два намеренных решения. Restart=on-failure запускает сервер после сбоя, но не после штатного stop, поэтому техническое обслуживание остается возможным. Важен и параметр TimeoutStopSec=120: systemctl stop отправляет SIGTERM, сервер Minecraft обрабатывает его и сохраняет все миры перед завершением работы, а для большого мира это сохранение занимает время. Стандартный тайм-аут systemd может отправить SIGKILL JVM во время сохранения. Именно это приводит к повреждению файлов регионов. Установите тайм-аут в две минуты.
Если служба перезапускается по кругу и в журнале отображается:
[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 — это лишь опциональный протокол запросов, который по умолчанию отключен). На VPS:
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enableЭто первый межсетевой экран. Многие провайдеры VPS также предлагают второй, сетевой уровень защиты в панели управления, и именно о нём часто забывают, если он активен. В SSD Nodes это дополнение Advanced Firewall Groups — платная опция, которую вы выбираете при оформлении заказа или в панели управления; если она есть у вашего сервера, откройте TCP 25565 и там. Симптом отсутствующего правила в любом из них крайне неинформативен: клиент зависает на сообщении "Connecting to the server..." и завершается с ошибкой Connection timed out: no further information, без отказа в соединении, без ошибки сервера и без записей в журнале, так как пакеты просто не доходят. Проверьте доступность с машины вне VPS с помощью nc -vz your.server.ip 25565; succeeded означает, что все межсетевые экраны на пути открыты. Зависание обычно указывает на то, что один из них всё ещё отбрасывает пакеты, хотя сервер может не отвечать и из-за высокой нагрузки, поэтому подтвердите, что сервер слушает порт, с помощью ss непосредственно на машине.
Пока вы работаете с ufw, помните, что эта же машина использует SSH на публичном IP, и попытки брутфорса начнутся уже через несколько часов, поэтому настройте Fail2ban для SSH на Ubuntu 24.04, пока не забыли.
Теперь подключайтесь: Multiplayer, Direct Connection, IP-адрес сервера. Поскольку вы выдали себе права оператора на шаге 4, внутриигровые команды будут работать сразу, /whitelist add FriendName для каждого игрока, /gamemode creative, если это входит в ваши планы.
Шаг 9: список разрешённых игроков, потому что интернет обнаруживает порт 25565
Открытый для интернета сервер Minecraft — это не теоретический риск: массовые сканеры непрерывно проверяют всё пространство IPv4 на наличие порта 25565, проекты любителей гриферства таким способом обнаружили сотни тысяч открытых серверов, а на сервер без списка разрешённых игроков незваные посетители приходят в течение нескольких дней, а иногда и часов. Список разрешённых игроков из шага 5 устраняет этот риск: online-mode=true подтверждает личность, а список разрешённых игроков ограничивает вход выбранными вами пользователями. Вся модель безопасности для сервера друзей сводится к этим двум мерам, и их достаточно.
Для доступа через консоль без запуска игры, создания резервных копий по сценарию и задания cron включите RCON в server.properties (enable-rcon=true, задайте надёжный rcon.password, порт 25575) и соберите небольшой клиент mcrcon из исходного кода GitHub непосредственно на VPS; в репозиториях Ubuntu его нет. Не открывайте порт 25575 в брандмауэре: RCON передаёт пароль в открытом виде, поэтому он должен быть доступен только через loopback-интерфейс.
Шаг 10: создание резервных копий без повреждения мира
Главное правило: никогда не копируйте каталог мира, пока сервер ведет запись. Файлы регионов постоянно перезаписываются во время игры; команда tar, запущенная одновременно с записью, создаст архив с частично записанными чанками. При восстановлении из такой копии — в тот самый момент, когда она должна сработать — журнал заполнится ошибками загрузки чанков, а в ландшафте появятся дыры. Избежать этого помогают два подхода.
Остановка-копирование-запуск — простой метод, требующий минуты простоя:
sudo systemctl stop minecraft
sudo mkdir -p /opt/backups
sudo tar czf /opt/backups/world-$(date +%F-%H%M).tgz \
-C /opt/minecraft world
sudo systemctl start minecraft(Начиная с версии 26.1, Paper хранит все три измерения внутри world/dimensions/, как и ванильная версия, поэтому world — это весь мир целиком. Сервер Paper версии 1.21.11 или старше разделяет их на world, world_nether и world_the_end; добавьте их в команду tar.)
Save-off позволяет создавать резервные копии «на лету»: через RCON выполните save-off (остановка автосохранения), затем save-all flush (принудительная запись всего на диск и ожидание завершения), создайте архив, а затем выполните save-on. Эту последовательность стоит добавить в cron для запуска в 5 утра.
В любом случае, резервная копия, хранящаяся на том же VPS, что и сервер, не является полноценной копией. Используйте scp или rclone для переноса архивов за пределы сервера и храните более одной копии. Поскольку вы не будете постоянно следить за консолью, настройте внешнюю проверку порта: Uptime Kuma на другом узле, выполняющий TCP-проверку порта 25565, сообщит вам о падении сервера раньше, чем это заметят игроки.
Плагины и обновления
В теории установка плагина сводится к копированию файла .jar в /opt/minecraft/plugins/ и перезапуску сервера. Загружайте плагины только с официальных страниц проектов (Hangar, Modrinth, SpigotMC) по той же причине, что и основной файл сервера: каждый плагин — это произвольный код, выполняемый от имени пользователя minecraft.
Обновление сервера состоит из следующих шагов: остановка, создание резервной копии, замена server.jar на сборку для новой версии Minecraft и запуск. Учтите два момента. Обновление мира — процесс необратимый: мир, открытый в новой версии, не запустится в старой, поэтому резервные копии обязательны. Плагины часто отстают от новых релизов Minecraft на несколько дней или недель, поэтому проверяйте совместимость перед тем, как обновляться в день выхода релиза. Переход с версии 1.21.11 на 26.1 или более позднюю также требует Java 25 (см. шаг 1) и перемещает папки Nether и End сервера Paper в world/dimensions/.
Если вы предпочитаете управлять всем этим через контейнер, используя фиксацию версий, принятие EULA и флаги памяти в качестве переменных окружения, широко используемый образ itzg/minecraft-server позволяет запустить тот же сервер Paper в рамках Docker Compose на вашем VPS с соблюдением тех же правил настройки брандмауэра и резервного копирования.
FAQ
Сколько оперативной памяти нужно серверу Minecraft?
2 GB достаточно для запуска ванильной версии на 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 (Out of Memory).
Почему мои друзья не могут подключиться к моему серверу Minecraft?
Зависание клиента с ошибкой Connection timed out: no further information обычно означает проблему с брандмауэром: ufw на самом VPS или сетевой экран провайдера, если он включен в панели управления. Порт 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, чем ванильный сервер Minecraft?
Почти для всех — да: Paper является прямой заменой jar-файла, который загружает ванильные миры, принимает немодифицированных клиентов, обрабатывает сущности и чанки гораздо эффективнее, а также добавляет экосистему плагинов. Исключение составляют сообщества технических специалистов по редстоуну, которым требуется побитово точное ванильное поведение, которое некоторые оптимизации Paper могут изменять. На небольшом VPS эффективность Paper фактически дает дополнительную оперативную память бесплатно.
Как сделать резервную копию мира Minecraft, чтобы не повредить его?
Никогда не архивируйте каталог мира, пока сервер записывает в него данные: копирование, выполняемое одновременно с записью файлов регионов, приводит к повреждению чанков, которые вы обнаружите только при попытке восстановления. Либо остановите сервер, заархивируйте каталоги мира и запустите его снова, либо выполняйте резервное копирование «на лету» с помощью save-off, save-all flush, tar и save-on через RCON. После этого переместите архив за пределы VPS.