Ein Minecraft-Server ist ein gutes erstes Projekt auf einem VPS: Der Aufbau ist überschaubar, das Ergebnis sofort sichtbar, und man lernt dabei drei Dinge, die überall wiederkommen, Dienste als systemd-Unit, Speicherverwaltung und Backups im laufenden Betrieb.
Was die Maschine können muss#
Minecraft ist überwiegend einkernig. Die Hauptschleife des Servers (der „Tick“) läuft auf einem Kern; mehr Kerne helfen beim Weltgenerieren und bei Nebenaufgaben, aber nicht dabei, 20 Ticks pro Sekunde zu halten.
Daraus folgt die wichtigste Kaufregel: Einzelkernleistung vor Kernanzahl. Ein Tarif mit 4 vCPU auf einem modernen Prozessor schlägt 8 vCPU auf altem Blech deutlich. Wie man das vor dem Kauf prüft, steht in VPS auswählen.
| Spieler | RAM gesamt | Kerne | Hinweis |
|---|---|---|---|
| 1-5, Vanilla | 4 GB | 2 | reicht bequem |
| 5-15, Paper, wenige Plugins | 8 GB | 2-4 | der übliche Fall |
| 15-30, viele Plugins | 12-16 GB | 4 | View-Distance im Blick behalten |
| Modpacks | 12 GB aufwärts | 4 | Modpacks fressen RAM, nicht Kerne |
Der Heap: die Zahl, die alles bestimmt#
-Xmx auf die volle RAM-Größe stellt, nimmt dem System den Puffer.Auf einer 8-GB-Maschine ist -Xmx6G ein guter Wert, nicht -Xmx8G. Java braucht neben dem Heap noch Metaspace, Thread-Stacks und Puffer; das Betriebssystem will auch etwas. Ist am Ende nichts mehr frei, greift der OOM-Killer des Kernels und der beendet den Prozess mit dem größten Speicherverbrauch, also den Server.
Aufsetzen#
Grundhärtung der Maschine vorausgesetzt, siehe Die erste Stunde auf einem neuen Server.
# Java 21 (für aktuelle Minecraft-Versionen)
sudo apt update
sudo apt install -y openjdk-21-jre-headless screen curl jq
# Eigener Benutzer ohne Login-Shell — der Server läuft nie als root
sudo adduser --system --group --home /opt/minecraft minecraft
sudo mkdir -p /opt/minecraft/server
sudo chown -R minecraft:minecraft /opt/minecraft
Paper statt Vanilla. Paper ist ein optimierter Server, kompatibel zu Vanilla-Clients, mit deutlich besserem Verhalten bei vielen Entities und Unterstützung für Bukkit-Plugins. Für praktisch jeden Mehrspieler-Server die bessere Grundlage.
sudo -u minecraft bash
cd /opt/minecraft/server
# Neuesten Paper-Build für eine Version über die API holen
MCVER=1.21.4
BUILD=$(curl -s "https://api.papermc.io/v2/projects/paper/versions/$MCVER" | jq -r '.builds[-1]')
curl -o paper.jar "https://api.papermc.io/v2/projects/paper/versions/$MCVER/builds/$BUILD/downloads/paper-$MCVER-$BUILD.jar"
# Erster Lauf erzeugt die EULA-Datei und bricht ab
java -jar paper.jar --nogui
sed -i 's/eula=false/eula=true/' eula.txt
exit
systemd-Unit statt screen#
screen ist zum Ausprobieren in Ordnung. Für einen Server, der nach einem Neustart von selbst wiederkommt und bei einem Absturz neu startet, ist ein systemd-Unit die richtige Form.
# /etc/systemd/system/minecraft.service
[Unit]
Description=Minecraft (Paper)
After=network-online.target
Wants=network-online.target
[Service]
Type=simple
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
# Aogiri-Flags: sinnvolle Voreinstellungen für den G1-Sammler.
# -Xms = -Xmx ist Absicht: Java soll den Speicher nicht ständig nachfordern.
ExecStart=/usr/bin/java -Xms6G -Xmx6G \
-XX:+UseG1GC -XX:+ParallelRefProcEnabled -XX:MaxGCPauseMillis=200 \
-XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC \
-XX:G1NewSizePercent=30 -XX:G1MaxNewSizePercent=40 \
-XX:G1HeapRegionSize=8M -XX:G1ReservePercent=20 \
-jar paper.jar --nogui
# Sauber herunterfahren: "stop" an die Konsole, nicht SIGKILL
ExecStop=/bin/sh -c 'echo stop > /run/minecraft.stdin'
Restart=on-failure
RestartSec=15
TimeoutStopSec=120
# Etwas Absicherung, kostet nichts
NoNewPrivileges=true
PrivateTmp=true
ProtectSystem=full
ProtectHome=true
[Install]
WantedBy=multi-user.target
Damit Befehle an die laufende Konsole gehen können, braucht es eine Eingabeleitung. Der bequemste Weg ist systemd-run mit einer FIFO oder, praktischer, das Werkzeug mcrcon über die eingebaute RCON-Schnittstelle:
# server.properties
enable-rcon=true
rcon.port=25575
rcon.password=EIN-LANGES-ZUFALLSPASSWORT
sudo systemctl daemon-reload
sudo systemctl enable --now minecraft
sudo journalctl -u minecraft -f
Der RCON-Port ist unverschlüsselt und mit einem Passwort geschützt, das im Klartext übertragen wird. Er gehört auf 127.0.0.1 gebunden und, wenn Fernzugriff nötig ist, durch einen SSH-Tunnel: ssh -L 25575:127.0.0.1:25575 user@server. Eine Freigabe in der Firewall ist der Fehler, über den viele Server übernommen wurden.
Die Einstellungen, die Ruckler beseitigen#
Die häufigste Ursache für schlechte Tickraten ist nicht zu wenig CPU, sondern eine zu große View-Distance. Jeder geladene Chunk kostet Rechenzeit für alle Spieler.
# server.properties
view-distance=8 # Standard 10; 8 ist meist unauffällig und spürbar günstiger
simulation-distance=6 # entscheidend: nur hier laufen Mobs und Redstone
max-tick-time=60000
network-compression-threshold=256
sync-chunk-writes=false
In der Paper-Konfiguration (config/paper-world-defaults.yml) lohnen zwei weitere Werte:
chunks:
# Chunks, in denen nichts passiert, weniger oft anfassen
auto-save-interval: 6000
entities:
spawning:
# Weniger Mobs pro Chunk — der größte Einzelhebel bei vielen Spielern
per-player-mob-spawns: true
Nachmessen statt raten:
/tps # Ticks pro Sekunde: 20.0 ist das Ziel
/timings on # bzw. /spark profiler start — zeigt, was Zeit frisst
Ein Wert unter 18 bedeutet, dass Spieler Verzögerungen spüren. Meist steckt ein einzelnes Plugin oder eine Mob-Farm dahinter, nicht die Maschine.
Backups, ohne den Server anzuhalten#
Eine Welt im laufenden Betrieb zu kopieren erzeugt einen Zustand, den es nie gab. Der Trick besteht darin, das automatische Speichern kurz anzuhalten:
#!/bin/bash
# /usr/local/bin/mc-backup.sh
set -euo pipefail
RCON="mcrcon -H 127.0.0.1 -P 25575 -p $(cat /etc/minecraft-rcon.pass)"
ZIEL=/var/backups/minecraft
mkdir -p "$ZIEL"
$RCON "say Sicherung startet" "save-all flush" "save-off"
sleep 3
tar czf "$ZIEL/welt-$(date +%F-%H%M).tar.gz" -C /opt/minecraft/server world world_nether world_the_end
$RCON "save-on" "say Sicherung fertig"
# Ältere Stände aufräumen, Rest übernimmt restic
find "$ZIEL" -name 'welt-*.tar.gz' -mtime +7 -delete
restic backup "$ZIEL" --tag minecraft
save-off hält das Schreiben an, save-all flush schreibt vorher alles raus. Zwischen beiden Befehlen ist die Welt auf der Platte konsistent. Das save-on am Ende darf unter keinen Umständen fehlen, sonst speichert der Server bis zum nächsten Neustart nicht mehr, und ein Absturz kostet den ganzen Tag.
Der Rest der Backup-Kette, verschlüsselt, an einen zweiten Ort, einmal zurückgespielt, steht in Backup-Strategie 3-2-1.
Erreichbarkeit und Schutz#
sudo ufw allow 25565/tcp comment 'Minecraft'
Zwei weitere Punkte, die man beim ersten Server übersieht:
Whitelist statt Online-für-alle, wenn der Server privat ist:
white-list=true
enforce-whitelist=true
/whitelist add SpielerName
DDoS ist real und trifft Gameserver häufiger als Webseiten. Ein VPS-Tarif ohne Filterung ist bei Angriffen schnell offline. Wenn der Server öffentlich beworben wird, lohnt es sich, vorher zu klären, was der Anbieter an Schutz mitbringt und im Zweifel einen Anbieter zu nehmen, bei dem das ein benanntes Merkmal ist und keine Fußnote.
Wenn etwas nicht geht#
| Symptom | Erste Prüfung |
|---|---|
| Server startet nicht | journalctl -u minecraft -n 50, meist EULA oder Java-Version |
| Spieler kommen nicht rein | ss -tulpn | grep 25565, dann Firewall, dann Portfreigabe des Anbieters |
| Ruckler bei mehreren Spielern | /tps, dann view-distance und simulation-distance senken |
| Server stirbt nach Stunden | RAM: -Xmx zu hoch gesetzt, journalctl -k | grep -i oom |
| Welt springt zurück | save-off ohne save-on, Backup-Skript prüfen |
Die vorletzte Zeile ist die, die am längsten unentdeckt bleibt: Ein Server, der nachts still vom OOM-Killer beendet und von systemd neu gestartet wird, sieht morgens völlig normal aus.
Geschrieben aus dem laufenden Betrieb: MRMedia betreibt eigene Proxmox- Hosts, einen Backup-Server und Kundendienste in der EU. Fehler in einer Anleitung sind Fehler im eigenen Betrieb. Korrekturen bitte über Discord.