Minecraft Spigot-Server unter Ubuntu 22, der 2.

Pummeluff

Lt. Commander
Registriert
März 2021
Beiträge
1.054
Guten Abend,

ja, ich hab den Thread mit gleichem Namen durchaus gefunden und bewusst denselben Titel gewählt.

Problem
Wie krieg ich Geyser (2) und Floodgate zum Laufen?

TL;DR
Gemäß der Anleitung hab ich die Geyser-Spigot.jar ins plugins-Verzeichnis kopiert und den Minecraft-Server neu gestartet. Blöd nur, da liegt die Jar-Datei drin und macht so gar nichts. Allerdings gab's auch das plugins-Verzeichnis vorher nicht. Das musste ich manuell anlegen.

Kurz: Ich denke, die Anleitung taugt nicht für einen Headless-Minecraft-Server.

Schritte bis zum Problem
  1. Ich hab mir heute einen Oracle-V-Server geholt. Hatte ich schon ewig auf der Todo-Liste. Daten: 4 Cores (ARM Ampere), 24 GB RAM, 150GB Platte.
  2. Auf dem Ding hab ich Ubuntu 22 mit OpenJDK-21-JRE installiert. Ubuntu 24 gibt's bei Oracle nicht für ARM.
  3. Dann hab ich den Minecraft-Server runtergeladen und installiert.
  4. Nach Öffnen der lokalen und der Oracle-Cloud-Firewall konnte ich mich aus Minecraft über die öffentliche IP zum Server verbinden. Server ist erreichbar. Spiel läuft.
  5. Installiert (eher ausgeführt javar -jar server.jar) hab ich die server.jar in /opt/minecraft-server. Dabei wurde die Jar entpackt: *
  6. Damit die Freunde meines Sohnemannes, die mit der Bedrock-Edition zocken müssen (PS5 + Switch), sich verbinden können, wollte ich die beiden o.g. Plugins installieren: GeyserMC + Floodgate.
  7. Allerdings gibt's kein plugins-Verzeichnis. Also hab ich naiverweise einfach mal eins angelegt und die Geyser-Spigot.jar dort reinkopiert und den Server neugestartet. Und da liegt nur die Datei, vom Server böse ignoriert.

*)
Code:
 ls -l /opt/minecraft-server/
 total 50464
 -rw-r--r--  1 mcu  mcu         2 Aug 25 01:10 banned-ips.json
 -rw-r--r--  1 mcu  mcu         2 Aug 25 01:10 banned-players.json
 -rw-r--r--  1 mcu  mcu        10 Aug 24 20:18 eula.txt
 drwxr-xr-x  8 mcu  mcu      4096 Aug 24 20:17 libraries
 drwxr-xr-x  2 mcu  mcu      4096 Aug 25 01:10 logs
 -rw-r--r--  1 mcu  mcu         2 Aug 25 01:10 ops.json
 -rw-r--r--  1 root root 51627615 Aug  8 14:40 server.jar
 -rw-r--r--  1 mcu  mcu      1409 Aug 25 01:10 server.properties
 -rw-r--r--  1 mcu  mcu       108 Aug 25 01:10 usercache.json
 drwxr-xr-x  3 mcu  mcu      4096 Aug 24 20:17 versions
 -rw-r--r--  1 mcu  mcu         2 Aug 24 20:19 whitelist.json
 drwxr-xr-x 12 mcu  mcu      4096 Aug 25 01:35 world

Wie krieg ich das Plugin auf dem Server installiert?
 
Das geht auch nicht mit dem normalen/vanilla MC Server. Du musst einen Spigot oder Paper (empfohlen weil performanter) Server nutzen.

... dein Link zum Servertutorial führt zumindest zum Vanilla Server.
 
  • Gefällt mir
Reaktionen: Pummeluff
Muss es Spigot sein? Ich hab seit ein paar Tagen einen Fabric-Server mit gut 100 Mods auf Debian Ubuntu 22.04 Server laufen.

Andere Frage: Wenn der Server läuft, kannst du, bzw. dein Sohn mit dem Server verbinden?
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: Pummeluff
Blackeye33 schrieb:
Das geht auch nicht mit dem normalen/vanilla MC Server. Du musst einen Spigot oder Paper
Ich bin auf den Begriff Spigot gestoßen, konnte damit aber als Minecraft-Außenstehender nichts anfangen. Danke. Der Schubs bringt mich erst mal wieder auf den richtigen Weg.

