SSD Nodes Learn Hosting plans →
Przewodniki Matt ConnorAutor: Matt Connor · Zaktualizowano 2026-08-07

Jak postawić serwer Minecraft na VPS z Ubuntu 24.04

Instrukcja konfiguracji serwera Paper na Ubuntu 24.04. Dowiedz się, jak poprawnie skonfigurować Java 21, systemd, zaporę UFW oraz iptables dla portu 25565 i uniknąć błędów.

Co budujesz

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

Dwa szczere ostrzeżenia przed wydaniem pieniędzy. Po pierwsze, Minecraft jest zasobożerny pod względem pamięci i w większości jednowątkowy: VPS z 1 GB RAM nie uruchomi grywalnego serwera, a jeden szybki rdzeń przewyższa cztery wolne. Po drugie, jest to Java Edition. Gracze Bedrock, konsol, telefonów oraz aplikacji Windows Bedrock nie mogą dołączyć do serwera Java; Bedrock wymaga innego oprogramowania serwerowego na porcie UDP 19132 lub wtyczki Geyser, co wykracza poza zakres tego poradnika.

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

Dobór zasobów: czego faktycznie potrzebuje serwer dla znajomych

Pamięć RAM jest kluczowym parametrem, a rzeczywiste zapotrzebowanie jest niższe, niż sugerują fora poświęcone modpackom:

  • 2 GB wystarcza do uruchomienia wersji vanilla dla 2–5 graczy przy umiarkowanym zasięgu widzenia. Jest to wartość graniczna, bez zapasu wydajności.
  • 4 GB to optymalny rozmiar dla serwera dla znajomych: pozwala na grę około dziesięciu osób jednocześnie na silniku Paper z kilkoma wtyczkami, pozostawiając wystarczającą ilość pamięci dla systemu operacyjnego.
  • 8 GB i więcej to obszar dla modpacków i serwerów obsługujących powyżej 20 graczy. W tym przypadku należy również zwrócić uwagę na wydajność pojedynczego rdzenia procesora, ponieważ główna pętla gry działa na jednym wątku.

Wraz z eksploracją świata przez graczy rośnie również zajętość miejsca na dysku. Często odwiedzany świat w trybie survival może osiągnąć rozmiar kilku gigabajtów, dlatego należy zapewnić odpowiedni zapas miejsca na świat oraz jego kopie zapasowe.

Vanilla czy Paper? Paper jest bezpośrednim zamiennikiem oficjalnego pliku jar: obsługuje te same światy, tych samych klientów i nie wymaga modyfikacji po stronie klienta. Optymalizuje on najbardziej obciążające procesy serwerowe, takie jak ładowanie chunków, przetwarzanie jednostek (entity ticking), działanie lejków (hoppers) oraz dodaje API dla wtyczek. Jedynym powodem, dla którego warto pozostać przy wersji vanilla, jest potrzeba zachowania identycznej z oryginałem mechaniki gry, co jest istotne w przypadku zaawansowanych farm redstone, na które optymalizacje Paper mogą wpływać. Dla większości użytkowników Paper oznacza więcej graczy na każdy gigabajt pamięci RAM. Wszystkie poniższe instrukcje działają dla obu rozwiązań.

Krok 1: instalacja Java 21

Minecraft 1.20.5 oraz każde wydanie od tego momentu (wszystkie wersje 21.x) wymaga Java 21. Ubuntu 24.04 dostarcza ją w domyślnych repozytoriach, a wersja headless pomija biblioteki graficzne, których serwer nigdy nie użyje:

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

Poprawny wynik: pierwsza linia zawiera openjdk version "21.0.x". Jeśli widnieje tam 17 lub 11, zainstalowane jest inne środowisko JRE, które ma priorytet; należy to naprawić za pomocą sudo update-alternatives --config java i wybrać wpis zawierający java-21.

Pominięcie tej weryfikacji prowadzi do najczęściej wyszukiwanego błędu serwera Minecraft. W przypadku Java 17 plik jar serwera kończy działanie natychmiast po uruchomieniu 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 te określają niezgodność: wersja pliku klasy 65.0 to Java 21, 61.0 to Java 17, 60.0 to Java 16. Niezależnie od wyświetlonej pary, rozwiązanie jest identyczne: należy zainstalować nowsze JRE i ponownie uruchomić update-alternatives.

