SSD Nodes Learn
Przewodniki Matt ConnorAutor: Matt Connor · Zaktualizowano 2026-07-26

serwer minecraft vps ubuntu paper ram java 21 systemd

Paper na Ubuntu 24.04: dobór RAM, Java 21, jednostka systemd, obie zapory na porcie 25565, bezpieczne kopie świata i konkretne błędy do uniknięcia.

Co zbudujesz

Serwer Minecraft Java Edition, który działa bez przerwy: Paper na Ubuntu 24.04, uruchamiany jako dedykowany użytkownik minecraft pod kontrolą systemd z Restart=on-failure, z włączoną białą listą, otwartym portem 25565 w obu zaporach stojących między graczami a JVM oraz kopiami zapasowymi wykonywanymi w sposób, który nie uszkadza świata mającego chronić. Sam serwer to jeden plik jar i jedno polecenie java; wszystko, co odróżnia serwer, na którym znajomi grają przez rok, od tego, który pada w pierwszy weekend, znajduje się wokół tego polecenia i to właśnie opisuje ten przewodnik.

Dwa uczciwe ostrzeżenia, zanim wydasz pieniądze. Po pierwsze, Minecraft jest pamięciożerny i w większości jednowątkowy: VPS 1 GB nie uruchomi grywalnego serwera, a jeden szybki rdzeń jest lepszy niż cztery wolne. Po drugie, to jest Java Edition. Gracze Bedrock, konsole, telefony, aplikacja Windows Bedrock nie mogą dołączyć do serwera Java; Bedrock wymaga innego oprogramowania serwerowego na UDP 19132 lub wtyczki Geyser, co wykracza poza zakres tego opisu.

Potrzebujesz świeżego VPS KVM z Ubuntu 24.04, z dostępem root lub sudo, oraz około trzydziestu minut.

Dobór zasobów: czego naprawdę potrzebuje serwer dla znajomych

Pamięć RAM jest kluczowym parametrem, a rzeczywiste wymagania są niższe, niż sugerują fora z modpackami:

  • 2 GB wystarcza na vanilla dla 2–5 graczy przy umiarkowanym zasięgu renderowania. Działa, ale bez zapasu.
  • 4 GB to komfortowy rozmiar dla serwera znajomych: około dziesięciu jednoczesnych graczy na Paperze z kilkoma pluginami i wystarczającą ilością pamięci dla systemu operacyjnego.
  • 8 GB i więcej to obszar modpacków i ponad dwudziestu graczy, gdzie należy również zwrócić uwagę na szybkość pojedynczego rdzenia CPU, ponieważ główna pętla gry działa w jednym wątku.

Świat rośnie również na dysku w miarę eksploracji – intensywnie użytkowany świat survivalowy osiąga kilka gigabajtów, dlatego należy pozostawić zapas miejsca na świat oraz jego kopie zapasowe.

Vanilla czy Paper? Paper to bezpośredni zamiennik oficjalnego pliku jar: te same światy, ci sami klienci, bez konieczności instalowania modów po stronie klienta. Przepisuje najwolniejsze ścieżki serwera – ładowanie chunków, przetwarzanie bytów, leje – i dodaje API pluginów. Jedynym powodem, by używać vanilla, jest potrzeba zachowania dokładnych, bitowo identycznych mechanik vanilla dla technicznych farm redstone, które optymalizacje Papera mogą zmienić; dla wszystkich pozostałych Paper oznacza więcej graczy na gigabajt. Wszystkie poniższe informacje dotyczą obu wersji.

Krok 1: instalacja Java 21

Minecraft 1.20.5 i każda wersja od tego czasu (cała seria 1.21.x) wymaga Java 21. Ubuntu 24.04 dostarcza ją w domyślnych repozytoriach, a wersja bez interfejsu graficznego pomija biblioteki pulpitu, których serwer nigdy nie użyje:

sudo apt update && sudo apt install -y openjdk-21-jre-headless
java -version

Prawidłowy wynik: pierwsza linia pokazuje openjdk version "21.0.x". Jeśli widnieje 17 lub 11, oznacza to, że zainstalowane i aktywne jest inne środowisko JRE; należy to naprawić za pomocą sudo update-alternatives --config java i wybrać wpis zawierający java-21.

Pominięcie tej kontroli prowadzi później do najczęściej wyszukiwanego w Google błędu serwera Minecraft. Przy Java 17 plik jar serwera kończy działanie natychmiast z komunikatem:

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