Innensechskant schrieb:
Wenn der Server läuft, kannst du, bzw. dein Sohn mit dem Server verbinden?
Ja, geht (mittlerweile) problemlos. Da man in der Oracle-Cloud auf dem Rechner nur eine Private-IP (10.0.0.0/24, obwohl 8 eigentlich richtig wäre) also NAT bekommt, musste ich erst mal rausfinden, wie man die Ports von außen durchreicht. Das hat dann aber nach etwas Google und Suche durchaus geklappt.

Im Grunde genommen hätte ich mir dann auch die ganze komplizierte lokale Firewallkonfiguration mit nftables sparen können.

Innensechskant schrieb:
Muss es Spigot sein? Ich hab seit ein paar Tagen einen Fabric-Server mit gut 100 Mods auf Debian Ubuntu 22.04 Server laufen.
Ich brauch halt Geyser (+ Floodgate?), damit die armen Bedrock-Opfer draufkommen, die sich keinen richtigen PC leisten können.

Grad gefunden:
https://geysermc.ru/wiki/other/geyser-fabric
  • Any mod that requires clientside installation in order to join the server will not permit Bedrock clients to join.
  • Floodgate is currently not supported on Fabric.

Den Beitrag auf Reddit fand ich ganz gut.
 
Hab den Fabric 1.21.1 mit Geyser und Floodgate installiert. Läuft trotz dem Versionsunterschied.

Ein Switchspieler konnte sich auch schon verbinden.
 
So jetzt kommen die interessanten Fragen auf:

1. Server steuern
Ich hab die server.properties angepasst. Kann ich die Properties neuladen, ohne den Dienst neustarten zu müssen?

Und wenn ich den Server neustarte, bleibt die erstellte Welt dann erhalten, oder wird die auf Initialzustand zurückgesetzt?

Kann man irgendwie auf dem Server selbst Statusabfragen abschicken, z.B. wieviele User gerade eingeloggt sind? Hab dazu bisher nichts gefunden. Wär cool, wenn's eine Art Rest-API gäb, also irgendwas mir curl.

2. Adminbefehle
Serverkommandos: Wie kann ich die ohne Minecraft-Installation abschicken/ausführen? Also auch am besten über den Server selbst.

3. Mods
Gibt's Mods, die ich unbedingt haben muss? Die sollten natürlich sowohl bei den Java- als auch bei den Bedrock-Clients laufen.

4. Server absichern
Bisher hab ich gefunden, dass man über eine Whitelist (server.properties) angeben kann, welche Nutzer sich verbinden dürfen. Hab ich jetzt nicht gemacht, d.h. wer den Server findet darf drauf. Gibt's in den Minecraftserer-Config irgendwas, was ich machen sollte?

Der V-Server selbst ist natürlich zugenagelt.
 
1a. Du kannst mit dem /reload Befehl die meisten Einstellungen neuladen. Dies funktioniert jedoch recht unzuverlässig und ist auf Custom-Servern wie Spigot, Paper und Fabric mittlerweile verpöhnt weil das auch die Plugins neulädt und viele Plugins damit nicht klarkommen. Für einige Einstellungen gibt es aber auch extra commands, z.B. /whitelist on.

1b. Die Welt wird gespeichert. Je nach Server liegen die Ordner für die Welten direkt im Hauptverzeichnis oder im Verzeichnis "worlds". Der Server schreibt die Weltdaten regelmäßig im Hintergrund, bei einem Crash des Servers können aber die letzten Minuten an Änderungen verloren gehen.

1c. Der Minecraft Server kann das von anderen Spielservern bekannte Query-Protokoll: https://wiki.vg/Query
Dieses muss ggf. mit enable-query und query.port erst aktiviert werden. Es gibt für zahlreiche Skriptsprachen libraries um dieses zu nutzen. Daneben gibt es auch noch den Server List Ping den auch Clients für die Anzeige in der Server-Liste nutzen: https://wiki.vg/Server_List_Ping

2. Der Server hat eine Konsole über die der Chat, Log und eine Kommandozeile zugängig sind. Wenn du den Server einfach per java -jar server.jar startest solltest du direkt in dieser drin sein. Befehle werden ohne führenden / eingegeben. Um im Chat zu schreiben say Nachricht .... Ferner siehe 4.

