Як запустити сервер Minecraft на VPS Ubuntu
Покрокова інструкція для Paper Minecraft на Ubuntu 24.04: налаштування Java 21, systemd, відкриття порту 25565 та створення безпечних бекапів світу.
Що ви створюєте
Стабільний сервер Minecraft Java Edition: Paper на Ubuntu 24.04, що працює від виділеного користувача minecraft через systemd з використанням Restart=on-failure. Порт 25565 має бути відкритий у обох фаєрволах між гравцями та JVM, а білий список (whitelist) — увімкнений. Резервне копіювання має виконуватися так, щоб не пошкодити світ. Сам сервер складається з одного jar-файлу та однієї команди java. Різниця між сервером, на якому друзі грають роками, і тим, що вимкнеться за перші вихідні, полягає саме в налаштуванні цієї команди. Цей посібник присвячений саме цьому процесу.
Два попередження перед тим, як ви витратите гроші. По-перше, Minecraft споживає багато оперативної пам'яті та переважно використовує один потік: VPS з 1 GB пам'яті не забезпечить стабільну гру; один швидкий процесор кращий за чотири повільних. По-друге, це Java Edition. Гравці Bedrock (консолі, телефони, додаток Windows Bedrock) не можуть підключитися до Java-сервера. Для Bedrock потрібне інше програмне забезпечення на UDP 19132 або плагін Geyser, який не розглядається в цьому посібнику.
Вам знадобиться чистий Ubuntu 24.04 KVM VPS з правами root або sudo та близько тридцяти хвилин часу.
Sizing: що насправді потрібно серверу для гри з друзями
Ключовим показником є обсяг RAM. Реальні цифри нижчі, ніж зазначають на форумах модпаків:
- 2 GB достатньо для vanilla-сервера на 2–5 гравців із невеликою дальністю промальовування. Робочий варіант, але без запасу.
- 4 GB — оптимальний обсяг для сервера для друзів: приблизно десять гравців одночасно на Paper із кількома плагінами, і достатньо пам'яті для роботи ОС.
- 8 GB і більше — це рівень модпаків та серверів на 20+ гравців. У цьому випадку також важливою є частота одного ядра CPU, оскільки основний ігровий цикл виконується в одному потоці.
Розмір світу на диску також зростає під час дослідження — добре пройдений світ у survival-режимі може займати кілька гігабайт — тому передбачте місце для самого світу та його резервних копій.
Vanilla чи Paper? Paper — це пряма заміна офіційного jar-файлу: ті самі світи, ті самі клієнти, додаткові клієнтські моди не потрібні. Він переписує найповільніші серверні процеси — завантаження чанків, тікінг сутностей, роботу хопперів — і додає API для плагінів. Vanilla варто використовувати лише якщо вам потрібна ідентична механіка гри для технічних фер на редстоуні, яку оптимізації Paper можуть змінити; для всіх інших Paper забезпечує більше гравців на кожен гігабайт. Усі наведені нижче параметри підходять для обох варіантів.
Step 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. При використанні 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 version 65.0 — це Java 21, 61.0 — це Java 17, 60.0 — це Java 16. Яку б пару ви не побачили, рішення однакове — встановіть новішу JRE та знову запустіть update-alternatives.
Step 2: виділений користувач, ніколи не root
Сервер виконує код плагінів та аналізує мережеві дані від будь-кого, хто має доступ до порту. Якщо станеться збій, злом під обліковим записом root дасть повний контроль над вашим VPS; злом під обліковим записом minecraft дасть контроль лише над ігровим світом.
sudo adduser --system --group --home /opt/minecraft minecraft--system створює обліковий запис без пароля, який не має можливості входу через SSH, з /opt/minecraft як домашньою та робочою директорією. Кожна команда, що взаємодіє з сервером після цього етапу, виконується від імені цього користувача.
Step 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.
Step 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. Цього разу сервер створюватиме світ (це займе 1–2 хвилини) і зупиниться на стані:
[Server thread/INFO]: Done (9.204s)! For help, type "help"Тепер у вас є активна консоль. Використайте її для другої задачі: введіть op YourMinecraftName (ваш точний ігровий нікнейм), і сервер запише вас у ops.json. Це дозволить пізніше — коли консоль не буде підключена — виконувати всі адміністраторські команди безпосередньо з гри. Потім введіть stop, щоб зберегти дані та коректно вийти.
Step 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) та білі списки (whitelists) прив'язані до імен, зловмисник отримає ваші права оператора. Єдиною легітимною причиною для встановлення false є використання автентифікуючого проксі, наприклад Velocity, який самостійно перевіряє гравців. На звичайному сервері цей параметр має залишатися true.
view-distance — це головний параметр впливу на продуктивність у цьому файлі; навантаження на CPU та RAM зростає приблизно пропорційно квадрату цього значення. 8 — розумне значення за замовчуванням для VPS; 10 — стандартне значення vanilla, яке значно важче для системи.
white-list=true разом із enforce-whitelist=true закриває сервер для сторонніх осіб; у розділі про безпека нижче пояснюється, що це налаштування є обов'язковим. Додавайте гравців за допомогою команди /whitelist add TheirName у грі, маючи права op.
Step 6: прапорці пам'яті — чому значення -Xms та -Xmx мають збігатися
JVM виділяє купу (heap) у межах від -Xms (початковий розмір) до -Xmx (максимальний розмір). На виділеному ігровому сервері встановлюйте їх однаковими: купа все одно досягне максимуму, а поступове збільшення об'єму лише створює зайве навантаження на 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. Якщо перевищити цей ліміт, виникне одна з двох проблем. Якщо виділення пам'яті неможливе відразу, сервер не запуститься з помилкою:
Error: Could not reserve enough space for object heapЦе очевидна та швидка помилка. Більш складний варіант: сервер запускається нормально, але вилітає через кілька годин, коли купа заповнюється під навантаженням і kernel OOM killer завершує найбільший процес у системі — JVM. У логах сервера нічого не буде; докази містяться в sudo dmesg | grep -i oom, наприклад, рядок типу Out of memory: Killed process 1234 (java). Якщо ваш сервіс перезавантажується «випадково», спочатку перевірте ці логи та зменште -Xmx.
Для Paper проєкт рекомендує Aikar's flags — налаштований набір для G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 та ще десяток параметрів), який зменшує паузи під час збору сміття на великих купах. Сформуйте повний рядок за документацією Paper; для купи розміром 2–4 GB приріст буде незначним, але ці прапорці безпечні.
Step 7: systemd unit з параметром 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.
У цьому юніті є два важливі налаштування. Restart=on-failure перезапускає сервер після збою, але не після коректного stop, що дозволяє проводити технічне обслуговування. Параметр TimeoutStopSec=120 також є критичним: systemctl stop надсилає сигнал SIGTERM, Minecraft сервер перехоплює його та зберігає всі світи перед виходом. Збереження великого світу займає час. Стандартний таймаут systemd може надіслати SIGKILL процесу JVM під час збереження, що призводить до пошкодження файлів регіонів. Встановіть таймаут у 2 хвилини.
Якщо сервіс постійно перезапускається (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 і завершіть його; ніколи не запускайте два сервери на одному порту.
Step 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, якщо це передбачено планом.
Step 9: whitelist, because the internet finds port 25565
Відкритий для інтернету Minecraft server — це реальний ризик. Сканери постійно перевіряють весь IPv4 простір на наявність порту 25565. Проєкти для гріфінгу вже знайшли сотні тисяч відкритих серверів таким чином. Без whitelist на сервер можуть потрапити сторонні користувачі протягом кількох днів або навіть годин. Використання whitelist із кроку 5 вирішує цю проблему: online-mode=true підтверджує особу, а whitelist дозволяє вхід лише вибраним користувачам. Ця комбінація є основою моделі безпеки, якої достатньо для сервера для друзів.
Для доступу через консоль без запуску гри (наприклад, для автоматизованого резервного копіювання через cron) увімкніть RCON у server.properties (використовуйте enable-rcon=true, надійний rcon.password, порт 25575) і зберіть клієнт mcrcon із вихідного коду GitHub безпосередньо на VPS; у репозиторіях Ubuntu його немає. Не відкривайте порт 25575 у firewall: RCON передає пароль у відкритому вигляді, тому доступ має бути лише через loopback.
Step 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:00.
У будь-якому випадку, бекап на тому ж VPS, що й сервер, не є надійним — використовуйте scp або rclone для вивантаження архівів з машини та зберігайте кілька копій. Оскільки ви не будете стежити за консоллю під час збоїв, налаштуйте зовнішню перевірку порту: Uptime Kuma на іншому вузлі, що виконує TCP-перевірку порту 25565, повідомить про падіння сервера раніше, ніж це зроблять гравці.
Plugins and upgrades
У 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 — комфортний об'єм для сервера на 10 гравців з Paper та кількома plugins; для modpacks та 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, тому будь-хто може зайти під будь-яким іменем — включно з іменем op-а, отримуючи його права — а також ламаються скіни та стабільні UUID. Єдиний допустимий варіант — використання проксі-сервера для автентифікації, наприклад Velocity, який самостійно перевіряє гравців. Для звичайного сервера цей параметр має залишатися true.
Paper кращий за vanilla Minecraft server?
Для більшості — так: Paper — це готовий jar-файл, який завантажує vanilla-світи, приймає немодифіковані клієнти, набагато ефективніше обробляє ticks сутностей та завантаження chunks, а також додає екосистему plugins. Виняток — спільноти технічного редстоуну, яким потрібна точна поведінка vanilla, яку змінюють деякі оптимізації Paper. На малопотужному VPS ефективність Paper фактично дає додаткову вільну RAM.
Як зробити бекап світу Minecraft без його пошкодження?
Ніколи не архівуйте директорію світу, поки сервер виконує запис у неї — копіювання під час запису region-файлів призводить до пошкодження chunks, що виявиться лише під час відновлення. Або зупиніть сервер, архівуйте директорії світу через tar і запустіть сервер знову, або використовуйте save-off, save-all flush, tar та save-on через RCON, щоб працювати без зупинки. Потім перенесіть архів з VPS.