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

406 Comments
Inline Feedbacks
View all comments
Dylan
Dylan
3 months ago

Hi,

I accidentally posted my previous thread in the wrong blog post. As I said. Iโ€™m moving my server from ARM to x64, and am getting this error when trying to pull the most recent version:

docker: no matching manifest for linux/386 in the manifest list entries.

Help would be great. Thanks in advance.

Dylan
Dylan
1 month ago

Sorry for not responding. I downloaded the wrong debian ISO. Stupid mistake.

Nitromorph
Nitromorph
3 months ago

The server comes up properly and I am able to connect with the Windows bedrock client, but I cannot connect with the Windows Java client with a generic “Connection refused: no further information” message. Is this an issue geyser is causing?

Sander
Sander
3 months ago

Hi James,

Happy New Year!

After some attempts with the Bedrock container on my Pi 5 I ended up running the Java container and it’s been working great (despite one SD Card that died on me). So thanks a bunch, my son and I are enjoying it and I’m trying to convince his friends to switch to Android or PC from their Nintento Switch. I have a few questions on world and server management though;
– There are auto backups when the server stops (and when the container stops, at least when done properly). Is there a way to trigger automatic backups too? Like, every two hours or something? Or what would you suggest for a good backup scheme when playing at home with my kids? Just a cronjob that stops and then restarts the container at 2am? Since the SD card died I feel like a good backup scheme is pretty relevant. I plan upgrading to an SSD when the Pi m.2 HAT becomes generally available.
– Is there any way to remotely manage this server with a GUI tool? I’ve found a bunch of free “Server Management Tools” but they each expect you to run that tool on the machine where you create the server. I can’t figure out how to install some kind of connector, and I have a feeling it would have to be inside the docker container which if I understand correctly, disappears when I restart? I would expect there is some way to install plugins or even see server status, who’s online etc. other than SSH-ing into the Pi and using docker attach…?
– Related to the previous; if I wanted to accommodate multiple worlds, would I install MultiVerse Core 2, or run separate docker containers with different ports? And how would I manage these from my client PC? I could remote desktop into my Pi of course but that seems pretty gross.

I realize you can’t publish complete tutorials for noobs like me, but maybe you can point me in the right direction?

AnthonyKellyYip
AnthonyKellyYip
3 months ago
Reply to  Sander

Hi Sander,

Just jumping in before James gives you a more detailed and accurate reply.

Even though the Docker container can disappear, the volume that it’s loading from doesn’t.

That means that you can access all the server files even when the container isn’t running. You can add any plugins that you like, and they’ll still be there on restart.

I’ve got Multiverse running (a hub world, survival world +Nether and the End, and a creative world) and it runs well. I’d suggest doing that rather than having separate containers running, as it’s relatively easy to set up, allows for teleporting between worlds, and would use less resources on the Pi. What I don’t know is how well it would scale with large numbers of players, but we had no problem using Multiverse with 2-3 people in different worlds on our Pi 4.

Sander
Sander
3 months ago

Thank you, Anthony!
Docker is new to me but it’s starting to make more sense. I suppose Multiverse Core 2 is something that lives inside the docker volume, and will therefore be persistent? I have not used it before and don’t know exactly how it interacts with Minecraft to work its magic.

I’m somewhat confused by Docker’s handling of old and new containers. I had been starting with the docker run command and after a while I had a whole bunch of containers all using the same volume. I have since figured out that if I stop the container, I can see stopped containers with “sudo docker ps -a” and restart an existing container using “sudo docker start [container name]”. I figured I would add this to my crontab as @reboot. But then I realized docker start doesn’t actually update the container to the latest version. In fact, as far as I can see, there is no way to get the latest version “update” the existing container. This may be by design but I’m a little confused having a ton of old containers living “somewhere”, especially since they’re somewhat hidden.

What do you guys recommend? Always use the run command from the instructions above and periodically clean up old containers? Or use start and update only when you want to update? In order to get regular backups, I would have to stop/start the container/server nightly anyway.

My question on how to manage things like MultiVerse or monitor server usage remains; I don’t really understand how I can monitor my MC Server instance from my client PC as all tools I’ve seen seem to depend on using those tools to create the server/worlds and in this case the docker container does that. Is there any way to connect to an existing server, or does a paper server have its own web interface for management?

AnthonyKellyYip
AnthonyKellyYip
3 months ago
Reply to  Sander

Multiverse is a plugin that runs within Minecraft, so as long as you have access to the files within the Minecraft volume, you can copy the Multiverse jar into the plugins folder, restart the server, and it just runs