3. Mods bezeichnet i.d.R. Erweiterungen die neuen Content einfügen und daher sowohl auf Client als auch Server installiert werden müssen. Plugins hingegen laufen nur auf dem Server. Mit Fabric kenne ich mich nicht aus, aber auf Spigot/Paper willst du meistens ein Logging Plugin um Griefing rückgängig machen zu können, ein Anti-Cheat (kann aber Konflikte geben mit den Bedrock Clients) und ein Plugin zur Rechteverwaltung, damit bestimmte Nutzer z.b. Teleportieren oder Kicken können. Häufig genutzt werden auch WorldEdit, WorldGuard, Multiverse, EssentialsX und und und...

4. Der Server sollte auf keinen Fall als root laufen und auch nicht als dein persönlicher Benutzer. Ich würde einen systemd Service einrichten wo der Server mit eigenem Nutzer läuft. Das Verzeichnis des Servers muss diesem Nutzer vollständig gehören.

Um noch auf die Konsole zugreifen zu können kannst du screen benutzen. Der Command um den Server zu starten lautet dann etwa: /usr/bin/screen -DmS minecraft -- /usr/bin/java -Xms4G -Xmx4G -jar server.jar nogui. 4G anpassen je nachdem wie viel RAM du dem Server geben willst. Mit mehr Spielern, Mods und Sichtweite steigen die Speicheranforderungen. Aber zu viel ist auch nicht gut weil GC Pausen länger werden und der Server anfängt zu laggen.

Eine vollständige systemd Unit /etc/systemd/system/minecraft.server sollte etwa so aussehen:
Code:
[Unit]
Description=Minecraft Server
Wants=network-online.target
After=network-online.target local-fs.target

StartLimitIntervalSec=60
StartLimitBurst=3

[Service]
User=minecraft
Group=minecraft
WorkingDirectory=/opt/minecraft

ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/minecraft /run/screen
PrivateTmp=true
NoNewPrivileges=true

Type=exec
ExecStart=/usr/bin/screen -DmS minecraft -- /usr/bin/java -Xms4G -Xmx4G -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 -XX:-DontCompileHugeMethods -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -DIReallyKnowWhatIAmDoingISwear -jar server.jar nogui

ExecStop=/usr/bin/screen -S minecraft -p 0 -X stuff "stop^M"
ExecStop=/bin/sh -c 'while kill -0 $MAINPID 2>/dev/null; do sleep 1; done'

Restart=always
TimeoutStopSec=120
KillSignal=SIGINT

[Install]
WantedBy=multi-user.target

Zugriff auf die Konsole dann mit sudo -u minecraft -- script -c "screen -x minecraft" /dev/null. Auto-Start bei Boot aktivieren mit sudo systemctl enable minecraft. Start/Stop/Restart mit sudo systemctl [start|stop|restart] minecraft.
 
  • Gefällt mir
Reaktionen: Pummeluff
Die Systemd-Unit, die ich bisher zusammengebastelt hatte:
Code:
[Unit]
Description=Minecraft Server
After=network.target

[Service]
User=mcu
Group=mcu
PrivateTmp=yes
RemoveIPC=yes
Type=simple
Restart=always
WorkingDirectory=/opt/minecraft-server
ExecStart=java -Xms16384M -Xmx16384M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+Unlo>
#ExecStart=java -jar -Xmx4G -Xms1G -XX:SoftMaxHeapSize=3G -XX:+UnlockExperimentalVMOptions -XX:+UseZGC /opt/minecraft-server/server.jar --nogui
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target
Ich merge mal die beiden zusammen.

Der Umweg über screen, um an die Konsole zu kommen, erscheint mir etwas dreckig. Aber vermutlich lässt sich das nicht brauchbarer regeln.

Vielen Dank für die Anregungen. Hilft mir weiter.

Marco01_809 schrieb:
Je nach Server liegen die Ordner für die Welten direkt im Hauptverzeichnis oder im Verzeichnis "worlds".
Hab jetzt das world-Verzeichnis in die Ebene darüber verschoben und ins Minecraft-Verzeichnis verlinkt. Damit lösch ich nicht aus Versehen die Daten beim Update.

Marco01_809 schrieb:
ExecStop=/usr/bin/screen -S minecraft -p 0 -X stuff "stop^M"
War der Zeilenumbruch gewollt? Systemd verweigerte mir die Zeile mit:
Code:
Unbalanced quoting, ignoring: "/usr/bin/screen -S minecraft -p 0 -X stuff "stop"
Ich hab das "^M" mal rausgenommen.
 
Zuletzt bearbeitet:
Update:
Ok, das "^M" ist notwendig, sonst hängt das Stop-Kommando. Muss mal sehen, ob ich das irgendwie eleganter hinbekomm.

Und die Konsolebefehle funktionieren im Screen. :)
Code:
/list
[13:51:07] [Server thread/INFO]: There are 0 of a max of 20 players online:
 