Liczby kodują niezgodność: wersja pliku klasy 65.0 to Java 21, 61.0 to Java 17, 60.0 to Java 16. Niezależnie od widocznej pary, rozwiązanie jest takie samo — zainstalować nowsze środowisko JRE i ponownie uruchomić update-alternatives.

Krok 2: dedykowany użytkownik, nigdy root

Serwer wykonuje kod wtyczek i analizuje dane sieciowe od każdego, kto może połączyć się z portem. Jeśli coś pójdzie nie tak, włamanie działające jako root przejmuje cały VPS; działające jako minecraft przejmuje tylko świat gry.

sudo adduser --system --group --home /opt/minecraft minecraft

--system tworzy konto bez hasła, które nie może logować się przez SSH, z /opt/minecraft jako katalogiem domowym i roboczym. Każde polecenie dotyczące serwera od tego momentu wykonuje się w kontekście tego użytkownika.

Krok 3: pobranie pliku jar serwera z oficjalnego źródła

Plik jar serwera powinien pochodzić wyłącznie z dwóch miejsc: oficjalnej strony pobierania serwera na minecraft.net dla wersji vanilla oraz strony pobierania na papermc.io dla Paper. Zewnętrzne „centra pobierania” przepakowujące pliki jar serwera są od dawna kanałem dystrybucji złośliwego oprogramowania — plik jar serwera to dowolny kod, który ma być uruchamiany całodobowo na maszynie wystawionej do internetu.

Skopiuj link do pobrania bieżącej kompilacji z oficjalnej strony (adres URL zmienia się z każdą wersją i kompilacją, więc wpisanie go tutaj na stałe szybko stałoby się nieaktualne), a następnie:

cd /opt/minecraft
sudo -u minecraft wget -O server.jar 'PASTE-THE-COPIED-URL-HERE'

Prawidłowy wynik: server.jar o rozmiarze około 50 MB, którego właścicielem jest minecraft, potwierdzony za pomocą ls -lh /opt/minecraft/server.jar.

Krok 4: pierwsze uruchomienie, EULA i nadanie sobie uprawnień operatora

Przed skonfigurowaniem systemd należy raz uruchomić serwer interaktywnie. Pierwsze uruchomienie wykonuje dwa zadania, które dobrze realizuje tylko aktywna konsola.

cd /opt/minecraft
sudo -u minecraft java -Xms1G -Xmx1G -jar server.jar nogui

Proces kończy się w ciągu kilku sekund. Paper poświęca kilka dodatkowych chwil na wstępne zastosowanie własnych poprawek, a log kończy się linią, którą napotyka każdy:

[ServerMain/INFO]: You need to agree to the EULA in order to run the server. Go to eula.txt for more info.

Nie jest to błąd; to bramka licencyjna. Uruchomienie zapisało plik eula.txt obok pliku jar. Należy zapoznać się z treścią EULA, jeśli nie zostało to jeszcze zrobione, a następnie zmienić wartość flagi:

sudo -u minecraft sed -i 's/eula=false/eula=true/' /opt/minecraft/eula.txt

Należy ponownie wykonać to samo polecenie java. Tym razem serwer wygeneruje świat, co przy pierwszym uruchomieniu trwa minutę lub dwie, i zatrzyma się na komunikacie:

[Server thread/INFO]: Done (9.204s)! For help, type "help"

Dostępna jest aktywna konsola. Należy jej użyć do drugiego zadania: wpisać op YourMinecraftName (dokładną nazwę gracza w grze). Serwer zapisze ją w pliku ops.json, dzięki czemu później, gdy konsola nie będzie podłączona, będzie można wykonywać wszystkie polecenia administracyjne z poziomu gry. Następnie należy wpisać stop, aby zapisać stan i czysto zakończyć działanie.

Krok 5: server.properties i dlaczego online-mode pozostaje włączone

Podczas pierwszego uruchomienia zapisano również plik server.properties. Większość ustawień domyślnych jest odpowiednia; poniższe linie warto zmienić świadomie:

online-mode=true
white-list=true
enforce-whitelist=true
view-distance=8
max-players=10
motd=A private server for people I actually know

online-mode=true nakazuje serwerowi weryfikację każdej dołączającej nazwy użytkownika na serwerach sesji Mojang, co potwierdza, że gracz jest właścicielem konta. Ustawienie wartości false, czyli przełącznika „serwera bez autoryzacji”, oznacza, że serwer przyjmuje tożsamość deklarowaną przez klienta: każdy może dołączyć pod dowolną nazwą, w tym pod Twoją, a ponieważ uprawnienia operatora i białe listy są powiązane z nazwą, osoba podszywająca się uzyskuje dostęp z Twoimi uprawnieniami operatorskimi. Jedynym uzasadnionym powodem ustawienia wartości false jest działanie za pośrednictwem autoryzującego proxy, takiego jak Velocity, które samodzielnie weryfikuje graczy. Na zwykłym serwerze pozostaje włączone, bez wyjątków.