Krok 2: dedykowany użytkownik, nigdy root

Serwer wykonuje kod wtyczek i przetwarza dane wejściowe z sieci od każdego, kto ma dostęp do portu. W przypadku wystąpienia błędu, przejęcie serwera działającego jako root oznacza utratę kontroli nad całym VPS; przejęcie serwera działającego jako minecraft ogranicza skutki do świata 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 jest wykonywane jako ten użytkownik.

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

Plik jar serwera należy pobierać wyłącznie z dwóch miejsc: oficjalnej strony pobierania minecraft.net dla wersji vanilla oraz strony papermc.io dla wersji Paper. Zewnętrzne serwisy oferujące gotowe paczki z plikami jar są częstym źródłem złośliwego oprogramowania. Plik jar serwera to dowolny kod, który będzie uruchamiany w trybie ciągłym na maszynie wystawionej na działanie Internetu.

Skopiuj link do pobrania aktualnej kompilacji z oficjalnej strony (adres URL zmienia się wraz z każdą wersją i kompilacją, dlatego umieszczenie go tutaj na stałe byłoby nieaktualne), a następnie:

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

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

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

Uruchom serwer interaktywnie przed skonfigurowaniem systemd. Pierwsze uruchomienie ma dwa zadania, które wymagają aktywnej konsoli.

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

Proces zakończy się w ciągu kilku sekund. Paper poświęca chwilę na nałożenie poprawek, a dziennik kończy się komunikatem, który pojawia się u każdego:

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

To nie jest błąd, lecz wymóg licencyjny. Uruchomienie utworzyło plik eula.txt obok pliku jar. Przeczytaj zalinkowaną treść EULA, jeśli jeszcze tego nie zrobiono, a następnie zmień flagę:

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

Uruchom ponownie to samo polecenie java. Tym razem serwer wygeneruje świat, co przy pierwszym uruchomieniu zajmie minutę lub dwie, a następnie zatrzyma się na komunikacie:

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

Masz teraz dostęp do aktywnej konsoli. Wykorzystaj ją do drugiego zadania: wpisz op YourMinecraftName (podając dokładną nazwę użytkownika z gry), a serwer zapisze Cię w pliku ops.json. Dzięki temu, gdy konsola nie będzie dostępna, będziesz mógł wykonywać wszystkie polecenia administracyjne bezpośrednio z poziomu gry. Następnie wpisz stop, aby zapisać stan i poprawnie zamknąć serwer.

Krok 5: server.properties i dlaczego online-mode pozostaje true

Pierwsze uruchomienie utworzyło również server.properties. Większość ustawień domyślnych jest poprawna; poniższe linie wymagają świadomej decyzji:

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 sprawia, że serwer weryfikuje każdą nazwę użytkownika dołączającego do gry z serwerami sesji Mojang, co potwierdza, że gracz posiada konto. Ustawienie wartości false, czyli przełączenie w tryb "cracked server", oznacza, że serwer ufa deklaracji klienta co do jego tożsamości: każdy może dołączyć pod dowolną nazwą, w tym Twoją. Ponieważ uprawnienia operatora i listy dozwolonych (whitelist) są powiązane z nazwą, osoba podszywająca się pod Ciebie przejmie Twoje uprawnienia administratora. Jedynym uzasadnionym powodem wyłączenia tej opcji jest praca za proxy uwierzytelniającym, takim jak Velocity, które samo weryfikuje graczy. Na standardowym serwerze opcja ta musi pozostać włączona.

view-distance to najważniejszy parametr wpływający na wydajność w tym pliku; zapotrzebowanie na CPU i RAM rośnie w przybliżeniu do kwadratu tej wartości. 8 to rozsądne ustawienie domyślne dla VPS; 10 to wartość domyślna dla vanilla, która jest zauważalnie bardziej obciążająca.

white-list=true oraz enforce-whitelist=true zamykają serwer przed nieznajomymi, co w sekcji dotyczącej bezpieczeństwa poniżej uznano za wymóg konieczny. Graczy należy dodawać za pomocą /whitelist add TheirName z poziomu gry jako operatora.

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

