Minecraft Crossplay-Server (Java + Bedrock)

Ein PaperMC-Server im Container, der per GeyserMC zusaetzlich Bedrock-Clients (Konsole, Handy, Windows-10-Edition) annimmt. Floodgate authentifiziert diese Spieler ueber Xbox Live, ein gekaufter Java-Account ist fuer sie nicht noetig.

Es bleibt ein Java-Server: Redstone, Kampfsystem und Mob-Verhalten folgen den Java-Mechaniken. Geyser sitzt als Uebersetzungsschicht dazwischen.

Java-Client  ──TCP 25565──┐
                          ├──► PaperMC (Java-Server)
Bedrock-Client ─UDP 19132─┴──► Geyser ──► Floodgate ──► Xbox-Live-Auth

Dateien

Datei Zweck
docker-compose.yml Der Stack: Image, Ports, Plugins, server.properties
.env Alle Stellschrauben (Version, RAM, Ports, MOTD, Ops, RCON-Passwort)
config/plugins/Geyser-Spigot/config.yml Geyser-Vorgabe, u.a. auth-type: floodgate

Die Welt und alle Plugin-Daten liegen im Docker-Volume mc-crossplay_mc-data, nicht im Projektordner (deutlich schnellere I/O unter Docker Desktop).

Schnellstart

docker compose up -d

Der erste Start dauert ein paar Minuten: Paper-Jar, Geyser und Floodgate werden geladen und die Welt wird generiert.

Logs mitlesen:

docker compose logs -f

Fertig ist der Server, sobald Started Geyser on UDP port 19132 und danach Done (…)! For help, type "help" in den Logs stehen.

Getestet mit Paper 26.2, Geyser 2.11.1 und Floodgate 2.2.5: Java-Ping auf 25565/TCP und RakNet-Ping auf 19132/UDP antworten beide, MOTD und Spielerzahl werden vom Java-Server an die Bedrock-Serverliste durchgereicht.

Verbinden

  • Java Edition: Adresse <Server-IP>, Port 25565
  • Bedrock Edition: Server hinzufuegen, Adresse <Server-IP>, Port 19132
  • Vom selben Rechner: localhost bzw. 127.0.0.1

Auf Konsolen (Switch, PS, Xbox) laesst sich oft keine freie Serveradresse eintragen. Ueblicher Weg dort: DNS-Umleitung im Heimnetz oder ein Dienst wie BedrockConnect.

Bedrock-Spieler erscheinen mit einem Punkt vor dem Namen, z.B. .MeinGamertag. Das ist der Floodgate-Praefix; er verhindert Namenskollisionen mit Java-Accounts. Aendern laesst er sich in plugins/floodgate/config.yml (username-prefix).

Firewall (Windows)

Docker Desktop oeffnet die Ports nur lokal. Fuer Zugriff aus dem LAN muessen beide Ports durch die Windows-Firewall — in einer Admin-PowerShell:

New-NetFirewallRule -DisplayName "Minecraft Java 25565" -Direction Inbound -Protocol TCP -LocalPort 25565 -Action Allow
New-NetFirewallRule -DisplayName "Minecraft Bedrock 19132" -Direction Inbound -Protocol UDP -LocalPort 19132 -Action Allow

Fuer Zugriff aus dem Internet zusaetzlich im Router portforwarden: 25565/TCP und 19132/UDP. Bedrock laeuft ueber UDP — ein reines TCP-Forwarding reicht nicht.

Erreichbarkeit pruefen

Sobald der Router-Port offen ist, testet Geyser die Erreichbarkeit von aussen selbst — das fragt einen oeffentlichen GeyserMC-Testdienst an, uebermittelt also deine oeffentliche IP und den Port dorthin:

docker compose exec minecraft rcon-cli "geyser connectiontest"

Betrieb

docker compose ps

Serverkonsole (Befehle wie op, whitelist, save-all):

docker compose exec minecraft rcon-cli

Einzelner Befehl:

docker compose exec minecraft rcon-cli op DeinName

Sauber stoppen (die Welt wird gespeichert, bis zu 2 Minuten Zeit):

docker compose down

Updates

  • Geyser/Floodgate: werden bei jedem Containerstart in der aktuellsten Version geladen. Nach einem Bedrock-Update also einfach docker compose restart — Geyser zieht dann den passenden Build nach.
  • Paper/Minecraft: MC_VERSION in der .env steht auf LATEST. Fuer einen planbaren Betrieb besser fest pinnen, z.B. MC_VERSION=26.2.
  • Image: docker compose pull && docker compose up -d

Weitere Plugins

URL in docker-compose.yml unter PLUGINS als weitere Zeile ergaenzen, dann docker compose up -d. Aus der Liste entfernte Plugins werden beim naechsten Start auch aus dem plugins-Ordner geloescht.

Fuer Bedrock-Spieler gilt: Plugins moeglichst simpel halten. Komplexe Chest-GUI-Menues (Auktionshaeuser, Shop-Menues) funktionieren ueber Geyser oft nur fehlerhaft. Plugins mit Formular-Unterstuetzung fuer Bedrock sind die bessere Wahl.

Konfiguration aendern

  • server.properties: ueber die .env bzw. die Environment-Variablen in docker-compose.yml. Direkte Aenderungen an der server.properties im Volume werden bei diesen Werten beim naechsten Start ueberschrieben.
  • Geyser: config/plugins/Geyser-Spigot/config.yml bearbeiten, dann docker compose restart. Die Datei aus dem Projektordner gewinnt, sobald sie neuer ist als die im Volume.
  • Alles andere (Floodgate, weitere Plugins): liegt im Volume. Anschauen mit
docker compose exec minecraft cat /data/plugins/floodgate/config.yml

Dauerhaft vorgeben laesst es sich, indem man die Datei unter config/plugins/<Plugin>/ im gleichen Pfadaufbau ablegt.

Backup

Welt und Plugin-Daten aus dem Volume in eine Datei sichern:

docker run --rm -v mc-crossplay_mc-data:/data -v "$PWD":/backup alpine tar czf /backup/mc-backup.tar.gz -C /data .

Vorher docker compose exec minecraft rcon-cli save-all ausfuehren oder den Server stoppen, damit die Welt konsistent auf der Platte liegt.

Deployment in die Oracle Cloud

Der Umzug auf die OCI-Instanz hinter minecraft.djnizz.at ist in DEPLOY-ORACLE.md beschrieben.

Bekannte Einschraenkungen

  • Bedrock unterstuetzt nicht alle Java-Features grafisch 1:1 (bestimmte Bannermuster, manche Offhand-Interaktionen) — kleine optische Abweichungen sind normal.
  • Geyser erzeugt einen leichten CPU-Overhead pro Bedrock-Spieler. Auf moderner Hardware faellt das nicht ins Gewicht.
  • Bedrock-Spieler haben keine Java-Chatsignatur, deshalb ist enforce-secure-profile=false gesetzt. Ohne das fliegen sie beim Chatten raus.

Troubleshooting

Bedrock-Client findet den Server nicht — meist die Firewall oder ein fehlendes UDP-Forwarding. Test vom Host aus:

docker compose exec minecraft sh -c "netstat -uln | grep 19132"

„Unable to connect to world" — pruefen, ob Geyser sauber gestartet ist:

docker compose logs | grep -i geyser

Container startet in einer Schleife neu, Log sagt „requires Java 25 or above" — dann zeigt das Image-Tag auf eine zu alte JVM. Minecraft 26.x braucht Java 25, das Tag in docker-compose.yml muss stable-java25 (oder neuer) bleiben.

Bedrock-Spieler wird nach Java-Account gefragt — dann greift auth-type nicht. Kontrolle:

docker compose exec minecraft grep -A2 "^java:" /data/plugins/Geyser-Spigot/config.yml
S
Description
No description provided
Readme
65 KiB
Languages
Python 100%