Minecraft Java + Bedrock Server Together – Geyser + Floodgate

Minecraft Geyser + Floodgate Paper Minecraft Server
Minecraft Geyser + Floodgate Paper Minecraft Server

This is a new Docker container to automatically set up and run a Minecraft server that both Java and Bedrock players can connect to! This allows everyone to play on your server no matter which edition of Minecraft you are using. It uses the Geyser and Floodgate plugins to accomplish this.

Since it uses the Paper Minecraft server it also supports any additional plugins that are compatible with Paper / Spigot. This gives you the ability to do many things that are currently impossible to do in Bedrock if you are hosting the official Bedrock dedicated server.

It is fully compatible with my Paper Minecraft Java Server Container and you can swap between these two containers without changing any configuration.

The official GitHub page is located here.

The Docker Hub page for the container is located here.

It’s now possible to convert your worlds between Bedrock and Java versions. Check out my guide on Chunker here for more information.

Features

  • Sets up fully operational Minecraft server that allows both Java and Bedrock clients to connect
  • Runs the highly efficient “Paper” Minecraft server
  • Runs Geyser to allow Bedrock clients to connect and Floodgate to allow them to authenticate with their Bedrock credentials to a Java server
  • Plugin support for Paper / Spigot / Bukkit
  • Uses named Docker volume for safe and easy to access storage of server data files (which enables more advanced Docker features such as automatic volume backups)
  • Installs and configures OpenJDK 18
  • Automatic backups to minecraft/backups when server restarts
  • Full logging available in minecraft/logs folder
  • Updates automatically to the latest version when server is started
  • Runs on all Docker platforms including Raspberry Pi

Usage

First you must create a named Docker volume. This can be done with:

docker volume create yourvolumename

Now you may launch the server and open the ports necessary with one of the following Docker launch commands.

With default ports:

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

With custom ports:

docker run -it -v yourvolumename:/minecraft -p 12345:12345 -e Port=12345 -p 54321:54321/udp -p 54321:54321 -e BedrockPort=54321 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

With a custom Minecraft version (add -e Version=1.X.X, must be present on Paper’s API servers to work):

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.17.1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

With a maximum memory limit in megabytes (optional, prevents crashes on platforms with limited memory, -e MaxMemory=2048):

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=2048 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Using a custom timezone:

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e TZ="America/Denver" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Skipping backups on a certain folder:

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoBackup="plugins" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Skipping permissions check:

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e NoPermCheck="Y" --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Change number of backups:

docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=1 --restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Configuration / Accessing Server Files

The server data is stored where Docker stores your volumes. This is typically a folder on the host OS that is shared and mounted with the container. I’ll give the usual locations here but if you’re having trouble just do some Googling for your exact platform and you should find where Docker is storing the volume files.

You can find your exact path by typing:

docker volume inspect yourvolumename

This will give you the fully qualified path to your volume like this:

{
        "CreatedAt": "2022-05-09T21:08:34-06:00",
        "Driver": "local",
        "Labels": {},
        "Mountpoint": "/var/lib/docker/volumes/yourvolumename/_data",
        "Name": "yourvolumename",
        "Options": {},
        "Scope": "local"
}

On Linux it’s typically available at:

/var/lib/docker/volumes/yourvolumename/_data

On Windows it’s at

C:\ProgramData\DockerDesktop

but may be located at something more like

\wsl$\docker-desktop-data\version-pack-data\community\docker\volumes\

if you are using WSL (Windows Subsystem for Linux).


On Mac it’s typically

~/Library/Containers/com.docker.docker/Data/vms/0/

If you are using Docker Desktop on Mac then you need to access the Docker VM with the following command first:

screen ~/Library/Containers/com.docker.docker/Data/com.docker.driver.amd64-linux/tty

You can then normally access the Docker volumes using the path you found in the first step with docker volume inspect.

Most people will want to edit server.properties. You can make the changes to the file and then restart the container to make them effective.
Backups are stored in the “backups” folder
Log files with timestamps are stored in the “logs” folder.

Plugin Support for Paper / Spigot / Bukkit

This is a “Paper” Minecraft server which has plugin compatibility with Paper / Spigot / Bukkit.

Installation is simple. There is a “plugins” folder on your Docker named volume.