view-distance jest najważniejszym parametrem wpływającym na wydajność w tym pliku; koszt procesora i pamięci RAM rośnie w przybliżeniu z kwadratem tej wartości. 8 to rozsądna wartość domyślna dla VPS; 10 to wartość domyślna vanilla, zauważalnie bardziej obciążająca.

white-list=true w połączeniu z enforce-whitelist=true zamyka serwer przed obcymi osobami, co – jak argumentuje poniższa sekcja dotycząca bezpieczeństwa – nie jest opcjonalne. Dodawaj graczy za pomocą polecenia /whitelist add TheirName w grze.

Krok 6: flagi pamięci, dlaczego -Xms i -Xmx powinny być równe

JVM przydziela stertę między -Xms (rozmiar początkowy) a -Xmx (górny limit). Na dedykowanym serwerze gry należy ustawić je na tę samą wartość: sterta i tak osiągnie górny limit, a zwiększanie jej stopniowo powoduje jedynie dodatkowe obciążenie odśmiecacza pamięci podczas rozgrywki. Na VPS-ie z 4 GB RAM właściwą parą jest:

/usr/bin/java -Xms3G -Xmx3G -jar server.jar nogui

-Xmx nie oznacza całkowitej pamięci używanej przez proces. JVM dodaje narzut poza stertą, stosy wątków, pamięci podręczne JIT, bufory bezpośrednie, co daje około pół gigabajta lub więcej, a sam Ubuntu potrzebuje przestrzeni. Praktyczna zasada: -Xmx to maksymalnie RAM VPS-a minus 1 GB. Przekroczenie tej wartości prowadzi do jednej z dwóch awarii. Jeśli alokacja nie powiedzie się na starcie, serwer odmawia uruchomienia z komunikatem:

Error: Could not reserve enough space for object heap

Ten przypadek jest uczciwy i natychmiastowy. Gorszy wariant uruchamia się poprawnie i kończy pracę wiele godzin później, gdy sterta wypełnia się pod obciążeniem, a kernelowy zabójca OOM wybiera największy proces w systemie, czyli JVM. W logu serwera nie pojawia się nic; dowód znajduje się w sudo dmesg | grep -i oom, w linii podobnej do Out of memory: Killed process 1234 (java). Jeśli usługa restartuje się „losowo”, sprawdź najpierw tam i zmniejsz -Xmx.

W przypadku Papera dokumentacja projektu opisuje flagi Aikara, zestaw dostrojonego G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 i kilkanaście innych), który wygładza przerwy w odśmiecaniu pamięci na większych stertach. Wygeneruj pełną linię z dokumentacji Papera; na stercie 2–4 GB zysk jest umiarkowany, ale flagi są pomocne.

Krok 7: jednostka systemd z Restart=on-failure

Serwer uruchomiony ręcznie kończy działanie wraz z sesją SSH i nie uruchamia się ponownie po restarcie systemu. Należy utworzyć plik /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.target
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
systemctl status minecraft
journalctl -u minecraft -f

Prawidłowy wynik: status pokazuje active (running), a dziennik, który zawiera teraz wyjście konsoli serwera, ponownie kończy się na linii Done.

W tej jednostce zastosowano dwa celowe wybory. Restart=on-failure przywraca serwer po awarii, ale nie po czystym stop, dzięki czemu konserwacja pozostaje możliwa. Natomiast TimeoutStopSec=120 ma większe znaczenie, niż się wydaje: systemctl stop wysyła SIGTERM, serwer Minecraft przechwytuje go i zapisuje każdy świat przed zakończeniem działania, a przy dużym świecie ten zapis wymaga czasu. Domyślny limit czasu systemd może wysłać SIGKILL do JVM w trakcie zapisu, co jest dokładnie tym, co powoduje uszkodzenie plików regionów. Należy przyznać dwie minuty.

Jeśli usługa ulega fluktuacjom, a dziennik pokazuje:

[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?

oznacza to, że coś już zajmuje port 25565, prawie zawsze wcześniejsze uruchomienie na pierwszym planie wciąż aktywne w innej sesji SSH. Należy to znaleźć za pomocą sudo ss -tlnp | grep 25565 i zatrzymać tę kopię; nigdy nie uruchamia się dwóch serwerów na jednym porcie.

Krok 8: otwarcie portu 25565 na obu zaporach

Minecraft Java używa wyłącznie TCP 25565 (UDP to jedynie opcjonalny protokół zapytań, domyślnie wyłączony). Na VPS:

sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

To pierwsza zapora. Większość dostawców VPS uruchamia drugą, sieciową zaporę w panelu sterowania i to o niej się zapomina. Tam również należy otworzyć TCP 25565. Objawem otwarcia tylko jednej z nich jest wyjątkowo nieprecyzyjny problem: klient zawiesza się na komunikacie „Connecting to the server...” i kończy błędem Connection timed out: no further information, bez odmowy, bez błędu serwera, bez wpisów w dzienniku, ponieważ pakiety nigdy nie dotarły. Weryfikację przeprowadza się z maszyny spoza VPS za pomocą nc -vz your.server.ip 25565; succeeded oznacza, że obie zapory są otwarte, zawieszenie oznacza, że co najmniej jedna nie jest.

Podczas pracy z ufw, to samo pudełko obsługuje SSH na publicznym adresie IP, a szum logów związany z atakami brute-force zaczyna się w ciągu kilku godzin, skonfiguruj Fail2ban dla SSH na Ubuntu 24.04 zanim zapomnisz.

Teraz połączenie: Multiplayer, Direct Connection, adres IP serwera. Ponieważ w kroku 4 nadano sobie uprawnienia operatora, komendy w grze działają natychmiast, /whitelist add FriendName dla każdego gracza, /gamemode creative jeśli taki jest plan.

Krok 9: biała lista, ponieważ internet znajduje port 25565

Pozostawienie serwera Minecraft otwartego na internet nie jest ryzykiem teoretycznym: skanery masowe przeszukują całą przestrzeń IPv4 w poszukiwaniu portu 25565 w sposób ciągły, hobbystyczne projekty griefingu zmapowały w ten sposób setki tysięcy otwartych serwerów, a serwer bez białej listy otrzymuje nieproszonych gości w ciągu dni, a czasem godzin. Rozwiązaniem jest biała lista z kroku 5: online-mode=true potwierdza tożsamość, biała lista ogranicza dostęp do wybranych tożsamości. Ta para stanowi cały model bezpieczeństwa i jest wystarczająca dla serwera dla znajomych.

Aby uzyskać dostęp do konsoli bez gry, tworzyć skryptowe kopie zapasowe lub zadanie cron, należy włączyć RCON w server.properties (enable-rcon=true, silne rcon.password, port 25575) i zbudować niewielkiego klienta mcrcon z jego źródła na GitHub bezpośrednio na VPS; nie znajduje się on w repozytoriach Ubuntu. Nie należy otwierać portu 25575 w żadnej zaporze sieciowej: RCON wysyła hasło czystym tekstem, więc pozostaje on dostępny wyłącznie przez interfejs loopback.

Krok 10: kopie zapasowe, które nie uszkadzają świata

Jedyna zasada: nigdy nie kopiować katalogu świata, gdy serwer do niego zapisuje. Pliki regionów są nadpisywane nieprzerwanie podczas gry; tar wykonany współbieżnie z zapisem tworzy archiwum z częściowo zapisanymi chunkami, a gdy w końcu zostanie przywrócone – w tym jedynym momencie, gdy kopia zapasowa musi zadziałać – log zapełnia się błędami ładowania chunków, a w terenie pojawiają się dziury. Dwie procedury pozwalają tego uniknąć.

Zatrzymaj-kopiuj-uruchom to prostsza metoda, kosztem minuty przestoju:

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 rozdziela wymiary na world, world_nether i world_the_end; serwer vanilla przechowuje wszystko w world, więc w tym przypadku pomija się pozostałe dwa).

Save-off wykonuje kopię na działającym serwerze: przez RCON wydaje się save-off (zatrzymanie automatycznego zapisywania), następnie save-all flush (wymuszenie zrzutu wszystkiego na dysk i oczekiwanie), wykonuje się archiwum tar, a potem save-on. To wersja do umieszczenia w cronie na godzinę 5 rano.

W obu przypadkach kopia zapasowa znajdująca się na tym samym VPS co serwer nie jest kopią zapasową – należy scp lub rclone archiwa poza serwer i przechowywać więcej niż jedną. A ponieważ nie będzie się wpatrywać w konsolę, gdy coś ulegnie awarii, należy ustawić zewnętrzne sprawdzenie portu: Uptime Kuma na innym serwerze wykonujący kontrolę TCP na porcie 25565 informuje o niedostępności serwera, zanim zorientują się gracze.

