Dealownia
Menu
sprawdzono – jak sprawdzamy oferty

Serwer Minecraft na VPS: Paper, Java, systemd i kopie świata

Własny serwer Minecraft Java Edition na Paperze: ile pamięci zaleca dokumentacja, Java 25, usługa systemd, zapora, biała lista, kopie świata i aktualizacje.

Aplikacje na własnym serwerzezaktualizowano 7 min czytania

Redakcja serwisu Dealownia · ceny i fakty ze stron dostawców, jak sprawdzamy

Serwer Minecraft Java Edition na silniku Paper, który działa jako osobny użytkownik systemowy, startuje sam po restarcie VPS, przyjmuje tylko graczy z białej listy i co noc zapisuje kopię świata. Konsolę serwera obsłużysz bez screen i tmux, a aktualizację do nowej wersji zrobisz w kilka minut, z kopią na wypadek problemów. Komendy są dla Ubuntu 24.04 LTS oraz Debiana 12 i 13.

Czego potrzebujesz

  • VPS z Ubuntu 24.04 LTS albo Debianem 12 lub 13, przygotowany jak w poradniku od zera: użytkownik z sudo, logowanie kluczem, ufw.
  • Pamięć: strona Paper o parametrach startowych zaleca co najmniej 6–10 GB dla samego serwera, niezależnie od liczby graczy. Do tego system i Java potrzebują miejsca poza stertą, dlatego dokumentacja każe odjąć od pamięci maszyny około 1000–1500 MB; dla 8 GB podaje 6500 MB. Liczby graczy na dany rozmiar Paper nie podaje i my też jej nie zgadujemy – zależy od zasięgu widzenia, pluginów i farm.
  • Procesor: Minecraft liczy główną pętlę gry w jednym wątku, więc liczy się szybkość pojedynczego rdzenia bardziej niż ich liczba. Jak to czytać w ofertach, opisujemy w poradniku o specyfikacji VPS.
  • Konto Minecraft Java Edition dla każdego gracza (serwer domyślnie sprawdza konta w usługach Mojang).

Część ofert to plany z 1–4 GB RAM, za małe na serwer Minecraft – przy każdej sprawdź, czy ma co najmniej 8 GB RAM.

Plany z dużą ilością pamięci porównasz w rankingu VPS.

Krok 1. Java 25

Według instrukcji Paper aktualne wydania wymagają co najmniej Javy 25 (Minecraft 26.1 i nowsze). Paper w swojej instrukcji instalacji Javy opisuje dystrybucję Amazon Corretto z repozytorium apt:

bash
sudo apt-get update
sudo apt-get install -y ca-certificates apt-transport-https gnupg wget jq
wget -O - https://apt.corretto.aws/corretto.key | sudo gpg --dearmor -o /usr/share/keyrings/corretto-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/corretto-keyring.gpg] https://apt.corretto.aws stable main" | sudo tee /etc/apt/sources.list.d/corretto.list
sudo apt-get update
sudo apt-get install -y java-25-amazon-corretto-jdk libxi6 libxtst6 libxrender1
java -version

Wynik ma zaczynać się od openjdk 25. Paper odradza pakiety z dopiskiem -headless, bo brakuje w nich zależności, których używa. jq przyda się w następnym kroku.

Krok 2. Użytkownik i pobranie Paper

Serwer gry nie powinien działać jako root ani jako Twoje konto z sudo. Załóż konto systemowe bez powłoki:

bash
sudo useradd --system --create-home --home-dir /opt/minecraft --shell /usr/sbin/nologin minecraft
sudo -u minecraft mkdir -p /opt/minecraft/server /opt/minecraft/backups

Paper udostępnia kompilacje przez API Fill. Każde zapytanie musi mieć nagłówek User-Agent, który identyfikuje Twój projekt i zawiera adres kontaktowy – domyślny curl/... zostanie odrzucony.