Navigate to your server files on your host operating system (see accessing server files section if you don’t know where this is) and you will see the “plugins” folder.

You just need to drop the extracted version of the plugin (a .jar file) into this folder and restart the container. That’s it!

Some plugins have dependencies so make sure you read the installation guide first for the plugin you are looking at.

A popular place to get plugins is: dev.bukkit.org

Troubleshooting Note – Oracle Virtual Machines

A very common problem people have with the Oracle Virtual Machine tutorials out there that typically show you how to use a free VM is that the VM is much more difficult to configure than just about any other product / offering out there.

It is because there are several steps you need to take to open the ports on the Oracle VM. You need to both:

  • Set the ingress ports (TCP/UDP) in the Virtual Cloud Network (VCN) security list
  • *and* set the ingress ports in a Network Security Group assigned to your instance

Both of these settings are typically required before you will be able to connect to your VM instance. This is purely configuration related and has nothing to do with the script or the Minecraft server itself.

I do not recommend this platform due to the configuration difficulty but the people who have gone through the pain of configuring an Oracle VM have had good experiences with it after that point. Just keep in mind it’s going to be a rough ride through the configuration for most people.

Troubleshooting Note – Hyper-V

There is a weird bug in Hyper-V that breaks UDP connections on the Minecraft server. The easy workaround for this is that you have to use a Generation 1 VM with the Legacy LAN network driver.

There is a second fix that was shared by bpsimons here. For that fix you need to install ethtool first with sudo apt install ethtool. Next in your /etc/network/interfaces file add “offload-tx off” to the bottom as the issue appears to be with TX offloading.

Here’s an example:

# The primary network interface
auto eth0
iface eth0 inet static
address 192.168.1.5
netmask 255.255.255.0
network 192.168.1.0
broadcast 192.168.1.255
gateway 192.168.1.1
offload-tx off

This can also be done non-persistently with the following ethtool command:

ethtool -K eth0 tx off

Additional Support

The comments section right here is the best place for support. The second best place is the GitHub issues section.

I will add additional documentation based on what problems people are running into / questions people are asking because right now I’m not really sure what those will be yet. Definitely let me know if you need any of these things!

Subscribe
Notify of
guest

463 Comments
Inline Feedbacks
View all comments
Alex
Alex
7 months ago

Thanks for the great docker. I’m using a digitalOcean instance. The docker loads however strangely the console is complete unresponsive. For example even if type “list” nothing happens. Any command I enter is just return the prompt? Below is some of the output. Can you let me know what might be the issue?

