Meine Kinder sind mein Motor, nix treibt Vorhaben so voran, wie sie. Selbst der Umzug des Homeservers auf neue Hardware – die hier schon zu lange rumliegt – treiben sie an. Ein paar wenig enthusiastische Anläufe hab ich jetzt schon unternommen gehabt; Die sind aber versandet. Der Einbau der größeren SSD scheiterte zum Beispiel am physischen Format, ein Adapter war nötig. Bestellt, eingebaut, bootet … Pause. Vielleicht war Alpine dann auch nicht die beste Idee fürs Server-Betriebsystem; Nicht, das Alpine das nicht kann, ich kenne Alpine nicht gut. Debianbasiertes und Arch sind eher meine Linux-Heimat; Alpine hab‘ ich noch nie probiert. Getriggert wurde der Switch zu Alpine von einem ‚Hilferuf‘ des Debian Maintainers, dass zu wenige beitragen und zu viel verwaiste Peckages rumliegen. Sowas gruselt mich ein bisschen, weil ich den Kisten zu Hause die fürs digitale Familienleben essenziellen Dinge anvertraue.

Alpine, Minecraft und ich

Mich in Alpine einzulesen hat mich mehr gefordert, als ich zugeben wöllte. Aber jetzt hat die Sidequest „Internet Exposed Minecraft Server“ zum nächsten, ernsthafteren Anlauf geführt. Jannika will unbedingt mit ihrer Freundin gemeinsam Minecraft zocken. Debian hatte ich kurz nochmal probiert, weil ich dachte, es geht schneller, wenn ich mich auf dem System schon gut auskenne. Aber wenn das Ethernet Device nicht direkt erkannt wird … Nee, keinen Bock. Dann ist halt doch das Alpine Linux drauf geblieben, mit dem ich angefangen hatte. So wahnsinnig anders, als Debian früher war, ist’s nun auch nicht. Das Prinzip ist das gleiche, die Befehle nur manchmal anders.

Im Prinzip gefällt mir Alpine sogar sehr gut! OpenRC als Startsystem für Services ist wirklich schön und einfach. Nachdem avahi fürs interne Finden von Geräten im Netzwerk drauf war und OpenSSH auch, konnte ich eigentlich schon alles für den Minecraftserver vorbereiten:

  • Eigenen User einrichten, der den PaperMC ausführen wird
  • Backup vom alten PaperMC auf dem Raspi kopieren. Schick.
  • Als Service soll das Teil auch starten, gleich nach dem Bootup, aber erst wenn Netzwerk da ist.

Letzteres ist mit einem kurzen Script in /etc/init.d/ schnell erledigt.

Das Problem dabei ist, dass man nicht mehr an die Serverconsole des PaperMC ran kommt, wenn der erstmal in den Hintergrund gedrückt wurde. Ich müsste die in Minecraft integrierte Remote Management Console freischalten, und da streubt es sich in mir. Bisher hab ich den Server auf dem Raspi händisch in einem screen gestartet und dann detached. Auf dem Raspi kann ich mich jederzeit per SSH einloggen und den screen zurückholen. Da der Raspi selten neu booten muss, war das Setup erstmal ok.

Automatik in OpenRC

Auf dem neuen Rechner will ich da nicht hinterherhirscheln, das muss von selber gehen. Für den simplen PaperMC-Start hatte ich ein Script geschrieben, das einen screen detached und mit Namen startet und drinnen einfach der PaperMC-Server ausführt: papermc.sh

#!/bin/sh
cd /opt/minecraft/papermc/
/usr/bin/screen -dmS MinecraftServer /usr/bin/java -Xms2048M -Xmx2048M -jar papermc.jar nogui

Ausführbar ist das durch den User für den Server (schreibbar nicht). Mit einem doas -u minecraft papermc.sh läuft das dann auch im Kontext des richtigen Users, der nur minimal die Rechte hat, die er dafür braucht. Piped man in das screen ein stopp-Kommando doas -u minecraft /usr/bin/screen -S MinecraftServer -X stuff 'stop\n' endet nicht nur der java-Teil, sondern auch das screen endet.

Das Script könnte ich jetzt direkt in OpenRC rufen, das hat aber Nachteile: OpenRC ‚guckt dann nicht auf den richtigen Prozess und meldet trotz laufendem Server eine ‚Service crashed‘ im status. Also schreiben wir die nötigen Zeilen direkt in /etc/init.d/minecraft:

#!/sbin/openrc-run
name="PaperMC"
description="papermc minecraft server"
command="/usr/bin/screen"
directory="/srv/minecraft/papermc"
command_args="-dmS papermc /usr/bin/java -Xms2048M -Xmx2048M -jar papermc.jar nogui"
command_user="minecraft"
command_background=true
pidfile="/run/screen_papermc.pid"

depend() {
need net
}

stop() {
ebegin "Stopping PaperMC gracefully"

su -s /bin/sh minecraft -c \
'/srv/minecraft/papermc/stop_papermc.sh'

eend $?
}

Achja: Ausführbar muss das sein chmod u+x /etc/init.d/minecraft.

Im stop_papermc.sh script wird ein ’stop‘ ins screen geschickt, worauf der Server und das screen endet. Wir warten in einer Schleife darauf, dass der Server die Nutzer benachrichtigt hat und dann sauber alles gespeichert und sich beendet hat.

#!/bin/bash
PAPERMCPID=$(/usr/bin/pgrep -f "java .*papermc.jar")
if [[ -z $PAPERMCPID ]];
then
exit 1;
fi

/usr/bin/screen -S papermc -p 0 -X stuff 'say Server fährt herunter in 10 Sekunden …\n'
sleep 10
/usr/bin/screen -S papermc -p 0 -X stuff 'stop\n'
((count=0))
until [[ -z $(/usr/bin/pgrep -f "java .*papermc.jar") ]];
do
sleep 1;
((count=count+1))
if [[ $count -gt 20 ]];
then
exit 1;
fi
done

Zuletzt soll unser ganzer schöner start-stop-minecraft dann auch beim boot/shutdown ausgeführt werden: rc-update add minecraft default

Für die Erreichbarkeit von außen hab ich eine Subdomain eingerichtet, die per dynDNS ihre IP bekommt. Der Updater dafür ist ddclient. Loch in Router gebohrt, dass der Weiß, wohin der Minecraft-Server-Traffic soll. Geht. Ganz wunderbar.

Es gilt noch zu schauen, wie die Kinder sich unterhalten – weil: nur miteinander schreiben, während man in Minecraft fleißig baut, ist ja auch doof. Vorerst löst ein Talk-Chatroom auf meiner Nextcloud das Problem. Irgendein Plugin für Minecraft wird das aber wahrscheinlich schöner lösen könne.

(swg)