bash
UA="moj-serwer-mc/1.0 (admin@example.pl)"
VER=$(curl -s -H "User-Agent: $UA" https://fill.papermc.io/v3/projects/paper | jq -r '.versions | to_entries[0] | .value[0]')
URL=$(curl -s -H "User-Agent: $UA" "https://fill.papermc.io/v3/projects/paper/versions/$VER/builds" \
  | jq -r 'first(.[] | select(.channel == "STABLE") | .downloads."server:default".url) // "null"')
echo "Wersja: $VER"
[ "$URL" != "null" ] && sudo -u minecraft curl -o /opt/minecraft/server/paper.jar "$URL"

Plik zapisujesz pełną ścieżką jako użytkownik minecraft: katalog domowy /opt/minecraft należy do niego i na Ubuntu 24.04 ma prawa 750, więc deploy nie może do niego wejść ani w nim pisać. Jeśli dla najnowszej wersji nie ma jeszcze kompilacji STABLE, URL będzie null i nic się nie pobierze. Wtedy ustaw VER ręcznie na poprzednią wersję – zwykle i tak warto poczekać, aż pluginy, których używasz, ją obsłużą.

Krok 3. EULA i pierwsze uruchomienie

Pierwszy start tworzy pliki konfiguracyjne i eula.txt, po czym serwer się zatrzymuje:

bash
sudo -u minecraft bash -c 'cd /opt/minecraft/server && java -Xms2G -Xmx2G -jar paper.jar --nogui'

W eula.txt jest link do umowy licencyjnej Minecrafta (EULA). Przeczytaj ją i dopiero wtedy ją zaakceptuj:

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

Jeśli chcesz kiedyś pobierać od graczy opłaty albo sprzedawać cokolwiek w grze, przeczytaj też wytyczne Mojang dotyczące serwerów (Minecraft Usage Guidelines na minecraft.net). Określają, za co i na jakich warunkach wolno brać pieniądze; nie streszczamy ich tutaj, bo Mojang je zmienia.

W server.properties ustaw przynajmniej:

ini
server-port=25565
online-mode=true
white-list=true
enforce-whitelist=true
motd=Serwer znajomych

25565 to domyślny port Java Edition. online-mode=true sprawdza konta graczy u Mojang – nie wyłączaj tego na serwerze dostępnym z internetu, bo wtedy każdy może wejść pod dowolnym nickiem, także administratora.

Krok 4. Usługa systemd z konsolą

Zamiast trzymać serwer w screen uruchomisz go jako usługę. Konsola trafi do dziennika systemd, a komendy będziesz wysyłać przez nazwany potok (FIFO), który systemd podłączy do wejścia serwera. Plik /etc/systemd/system/minecraft.socket:

ini
[Unit]
Description=Konsola serwera Minecraft (FIFO)

[Socket]
ListenFIFO=/run/minecraft.stdin
SocketMode=0600
RemoveOnStop=true
Service=minecraft.service

Plik /etc/systemd/system/minecraft.service (przy VPS z 8 GB, zgodnie z wyliczeniem Paper, ustaw -Xms6500M -Xmx6500M):

ini
[Unit]
Description=Serwer Minecraft (Paper)
After=network-online.target
Wants=network-online.target
Requires=minecraft.socket
After=minecraft.socket

[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
Sockets=minecraft.socket
StandardInput=socket
StandardOutput=journal
StandardError=journal
ExecStart=/usr/bin/java -Xms6500M -Xmx6500M -XX:+UseG1GC -jar paper.jar --nogui
SuccessExitStatus=0 143
TimeoutStopSec=120
Restart=on-failure
RestartSec=15
NoNewPrivileges=true
ProtectSystem=full
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Xms i Xmx mają tę samą wartość, tak jak w przykładach Paper. Pełny zestaw zalecanych flag JVM wygenerujesz w generatorze skryptów podlinkowanym na stronie o flagach. Przy systemctl stop systemd wysyła sygnał SIGTERM; serwer zapisuje wtedy świat i kończy pracę z kodem 143, który SuccessExitStatus traktuje jako poprawne zakończenie.

bash
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft.socket minecraft.service
journalctl -u minecraft -f

Komendy konsoli wysyłasz tak:

bash
echo "whitelist add TwojNick" | sudo tee /run/minecraft.stdin
echo "op TwojNick" | sudo tee /run/minecraft.stdin

Krok 5. Zapora

ufw ma już regułę dla SSH. Dodaj port gry:

bash
sudo ufw allow 25565/tcp
sudo ufw status

Nie otwieraj portu RCON (domyślnie 25575) – i tak jest wyłączony, dopóki nie ustawisz enable-rcon=true. Jeśli dostawca ma osobną zaporę w panelu, tam też zezwól na 25565/tcp.

Krok 6. Kopie świata

Kopia kopiowana w trakcie zapisu chunków może być uszkodzona. Dlatego skrypt na chwilę wyłącza automatyczny zapis, wymusza zapis na dysk, pakuje cały katalog serwera i włącza zapis z powrotem. Plik /opt/minecraft/backup.sh:

bash
#!/usr/bin/env bash
set -euo pipefail
umask 077
CON=/run/minecraft.stdin
D=$(date +%F-%H%M)
echo "save-off" > "$CON"
echo "save-all flush" > "$CON"
sleep 15
tar -czf "/opt/minecraft/backups/server-$D.tar.gz" -C /opt/minecraft server \
  || { echo "save-on" > "$CON"; exit 1; }
echo "save-on" > "$CON"
find /opt/minecraft/backups -name 'server-*.tar.gz' -mtime +7 -delete
bash
sudo chmod 700 /opt/minecraft/backup.sh
sudo /opt/minecraft/backup.sh && sudo ls -lh /opt/minecraft/backups
echo "30 4 * * * root /opt/minecraft/backup.sh >>/var/log/minecraft-kopia.log 2>&1" | sudo tee /etc/cron.d/minecraft-kopia

sleep 15 daje serwerowi czas na dokończenie zapisu – na dużym świecie wydłuż go i sprawdź w journalctl -u minecraft, ile trwa „save-all flush”. Kopia na tym samym dysku nie chroni przed awarią VPS – wysyłaj archiwa na zewnątrz, np. jak w poradniku o restic i rclone.

Krok 7. Aktualizacje

Nowa wersja Minecrafta zapisuje świat w nowym formacie, a starsza może go już nie otworzyć. Zawsze więc najpierw kopia:

bash
sudo /opt/minecraft/backup.sh
sudo systemctl stop minecraft
# pobierz nowy paper.jar jak w kroku 2, potem:
sudo systemctl start minecraft
journalctl -u minecraft -f

Przed skokiem na nową wersję gry sprawdź, czy Twoje pluginy już ją obsługują. Aktualizacje kompilacji w obrębie tej samej wersji (poprawki Paper) są zwykle bezpieczne, ale kopia i tak nic nie kosztuje.

Najczęstsze problemy

  • Serwer kończy się od razu z komunikatem o EULA. eula.txt nadal ma eula=false albo należy do roota. Sprawdź sudo ls -l /opt/minecraft/server – wszystko ma należeć do minecraft.
  • UnsupportedClassVersionError przy starcie. Za stara Java. java -version musi pokazać 25; jeśli masz kilka wersji, w ExecStart podaj pełną ścieżkę do Javy 25.
  • Proces znika bez błędu w logu, a w dmesg jest „Out of memory: Killed process”. Xmx jest za blisko całej pamięci VPS. Zostaw systemowi zapas 1000–1500 MB, jak zaleca Paper, albo weź większy plan.
  • Gracze nie mogą się połączyć, choć serwer działa. Port 25565 zamknięty w zaporze dostawcy albo gracz nie jest na białej liście (whitelist list w konsoli). Sprawdź z zewnątrz: nc -vz example.pl 25565.
  • Lagi przy większej liczbie graczy. Zmniejsz view-distance i simulation-distance w server.properties (domyślnie 10). Przyczynę pokaże wbudowany w Paper profiler spark (spark profiler start --timeout 600 – po 10 minutach dostaniesz adres raportu).

Co dalej

Zanim podasz adres znajomym, przejdź listę kontrolną zabezpieczenia VPS. Zamiast adresu IP możesz dać im subdomenę – rekord A mc.example.pl wskazujący serwer; podstawy rekordów DNS opisuje poradnik o DNS. Jeśli wybierasz serwer pod konkretny budżet, zajrzyj do zestawienia Jaki VPS wybrać do 20, 50 i 100 zł.

Powiązane poradniki