Pummeluff schrieb:
Der Umweg über screen, um an die Konsole zu kommen, erscheint mir etwas dreckig. Aber vermutlich lässt sich das nicht brauchbarer regeln.
Najo dafür haben die meisten Server forks mit JLine aber auch eine echt gute readline-ähnliche Shell. Mit Plugins oder Wrapper Daemons kann man auch remote shells kriegen aber das läuft nie so reibungslos und sicher wie screen über die SSH-Verbindung die du eh schon hast.

Pummeluff schrieb:
Hab jetzt das world-Verzeichnis in die Ebene darüber verschoben und ins Minecraft-Verzeichnis verlinkt. Damit lösch ich nicht aus Versehen die Daten beim Update.
Löschen solltest du bei einem Update gar nichts aus dem Ordner. Du tauschst nur die server.jar und die plugin/mod jars durch die neueren Versionen aus. Die plugins legen gerne Daten in plugins/PluginName/ ab. Darum den ganzen Server-Ordner backuppen, auch die Konfigurationsdateien. Es hat sich in dem Umfeld leider etabliert dass Plugins ihre Config (plugins/PluginName/config.yml) lesen, neue Felder hinzufügen, dann wieder ausschreiben.

Bei einem Vanilla Minecraft server gibt es übrigens mindestens 3 Welten, die Overworld (world), den Nether (world_nether) und The End (world_the_end). Die werden aber erst generiert wenn sie von Spielern betreten werden.

Pummeluff schrieb:
War der Zeilenumbruch gewollt? Systemd verweigerte mir die Zeile mit:
Code:
Unbalanced quoting, ignoring: "/usr/bin/screen -S minecraft -p 0 -X stuff "stop"
Ich hab das "^M" mal rausgenommen.
Der Zeilenumbruch ist notwendig. Der Befehl tippt tatsächlich einfach "stop<ENTER>" in die screen um den Server zu stoppen. Ohne den Umbruch wird der Befehl nicht abgeschickt und systemd wartet ganze 120 Sekunden auf nichts. Der Zeilenumbruch ist aber "fake", also in der unit sollten zwei normale ASCII bytes ^ und M stehen. Das wird von screen dann später übersetzt.

Wenn der Server mit deiner Unit bisher aber korrekt heruntergefahren ist (kann man schauen ob der letzte log mit den shutdown Meldungen endet) kannst du die ExecStop= ganz rausnehmen. Die längste Zeit kamen die meisten Server Forks mit Signalen nicht richtig klar (Ist eben Java ^^).
 
  • Gefällt mir
Reaktionen: Pummeluff
Marco01_809 schrieb:
Najo dafür haben die meisten Server forks mit JLine aber auch eine echt gute readline-ähnliche Shell. Mit Plugins oder Wrapper Daemons kann man auch remote shells kriegen aber das läuft nie so reibungslos und sicher wie screen über die SSH-Verbindung die du eh schon hast.
screen ist obsolet. Verwendet man nicht mehr. Wenn dan tmux. Ist aber beides nicht der eigentliche Einsatzzweck der terminal multiplexer. Der vorgesehene Weg ist über RCON lokal dass ganze laufen zu lassen. Also RCON nicht nach außen frei zu geben sondern über localhost sich verbinden und dann die Befehle abfeuern.
 
  • Gefällt mir
Reaktionen: Pummeluff
Marco01_809 schrieb:
in der unit sollten zwei normale ASCII bytes ^ und M stehen.
Ok, das war dann mein Fehler. In VIM erzeugt man einen Zeilenumbruch mit <Strg+V> M.

@graywolf2: Screen ist durchaus nicht obsolet, auch wenn ich lieber Tmux verwende. Screen wird trotzdem noch gepflegt.

Ich werd mich mal in rcon einlesen. Danke dafür.
 
graywolf2 schrieb:
screen ist obsolet.
Oh gott, ich glaube die screen Leute wissen das gar nicht. Die programmieren immer noch weiter 😱
1724848761829.png

tmux kann man natürlich nehmen wenn man das bevorzugt.

Hab RCON noch nie im Einsatz gesehen auf MC Servern, schnelles googlen zeigt auch eher ein ernüchterndes Bild. Für scripts oder wenn man mangels root den Service nicht selber aufsetzen kann vielleicht als Notlösung brauchbar, aber für interaktive Verwendung ist das nichts.
Incoming payload is the output of the command, though many commands return nothing, and there's no way of detecting unknown commands.
Das extra Passwort ist auch reichlich nutzlos bei lokalem Zugriff, da verlass ich mich doch lieber auf meine linux permissions bzw. sudoers rules.
 
