# 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 ```bash 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: ```bash 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. Eingestellt ist Minecraft/Paper 26.3 (dazu Geyser 2.12.0, Floodgate 2.2.5). Zuletzt 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 ``, Port `25565` * **Bedrock Edition:** Server hinzufuegen, Adresse ``, 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**: ```powershell New-NetFirewallRule -DisplayName "Minecraft Java 25565" -Direction Inbound -Protocol TCP -LocalPort 25565 -Action Allow ``` ```powershell 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: ```bash docker compose exec minecraft rcon-cli "geyser connectiontest" ``` ## Betrieb ```bash docker compose ps ``` Serverkonsole (Befehle wie `op`, `whitelist`, `save-all`): ```bash docker compose exec minecraft rcon-cli ``` Einzelner Befehl: ```bash docker compose exec minecraft rcon-cli op DeinName ``` Sauber stoppen (die Welt wird gespeichert, bis zu 2 Minuten Zeit): ```bash 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` ist fest auf `26.3` gepinnt. Fuer ein Update die Zahl anheben (oder `LATEST` fuer immer die neueste Version). * **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 ```bash docker compose exec minecraft cat /data/plugins/floodgate/config.yml ``` Dauerhaft vorgeben laesst es sich, indem man die Datei unter `config/plugins//` im gleichen Pfadaufbau ablegt. ## Backup Welt und Plugin-Daten aus dem Volume in eine Datei sichern: ```bash 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](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: ```bash docker compose exec minecraft sh -c "netstat -uln | grep 19132" ``` **„Unable to connect to world"** — pruefen, ob Geyser sauber gestartet ist: ```bash 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: ```bash docker compose exec minecraft grep -A2 "^java:" /data/plugins/Geyser-Spigot/config.yml ```