JVM przydziela stertę w zakresie między -Xms (rozmiar początkowy) a -Xmx (limit górny). Na dedykowanym serwerze gier należy ustawić obie wartości na ten sam poziom: sterta i tak osiągnie limit, a jej stopniowe powiększanie powoduje jedynie niepotrzebne obciążenie mechanizmu garbage collector podczas gry. Na serwerze VPS z 4 GB pamięci RAM właściwa para to:

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

-Xmx to nie jest całkowita pamięć używana przez proces. JVM dodaje narzut spoza sterty (off-heap), stosy wątków, pamięci podręczne JIT oraz bufory bezpośrednie, co zajmuje około pół gigabajta lub więcej, a sam system Ubuntu również wymaga zasobów. Zasada praktyczna: -Xmx to maksymalnie RAM serwera VPS minus 1 GB. Przekroczenie tego limitu prowadzi do jednej z dwóch awarii. Jeśli przydział pamięci nie powiedzie się na starcie, serwer odmówi uruchomienia z komunikatem:

Error: Could not reserve enough space for object heap

Ten błąd jest czytelny i występuje natychmiast. Gorszy wariant polega na tym, że serwer uruchamia się poprawnie, ale zawiesza się po kilku godzinach, gdy sterta zapełnia się pod obciążeniem, a mechanizm OOM killer jądra systemu wybiera największy proces na maszynie, czyli JVM. W dzienniku serwera nie pojawia się żaden wpis; dowód znajduje się w sudo dmesg | grep -i oom, w linii takiej jak Out of memory: Killed process 1234 (java). Jeśli usługa restartuje się "losowo", sprawdź najpierw ten plik i zmniejsz wartość -Xmx.

W przypadku Paper, dokumentacja projektu zawiera tzw. Aikar's flags, czyli zestaw zoptymalizowanych ustawień G1GC (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 oraz kilkanaście innych), które wygładzają przestoje związane z odśmiecaniem pamięci przy większych stertach. Pełną linię polecenia można wygenerować na podstawie dokumentacji Paper; przy stercie o rozmiarze 2–4 GB zysk jest niewielki, ale flagi te są bezpieczne.

Krok 7: jednostka systemd z parametrem Restart=on-failure

Serwer uruchomiony ręcznie wyłącza się wraz z sesją SSH i nie wstaje po restarcie systemu. Utwórz 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

Poprawny wynik: status pokazuje active (running), a dziennik, który teraz zawiera wyjście konsoli serwera, kończy się ponownie linią Done.

W tej jednostce dokonano dwóch celowych wyborów. Restart=on-failure przywraca serwer po awarii, ale nie po czystym stop, dzięki czemu prace konserwacyjne pozostają możliwe. Z kolei TimeoutStopSec=120 jest ważniejsze, niż się wydaje: systemctl stop wysyła sygnał SIGTERM, serwer Minecraft przechwytuje go i zapisuje każdy świat przed wyjściem, a w przypadku dużego świata zapis ten zajmuje czas. Domyślny limit czasu systemd może wysłać sygnał SIGKILL do JVM w trakcie zapisu, co prowadzi do uszkodzenia plików regionów. Należy przydzielić dwie minuty.

Jeśli usługa ulega ciągłym restartom, 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 port 25565 jest już zajęty, najprawdopodobniej przez wcześniejszy proces uruchomiony w innym oknie SSH. Znajdź go za pomocą sudo ss -tlnp | grep 25565 i zatrzymaj tę kopię; nigdy nie uruchamiaj dwóch serwerów na tym samym porcie.

Krok 8: otwarcie portu 25565 na obu zaporach sieciowych

Minecraft Java korzysta wyłącznie z protokołu TCP 25565 (UDP jest opcjonalnym protokołem zapytań, domyślnie wyłączonym). Na serwerze VPS:

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

