The missing Link of the Minecraft Server in the Kinderzimmer

tl;dr

Minecraft als Familienspiel: Vor wenigen Tagen berichtet Ralf Stockman in Episode FS276 der Freakshow über Minecraft als Familienspie - und verweist auf seine umfassende Zusammenfassung zur Installation und Setup. Hier werden einige “missing Links” ergänzt, insbesondere, wenn der Server selbst in Docker gehostet wird.

Hintergrund

DALL·E 3 generiertes Bild, Prompt: Hacker Dad, der mit seinem Sohn Minecraft spielt und viel Spaß dabei hat.

Mein (jetzt) 6-jähriger Sohn liegt mir schon seit geraumer Zeit in den Ohren, dass er Minecraft spielen möchte. Wir sind so verblieben, dass ich vorschlug es zu kaufen wenn das Spiel im Sonderangebot zu haben sei. Seither kommt täglich die Frage, ob Minecraft im Sonderangebot ist. Ok, selbst schuld. Warum ich es bisher hinausgezögert habe, ist die geringe Kontrolle im gesamten Ökosystem. Da kam der Bericht bzw. der Zusammenschreib von Ralf Stockman gerade recht. Am Ende hat es mich ein Abend und ein Vormittag gekostet alles aufzusetzen. Und 100€ für Lizenzen auf zwei Plattformen als auch den Gebühren für Nintendo Online und XBOX Live. Danke der Anleitung von Ralf hat es mich nur 5% der Nerven gekostet, die so ein Unterfangen sonst hätte - mit zwei kleinen Kindern im Haushalt. Betroffene wissen sehr wohl, wovon ich rede.

Setup

Das hier zugrundeliegende Setup unterscheidet sich leicht von Ralfs Setup - vorrangig auf Serverseite, daher empfiehlt es sich zunächst die Seite von Ralf durchzuarbeiten.

Das Setup hier:

Bedrock Server als Container

Das Images itzg/minecraft-bedrock-server hat in meinem Fall ohne Probleme funktioniert. Allerdings hat die Dokumentation einige Schwächen. Die ansonst zügige Installation wurde durch unnötige Recherche etwas (ca. 2h) in die Länge gezogen.

Grund hierfür war, daß alles via Docker Compose gestartet werden sollte. Einige Parameter sind nur für die Kommandozeile erläutert. Der Link zur Compose-Datei läuft erst einmal auf einen 404-Fehler - bis man realisiert hat, dass es sich dabei ja um einen Ordner bzw. eine Datei auf der GitHub Seite handelt.

Docker Compose

Die docker-compose.yml ist überwiegend dem Beispiel entliehen. Nur um dem Fall vorzugreifen, dass wir später weitere Spieler auf den Server holen, ist DEFAULT_PLAYER_PERMISSION_LEVEL in unserem Fall “member”. Die Operators regeln wir gleich im Anschluss.

Weiterhin gab es Änderungen bzgl. der Whitelist. Diese lässt sich nun via ALLOW_LIST: "true" aktivieren. Die Liste der zugelassenen Spieler selbst wird über ALLOW_LIST_USERS: "gamertag1,gamertag22345"geregelt. Die List der User sind keine xuid-Einträge, sondern die echten XBOX-Gamertags. Achtung: Bei meinem Gamertag (aheil) handelt es sich um eines der erste Gamertags, die auch genau so in die Liste aufgenommen werden. Neuere Gamertags erhalten alle ein Suffix. So wird der Gamertag gamertag2#2345 in die Liste mit gamertag22345 aufgenommen. Mehr zu den Gamertags Suffixen gibt es in der Gamertag FAQ. Ansonsten verwende ich standardmäßig das local-persist Volume Plugin für Docker.

version: '3.4'

services:
  bds:
    image: itzg/minecraft-bedrock-server
    environment:
      SERVER_NAME: "MeinCraftServer"
      EULA: "TRUE"
      GAMEMODE: survival
      DIFFICULTY: peaceful
      ALLOW_CHEATS: "true"
      ONLINE_MODE: "true"
      DEFAULT_PLAYER_PERMISSION_LEVEL: "member"
      ALLOW_NETHER: "true"
      ALLOW_LIST: "true"
      ALLOW_LIST_USERS: "gamertag1,gamertag2gamertag22345"
    ports:
      - 19132:19132/udp
    volumes:
      - minecraft-storage:/data
    stdin_open: true
    tty: true

volumes:
  minecraft-storage:
    driver: local-persist
    driver_opts:
      mountpoint: /srv/minecraft

Ansible Skript