Wtyczki i aktualizacje

W przypadku Paper wtyczka to plik jar umieszczony w katalogu /opt/minecraft/plugins/, po którym następuje restart — to cała instalacja. Wtyczki należy pobierać wyłącznie z ich oficjalnych stron projektów (Hangar, Modrinth, SpigotMC), z tego samego powodu co plik jar serwera: każda z nich to dowolny kod wykonywany z uprawnieniami użytkownika minecraft.

Aktualizacja serwera przebiega następująco: zatrzymanie, wykonanie kopii zapasowej, zastąpienie pliku server.jar kompilacją dla nowej wersji Minecrafta, uruchomienie. Należy zachować dwie ostrożności. Aktualizacje świata są jednokierunkowe — świat otwarty przez nowszą wersję nie zostanie otwarty przez starszą, co stanowi kolejne zadanie dla kopii zapasowych. Ponadto wtyczki często pozostają w tyle za nowym wydaniem Minecrafta o dni lub tygodnie, dlatego przed instalacją wydania w dniu premiery należy sprawdzić kompatybilność.

Jeśli preferowane jest zarządzanie tym wszystkim jako kontenerem, z przypinaniem wersji, akceptacją EULA i flagami pamięci jako zmiennymi środowiskowymi, powszechnie używany obraz itzg/minecraft-server uruchamia ten sam serwer Paper w ramach Docker Compose na VPS z identyczną konfiguracją zapory sieciowej i dyscypliną tworzenia kopii zapasowych.

FAQ

Ile pamięci RAM potrzebuje serwer Minecraft?

2 GB wystarcza na wanilię dla 2–5 graczy; 4 GB to wygodna wartość dla serwera znajomych na Paperze z kilkoma pluginami i około dziesięcioma graczami; pakiety modów i ponad dwudziestu graczy wymagają 8 GB lub więcej. Niezależnie od rozmiaru VPS, należy ustawić -Xmx na maksymalnie całkowitą pamięć RAM minus 1 GB, ponieważ JVM używa pamięci poza stertą, a przekroczenie kończy się Error: Could not reserve enough space for object heap lub cichym zabiciem przez OOM.

Dlaczego moi znajomi nie mogą połączyć się z moim serwerem Minecraft?

Zawieszenie klienta kończące się komunikatem Connection timed out: no further information prawie zawsze oznacza zaporę sieciową, a są dwie: ufw na VPS oraz zapora sieciowa dostawcy w panelu sterowania. Port TCP 25565 musi być otwarty w obu. Należy potwierdzić, że serwer faktycznie nasłuchuje, używając sudo ss -tlnp | grep 25565 na maszynie, a następnie przetestować z zewnątrz za pomocą nc -vz your.server.ip 25565.

Czy powinienem ustawić online-mode=false w server.properties?

Nie. Przy online-mode=false serwer całkowicie pomija uwierzytelnianie Mojang, więc każdy może dołączyć pod dowolną nazwą użytkownika, w tym nazwą operatora, dziedzicząc jego uprawnienia, a skórki i stabilne UUID przestają działać. Jedyne uzasadnione zastosowanie to sytuacja za proxy uwierzytelniającym, takim jak Velocity, które samodzielnie weryfikuje graczy. Dla normalnego serwera pozostaje true.

Czy Paper jest lepszy niż waniliowy serwer Minecraft?

Dla prawie wszystkich tak: Paper to zastępczy plik jar, który ładuje waniliowe światy, akceptuje niezmodyfikowane klienty, znacznie wydajniej przetwarza byty i ładuje chunki oraz dodaje ekosystem pluginów. Wyjątkiem są społeczności technicznego redstone'a, które potrzebują bitowo dokładnego zachowania wanilii, które niektóre optymalizacje Papera zmieniają. Na małym VPS wydajność Papera to efektywnie darmowa dodatkowa pamięć RAM.

Jak wykonać kopię zapasową świata Minecraft bez jego uszkodzenia?

Nigdy nie należy archiwizować katalogu świata, gdy serwer do niego zapisuje; kopia wykonana równolegle z zapisem pliku regionu powoduje powstawanie uszkodzonych chunków, które odkrywa się dopiero podczas przywracania. Należy albo zatrzymać serwer, spakować katalogi świata i uruchomić go ponownie, albo utrzymać go w działaniu, wykonując save-off, save-all flush, spakowanie, save-on przez RCON. Następnie należy przenieść archiwum poza VPS.

#minecraft#game-server#java#ubuntu#self-hosting