Zum Hauptinhalt springen
S-EDV news
← Alle Anleitungen
📘 Anleitung Linux 13.06.2026 · 10 min Lesezeit

Minecraft-Server auf netcup VPS aufsetzen und dauerhaft betreiben (Purpur, systemd, Backup)

Purpur-Minecraft-Server auf einem netcup VPS einrichten: eigener Systembenutzer, Java 25, systemd-Dienst mit sauberem Herunterfahren, richtige Freigabe in der netcup-Firewall und tägliches Backup.

Geprüft am 11.10.2026 · für Purpur 26.3 Build 2642, netcup Firewall Helpcenter Stand 30.09.2026

WerbelinksMit * markierte Links sind Werbelinks: Bei einem Kauf erhalten wir eine Provision, der Preis bleibt gleich. Mehr dazu

PC mit Glasseitenteil und Landschaftsmodell aus Blöcken mit Wasserfall auf einem Schreibtisch vor Fenster mit Bergblick

Ein eigener Minecraft-Server gibt Ihnen volle Kontrolle über Plugins, Whitelist und Spielregeln. Diese Anleitung richtet auf einem netcup VPS mit Debian oder Ubuntu einen Server mit Purpur ein, einem Fork von Paper, der alle Bukkit- und Paper-Plugins unterstützt und zusätzliche Einstellungen für Mobs und Gameplay bietet. Sie legen einen eigenen Systembenutzer an, installieren die passende Java-Version, betreiben den Server als systemd-Dienst mit sauberem Herunterfahren, öffnen den Port in der netcup-Firewall und richten ein tägliches Backup ein.

Voraussetzungen

  1. netcup VPS mit mindestens 4 GB RAM, besser 8 GB (siehe Tabelle), und Zugang zum Server Control Panel (SCP)
  2. Debian 12 oder 13 bzw. Ubuntu 24.04 LTS
  3. SSH-Zugang mit sudo-Rechten, idealerweise per Schlüssel (siehe SSH-Key-Authentifizierung einrichten)
  4. Minecraft: Java Edition auf den Clients in derselben Version wie der Server
  5. Optional: eigene Domain für einen SRV-Record, damit Spieler ohne Portangabe verbinden

Ressourcen nach Spielerzahl

Richtwerte für Purpur ohne große Modpacks. Redstone-Anlagen, viele Plugins oder große Sichtweiten erhöhen den Bedarf.

RAM des VPSvCoresHeap (-Xmx)Gleichzeitige Spieler
4 GB22–2,5 GBbis 5
8 GB45–6 GB10–20
16 GB812 GB20–40

Lassen Sie mindestens 1,5 bis 2 GB RAM für Betriebssystem und JVM-Overhead frei.

Purpur-Versionen und Java-Anforderungen

Minecraft-VersionPurpur-BuildJavaBemerkung
1.21.x (bis 1.21.11)älter, keine neuen BuildsJava 21nur für bestehende Welten
26.32642 (Stand 30.09.2026)Java 25aktuelle Version, für neue Server

Seit 2026 zählt Mojang die Versionen nach Jahr (26.1, 26.2 …). Die Java-Version schreibt Mojang je Minecraft-Version vor; ab 26.1 ist Java 25 Pflicht.

Schritt 1: System vorbereiten und Java installieren

Aktualisieren Sie das System und installieren Sie Java aus dem Azul-Zulu-Repository als headless-Paket ohne GUI-Abhängigkeiten, dazu screen für die Serverkonsole.

sudo apt-get update && sudo apt-get upgrade -y
sudo apt-get install -y gnupg curl ca-certificates screen

# Azul-Zulu-Repository einbinden
curl -fsSL https://repos.azul.com/azul-repo.key | sudo gpg --dearmor \
  -o /usr/share/keyrings/azul.gpg
echo "deb [signed-by=/usr/share/keyrings/azul.gpg] https://repos.azul.com/zulu/deb stable main" | \
  sudo tee /etc/apt/sources.list.d/zulu.list

sudo apt-get update
# Minecraft 26.x: Java 25 (für 1.21.x stattdessen zulu21-jdk-headless)
sudo apt-get install -y zulu25-jdk-headless

Verifizieren: java -version zeigt openjdk version "25…" mit Zulu25. Erscheint eine andere Version, wählen Sie mit sudo update-alternatives --config java die richtige.

Schritt 2: Eigenen Systembenutzer anlegen

Betreiben Sie den Server nie als root: Eine Lücke in einem Plugin hätte sonst Vollzugriff auf das System. Der Benutzer minecraft erhält keine Login-Shell.

sudo useradd --system --create-home \
  --shell /usr/sbin/nologin \
  --home-dir /opt/minecraft minecraft