To jest pierwsza zapora sieciowa. Większość dostawców VPS utrzymuje drugą zaporę na poziomie sieci w panelu sterowania i to o niej użytkownicy najczęściej zapominają. Należy otworzyć port TCP 25565 również tam. Objawem otwarcia portu tylko na jednej z dwóch zapor jest bardzo niejednoznaczny komunikat: klient zawiesza się na "Connecting to the server..." i kończy działanie z Connection timed out: no further information, bez odmowy połączenia, błędu serwera czy wpisów w dzienniku, ponieważ pakiety nigdy nie dotarły do celu. Należy zweryfikować dostępność z maszyny znajdującej się poza VPS za pomocą nc -vz your.server.ip 25565; succeeded oznacza, że obie zapory są otwarte, natomiast zawieszenie połączenia oznacza, że przynajmniej jedna z nich blokuje ruch.

Skoro używany jest ufw, a serwer posiada publiczny adres IP z aktywnym SSH, próby ataków brute-force pojawią się w logach w ciągu kilku godzin. Warto skonfigurować Fail2ban dla SSH na Ubuntu 24.04, zanim zostanie to pominięte.

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

Krok 9: lista dozwolonych (whitelist), ponieważ Internet skanuje port 25565

Pozostawienie serwera Minecraft otwartego na świat nie jest zagrożeniem teoretycznym: masowe skanery nieustannie przeszukują całą przestrzeń adresową IPv4 w poszukiwaniu portu 25565, hobbystyczne projekty typu griefing zmapowały w ten sposób setki tysięcy otwartych serwerów, a serwer bez listy dozwolonych w ciągu dni, a czasem godzin, zyskuje nieproszonych gości. Rozwiązaniem jest lista dozwolonych z kroku 5: online-mode=true potwierdza tożsamość, a lista dozwolonych ogranicza dostęp wyłącznie do wybranych tożsamości. To połączenie stanowi kompletny model bezpieczeństwa i jest wystarczające dla serwera przeznaczonego dla znajomych.

Aby uzyskać dostęp do konsoli bez uruchamiania gry, wykonywać skryptowane kopie zapasowe lub zadania cron, należy włączyć RCON w pliku server.properties (ustawić enable-rcon=true oraz silne rcon.password, port 25575) i zbudować niewielkiego klienta mcrcon z kodu źródłowego pobranego z GitHub bezpośrednio na VPS; narzędzie to nie znajduje się w repozytoriach Ubuntu. Nie należy otwierać portu 25575 w żadnej zaporze sieciowej: RCON przesyła hasło otwartym tekstem, dlatego dostęp musi być ograniczony wyłącznie do interfejsu loopback.

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

Obowiązuje jedna zasada: nigdy nie kopiuj katalogu świata, gdy serwer dokonuje w nim zapisu. Pliki regionów są nadpisywane w sposób ciągły podczas gry; tar, który wyprzedzi operację zapisu, utworzy archiwum z częściowo zapisanymi fragmentami (chunks). W momencie przywracania kopii, czyli wtedy, gdy musi ona zadziałać, dziennik zapełni się błędami ładowania fragmentów, a w terenie pojawią się dziury. Dwie metody pozwalają uniknąć tego problemu.

Zatrzymanie-kopiowanie-uruchomienie to proste rozwiązanie, wymagające 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 oraz world_the_end; serwer vanilla przechowuje wszystko w world, więc w tym przypadku należy pominąć dwa pozostałe katalogi.)

Save-off umożliwia tworzenie kopii w trakcie pracy serwera: przez RCON wydaj polecenie save-off (zatrzymanie automatycznego zapisu), następnie save-all flush (wymuszenie zapisu wszystkiego na dysk i oczekiwanie), wykonaj archiwum tar, a potem save-on. Jest to wersja, którą warto umieścić w cron o godzinie 5 rano.

Niezależnie od metody, kopia zapasowa znajdująca się na tym samym VPS co serwer nie jest kopią zapasową; scp lub rclone archiwa poza maszynę i przechowuj więcej niż jedną kopię. Ponieważ nie będziesz obserwować konsoli w momencie awarii, skonfiguruj zewnętrzną kontrolę portu: Uptime Kuma na innej maszynie wykonująca sprawdzenie TCP na porcie 25565 poinformuje Cię o niedostępności serwera, zanim zrobią to gracze.

Wtyczki i aktualizacje