I usually use ssh to copy any plugins that I need and use nano to set up their configurations. Very few plugins have a web UI, but there are some exceptions like Luckperms

Kasaisora has a really good YouTube video called “How To Create Multiple Worlds On Your Minecraft Server (Multiverse-Core Tutorial)”

As you’ll see from the video, a lot of the setup can be done using commands within game or from the console

AnthonyKellyYip
AnthonyKellyYip
3 months ago
Reply to  Sander

I’m certainly no expert on Docker, but I’m pretty sure you don’t need to have a million containers. I just have one that I stop and start.

Who knows, maybe I’m doing it wrong. Should I have a bunch of Minecraft containers too? XD

BTW, Portainer is a great service for managing docker containers if you don’t like messing around on the command line

ZackM
ZackM
4 months ago

I’m having the same issue as poster Tommy. Running command “docker run -it -v minecraft:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.20.4 โ€“restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest” is resulting in the following error when connecting from my kids’ tablets: “Outdated Geyser proxy! This server supports the following Bedrock versions: 1.20.0/1.20.1, 1.20.10/1.20.15, 1.20.30/1.20.32, 1.20.40…The latest Geyser release supports this Bedrock version. A server admin can download…”. I’ve deleted the docker volume and pulled fresh to verify.

AnthonyKellyYip
AnthonyKellyYip
4 months ago

Hey there,

Just dropping by to give you a quick thank you. The container ran well on my 8GB Pi 4. I’m now in the process of migrating over to a Oracle ARM instance where it seems to be running amazingly well. In the end, the networking setup wasn’t too bad. I just had to set up the ports in the Oracle Cloud web-ui and set them up on the firewall from within the instance.

Quick question though. The backups from your container are being created in the /backups folder, right? Do they contain everything from the Minecraft volume (including new plugins, worlds, player data) so that, if I ever lost this Oracle instance I could deploy the entire server again?

AnthonyKellyYip
AnthonyKellyYip
4 months ago

[Realises it’s just a compressed volume that I can look inside] OK, I see all the files now ๐Ÿ˜‚ but my backups folder doesn’t have any recent backups in it. It has three backups from the first couple of days when I was setting up the server and then it stopped. I’m wondering if any of my plugins might be interfering with it.

I’m assuming backups are created every time the server restarts, or do I need to restart the whole container? Either way, I’m not seeing any new backups ๐Ÿฅบ

AnthonyKellyYip
AnthonyKellyYip
4 months ago

If that’s the case, then I might have broken something ๐Ÿ˜‚

I’m not getting any new backups being generated. I’ve pulled the latest image and spun up a new container, and I’m still not getting any new backups

Is there a script hiding anywhere in the volume that I can run manually?

AnthonyKellyYip
AnthonyKellyYip
4 months ago

Thanks for the reply. My workaround was to ignore the problem and install a backup plugin ๐Ÿ˜‚ imaginatively called “Server Backup.”

I’ll keep an eye on the original backup directory to see if it suddenly starts populating again. I kind of don’t want to touch anything else because the server seems to be – touchwood – stable? And running well?? ๐Ÿ˜…

I’m going to keep it running for a couple of weeks to see if anything weird happens, but I’m very tempted to stop paying for my two Minecraft Realms ASAP and just run this server.

Your containers have made this super easy

Tommy
Tommy
4 months ago

Tried deleting containers by stopping and docker container prune -f. All containers deleted, but still receiving same error. Ran a new pull from :latest, and now I’m seeing a different error:
player1 has disconnected from the Java server because of Outdated client! Please use 1.20.4

Forced version with -e Version=1.20.4 but had no change in the error. Still “Outdated client”

Client version is Bedrock 1.20.50

Command that I am running to start the server is:
docker run -it -v minecraft:/minecraft -p 25565:25565 -p 19132:19132/udp -p 19132:19132 -e Version=1.20.4 –restart unless-stopped 05jchambers/legendary-minecraft-geyser-floodgate:latest

Arathi
Arathi
4 months ago

Hi James, I’m still having a heck of a time getting Geyser to update, and the guys over at Geyser asked me this: “well sure, but are you running his old version that tries to pull it from the ci, or his new version that uses the downloads endpoint?” and I’m suspecting I’ve missed something somewhere. Is there an update I should be running?

Arathi
Arathi
4 months ago
Reply to  Arathi

Nevermind. A little playing around, and I saw the note about deleting containers. Appears to be working now