Setup Guide

Velocity Proxy for Minecraft

Connect multiple backend servers (lobby, survival, minigames) under one IP with seamless switching, modern forwarding, and built-in security.

Java 11+ Required to run Velocity
MC Support 1.7.2 → Latest All modern versions
Memory 512 MB – 1 GB Minimum for Velocity itself
Forwarding modern / legacy Encrypted player data
FeatureVelocityBungeeCordWaterfall
Performance✓ Modern JVMOlder archModerate
Encrypted forwarding✓ Built-inManual onlyPartial
Latest MC versions✓ AlwaysSlow updatesDelayed
Actively maintained✓ PaperMCSlowCommunity
Large network support✓ OptimizedResource-heavyModerate

1 Install & Start Velocity

  1. Download the latest Velocity JAR from papermc.io/software/velocity. Make sure Java 11+ is installed.
  2. Place the JAR in a dedicated folder and start it once to generate config files:
    click to copyjava -jar velocity.jar
  3. This generates velocity.toml and forwarding.secret in the same directory. Stop the server — you need to configure both before running players through it.
Memory: Allocate at least 512 MB–1 GB for Velocity itself. Add more based on your backend server count.

2 Configure velocity.toml

Located in your Velocity root directory. These are the key settings.

Bind address & port

click to copybind = "0.0.0.0:25565"

0.0.0.0 binds to all network interfaces. Replace 25565 with your preferred port.

Note: Make sure this port is open in your firewall and forwarded on your router if hosting externally.

Online mode

click to copyonline-mode = false
ValueBehaviour
truePremium accounts only — Mojang authentication required
falseAllows cracked clients — use with AuthMe or similar on backends

Player info forwarding

click to copyplayer-info-forwarding-mode = "modern"
ModeWhen to use
"modern"Minecraft 1.13+ — recommended, uses Velocity's encrypted protocol
"legacy"Minecraft 1.7.2–1.12.2
"none"Disables forwarding — not recommended

Backend server list

click to copy[servers]
lobby     = "127.0.0.1:25565"
survival  = "127.0.0.1:25566"
minigames = "127.0.0.1:25567"

try = ["lobby", "survival", "minigames"]

Define each backend server by name and address. The try list sets the fallback order when a player joins — first available server wins.

Remote servers: Replace 127.0.0.1 with the numeric IP of each remote server. Don't use domain names here — use nslookup.io to find the IP.
TOML note: No inline comments allowed in the [servers] block. Keep it clean.

MOTD

click to copymotd = "&6Welcome to Your Network!&r\nJoin our &bcommunity&r today!"

Displayed in the Minecraft server list. Use & for color codes and \n for line breaks.

Player limits & compression

click to copyshow-max-players = 1000
compression-level = 4
compression-threshold = 256
SettingDescription
show-max-playersMax players shown in server list (display only)
compression-level1–9. Higher = less bandwidth, more CPU. 4 is a safe default.
compression-thresholdMinimum packet size in bytes before compressing. Default: 256.

Forced hosts (optional)

click to copy[forced-hosts]
"lobby.yourdomain.com"    = ["lobby"]
"survival.yourdomain.com" = ["survival"]

Routes players connecting via a specific domain directly to a backend server. Leave empty if you're not using subdomains. DNS records must be set up first.

3 Set Up forwarding.secret

This key secures communication between Velocity and all backend servers. Every backend must use the same key.

  1. Generate a strong random string using Bitwarden's generator or any password tool.
  2. Open forwarding.secret in your Velocity directory and replace its contents with your key:
    click to copyxL9E!aaW#7Ef29pQ
  3. Save the file. You'll use this exact key in every backend server's config.
Security: Never share this key publicly. Use a unique key per Velocity instance — don't reuse keys across networks.

4 Configure Backend Servers

Each backend server needs two changes: disable its own auth (Velocity handles it) and enable Velocity forwarding with your secret key.

Edit server.properties

click to copyonline-mode=false

Mandatory for all backends in a proxy setup. Velocity handles authentication, so backends must not re-verify.

Note: Each backend server must run on a unique port to avoid conflicts.

Edit paper-global.yml (PaperMC)

Location varies by version:

