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 Alex

    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

    1. Avatar for James A. Chambers

      Hey Alex,

      It looks like your console is unresponsive because it’s still preparing the world. Have you let it sit for a while? You should get additional messages after preparing level world.

  2. Avatar for Ray J

    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

      1. Avatar for Ray J

        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

        1. Avatar for James A. Chambers

          Hey Ray J,

          I would try removing all instances of the container with docker image ls and then docker image rm each one of the entries on the list.

          I think your old backup settings are probably being retained somehow!

            1. Avatar for 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.

              1. Avatar for James A. Chambers

                Hey Ray J,

                Well let’s look at the backup code:

                # Back up server
                if [ -d "world" ]; then

                Did you change the name of your world/level away from world? That would definitely do it.

                Specifically you have modified server.properties and changed your:

                level-name=world

                right? Yeah, you won’t get any backups if you do that. You’ve changed the paths (which won’t do anything but break things). You would need to customize the container and compile your own version to get it to work with custom world paths.

                There is no point in changing the level-name setting. It doesn’t do anything other than change the paths to your world files. No players will ever know you changed it. They don’t see it anywhere. If you want to change the one they see that is actually:

                motd=A Minecraft Server

                You may have a hard time changing it back at this point. If you try I would make sure you do have backups taken (even if you do them manually). Theoretically you would need to rename your folders back to world, world_nether, etc. with the server closed and fix server.properties and relaunch. I know if you try this with Bedrock you have trouble though as it’s embedded in the NBT files. Hopefully Java will be a bit more forgiving.

                Hopefully that helps!

              2. Avatar for 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.

  3. Avatar for Paul B

    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

    1. Avatar for James A. Chambers

      Hello Paul,

      Usually the issues with problems like this fall into the following categories:

      – You have two routers (one for wired and one for WiFi for example) which is called double NAT (the solution is to put one of the devices in bridge mode)
      – You have a 4G/5G/wireless internet connection (these are rare to have inbound connectivity without getting on a special plan from your provider)
      – You have a shared internet connection through school/apartments/etc. (these often require working with whoever manages the connection to get inbound connectivity)
      – You potentially have a firewall running on the machine

      If you check for those things it will typically be one of those. Hopefully that helps!

  4. Avatar for juanlu

    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.

    1. Avatar for James A. Chambers

      Hey juanlu,

      The best way is to simply type “op player” in the server console. You can pull up the console with docker container ls and then docker container attach xxxx.

      Hopefully that helps!

  5. Avatar for Sander

    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).

    1. Avatar for James A. Chambers

      Hey Sander,

      What a great setup! Sorry for sending you down the rabbit hole with the Pi 5 issue. That’s a tricky one to fix.

      I have some ideas on how to fix it but they’re nasty. Detecting which system model the host is using in Docker and taking special action based upon it kind of defeats the purpose of Docker’s place and run anywhere.

      In reality I may have to do something like a special switch for the Pi5 you have to start the container with. I just hate the whole idea of having to do that since my whole goal with the container was portability. A switch may be the least evil way to do it.

      I completely agree with all of your recommendations though and am absolutely thrilled with where you ended up. Thank you for sharing and enjoy and take care!

  6. Avatar for Tony T

    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.

    1. Avatar for James A. Chambers

      Hey Tony,

      Great question! So the backup file is basically a tar / zip file that you just extract over the top of your existing files.

      In other words the backup file is just a full copy of the folders / files that make up your server. Make sure you stop the server before trying to extract over the top but that is basically all there is to it.

      Hopefully that helps!

  7. Avatar for Michael

    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

    1. Avatar for James A. Chambers

      Hey Michael,

      So you actually have it right. The problem is when you use the console you need to not put a / in front of the commands. That is only used in-game.

      The way to use it in the server console would be like this:

      op playername

      or

      op "player name"

      Hopefully that helps!

Leave a Comment

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

Type here..

Exit mobile version