sudo mkdir -p /opt/minecraft/server /opt/minecraft/backups
sudo chown -R minecraft:minecraft /opt/minecraft

Verifizieren: id minecraft zeigt den Benutzer, ls -ld /opt/minecraft/server den Besitzer minecraft.

Schritt 3: Purpur-JAR herunterladen und EULA akzeptieren

Die Purpur-API liefert unter https://api.purpurmc.org/v2/purpur/VERSION/latest/download den neuesten Build einer Minecraft-Version. Die verfügbaren Versionen listet curl -s https://api.purpurmc.org/v2/purpur.

MC_VERSION="26.3"
cd /opt/minecraft/server
sudo -u minecraft curl -fL -o purpur.jar \
  "https://api.purpurmc.org/v2/purpur/${MC_VERSION}/latest/download"

# Erster Start legt eula.txt und die Konfiguration an und beendet sich dann
sudo -u minecraft java -jar purpur.jar --nogui
sudo -u minecraft sed -i 's/^eula=false/eula=true/' eula.txt

Mit eula=true bestätigen Sie die Minecraft-EULA von Mojang; ohne diesen Eintrag startet der Server nicht.

Verifizieren: cat /opt/minecraft/server/eula.txt enthält eula=true, im Verzeichnis liegen server.properties und purpur.yml.

Schritt 4: Startskript mit Aikars G1GC-Flags anlegen

Die Flags von Aikar sind die verbreitete Empfehlung für Paper-basierte Server. Setzen Sie -Xms und -Xmx gleich, damit der Heap nicht zur Laufzeit wächst. Beispiel für einen VPS mit 8 GB RAM:

sudo -u minecraft tee /opt/minecraft/server/start.sh > /dev/null << 'EOF'
#!/bin/bash
cd /opt/minecraft/server
exec java \
  -Xms6G -Xmx6G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:G1MixedGCCountTarget=4 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 \
  -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -jar purpur.jar --nogui
EOF
sudo chmod +x /opt/minecraft/server/start.sh

Bei 16 GB RAM setzen Sie -Xms12G -Xmx12G; ab 12 GB Heap empfiehlt Aikar zusätzlich G1NewSizePercent=40, G1MaxNewSizePercent=50, G1HeapRegionSize=16M, G1ReservePercent=15 und InitiatingHeapOccupancyPercent=20.

Verifizieren: bash -n /opt/minecraft/server/start.sh meldet keinen Syntaxfehler.

Schritt 5: systemd-Service einrichten und aktivieren

Der Dienst startet den Server beim Booten in einer screen-Sitzung namens minecraft. Über diese Sitzung schickt ExecStop eine Ankündigung, save-all und stop an die Serverkonsole; dasselbe nutzt später das Backup-Skript. screen -DmS bleibt im Vordergrund, sodass systemd den Prozess überwacht.

sudo tee /etc/systemd/system/minecraft.service > /dev/null << 'EOF'
[Unit]
Description=Purpur Minecraft Server
Wants=network-online.target
After=network-online.target

