SSD Nodes Learn Hosting plans →
Gidsen Matt ConnorDoor Matt Connor

Minecraft server hosten op Ubuntu 24.04 VPS

Leer hoe u een stabiele Paper Minecraft server op Ubuntu 24.04 draait. Wij behandelen Java 25 installatie, systemd configuratie, poort 25565 instellingen en veilige back-ups.

Wat u gaat bouwen

Een Minecraft Java Edition-server die stabiel blijft draaien: Paper op Ubuntu 24.04, uitgevoerd als een toegewezen minecraft-gebruiker onder systemd met Restart=on-failure, whitelist ingeschakeld, poort 25565 geopend in ufw en in de netwerkfirewall van uw provider indien deze is geactiveerd, en back-ups die worden gemaakt op een manier die de wereld die ze moeten beschermen niet beschadigt. De server zelf bestaat uit één jar-bestand en één java-commando; alles wat een server waar uw vrienden een jaar op spelen onderscheidt van een server die het eerste weekend al uitvalt, draait om dat commando, en dat is wat deze handleiding behandelt.

Twee eerlijke waarschuwingen voordat u geld uitgeeft. Ten eerste: Minecraft is geheugenintensief en grotendeels single-threaded; een 1 GB VPS zal geen speelbare server draaien, en één snelle core is beter dan vier langzame. Ten tweede: dit is Java Edition. Bedrock-spelers, consoles, telefoons en de Windows Bedrock-app kunnen niet deelnemen aan een Java-server; Bedrock vereist andere serversoftware op UDP 19132, of de Geyser-plugin, wat buiten het bereik van deze handleiding valt.

U heeft een verse Ubuntu 24.04 KVM VPS nodig met root- of sudo-toegang, en ongeveer dertig minuten de tijd.

Sizing: wat een server voor vrienden werkelijk nodig heeft

RAM is de doorslaggevende factor, en de realistische cijfers liggen lager dan de forums voor modpacks suggereren:

  • 2 GB is voldoende voor vanilla met 2–5 spelers op een bescheiden render-afstand. Speelbaar, maar zonder enige reserve.
  • 4 GB is de ideale omvang voor een server met vrienden: ongeveer tien gelijktijdige spelers op Paper met een handvol plugins, en voldoende ruimte over voor het besturingssysteem.
  • 8 GB en meer is bedoeld voor modpacks en meer dan 20 spelers. Hierbij is ook de single-core CPU-snelheid van belang, omdat de hoofd-game-loop op één thread draait.

De wereld groeit ook op de schijf naarmate spelers deze verkennen. Een intensief verkende survival-wereld bereikt al snel enkele gigabytes, dus houd rekening met voldoende ruimte voor de wereld en de bijbehorende back-ups.

Vanilla of Paper? Paper is een directe vervanger voor de officiële jar: dezelfde werelden, dezelfde clients, en er zijn geen client-side mods vereist. Het herschrijft de traagste serverprocessen, zoals het laden van chunks, entity-ticking en hoppers, en voegt een plugin-API toe. De enige reden om vanilla te draaien is als u bit-exacte vanilla-mechanica nodig heeft voor technische redstone-farms die door de optimalisaties van Paper kunnen veranderen; voor alle andere gevallen biedt Paper meer spelers per gigabyte. Alles hieronder werkt voor beide.

Stap 1: Java 25 installeren

Minecraft 26.1 en elke release daarna vereist Java 25; Java 21 ondersteunt alleen de oudere 1.20 tot 1.21.11-lijn. Ubuntu 24.04 levert Java 25 via de updates- en security-repositories. Installeer de volledige JRE, niet de -headless-build: de Java-installatiehandleiding van Paper waarschuwt tegen headless-varianten omdat deze afhankelijkheden missen die Paper nodig heeft.

sudo apt update && sudo apt install -y openjdk-25-jre
java -version

Correct resultaat: de eerste regel bevat openjdk version "25.0.x". Als er 21, 17 of 11 staat, is er een andere JRE geïnstalleerd die voorrang krijgt; los dit op met sudo update-alternatives --config java en kies het item dat java-25 bevat.

