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!

458 thoughts on “Minecraft Java + Bedrock Server Together – Geyser + Floodgate”

  1. Avatar for Kody

    Hey there, thanks for the great container and support here!
    I just spun up an oracle instance for Minecraft, and realized that it was going to be a PITA to run a Bedrock server on the Oracle ARM linux. That’s when I discovered Geyser and your docker container.
    I got it all set up well enough on Oracle Linux, but was having a hell of a time getting access over the firewall. Couldn’t figure it out for a while, but then found these commands which you may want to add to your Oracle Additional Support section.

    You will also need to open up the port’s on the VM’s firewall, so run the following commands in the terminal:
    sudo firewall-cmd –permanent –zone=public –add-port=25565/tcp
    sudo firewall-cmd –permanent –zone=public –add-port=25565/udp
    sudo firewall-cmd –reload

    Hope this is helpful. Thanks!

  2. Avatar for Anthony

    Hi James,

    Is there something like:
    -e Version=latest
    that we could use to always get the latest version of PaperMC as soon as it drops on the API?

    1. Avatar for James A. Chambers

      Hello Anthony,

      This isn’t something Paper offers in their API. The reason is because when new versions come out they are unstable and have a bunch of warnings on them. You’re supposed to make backups before ever upgrading your version because of the risk of corruption. That’s why it’s never been automatic to jump versions.

      You’d think you could just scrape their web site to always get the latest version but if you watch the site closely when new versions come out they will be in red and marked in beta and the site will completely change. They don’t provide an easy way to get this that would be consistent enough to survive over the releases.

      I also have the same concerns they have about upgrading versions too early. When they are in red status or beta I would not want it pulling those down yet because they are *known* unstable.

      If there was a reliable way to only get the latest stable version I would consider supporting it since it does make backups and you could roll back if something happens though. Since I don’t know of any way to do it though I wouldn’t want to invent one when the Paper team is probably right that it’s not safe to always just run the latest and that it depends on where they are at with the update process, etc.

      Hopefully that helps!

  3. Avatar for CryptidKeepr

    I’m hoping you can’t help me. I run a master docker-compose file. I created a compose file for the legendary server compose (only that one). I’m pretty new to docker-compose. But since everything else is set up that way I was trying to keep it uniform. Problem is it doesn’t create any of the necessary files when I run it. Is there a way you can guide me through the process of doing it this way?

    1. Avatar for James A. Chambers

      Hello CryptidKeepr,

      It sounds like you aren’t changing the volumes in the file. Each server will need it’s own volume. That means from the master you should be changing the volume from minecraft to minecraft2, minecraft3, etc.

      Everything else you’re doing should work as I assume you’re changing the ports between the servers as well (as this will also cause them to just close if the port is in use).

      Hopefully that helps!

  4. Avatar for Ross

    Hey James, is it possible that I could easily fork this into a Fabric server? If so, would there be any relevant modifications I would have to do to the startup script?

    1. Avatar for James A. Chambers

      Hey Ross,

      You would just need to change the server it’s downloading to a Fabric one. You’d basically update the links it’s trying to update from to Fabric instead of Paper. I did a similar one for Purpur.

      Most of the time the sites are slightly different but basically you need to just point it to the download. Hopefully that helps!

  5. Avatar for David Ems

    Is there a guide to do this with a docker-compose file and not through docker CLI. Sorry if this is answered somewhere else I’m still new to docker and my server has been set up with compose files so i haven’t used the docker CLI itself

  6. Avatar for CardinalFang

    James,

    This is not really related to you container, but more of a performance troubleshooting question. The server works fine until I get to the edge of the current world. There is a significant pause while waiting for new chunks to be generated. I don’t know where to even start looking. Any thoughts?

    To make things worse, I have added several plugins, including dynmap and most recently Terralith (technically, a data pack)

    Fang

    1. Avatar for CardinalFang36
      CardinalFang36

      After some research, it appears many people have chunk creation performance issues on the RPi4. I decided to bite the bullet and migrate to an RPi5. It has only been a day, but the performance it great. And the start up time is dramatically faster.

      1. Avatar for James A. Chambers

        Hey CardinalFang36,

        That’s great news! The Raspberry Pi 5 is supposed to be 3-4x faster on CPU performance so this makes sense. I’m glad this got some of the performance issues resolved!

        A lot of the time new chunk generation is limited by both CPU and storage. I imagine in your case (and judging from the Pi 5 helping) that in your case it was CPU limited.

        Take care!

  7. Avatar for Aimar

    Hi James, I am planning on making a server of Minecraft with my friends. Do you have planned on making the 1.21 version of geyser+floodgate?
    Thanks

    1. Avatar for James A. Chambers

      Hello Aimar,

      It never matters what version the container is. Just do -e Version=1.X.X. The container doesn’t know or care what version you are running.

      If you are talking about me updating the defaults sure I will do that eventually but it doesn’t have any impact other than fixing it for people who don’t understand you can run any version you want already (as long as it exists).

      Me updating the defaults is literally me just changing the default version in the text file. Please don’t wait for this. Just use the version switch.

      Hopefully that helps!

Leave a Comment

Your email address will not be published. Required fields are marked *

Type here..

Exit mobile version