click to copyproxies:
  velocity:
    enabled: true
    online-mode: false
    secret: "xL9E!aaW#7Ef29pQ"
Verify three things:
enabled is true · online-mode matches Velocity's setting · secret is identical to forwarding.secret

Other server software

SoftwareWhat to change
SpigotEdit spigot.yml → set bungeecord: true for legacy forwarding
FabricInstall FabricProxy Lite, configure with the same secret
PurpurEdit purpur.yml → set velocity: true
NeoForgeInstall NeoVelocity, configure with the same secret
Note: All backends must use the same forwarding mode (modern or legacy) as Velocity.

5 Repeat for All Backend Servers

Apply steps 4 to every server in your network — lobby, survival, minigames, etc. Each one needs:

Tip: Test each backend server individually (connect directly by IP:port) before routing players through Velocity.

6 Startup Order

Order matters — Velocity connects to backends on startup, so they need to be online first.

  1. Start all backend servers (lobby, survival, minigames, etc.).
  2. Start the Velocity proxy server.
Note: If a backend is offline when Velocity starts, players trying to join that server will get a connection error. Velocity won't crash — it just won't route to offline backends.

7 Switching Between Servers

Players can move between backend servers without disconnecting from the proxy.

Built-in commands

CommandWhat it does
/server <name>Switch to a named backend server
/server lobbyExample — switch to lobby
/glistList all servers and connected player counts
Permission: Players need velocity.command.server to use /server. Granted by default, but can be restricted via a permissions plugin.

Recommended plugins

LuckPerms
Cross-server permission management. Install on Velocity and all backends. Download
ServerSelectorX
GUI inventory menu for players to pick a server by clicking items. SpigotMC
RedisVelocity
Event-based switching (e.g. auto-move players after a game ends). SpigotMC
BungeeGuard
Extra security layer when using legacy forwarding. SpigotMC
Install plugins: Drop the JAR into the plugins/ folder of your Velocity directory and restart the proxy. Check each plugin's docs for Velocity-specific versions.

ServerSelectorX config example

click to copymenus:
  main:
    title: "&6Choose a Server"
    size: 27
    items:
      lobby:
        material: GRASS_BLOCK
        name: "&bLobby"
        slot: 10
        command: "server lobby"
      survival:
        material: DIAMOND_PICKAXE
        name: "&2Survival"
        slot: 12
        command: "server survival"
      minigames:
        material: GOLDEN_SWORD
        name: "&eMinigames"
        slot: 14
        command: "server minigames"

Players open this menu with /ssx open main. Make sure server names match exactly what's in velocity.toml.

LuckPerms — per-server access control

click to copy/lpv user <player> permission set velocity.command.server.lobby true
/lpv user <player> permission set velocity.command.server.survival true

Run from the Velocity console or as an operator in-game. Omit a permission to block access to that server.

8 Security & Performance

Troubleshooting

Players can't connect to backend servers
Verify the backend server IPs and ports in velocity.toml are correct and that each backend is actually running. Try connecting directly (by IP:port) to isolate whether it's a Velocity or backend issue.
Authentication errors on join
Check that forwarding.secret exactly matches the secret value in every backend's config. Also verify online-mode is consistent — false on backends, and matching your intent on Velocity.
High latency / lag
Check compression-level — if CPU usage is high, lower it. Use Spark to profile where the bottleneck is. Also check your host's network quality.
Domain forced hosts not routing correctly
Confirm your DNS records are correct using nslookup.io. Make sure the domain in [forced-hosts] exactly matches what players connect from, including any subdomains.
Players can't switch servers with /server
Confirm the server name in the command matches exactly what's in velocity.toml (case-sensitive). Check that the player has the velocity.command.server permission via LuckPerms. Make sure the target backend is online.
GUI plugin menu not appearing
The plugin (e.g. ServerSelectorX) must be installed in Velocity's plugins/ folder, not on the backend server. Also verify the config file has no YAML syntax errors and that the server names match velocity.toml.
Velocity won't start
Check you're running Java 11 or newer (java -version). Read the startup log — it usually states the exact error. Common causes: port already in use, malformed velocity.toml, or missing backend server entries.

Contributors

PokeDB — Developed & designed
Alino10 — Ideas & support (dealt with my crash-outs 🫡)