[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft/server
ExecStart=/usr/bin/screen -DmS minecraft /opt/minecraft/server/start.sh
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "say Server wird heruntergefahren\n"'
ExecStop=/bin/sleep 3
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "save-all\n"'
ExecStop=/bin/sleep 5
ExecStop=/usr/bin/screen -p 0 -S minecraft -X eval 'stuff "stop\n"'
TimeoutStopSec=90
Restart=on-failure
RestartSec=10
ProtectSystem=full
PrivateTmp=true
NoNewPrivileges=true

[Install]
WantedBy=multi-user.target
EOF

sudo systemctl daemon-reload
sudo systemctl enable --now minecraft.service

Verifizieren: systemctl status minecraft zeigt active (running), sudo -u minecraft screen -ls die Sitzung minecraft. Die Konsole öffnen Sie mit sudo -u minecraft screen -r minecraft und verlassen sie mit Strg+A, dann D, ohne den Server zu stoppen. Das Serverlog steht in /opt/minecraft/server/logs/latest.log; Done (…s)! For help, type "help" meldet den fertigen Start. sudo systemctl restart minecraft muss im Log Saving worlds zeigen.

Schritt 6: netcup-Firewall konfigurieren

Die Firewall im netcup Server Control Panel filtert vor dem Server. Neue Server erlauben zunächst allen Verkehr. Wichtig: Sobald Sie die erste eigene INGRESS-Regel speichern, wechselt die implizite Eingangsregel auf DROP; dasselbe gilt für EGRESS. Legen Sie deshalb die SSH-Regel zuerst an und keine EGRESS-Regel, sonst blockiert die Firewall allen ausgehenden Verkehr, auch Updates und die Anmeldung der Spieler bei den Mojang-Servern.

Für Minecraft: Java Edition genügt TCP. Die Firewall ist für TCP zustandsbehaftet und lässt Antworten automatisch zu.

  1. Öffnen Sie das SCP (servercontrolpanel.de), wählen Sie den Server und den Bereich Firewall.
  2. Legen Sie eine Policy an, z. B. Minecraft.
  3. Regel 1: INGRESS, TCP, Zielport 22, ACCEPT (SSH).
  4. Regel 2: INGRESS, TCP, Zielport 25565, ACCEPT.
  5. Weisen Sie die Policy dem Server zu und speichern Sie.

UDP brauchen Sie nur, wenn Sie in server.properties enable-query=true setzen. Da netcup UDP nicht zustandsbehaftet filtert, sind dann eine INGRESS-Regel (UDP, Zielport 25565) und eine EGRESS-Regel (UDP, Quellport 25565) nötig; weil jede EGRESS-Regel den übrigen ausgehenden Verkehr sperrt, ergänzen Sie in dem Fall eine EGRESS-Regel ACCEPT für alle Protokolle und Ziele.

Als zweite Ebene auf dem VPS selbst:

sudo apt-get install -y ufw
sudo ufw allow OpenSSH
sudo ufw allow 25565/tcp
sudo ufw enable

Verifizieren: Verbinden Sie sich mit einem Minecraft-Client auf SERVER-IP:25565. Von einem anderen Linux-Rechner prüft nc -vz SERVER-IP 25565 die Erreichbarkeit; eine neue SSH-Sitzung muss weiterhin funktionieren.

Schritt 7: Automatisches Backup per cron einrichten

Das Skript schaltet das automatische Speichern ab (save-off), schreibt alle Welten (save-all flush), archiviert das gesamte Serververzeichnis ohne Logs und Caches und schaltet das Speichern wieder ein. So sind alle Welten, Plugin-Daten und Konfigurationen enthalten, unabhängig vom Ordneraufbau der Welten. Archive älter als 7 Tage löscht es.

sudo -u minecraft tee /opt/minecraft/backup.sh > /dev/null << 'EOF'
#!/bin/bash
set -u
BACKUP_DIR="/opt/minecraft/backups"
SERVER_DIR="/opt/minecraft/server"
DATE=$(date +%Y-%m-%d_%H-%M)
RETENTION_DAYS=7
send() { screen -p 0 -S minecraft -X eval "stuff \"$1\n\"" 2>/dev/null; }

send "save-off"
send "save-all flush"
sleep 10

tar -czf "${BACKUP_DIR}/backup_${DATE}.tar.gz" \
  --exclude=./logs --exclude=./cache --exclude=./libraries --exclude=./versions \
  -C "$SERVER_DIR" .
RC=$?

send "save-on"
find "$BACKUP_DIR" -name 'backup_*.tar.gz' -mtime +"$RETENTION_DAYS" -delete
echo "$(date) Backup backup_${DATE}.tar.gz, tar-Exitcode $RC"
exit $RC
EOF
sudo chmod +x /opt/minecraft/backup.sh

# Täglich um 04:00 Uhr
(sudo crontab -u minecraft -l 2>/dev/null; echo "0 4 * * * /opt/minecraft/backup.sh >> /opt/minecraft/backup.log 2>&1") \
  | sudo crontab -u minecraft -

Die Archive liegen auf demselben VPS. Kopieren Sie sie zusätzlich auf ein externes Ziel, etwa per rsync oder mit einem Backup-Werkzeug wie Restic.

Verifizieren: sudo -u minecraft /opt/minecraft/backup.sh endet mit tar-Exitcode 0. tar -tzf /opt/minecraft/backups/backup_*.tar.gz | grep level.dat listet die Welten; sudo crontab -u minecraft -l zeigt den Eintrag.

Purpur aktualisieren

Erstellen Sie vor jedem Update ein Backup und prüfen Sie, ob Ihre Plugins die neue Minecraft-Version unterstützen. Ein Wechsel auf eine ältere Minecraft-Version ist nicht vorgesehen und beschädigt Welten. Für einen neuen Build derselben Version bleibt MC_VERSION gleich.

MC_VERSION="26.3"
sudo -u minecraft /opt/minecraft/backup.sh
sudo systemctl stop minecraft
cd /opt/minecraft/server
sudo -u minecraft cp purpur.jar purpur.jar.bak
sudo -u minecraft curl -fL -o purpur.jar \
  "https://api.purpurmc.org/v2/purpur/${MC_VERSION}/latest/download"
sudo systemctl start minecraft

Verifizieren: tail -f /opt/minecraft/server/logs/latest.log zeigt die neue Version beim Start und abschließend Done.

Typische Fehler und Lösungen

Server startet nicht: „Failed to bind to port“

Port 25565 ist belegt, meist durch einen Java-Prozess aus einem manuellen Startversuch. sudo ss -tlnp | grep 25565 zeigt den Prozess; beenden Sie ihn mit sudo pkill -u minecraft java und starten Sie den Dienst neu.

Server startet nicht: EULA-Fehler

In /opt/minecraft/server/eula.txt muss eula=true stehen.

Out-of-Memory-Kill (OOM)

sudo journalctl -k | grep -i "killed process" zeigt, ob der Kernel Java beendet hat. Dann ist -Xmx zu hoch für den RAM des VPS; reduzieren Sie -Xms und -Xmx um 1 GB.

SSH-Verbindung nach Firewall-Konfiguration verloren

Die erste INGRESS-Regel hat die implizite Regel auf DROP gesetzt, ohne dass SSH erlaubt war. Melden Sie sich über die Konsole im SCP an bzw. ergänzen Sie dort die SSH-Regel.

Spieler können nicht beitreten oder Updates scheitern nach Firewall-Änderung

Eine EGRESS-Regel hat die implizite Ausgangsregel auf DROP gesetzt; der Server erreicht die Mojang-Anmeldeserver nicht, Spieler sehen „Authentication servers are down“ oder die Verbindung bricht ab. Entfernen Sie die EGRESS-Regel oder ergänzen Sie eine EGRESS-Regel ACCEPT für allen Verkehr.

Falsches Java

Eine zu alte Java-Version meldet beim Start UnsupportedClassVersionError. Minecraft 26.x braucht Java 25, 1.21.x Java 21. Prüfen Sie mit java -version und wählen Sie mit sudo update-alternatives --config java die richtige Version.

Häufige Fragen

Wie viele Spieler passen auf einen VPS mit 8 GB RAM?

Mit -Xmx6G und Purpur realistisch 10 bis 20 gleichzeitige Spieler in einer Vanilla-nahen Welt. Minispiele, viele Plugins oder große Redstone-Anlagen senken die Grenze. Die Auslastung zeigt der Befehl mspt bzw. tps in der Konsole; Werte über 50 ms pro Tick bedeuten Verzögerungen.

Können Sie den VPS später vergrößern?

Die Upgrade-Möglichkeiten Ihres Produkts zeigt das netcup Customer Control Panel (CCP). Erstellen Sie vorher ein Backup und passen Sie danach -Xms/-Xmx in start.sh an.

Was ist der Unterschied zwischen Purpur und Paper oder Spigot?

Paper ist ein leistungsoptimierter Fork von Spigot, Purpur ein Fork von Paper mit der zusätzlichen Konfigurationsdatei purpur.yml für Mobs, Spielerverhalten und Gameplay. Bukkit-, Spigot- und Paper-Plugins laufen auf Purpur. Brauchen Sie die zusätzlichen Optionen nicht, genügt Paper.

Wie verbinden Sie sich mit der Serverkonsole?

Mit sudo -u minecraft screen -r minecraft. Strg+A, dann D trennt die Sitzung, ohne den Server zu stoppen. Geben Sie in der Konsole nicht stop ein, wenn der Server laufen soll; systemd startet ihn nach einem sauberen Stop nicht neu.

Brauchen Sie ufw zusätzlich zur netcup-Firewall?

Nicht zwingend. Als zweite Ebene ist ufw sinnvoll, vor allem wenn weitere Dienste auf dem VPS laufen oder die SCP-Policy versehentlich entfernt wird. Das Zusammenspiel beschreibt die unten verlinkte Anleitung zur SCP-Firewall.

Fazit

Mit eigenem Systembenutzer, passender Java-Version, systemd-Dienst mit sauberem Herunterfahren und einer reinen TCP-Freigabe in der netcup-Firewall läuft Purpur stabil im Dauerbetrieb. Die häufigsten Fehler sind eine fehlende SSH-Regel vor der ersten Firewall-Regel und eine EGRESS-Regel, die den ausgehenden Verkehr sperrt. Tägliche Backups mit Kopie auf ein externes Ziel schützen die Welten.

Weiterführende Anleitungen und Quellen

  1. netcup vServer bestellen: vom CCP bis zum ersten SSH-Login
  2. netcup SCP-Firewall einrichten: Policies, Regeln und Zusammenspiel mit ufw
  3. VPS absichern und härten: UFW, SSH-Keys und Fail2Ban
  4. systemd-Service selbst erstellen und verwalten
  5. Cron und crontab richtig nutzen – die Grundlagen
  6. PurpurMC offizielle Dokumentation: purpurmc.org/docs/purpur/installation
  7. netcup Firewall-Dokumentation: netcup.com Helpcenter
  8. Minecraft Wiki – Server Startup Script: minecraft.wiki