Het overslaan van deze controle leidt later tot de meest gegoogelde Minecraft-serverfout. Met Java 21 stopt het server-jar direct met de volgende melding:

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

De getallen verklaren de mismatch: class file version 69.0 is Java 25, 65.0 is Java 21, 61.0 is Java 17. Welk paar u ook ziet, de oplossing is hetzelfde: installeer de nieuwere JRE en voer update-alternatives opnieuw uit.

Stap 2: een toegewezen gebruiker, nooit root

De server voert plug-incode uit en verwerkt netwerkinvoer van iedereen die de poort kan bereiken. Als dit ooit misgaat, heeft een aanvaller die als root draait volledige controle over uw VPS; een proces dat draait als minecraft heeft alleen controle over een spelwereld.

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

--system maakt een account zonder wachtwoord aan dat niet via SSH kan inloggen, met /opt/minecraft als home- en werkdirectory. Elk commando dat vanaf dit punt de server raakt, wordt uitgevoerd als deze gebruiker.

Stap 3: download de server-jar van de officiële bron

Er zijn slechts twee locaties waar u een server-jar vandaan zou moeten halen: de officiële downloadpagina voor servers op minecraft.net voor vanilla, of de downloadpagina op papermc.io voor Paper. "Downloadhubs" van derden die server-jars opnieuw verpakken, zijn een bekende bron voor malware. Een server-jar is willekeurige code die u 24/7 op een server met internetverbinding gaat uitvoeren.

Kopieer de downloadlink voor de huidige build van de officiële pagina (de URL verandert bij elke versie en build, dus het hardcoderen van een link hier zou snel verouderen), en voer vervolgens het volgende uit:

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

Correct resultaat: een server.jar van ongeveer 60 MB in het bezit van minecraft, bevestigd met ls -lh /opt/minecraft/server.jar.

Stap 4: eerste uitvoering, de EULA en uzelf op-rechten geven

Start de server eenmalig interactief voordat u systemd configureert; de eerste uitvoering heeft twee taken die alleen via een live console goed verlopen.

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

De server stopt binnen enkele seconden. Paper besteedt eerst wat tijd aan het toepassen van patches en het logbestand eindigt met de melding die iedereen ziet:

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

Dit is geen foutmelding; het is een licentiebeperking. De uitvoering heeft eula.txt aangemaakt naast het jar-bestand. Lees de gelinkte EULA als u dat nog niet heeft gedaan en wijzig vervolgens de vlag:

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

Voer hetzelfde java-commando opnieuw uit. Deze keer wordt de wereld gegenereerd, wat bij de eerste keer opstarten een minuut of twee duurt, en stopt het proces bij:

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

U heeft nu een live console. Gebruik deze voor de tweede taak: typ op YourMinecraftName (uw exacte in-game gebruikersnaam) en de server voegt u toe aan ops.json. Zo kunt u later, wanneer er geen console is gekoppeld, elk beheercommando vanuit het spel uitvoeren. Typ daarna stop om de server op te slaan en correct af te sluiten.

Stap 5: server.properties, en waarom online-mode op true blijft

De eerste uitvoering heeft ook server.properties geschreven. De meeste standaardinstellingen zijn in orde; deze regels zijn het overwegen waard:

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 zorgt ervoor dat de server elke inloggende gebruikersnaam verifieert bij de sessieservers van Mojang, waarmee wordt bewezen dat de speler de eigenaar van het account is. Het instellen op false, de schakelaar voor "cracked servers", betekent dat de server blind vertrouwt op de identiteit die een client opgeeft: iedereen kan inloggen onder elke naam, inclusief die van u. Aangezien ops en whitelists op naam werken, krijgt een imitator direct uw operator-rechten. De enige legitieme reden om dit op false te zetten is achter een authenticerende proxy zoals Velocity, die zelf de spelers verifieert. Op een normale server blijft dit true, zonder uitzondering.

view-distance is de belangrijkste prestatiefactor in het bestand; de belasting voor CPU en RAM schaalt ongeveer kwadratisch mee. 8 is een verstandige standaardwaarde voor een VPS; 10 is de standaardwaarde van vanilla en merkbaar zwaarder.

