Update 2 months later
Somewhat unsurprisingly, given Oracle reputation, they disabled my supposedly always free resources two months later. Turns out, they disable the resources created while you were on trial. However, you can still make a clone of your boot volume, then terminate your previous instance, then recreate your instance from the cloned volume. It works so far.
In this tutorial, we’ll set up a free Minecraft server using a free tier Oracle Cloud.
Setting up an Oracle Free Tier
Signup for Oracle free account. Since this is Oracle, you probably want to check on the billing from time to time to make sure they didn’t start your changing for what they promised to be free.
Create a new compute instance. For max compatibility, we’ll use Ubuntu 18.04. You can try your luck with a newer version.
For the shape, select Ampere with 4 OCPU and 6GB Ram. This should still qualify for the free tier and should still be plenty for a Minecraft server.
Add your public SSH keys in the “Add SSH keys” section.
Create the instance.
After it’s created, go to the instance details, find “Primary VNIC” section, and open the subnet link (or create a new one).
Open Default Security List (or create a new one if one doesn’t exist yet)
Add Ingress Rules to open TCP/UDP ports 19132 for Bedrock and 25565 for Java edition (or both). Use CIDR for Source Type, 0.0.0.0/0 for Source CIDR, 19132 for Destination port. Repeat for TCP. Repeat for 25565 if planning to use Java edition.
SSH to your server
Upgrade all packages:
sudo apt-get update
sudo apt-get upgrade
Let’s reset the firewall rules and open the ssh and Minecraft ports:
sudo iptables -P INPUT ACCEPT
sudo iptables -P FORWARD ACCEPT
sudo iptables -P OUTPUT ACCEPT
sudo iptables -F
sudo ufw default deny incoming
sudo ufw default allow outgoing
sudo ufw allow 22/tcp
sudo ufw allow 19132/udp
sudo ufw allow 19132/tcp
sudo ufw allow 25565/udp
sudo ufw allow 25565/tcp
sudo ufw enable
sudo ufw status
Optionally install zsh and vim:
sudo apt install zsh
sudo apt install vim
SSH to your server:
ssh [email protected]_address
We’ll use this script to setup the server: https://github.com/TheRemote/MinecraftBedrockServer
curl https://raw.githubusercontent.com/TheRemote/MinecraftBedrockServer/master/SetupMinecraft.sh | bash
Use the following commands to start/restart the service (you specified the service name when you ran the installation script):
sudo systemctl stop minecraft_service
sudo systemctl start minecraft_service
sudo systemctl restart minecraft_service
# To disconnect (do not do ctrl-c or it may kill the minecraft service):
This section is only for Java edition. Don’t use it if you need the Bedrock version.
We’ll use this script to install the Java edition Paper server: https://github.com/TheRemote/RaspberryPiMinecraft.
SSH to your server and run
curl https://raw.githubusercontent.com/TheRemote/RaspberryPiMinecraft/master/SetupMinecraft.sh | bash. All default settings should be fine.
If you want Bedrock users to use your server, we can install Geyser plugin:
We’ll download the latest Geyser-Spigot server from https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/.
On the server run:
curl -O https://ci.opencollab.dev/job/GeyserMC/job/Geyser/job/master/lastSuccessfulBuild/artifact/bootstrap/spigot/target/Geyser-Spigot.jar
If you also want Bedrock users to be able to login with their Microsoft account without requiring a separate Java account, we can also install a floodgate plugin:
curl -O https://ci.opencollab.dev/job/GeyserMC/job/Floodgate/job/master/lastSuccessfulBuild/artifact/spigot/build/libs/floodgate-spigot.jar
Restart the Minecraft server with
sudo systemctl restart minecraft.service
DNS Records with Cloudflare
Add an A record for your server IP. For example, if you own example.com and want to connect to your server using mct.example.com, then add an A record for mct pointing to your server IP.
Add 2 srv records for each port (19132 and 25565):
mct for Name,
_minecraft for service, 0 for both Priority and Weight, UDP for protocol,
mct.example.com for the target.
mct is just the subdomain that you can change to whatever you want. Repeat for TCP and then for each port (19132 and 25565)