6.7 KiB
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>, Port25565 - Bedrock Edition: Server hinzufuegen, Adresse
<Server-IP>, Port19132 - Vom selben Rechner:
localhostbzw.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_VERSIONin der.envsteht aufLATEST. 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
.envbzw. die Environment-Variablen indocker-compose.yml. Direkte Aenderungen an derserver.propertiesim Volume werden bei diesen Werten beim naechsten Start ueberschrieben. - Geyser:
config/plugins/Geyser-Spigot/config.ymlbearbeiten, danndocker 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=falsegesetzt. 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