white-list=true plus enforce-whitelist=true sluit de server af voor onbekenden, wat volgens de beveiligingssectie hieronder niet optioneel is. Voeg spelers toe met /whitelist add TheirName in het spel als een op.

Stap 6: geheugenvlaggen, waarom -Xms en -Xmx gelijk moeten zijn

De JVM wijst zijn heap toe tussen -Xms (startgrootte) en -Xmx (maximum). Stel deze op een dedicated gameserver in op dezelfde waarde: de heap bereikt het maximum toch wel, en het stapsgewijs vergroten zorgt alleen voor extra werk voor de garbage collector tijdens het spelen. Op een 4 GB VPS is het juiste paar:

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

-Xmx is niet het totale geheugen dat het proces gebruikt. De JVM voegt overhead buiten de heap toe, zoals thread stacks, JIT-caches en direct buffers, van ongeveer een halve gigabyte of meer, en Ubuntu zelf heeft ook ruimte nodig. De vuistregel: -Xmx is maximaal het VPS-RAM minus 1 GB. Bij overschrijding treden een van de twee volgende fouten op. Als de toewijzing direct mislukt, weigert de server te starten met:

Error: Could not reserve enough space for object heap

Die melding is eerlijk en direct. De vervelendere variant start normaal op en crasht uren later, wanneer de heap onder belasting volloopt en de OOM-killer van de kernel het grootste proces op de machine kiest: de JVM. Er verschijnt niets in het serverlogboek; het bewijs staat in sudo dmesg | grep -i oom, een regel zoals Out of memory: Killed process 1234 (java). Als uw service "willekeurig" herstart, controleer dan eerst daar en verlaag -Xmx.

Voor Paper documenteert het project de Aikar's flags, een getunede G1GC-set (-XX:+UseG1GC -XX:MaxGCPauseMillis=200 en een dozijn verwante vlaggen) die garbage-collection-pauzes bij grotere heaps versoepelt. Genereer de volledige regel vanuit de Paper-documentatie; bij een heap van 2–4 GB is de winst bescheiden, maar de vlaggen zijn onschadelijk.

Stap 7: een systemd unit met Restart=on-failure

Een server die handmatig wordt gestart, stopt zodra uw SSH-sessie wordt beëindigd en blijft na een reboot uitgeschakeld. Schrijf /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

Correct resultaat: status toont active (running), en het journal, dat nu de console-output van de server bevat, eindigt wederom bij de Done regel.

Er zijn twee bewuste keuzes gemaakt in deze unit. Restart=on-failure brengt de server terug na een crash, maar niet na een schone stop, waardoor onderhoud mogelijk blijft. En TimeoutStopSec=120 is belangrijker dan het lijkt: systemctl stop verstuurt een SIGTERM, de Minecraft server vangt dit op en slaat elke wereld op voordat het proces wordt beëindigd. Bij een grote wereld kost dit opslaan tijd. De standaard timeout van systemd kan de JVM tijdens het opslaan een SIGKILL sturen, wat precies de manier is waarop regiobestanden corrupt raken. Geef het twee minuten de tijd.

Als de service blijft flapperen en het journal toont:

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

dan houdt iets anders poort 25565 al bezet. Dit is bijna altijd uw eerdere handmatige sessie die nog op de achtergrond draait in een ander SSH-venster. Zoek dit proces met sudo ss -tlnp | grep 25565 en stop die kopie; draai nooit twee servers op dezelfde poort.

Stap 8: open 25565 op beide firewalls

Minecraft Java gebruikt uitsluitend TCP 25565 (UDP is enkel het optionele query-protocol, dat standaard uitgeschakeld is). Op de VPS:

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