W przypadku Paper wtyczka to plik jar umieszczony w /opt/minecraft/plugins/, po którym następuje restart; to cały proces instalacji. Wtyczki należy pobierać wyłącznie z 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 polega na: zatrzymaniu, wykonaniu kopii zapasowej, zastąpieniu server.jar kompilacją dla nowej wersji Minecraft i uruchomieniu. Należy zachować dwie ostrożności. Aktualizacje świata są jednostronne; świat otwarty w nowszej wersji nie zadziała w starszej, co stanowi kolejne zadanie dla kopii zapasowych. Wtyczki często otrzymują aktualizacje z kilkudniowym lub kilkutygodniowym opóźnieniem względem wydania Minecraft, dlatego przed pośpieszną aktualizacją w dniu premiery należy sprawdzić kompatybilność.

Jeśli zarządzanie tym wszystkim ma odbywać się w kontenerze, z przypinaniem wersji, akceptacją EULA i flagami pamięci jako zmiennymi środowiskowymi, powszechnie używany obraz itzg/minecraft-server uruchamia ten sam serwer Paper zgodnie z instrukcją Docker Compose na Twoim VPS, zachowując identyczne zasady dotyczące firewalla i kopii zapasowych.

FAQ

Ile pamięci RAM potrzebuje serwer Minecraft?

2 GB wystarcza do uruchomienia czystej wersji (vanilla) dla 2–5 graczy; 4 GB zapewnia komfortową pracę serwera Paper dla około dziesięciu graczy z kilkoma wtyczkami; modpacki i ponad 20 graczy wymagają 8 GB lub więcej. Niezależnie od rozmiaru VPS, ustaw -Xmx na wartość co najwyżej całkowitej pamięci RAM minus 1 GB. JVM wykorzystuje pamięć poza stertą (heap), a przekroczenie dostępnych zasobów kończy się błędem Error: Could not reserve enough space for object heap lub cichym zabiciem procesu przez mechanizm OOM.

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

Zawieszenie klienta kończące się błędem Connection timed out: no further information prawie zawsze oznacza problem z firewallem. Należy sprawdzić dwa miejsca: ufw na serwerze VPS oraz sieciowy firewall dostawcy w panelu sterowania. Port TCP 25565 musi być otwarty w obu. Potwierdź, że serwer nasłuchuje na porcie za pomocą sudo ss -tlnp | grep 25565 na maszynie, a następnie przetestuj połączenie z zewnątrz za pomocą nc -vz your.server.ip 25565.

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

Nie. Przy ustawieniu online-mode=false serwer całkowicie pomija uwierzytelnianie Mojang. Każdy może dołączyć pod dowolną nazwą użytkownika, w tym pod nazwą administratora, przejmując jego uprawnienia. Ponadto przestają działać skiny oraz stabilne identyfikatory UUID. Jedynym uzasadnionym zastosowaniem jest praca za proxy uwierzytelniającym, takim jak Velocity, które samodzielnie weryfikuje graczy. W przypadku standardowego serwera należy pozostawić wartość true.

Czy Paper jest lepszy niż serwer vanilla Minecraft?

Dla większości użytkowników tak: Paper to zamiennik pliku jar, który wczytuje światy vanilla, obsługuje niezmodyfikowanych klientów, znacznie wydajniej przetwarza jednostki (entities) i wczytuje chunki, a także dodaje ekosystem wtyczek. Wyjątkiem są społeczności techniczne zajmujące się mechanizmami redstone, które wymagają zachowania identycznego z vanilla, co niektóre optymalizacje Paper mogą zmieniać. Na małym VPS wydajność Paper to w praktyce dodatkowa, darmowa pamięć RAM.

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

Nigdy nie archiwizuj katalogu świata, gdy serwer zapisuje do niego dane. Kopia wykonywana w trakcie zapisu pliku regionu prowadzi do uszkodzenia chunków, które zostaną wykryte dopiero podczas przywracania danych. Należy zatrzymać serwer, spakować katalogi świata za pomocą tar, a następnie uruchomić go ponownie. Alternatywnie można utrzymać serwer w trybie online, używając save-off, save-all flush, tar oraz save-on przez RCON. Następnie przenieś archiwum poza serwer VPS.