Як розгорнути Minecraft-сервер на VPS
Запустіть Paper Minecraft на Ubuntu 24.04: Java 25, systemd, ufw і порт 25565, безпечні резервні копії світу та розбір типових помилок.
Що ви створюєте
Minecraft Java Edition сервер, який стабільно працює: Paper на Ubuntu 24.04, запущений від імені окремого minecraft користувача через systemd із Restart=on-failure, з увімкненим whitelist, відкритим портом 25565 у ufw і в мережевому firewall вашого провайдера, якщо він увімкнений, а також із резервними копіями, створеними так, щоб не пошкодити світ, який вони мають захищати. Сам сервер — це один jar-файл і одна команда java; усе, що відрізняє сервер, на якому ваші друзі грають протягом року, від сервера, який припиняє працювати в перші вихідні, пов’язане з цією командою. Саме це і розглядається в цьому посібнику.
Два важливі попередження перед витратами. По-перше, Minecraft потребує багато пам’яті та переважно використовує одне ядро процесора: VPS із 1 GB не забезпечить придатну для гри роботу сервера, а одне швидке ядро краще за чотири повільні. По-друге, це Java Edition. Гравці Bedrock, користувачі консолей, телефонів і Windows Bedrock app не можуть підключитися до Java-сервера; для Bedrock потрібне інше серверне програмне забезпечення, яке працює через UDP 19132, або плагін Geyser. Це виходить за межі цього посібника.
Вам потрібен новий KVM VPS з Ubuntu 24.04 і доступом root або sudo, а також приблизно тридцять хвилин.
Розмір сервера: які ресурси насправді потрібні для сервера друзів
Оперативна пам’ять має найбільше значення, а реальні показники нижчі, ніж радять на форумах модпаків:
- 2 GB достатньо для vanilla на 2–5 гравців за помірної дальності промальовування. Грати можна, але запасу ресурсів немає.
- 4 GB — комфортний обсяг для сервера друзів: приблизно десять одночасних гравців на Paper із кількома плагінами та достатнім залишком для ОС.
- 8 GB і більше — для модпаків і понад 20 гравців. У такому разі також важлива швидкість одного ядра CPU, оскільки основний цикл гри виконується в одному потоці.
Світ також займає дедалі більше місця на диску в міру дослідження гравцями. Добре досліджений survival-світ може займати кілька гігабайтів, тому залиште запас для самого світу та його резервних копій.
Vanilla чи Paper? Paper — це сумісна заміна офіційного jar-файлу: ті самі світи, ті самі клієнти, модифікації на стороні клієнта не потрібні. Він оптимізує найповільніші ділянки сервера: завантаження чанків, обробку сутностей і hopper-и, а також додає API для плагінів. Єдина причина використовувати vanilla — потреба в побітово точній механіці vanilla для технічних ферм на redstone, на роботу яких можуть впливати оптимізації Paper. Для всіх інших Paper забезпечує більшу кількість гравців на кожен гігабайт. Усе нижче працює для обох варіантів.
Крок 1: встановіть Java 25
Для Minecraft 26.1 і кожного наступного випуску потрібна Java 25; Java 21 підтримує лише старішу лінійку 1.20–1.21.11. Ubuntu 24.04 постачає Java 25 через репозиторії оновлень і безпеки. Встановіть повний JRE, а не збірку -headless: у посібнику Paper зі встановлення Java не рекомендуються 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, яку найчастіше шукають у Google. З 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: завантажте server jar з офіційного джерела
Отримувати server jar слід лише з двох джерел: з офіційної сторінки завантаження серверів на minecraft.net для vanilla та зі сторінки завантажень на papermc.io для Paper. Сторонні «download hubs», які перепаковують server jar, уже багато років використовуються для поширення шкідливого програмного забезпечення. server jar містить довільний код, який ви збираєтеся запускати цілодобово на сервері, доступному з Інтернету.
Скопіюйте посилання на завантаження поточної збірки з офіційної сторінки. 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» — означає, що сервер приймає заявлену клієнтом особу без перевірки. Будь-хто може підключитися під будь-яким ім’ям, зокрема під вашим. Оскільки права оператора й whitelist прив’язані до імені, зловмисник отримає ваші права оператора. Єдина коректна причина встановити це значення в 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 (максимальний розмір). На виділеному game server встановіть однакове значення: heap у будь-якому разі досягне максимального розміру, а його поетапне збільшення лише створює додаткові паузи через роботу garbage collector під час гри. На VPS із 4 GB правильна пара має такий вигляд:
/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui-Xmx — це не загальний обсяг пам’яті, який використовує процес. JVM додатково використовує off-heap пам’ять, стеки потоків, JIT-кеші та direct buffers — приблизно пів гігабайта або більше. Ubuntu також потрібна вільна пам’ять. Практичне правило: -Xmx має становити не більше ніж обсяг RAM VPS мінус 1 GB. Якщо перевищити цей ліміт, виникне одна з двох проблем. Якщо виділення пам’яті не вдасться одразу, server відмовиться запускатися з повідомленням:
Error: Could not reserve enough space for object heapЦя помилка одразу вказує на причину. Гірший варіант: server запускається, але через кілька годин завершує роботу, коли під навантаженням heap заповнюється, а kernel OOM killer вибирає найбільший процес на сервері — JVM. У журналі server нічого не з’явиться. Доказ буде в sudo dmesg | grep -i oom, у рядку на кшталт Out of memory: Killed process 1234 (java). Якщо service перезапускається «випадково», спочатку перевірте цей файл і зменште -Xmx.
Для Paper у документації проєкту описані параметри Aikar — оптимізований набір параметрів G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 та ще близько десятка параметрів), який зменшує тривалість пауз garbage collector на більших heap. Сформуйте повний рядок за документацією Paper. Для heap обсягом 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), а журнал, у якому тепер зберігається вивід консолі сервера, знову завершується рядком Done.
У цьому unit є два свідомі рішення. 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 уже зайнятий. Майже завжди його все ще використовує попередній процес, запущений у foreground, в іншому сеансі 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 також пропонують другий брандмауер на рівні мережі в панелі керування. Саме про нього часто забувають, якщо він увімкнений. У SSD Nodes це платне розширення Advanced Firewall Groups, яке можна призначити під час оформлення замовлення або в dashboard. Якщо для вашого сервера його налаштовано, відкрийте там TCP 25565. Ознака відсутнього правила в будь-якому з брандмауерів дуже неспецифічна: клієнт зависає на етапі "Connecting to the server..." і завершується з помилкою Connection timed out: no further information. Відмови в підключенні немає, помилок сервера немає, і в журналі нічого немає, оскільки пакети не дійшли до сервера. Перевірте підключення з машини поза VPS за допомогою nc -vz your.server.ip 25565. succeeded означає, що всі брандмауери на шляху пропускають підключення. Зависання зазвичай означає, що один із них усе ще відкидає пакети. Однак перевантажений хост також може завершити спробу підключення за тайм-аутом. Тому перевірте, чи сервер прослуховує порт, за допомогою ss безпосередньо на сервері.
Поки ви працюєте з ufw, врахуйте, що цей самий сервер використовує SSH на публічній IP-адресі, а шум від спроб brute-force починається вже за кілька годин. До того як ви забудете, налаштуйте Fail2ban для SSH в Ubuntu 24.04.
Тепер підключіться: Multiplayer, Direct Connection, IP-адреса сервера. Оскільки на кроці 4 ви надали собі права оператора, ігрові команди працюють одразу: /whitelist add FriendName для кожного гравця, /gamemode creative, якщо це передбачено планом.
Крок 9: whitelist, оскільки інтернет знаходить порт 25565
Залишати Minecraft-сервер відкритим в інтернеті — не теоретичний ризик: масові сканери безперервно перевіряють увесь простір IPv4 на наявність порту 25565, аматорські проєкти для griefing у такий спосіб виявили сотні тисяч відкритих серверів, а на сервер без whitelist непрохані відвідувачі приходять протягом кількох днів, а іноді й годин. Виправленням є whitelist із кроку 5: online-mode=true підтверджує особу, а whitelist обмежує доступ особами, яких ви вибрали. Ці два механізми становлять усю модель безпеки, і для сервера друзів цього достатньо.
Для доступу до консолі без запуску гри, скриптового резервного копіювання та cron job увімкніть RCON у server.properties (enable-rcon=true, надійний rcon.password, порт 25575) і зберіть невеликий клієнт mcrcon із його джерел на GitHub безпосередньо на VPS; у репозиторіях Ubuntu його немає. Не відкривайте 25575 у жодному firewall: 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/, як і vanilla, тому world містить увесь світ. Сервер Paper на версії 1.21.11 або старішій і далі розділяє їх на world, world_nether і world_the_end; у такому разі додайте до tar ще два каталоги.)
Save-off дає змогу створювати резервну копію під час роботи сервера: через RCON виконайте save-off (зупиніть автоматичне збереження), потім save-all flush (примусово запишіть усі дані на диск і дочекайтеся завершення), створіть tar, а потім виконайте save-on. Саме цей варіант слід додати до cron на 5 a.m.
У будь-якому разі резервна копія, що зберігається на тому самому VPS, що й сервер, не є резервною копією. scp або rclone архіви на інший сервер і зберігайте більше однієї копії. Оскільки під час збою ви не стежитимете за консоллю, налаштуйте зовнішню перевірку порту: Uptime Kuma на іншому сервері має виконувати TCP-перевірку порту 25565 і повідомити, що сервер недоступний, раніше за ваших гравців.
Плагіни та оновлення
Формально плагін — це jar-файл, який потрібно помістити в /opt/minecraft/plugins/, а потім перезапустити сервер. На цьому встановлення завершено. Завантажуйте плагіни лише з офіційних сторінок їхніх проєктів (Hangar, Modrinth, SpigotMC). Причина та сама, що й для jar-файлу сервера: кожен плагін є довільним кодом, який запускається від імені користувача minecraft.
Оновлення сервера виконується так: зупиніть сервер, створіть резервну копію, замініть server.jar збіркою для нової версії Minecraft і запустіть сервер. Врахуйте 2 моменти. Оновлення світу є незворотним: світ, відкритий новішою версією, не відкриється у старішій. Саме для таких випадків потрібні резервні копії. Плагіни часто підтримують новий випуск Minecraft лише через кілька днів або тижнів. Тому перед оновленням у день виходу перевірте сумісність. Перехід із 1.21.11 на 26.1 або новішу версію також потребує Java 25 (крок 1) і переміщує каталоги Nether та End у Paper до world/dimensions/.
Якщо ви хочете керувати всім цим у контейнері, задаючи фіксацію версій, прийняття EULA та прапорці пам’яті як змінні середовища, поширений образ itzg/minecraft-server запускає той самий Paper server через 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 має бути відкритим у кожному firewall на шляху з’єднання. Переконайтеся, що сервер справді прослуховує порт, виконавши sudo ss -tlnp | grep 25565 на сервері, а потім перевірте підключення ззовні за допомогою nc -vz your.server.ip 25565.
Чи потрібно встановлювати online-mode=false у server.properties?
Ні. У разі online-mode=false сервер повністю пропускає автентифікацію Mojang. Тому будь-хто може підключитися під будь-яким іменем користувача, зокрема під іменем op, і отримати його права. Скіни та стабільні UUID також перестають працювати належним чином. Єдиний коректний варіант використання — за authenticating proxy, наприклад Velocity, який сам перевіряє гравців. Для звичайного сервера потрібно залишити true.
Чи Paper кращий за vanilla-сервер Minecraft?
Для майже всіх випадків — так. Paper — це jar, який можна безпосередньо замінити: він завантажує vanilla-світи, приймає незмінених клієнтів, значно ефективніше обробляє сутності й завантажує чанки, а також підтримує екосистему плагінів. Виняток становлять спільноти, які використовують технічний redstone і потребують повністю побітової відповідності поведінці vanilla, оскільки деякі оптимізації Paper її змінюють. На невеликому VPS ефективність Paper фактично дає додатковий вільний обсяг RAM.
Як створити резервну копію світу Minecraft без його пошкодження?
Ніколи не архівуйте каталог світу, поки сервер записує до нього дані. Копіювання під час запису region-файлу може пошкодити чанки, і ви виявите це лише під час відновлення. Зупиніть сервер, заархівуйте каталоги світу за допомогою tar і запустіть сервер знову. Або залиште сервер запущеним і використайте save-off, save-all flush, tar та save-on через RCON. Після цього перенесіть архів за межі VPS.