Dit is de eerste firewall. Veel VPS-providers bieden ook een tweede firewall op netwerkniveau aan in het configuratiescherm. Wanneer deze actief is, wordt deze vaak vergeten. Bij SSD Nodes is dit de Advanced Firewall Groups-add-on, een betaalde extra die u bij het afrekenen of via het dashboard toewijst; als uw server hierover beschikt, open dan ook daar TCP 25565. Het symptoom van een ontbrekende regel in een van beide firewalls is frustrerend vaag: de client blijft hangen op "Connecting to the server..." en faalt met Connection timed out: no further information, zonder weigering, zonder serverfout en zonder meldingen in de journal, omdat de pakketten nooit zijn aangekomen. Controleer dit vanaf een machine buiten de VPS met nc -vz your.server.ip 25565; succeeded betekent dat elke firewall in het pad openstaat. Een hangend proces betekent meestal dat een firewall de pakketten nog steeds blokkeert, hoewel een host die te druk is om verbindingen te accepteren ook een time-out kan geven. Controleer daarom op de server zelf of deze luistert met ss.

Nu u toch in ufw bent: dezelfde machine draait SSH op een publiek IP-adres en de logbestanden zullen binnen enkele uren volstaan met brute-force-pogingen. Stel Fail2ban in voor SSH op Ubuntu 24.04 voordat u dit vergeet.

Maak nu verbinding: Multiplayer, Direct Connection, het server-IP. Omdat u uzelf in stap 4 tot operator heeft gemaakt, werken in-game commando's direct, /whitelist add FriendName voor elke speler, /gamemode creative als dat het plan is.

Stap 9: whitelist, omdat het internet poort 25565 vindt

Een Minecraft-server openstellen voor het internet is geen theoretisch risico: massascanners scannen continu de volledige IPv4-ruimte op poort 25565. Hobbyprojecten voor griefing hebben op deze manier honderdduizenden open servers in kaart gebracht, en een server zonder whitelist krijgt binnen enkele dagen, soms zelfs uren, onuitgenodigde bezoekers. De whitelist uit stap 5 is de oplossing: online-mode=true bewijst de identiteit, de whitelist beperkt de toegang tot identiteiten die u heeft gekozen. Dat duo vormt het volledige beveiligingsmodel, en het is voldoende voor een server voor vrienden.

Voor consoletoegang zonder het spel, gescripte back-ups of een cron job, schakelt u RCON in via server.properties (enable-rcon=true, een sterk rcon.password, poort 25575) en bouwt u de kleine mcrcon-client vanaf de GitHub-broncode op de VPS zelf; deze bevindt zich niet in de Ubuntu-repositories. Open poort 25575 niet in een firewall: RCON verstuurt het wachtwoord in leesbare tekst (cleartext), dus het moet beperkt blijven tot loopback-verkeer.

Stap 10: backups die de wereld niet beschadigen

De enige regel: kopieer nooit een wereldmap terwijl de server erin schrijft. Regiobestanden worden tijdens het spelen continu herschreven; een tar die sneller is dan een schrijfactie produceert een archief met halfgeschreven chunks. Wanneer u dit uiteindelijk terugzet – het enige moment waarop een backup moet werken – stroomt het logboek vol met fouten bij het laden van chunks en vertoont het terrein gaten. Twee methoden voorkomen dit.

Stop-kopieer-start is de eenvoudige methode, ten koste van een minuut downtime:

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

(Sinds 26.1 bewaart Paper alle drie de dimensies binnen world/dimensions/, net als vanilla, dus world is de gehele wereld. Een Paper-server die nog op 1.21.11 of ouder draait, splitst deze in world, world_nether en world_the_end; voeg die twee toe aan de tar-opdracht.)

Save-off maakt backups terwijl de server draait: verstuur via RCON het commando save-off (stop de automatische opslag), vervolgens save-all flush (forceer alles naar de schijf en wacht), maak de tar-kopie en voer daarna save-on uit. Dit is de versie die u om 05:00 uur in cron plaatst.

Hoe dan ook, een backup die op dezelfde VPS staat als de server is geen backup. scp of rclone de archieven van de server af en bewaar er meer dan één. En aangezien u niet naar de console kijkt wanneer er iets misgaat, kunt u beter een externe controle op de poort instellen: Uptime Kuma op een andere machine die een TCP-controle uitvoert op 25565, laat u weten dat de server offline is voordat uw spelers dat merken.