Starting Minecraft server...
Starting org.bukkit.craftbukkit.Main
System Info: Java 19 (OpenJDK 64-Bit Server VM 19.0.2+7-Ubuntu-4) Host: Linux 6.5.0-9-generic (amd64)
Loading libraries, please wait...
[13:08:20 INFO]: Environment: Environment[sessionHost=https://sessionserver.mojang.com, servicesHost=https://api.minecraftservices.com, name=PROD]
[13:08:21 INFO]: Found new data pack file/bukkit, loading it automatically
[13:08:23 INFO]: No existing world data, creating new world
[13:08:23 WARN]: Failed to parse level-type default, defaulting to minecraft:normal
[13:08:26 INFO]: Loaded 1174 recipes
[13:08:27 INFO]: Loaded 1271 advancements
[13:08:27 INFO]: Starting minecraft server version 1.20.4
[13:08:27 WARN]: To start the server with more ram, launch it as "java -Xmx1024M -Xms1024M -jar minecraft_server.jar"
[13:08:27 WARN]: ****************************
[13:08:27 WARN]: YOU ARE RUNNING THIS SERVER AS AN ADMINISTRATIVE OR ROOT USER. THIS IS NOT ADVISED.
[13:08:27 WARN]: YOU ARE OPENING YOURSELF UP TO POTENTIAL RISKS WHEN DOING THIS.
[13:08:27 WARN]: FOR MORE INFORMATION, SEE https://madelinemiller.dev/blog/root-minecraft-server/
[13:08:27 WARN]: ****************************
[13:08:27 INFO]: Loading properties
[13:08:28 INFO]: This server is running Paper version git-Paper-496 (MC: 1.20.4) (Implementing API version 1.20.4-R0.1-SNAPSHOT) (Git: 7ac24a1 on ver/1.20.4)
[13:08:30 INFO]: Server Ping Player Sample Count: 12
[13:08:30 INFO]: Using 4 threads for Netty based IO
[13:08:31 WARN]: [!] The timings profiler has been enabled but has been scheduled for removal from Paper in the future.
We recommend installing the spark profiler as a replacement: https://spark.lucko.me/
For more information please visit: https://github.com/PaperMC/Paper/issues/8948
[13:08:31 INFO]: [ChunkTaskScheduler] Chunk system is using 1 I/O threads, 1 worker threads, and gen parallelism of 1 threads
[13:08:32 INFO]: Default game type: SURVIVAL
[13:08:32 INFO]: Generating keypair
[13:08:32 INFO]: Starting Minecraft server on *:25565
[13:08:32 INFO]: Using epoll channel type
[13:08:33 INFO]: Paper: Using libdeflate (Linux x86_64) compression from Velocity.
[13:08:33 INFO]: Paper: Using OpenSSL 3.0.x (Linux x86_64) cipher from Velocity.
[13:08:34 INFO]: [floodgate] Loading server plugin floodgate v2.2.2-SNAPSHOT (b98-0fa00a8)
[13:08:38 INFO]: [floodgate] Took 3,450ms to boot Floodgate
[13:08:38 INFO]: [ViaVersion] Loading server plugin ViaVersion v4.10.1-SNAPSHOT
[13:08:38 INFO]: [ViaVersion] ViaVersion 4.10.1-SNAPSHOT is now loaded. Registering protocol transformers and injecting...
[13:08:40 INFO]: [ViaVersion] Loading block connection mappings ...
[13:08:41 INFO]: [ViaVersion] Using FastUtil Long2ObjectOpenHashMap for block connections
[13:08:41 INFO]: [Geyser-Spigot] Loading server plugin Geyser-Spigot v2.2.3-SNAPSHOT
[13:08:43 INFO]: [Geyser-Spigot] Loading extensions...
[13:08:43 INFO]: [Geyser-Spigot] Loaded 0 extension(s)
[13:08:43 INFO]: Server permissions file permissions.yml is empty, ignoring it
[13:08:43 INFO]: Preparing level "world"
[13:08:43 WARN]: Failed to parse level-type default, defaulting to minecraft:normal
> list
> list

Ray J
Ray J
8 months ago

Hey James, been a while. I have tried enabling backups (after disabling them a while ago with your help) using -e BackupCount=20. This does not seem to be working. When restarting the container or restarting by issuing the server command ‘restart’ no backups are saved. This is how i started the server: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e MaxMemory=7000 -e BackupCount=20 –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Ray J
Ray J
6 months ago

Hi James, the new version still didn’t work. I ran this command to start the server: docker run –name bee -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=15 -e MaxMemory=7000 –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Ray J
Ray J
6 months ago

Okay, I will try that. Thanks James

Ray J
Ray J
6 months ago
Reply to  Ray J

Hi James. I just removed the container and the image, pulled the latest one again, and ran this to get the server up and running once again: docker run -it -v yourvolumename:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e BackupCount=20 -e TZ=”America/Detroit” -e MaxMemory=7350 –name bee –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

When entering ‘stop’ or ‘restart’ into the server console, or when running ‘docker restart xxxx’ it restarts as it should but no backup is made and there are no errors. I have a feeling that whats causing this is very minor and dumb and I’m wondering if I should try making a new volume and moving the server files there (which I will try tonight), or if there’s a plugin affecting the backups from being made. I currently have these running: AuthMe, BetterRTP, Chunky, DiscordSRV, floodgate, Geyser-Spigot, Graves, GriefPrevention, LaggRemover, SetHome, SkinsRestorer, spark, ViaBackwards, and ViaVersion

Also, could you share whatever script or code creates the backups? Maybe i could just run it manually. Thanks.

Ray J
Ray J
5 months ago
Reply to  Ray J

ahhhhh so that’s the issue! I’ll make a backup and try changing the level names and check the results. I knew it was a stupid issue, especially on my side haha. Thanks so much for the help James. I might’ve changed the name because bedrock players saw it or something but it was so long ago that I forgot. I had my own backup script going but issues began happening plus it took a while to back up. Thanks again for helping with this, it means a lot to get support with issues that I am unfamiliar with.

Paul B
Paul B
8 months ago

Hello James Chambers,

Does this server docker support internet multiplayer? I was able to run this locally but not over the internet. Is internet playing supported or not? I launched the server with custom ports

This is basically the first time i’ve used docker.

Thanks

juanlu
juanlu
9 months ago

Hi James, thanks a lot for this container. Nice job ! My son loves it a lot. I installed for him the bedrock version one year ago. How to manage permission levels and activate Operator mode here? It is not in server.properties.

Sander
Sander
9 months ago

I would just like to report back that this whole thing opened up sort of a Pandora’s Box for me – I started trying to get a simple Bedrock Server going on my new RPi 5. When that failed, I tried this Java/Geyser container by James and it worked almost immediately despite not knowing much about docker. It worked so well that we got excited about the possibilities and I ended up adding a bunch of plugins (Multiverse, Luckperms, Anti griefing) and worlds (World of Worlds is a cool download). Then it got me excited about docker and VM type technology and I ended up repurposing an HP EliteDesk 800 G3 with an i7 7700 and 16GB of RAM, running Proxmox. I created a really lean headless debian server VM on it with 2 cpu cores and 8GB of RAM and moved over the docker volume from the Pi. I ran the container in the new VM and everything was picked up perfectly on the first go. The difference in performance is noticeable especially when loading new chunks or switching dimensions.

Major thanks to James for this excellent container and the flexibility it provides. And definitely recommend Proxmox and a second hand HP Elitedesk 800 G3 (similar price as a new RPi 5).

Tony T
Tony T
10 months ago

Hi James,
I’m still running this on my RPi 4 and it’s been great! I have a question I’m a little embarrased to ask: how do I use the backup files? My pi and server restart every morning via crontab, so I have 10 backups in the folder. I made a rookie error and my son and I would like to just go back to today’s back up. I found the file, but don’t know how to revert the server to that point. I’m sure it’s super easy, but I don’t want to mess it up and upset my 7 year old more.

Tony T
Tony T
10 months ago

Thank you! I muddled my way through it and got it to work although I’m sure there was an easier way 🙂

Michael
Michael
11 months ago

Dear James
Thanks for this fantastic creation. I’m new to RPi but this worked flawlessly.

I have one problem, though. I want to allow (all) players to perform commands. My daughter wants to be able to summon things. I have tried several things without success. In the console, writing /op gives “Unknown command. Type “/help” for help.” Even /help gives the same answer. The console is working, I can see the players joining and things happening. I’ve also tried to edit server.properties without effect. No commands are available to the players, only, e.g., floodgate, bukkit.

allow-cheats=true
allow-flight=false
allow-nether=true
broadcast-console-to-ops=true
broadcast-rcon-to-ops=true
debug=false
default-player-permission-level=4
difficulty=normal
enable-command-block=true
enable-jmx-monitoring=false
enable-query=false
enable-rcon=false
enable-status=true
enforce-secure-profile=false
enforce-whitelist=false
entity-broadcast-range-percentage=100
force-gamemode=false
function-permission-level=2
gamemode=survival
generate-structures=true
generator-settings={}
hardcore=false
hide-online-players=false
initial-disabled-packs=
initial-enabled-packs=vanilla
level-name=world
level-seed=
level-type=default
log-ips=true
max-chained-neighbor-updates=1000000
max-players=20
max-tick-time=120000
max-world-size=29999984
motd=Minecraft-server\!\!
network-compression-threshold=512
online-mode=true
op-permission-level=4
player-idle-timeout=0
prevent-proxy-connections=false
pvp=true
query.port=25565
rate-limit=0
rcon.password=
rcon.port=25575
require-resource-pack=false
resource-pack=
resource-pack-id=
resource-pack-prompt=
resource-pack-sha1=
server-ip=
server-port=25565
simulation-distance=10
spawn-animals=true
spawn-monsters=true
spawn-npcs=true
spawn-protection=0
sync-chunk-writes=true
text-filtering-config=
use-native-transport=true
view-distance=10
white-list=false

Michael
Michael
10 months ago

Dear James, thanks for the reply. Indeed, it was the / which was causing the problems. 😀