Die Provisionierung findet auf meinem Server via Ansible statt. Schließlich halte ich eine DevOps-Vorlesung. Das muss daher automatisiert sein. Das ganze ist eher unspektakulär und entspricht 90% meiner restlichen Skripte.

- name: Make sure install dir is present
  file:
    path: ""
    state: directory
  tags:
    - minecraft

- name: Make sure data dir is present
  file:
    path: ""
    state: directory
  tags:
    - minecraft

- name: Copy the required files
  copy: 
    src: files/
    dest: ""
    force: yes
  tags:
    - minecraft

- name: Pull docker images and start containers 
  docker_service:
    project_src: ""
    build: no
    remove_orphans: yes
    state: present
    restarted: yes
  tags:
    - minecraft

Die kopierten Files (im vorliegen Fall die docker-compose.yml) und die Daten liegen bei mir getrennt.

MINECRAFT_INSTALL_DIR: /opt/minecraft
MINECRAFT_DATA_DIR: /srv/minecraft

Ich führe täglich ein Backup des srv-Ordners durch, dadurch ist auch mein gesamter Minecraft Server tagesaktuell im Backup.

Kein Backup, kein Mitleid!

Das Vorgehen macht weniger Kopfschmerzen, z.B. wenn die Whitelist eingespielt wird, wird per Ansible das Skript neu ausgeführt, dadurch die neue docker-compose.yml auf den Server kopiert und dieser mit der neuen Whitelist gestartet. Das ganze dauert ca. 10 Sekunden.

Operators

Das einzige, was nicht via Docker Compose zu setzen war. Sollte eigentlich via OPS: "gamertag1" oder OPS: "xuid" funktionieren. Tut es aber nicht. Von daher ist das per Fuß zu erledigen.

Dazu muss man einen Blick in das Datenverzeichnis (bei mir /srv/minecraft) werfen und die permissions.json anpassen.

Datenverzeichnis eines Minecraft Servers

Die Datei sieht dann so aus:

Inhalt einer Minecraft Server permissions.json

Wenig spektakulär und ohne Geheimnisse kann man die xuid z.B. hier abfragen und bekommt damit folgende Ausgabe für mein Gamertag:

Graphische Darstellung einer XBOX User ID (xuid)

Im Gegensatz zur Docker-Compose muss hier tatsächlich die xuid (Xbox user ID oder Xbox service ID, Microsoft ist da eher ambivalent was den eigentlich Namen angeht) eingegeben werden.

DNS Einträge

Die DNS-Einträge sind wir von Ralf beschrieben vorzunehmen.

Woher stammt die ominöse IP-Adresse? Es handelt sich dabei um einen BedrockConnect Server:

BedrockConnect is an easy to use solution for Minecraft Bedrock Edition players on Xbox One, Nintendo Switch, PS4/PS5 to join any server IP, while also having access to a serverlist that allows you to manage a list of servers. It doesn’t require any downloads, just a few changes to settings.

Neben der 104.238.130.180 gibt es noch weiter IPs bzw. Server, die verwendet werden können. Vermutlich ist der Server eine der ersten Sollbruchstellen im gesamten Setup.

Nicht Vergessen die XBOX neu zu starten

Nach dem Ändern der DNS Einträge sollte unbedingt die XBOX durchgestartet werden. Die geänderten DNS-Einträge werden bei der XBOX augenscheinlich nicht direkt gezogen. Bei der Switch wurde der primäre DNS-Server bei mir ohne Neustart problemlos übernommen.

Hive Server

Was mich tatsächlich mehrere Stunden an der Xbox gekostet hat, war die Verbindung zum meinem Server. Das war in allen Videos (und auf im Artikel von Ralf) nicht beschrieben.

Grundsätzlich muss ein Server ausgewählt werden, der selbst eine Liste von Minecraft Servern anbiete.

Switch Screenshot - Minecraft Serverauswahl

Hier taucht der magische Bildschirm auf, in dem der eigene Server ausgewählt bzw. in die Liste eingetragen werden kann. Einmal eingetragen, kann man den Server dort immer wieder finden.

Switch Screenshot - Minecraft ServerList

Tatsächlich habe ich es ca. 2h mit einem anderen Server versucht, der diese Option nicht anbiete. Den entscheidenden Hinweis habe ich diesem Video von Cove Wolf erhalten.

Hinweis: Der Eintrag muss auf jedem Gerät entsprechend vorgenommen werden.

Backups

Optional wäre der kaiede/minecraft-bedrock-backup Backup-Container noch eine Möglichkeit den Minecraft Server zu backupen. Ich selbst habe es nicht getestet, da die Backups über meine bereits existierende Lösung zum Nulltarif mitkommen. Erfahrungsberichte gerne an mich.