Plugins en upgrades

Bij Paper is een plugin een .jar-bestand dat in /opt/minecraft/plugins/ wordt geplaatst, gevolgd door een herstart; dat is de volledige installatie. Download plugins uitsluitend van hun officiële projectpagina's (Hangar, Modrinth, SpigotMC), om dezelfde reden als bij de server-jar: elk bestand bevat willekeurige code die wordt uitgevoerd als de minecraft-gebruiker.

Het upgraden van de server verloopt als volgt: stop de server, maak een back-up, vervang server.jar door de build voor de nieuwe Minecraft-versie en start de server opnieuw. Twee waarschuwingen. Wereld-upgrades zijn eenrichtingsverkeer; een wereld die is geopend met een nieuwere versie, werkt niet meer in een oudere versie, wat het belang van back-ups onderstreept. Bovendien lopen plugins vaak dagen of weken achter op een nieuwe Minecraft-release; controleer daarom de compatibiliteit voordat u direct op de dag van uitgave upgradet. De overstap van 1.21.11 naar 26.1 of later vereist ook Java 25 (stap 1) en verplaatst de Nether- en End-mappen van Paper naar world/dimensions/.

Als u dit liever als container beheert, met versie-pinning, EULA-acceptatie en geheugenvlaggen als omgevingsvariabelen, dan draait de veelgebruikte itzg/minecraft-server-image dezelfde Paper-server onder Docker Compose op uw VPS met dezelfde firewall- en back-updiscipline.

FAQ

Hoeveel RAM heeft een Minecraft-server nodig?

Met 2 GB draait een vanilla-server voor 2–5 spelers; 4 GB is comfortabel voor een server met ongeveer tien spelers op Paper met enkele plugins; voor modpacks en 20 of meer spelers is 8 GB of meer aanbevolen. Ongeacht de grootte van de VPS, stel -Xmx in op maximaal het totale RAM-geheugen minus 1 GB; de JVM gebruikt geheugen buiten de heap, en overschrijding leidt tot Error: Could not reserve enough space for object heap of een stille OOM-kill.

Waarom kunnen mijn vrienden geen verbinding maken met mijn Minecraft-server?

Een client-hang die eindigt in Connection timed out: no further information wijst meestal op een firewall: ufw op de VPS, en de netwerkfirewall van uw provider als deze is ingeschakeld in het configuratiescherm. TCP 25565 moet openstaan in elke firewall in het pad. Bevestig dat de server daadwerkelijk luistert met sudo ss -tlnp | grep 25565 op de machine en test vervolgens vanaf de buitenkant met nc -vz your.server.ip 25565.

Moet ik online-mode=false instellen in server.properties?

Nee. Met online-mode=false slaat de server de Mojang-authenticatie volledig over, waardoor iedereen kan deelnemen onder elke gebruikersnaam, inclusief de naam van een op, waarbij hun rechten worden overgenomen en skins en stabiele UUID's niet meer werken. Het enige legitieme gebruik is achter een authenticerende proxy zoals Velocity die zelf spelers verifieert. Voor een normale server blijft dit true.

Is Paper beter dan de vanilla Minecraft-server?

Voor bijna iedereen wel: Paper is een drop-in jar die vanilla-werelden laadt, ongewijzigde clients accepteert, entiteiten verwerkt en chunks veel efficiënter laadt, en het plugin-ecosysteem toevoegt. De uitzondering zijn technische redstone-communities die bit-exact vanilla-gedrag nodig hebben, wat sommige Paper-optimalisaties wijzigen. Op een kleine VPS is de efficiëntie van Paper in feite gratis extra RAM.

Hoe maak ik een back-up van een Minecraft-wereld zonder deze te beschadigen?

Archiveer nooit de wereldmap terwijl de server erin schrijft; een kopie die tegelijkertijd met een region-file-schrijfactie plaatsvindt, produceert beschadigde chunks die u pas ontdekt bij het herstellen. Stop de server, tar de wereldmappen en start deze opnieuw, of houd de server live met save-off, save-all flush, tar, save-on via RCON. Verplaats het archief vervolgens van de VPS af.