Zuletzt bearbeitet:
Wozu sollte man denn neue Features wollen? Screen bietet schon wesentlich mehr als man für diesen use-case brauchen kann. Und die meisten TTY tools folgen Terminal Gegebenheiten aus den 70ern-80ern, an der ganzen Sache ändert sich nicht mehr so oft was... Screen ist einfach fertig, bugfixes reichen doch vollkommen.

Wie gesagt wer tmux bevorzugt soll das nehmen. screen ist halt bekannt als die Standard-Lösung für genau diesen use-case.
 
Hast du nicht gerade noch mit skripten argumentiert? multiplex Eingaben bzw. Skripte sind die Stärke von tmux gegenüber screen.
 
Ich hab jetzt mal rcon ausprobiert und zu 90% begeistert.

Installation: apt install rcon
Config: /etc/rcon.conf
Code:
[localhost]
host=localhost
port=25575
passwd=mcu
Nutzung: rconshell localhost

Anpassung in den server.properties (PW egal, ist sowieso nur auf dem localhost erreichbar):
Code:
broadcast-rcon-to-ops=true
enable-rcon=true
rcon.password=mcu
rcon.port=25575

Was mir jetzt nicht so passt:
Code:
RCON localhost:25575> help
/advancement (grant|revoke)/attribute <target> <attribute> (get|base|modifier)/execute (run|if|unless|as|at|store|positioned|rotated|facing|align|anchored|in|summon|on)/bossbar (add|remove|list|set|get)/clear [<targets>]/clone (<begin>|from)/damage <target> <amount> [<damageType>]/data (merge|get|remove|modify)/datapack (enable|disable|list)/debug (start|stop|function)/defaultgamemode <gamemode>/difficulty [peaceful|easy|normal|hard]/effect (clear|give)/me <action>/enchant <targets> <enchantment...

RCON localhost:25575> list
There are 0 of a max of 20 players online:
Ein Zeilenumbruch hätte der Ansicht durchaus gut getan.

Die rconshell lass ich jetzt im Tmux laufen.

Mein minecraft-server.service: Den Screen hab ich wieder rausgeschmissen.

Code:
[Unit]
Description=Minecraft Server
Wants=network-online.target
After=network-online.target local-fs.target
StartLimitIntervalSec=60
StartLimitBurst=3

[Service]
User=mcu
Group=mcu
PrivateTmp=yes
RemoveIPC=yes
Restart=always
WorkingDirectory=/opt/minecraft-server
ProtectSystem=strict
ProtectHome=true
ReadWritePaths=/opt/minecraft-server
NoNewPrivileges=true
ExecStart=java -Xms16384M -Xmx16384M -XX:+AlwaysPreTouch -XX:+DisableExplicitGC -XX:+ParallelRefProcEnabled -XX:+PerfDisableSharedMem -XX:+UnlockExperimentalVMOptions -XX:+UseG1GC -XX:G1HeapRegionSize=8M -XX:G1HeapWastePercent=5 -XX:G1MaxNewSizePercent=40 -XX:G1MixedGCCountTarget=4 -XX:G1MixedGCLiveThresholdPercent=90 -XX:G1NewSizePercent=30 -XX:G1RSetUpdatingPauseTimePercent=5 -XX:G1ReservePercent=20 -XX:InitiatingHeapOccupancyPercent=15 -XX:MaxGCPauseMillis=200 -XX:MaxTenuringThreshold=1 -XX:SurvivorRatio=32 -Dusing.aikars.flags=https://mcflags.emc.gs -Daikars.new.flags=true -jar /opt/minecraft-server/server.jar --nogui
SuccessExitStatus=143

[Install]
WantedBy=multi-user.target

Marco01_809 schrieb:
4G anpassen je nachdem wie viel RAM du dem Server geben willst. Mit mehr Spielern, Mods und Sichtweite steigen die Speicheranforderungen. Aber zu viel ist auch nicht gut weil GC Pausen länger werden und der Server anfängt zu laggen.
Ja, das hab ich auch schon gelesen. Mein V-Server hat 4 ARM-CPUs, dafür aber 24GB RAM. Davon hab ich naiverweise mal 16GB Minecraft spendiert. Ist das schlecht?

Aktuell hab ich die Settings aus dem Skript-Generator. mit den Aikar's Flags verwendet.
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: graywolf2
Zurück
Oben