Skip to content

How to reverse proxy your Minecraft server with Velocity

Intro

So given Wendell's recent video+thread on HaProxy-Wi and other content relating to self hosting services at home and then proxy-ing them to the internet, I have seen some questions about running a reverse proxy with a Minecraft server, and answered them, and thought I might as well make a full thread.

The issue is that unlike many other services, Minecraft is not HTTP based, so HaProxy and similar software does not work. Therefore, either you have to directly forward all requests, or use a specific proxy software for Minecraft, which is where Velocity comes in. Velocity also has other features, such as allowing server linking, and supporting plugins.

The setup is fairly easy. Install java 8+, download the jar, run it once to create an example config file, edit the config file, run the jar again and you are good to go. Their wiki explains this part fairly well.

Once you get it up and running, if you are using it on a Linux machine, I would suggest also setting up the systemd service, as shown below. If you are running on a non-systemd distro, you probably already know how to write a service, or at least know enough to look up the info easily.

Systemd service

Autostarting after boot, and easy restarting are two of the benefits of using a systemd service.

Example systemd service file:

[Unit]
Description=Velocity Minecraft Proxy

[Service]
WorkingDirectory=/path/to/velocity/folder
ExecStart=/path/to/java -Xms512M -Xmx512M -XX:+UseG1GC -XX:G1HeapRegionSize=4M -XX:+UnlockExperimentalVMOptions -XX:+ParallelRefProcEnabled -XX:+AlwaysPreTouch -jar velocity-proxy.jar 
User=velocity
Type=simple
Restart=on-failure
RestartSec=10

[Install]
WantedBy=multi-user.target

Edit theWorkingDirectory, ExecStart, and User as needed. Call the file velocity.service, put in /etc/systemd/system/, although there other places that will work.

Run

#Reload service files from disk
sudo systemctl daemon-reload
#Set the velocity service to start at boot
sudo systemctl enable velocity
#Start the service
sudo systemctl start velocity

and you should be in business with a systemd managed proxy. It will then autostart with the system, and is easy to restart(sudo systemctl restart velocity)

Update script

Here is a update script I wrote. I am not super confident in the long term reliability of this, because it scrapes the download page to get the link, so if they update their build system or website, then this might need to be changed. But it works for the moment.

It works if you are using the stable version. Also you need to make a version.txt in your velocity directory before this will work. Something like echo 1.1.0 > version.txt, or whatever the current version is. Edit the /path/to/velocity/directory as needed, as well as the name of the jar file.

#!/bin/bash

#Bash unofficial strict mode
set -euo pipefail

#Easier to CD than to use absolute paths 
cd /path/to/velocity/directory

#Scrape the version and url from the downloads page
UPDATE_PAGE=$(curl -s https://www.velocitypowered.com/downloads)
UPDATE_URL=$(echo $UPDATE_PAGE | grep -oi 'https://ci.velocitypowered.com/.*jar')
UPDATE_VERSION=$(echo $UPDATE_URL | grep -io 'proxy-.*jar' | grep -ioP '\d.*\d')

#Get the current version from the version.txt file
CURRENT_VERSION=$(cat version.txt)

#Check if an update is needed
if [ $CURRENT_VERSION == $UPDATE_VERSION ]
then
        echo Velocity up to date: version $CURRENT_VERSION
else
        echo New Velocity update available: version $UPDATE_VERSION
        systemctl stop velocity.service
        #Moves the current jar to a jar.old so you could manually revert if the download fails
        mv velocity-proxy.jar velocity-proxy.jar.old
        curl -o velocity-proxy.jar $UPDATE_URL
        systemctl start velocity.service
        echo $UPDATE_VERSION > version.txt
        rm velocity-proxy.jar.old
fi

Last update: 2020-11-07