How to Run a Minecraft Server Network (BungeeCord/Velocity) on a VPS

How to Run a Minecraft Server Network (BungeeCord/Velocity) on a VPS

A single Minecraft server has limits — one game mode, one world, one experience. A Minecraft server network changes everything: players connect to one address and can switch between Survival, Creative, SkyBlock, PvP, and minigame servers instantly, all running as separate servers behind a single proxy. This is how large Minecraft networks like Hypixel and Mineplex operate — and you can build your own version on a VPS.

This guide covers setting up a Minecraft network using Velocity (the modern, recommended proxy) or BungeeCord (the classic option), running multiple backend servers, and configuring the full network on a VPS.

How a Minecraft Network Works

Players connect to:  play.yournetwork.com:25565
                              │
                        ┌─────▼─────┐
                        │  Velocity  │  ← Proxy server (port 25565)
                        │  (Proxy)   │     Routes player connections
                        └─────┬─────┘
                              │
              ┌───────────────┼───────────────┐
              │               │               │
        ┌─────▼─────┐  ┌──────▼─────┐  ┌─────▼──────┐
        │  Survival  │  │  Creative  │  │  SkyBlock  │
        │ (port 25566)│  │(port 25567)│  │(port 25568)│
        └────────────┘  └────────────┘  └────────────┘

Players see one network address. The proxy routes them to the correct backend server, handles login, and manages cross-server communication.

Velocity vs BungeeCord

Velocity BungeeCord
Developer PaperMC team SpigotMC team
Performance ⚡ Significantly better Moderate
Security Modern (better anti-exploit) Older design
Plugin ecosystem Growing (Velocity API) Mature (BungeeCord API)
Recommendation ✅ New networks Legacy networks only

Use Velocity for any new network. BungeeCord only makes sense if you need specific legacy plugins that haven’t been updated for Velocity.

VPS Requirements for a Network

Network size RAM CPU Players
Small (proxy + 2 servers) 8 GB 4 vCPU Up to 50
Medium (proxy + 4 servers) 16 GB 6–8 vCPU 50–200
Large (multiple VPS) Multiple VPS Distributed 200+

💡 VPS.DO Tip: VPS.DO’s USA VPS plans use KVM virtualization with dedicated RAM — essential for running multiple Java processes. The 30IPs plan (4 vCPU / 8 GB RAM) is a solid starting point for a small network. View Plans →


Step 1: System Preparation

sudo apt update && sudo apt upgrade -y
sudo apt install openjdk-21-jre-headless screen -y

# Create dedicated minecraft user
sudo useradd -m -s /bin/bash minecraft
sudo su - minecraft

Step 2: Create Directory Structure

mkdir -p ~/network/{proxy,survival,creative,skyblock}
# Each directory will hold one server instance

Step 3: Set Up the Velocity Proxy

cd ~/network/proxy

# Download Velocity (check papermc.io for latest version)
wget https://api.papermc.io/v2/projects/velocity/versions/3.3.0-SNAPSHOT/builds/latest/downloads/velocity-3.3.0-SNAPSHOT-latest.jar \
  -O velocity.jar

Start Velocity once to generate config files

screen -S proxy
java -Xms512M -Xmx1G -jar velocity.jar
# Press Ctrl+C after it generates configs
# Detach: Ctrl+A then D

Configure velocity.toml

nano ~/network/proxy/velocity.toml
# The port players connect to
bind = "0.0.0.0:25565"

# Your MOTD (shows in server list)
motd = "&aWelcome to &bMyNetwork&a!"

# Maximum players shown in server list
show-max-players = 500

# Online mode — set to true for premium/authenticated players
online-mode = true

# Security — MUST use "modern" forwarding with Paper backends
player-info-forwarding-mode = "modern"

# Backend servers
[servers]
survival  = "127.0.0.1:25566"
creative  = "127.0.0.1:25567"
skyblock  = "127.0.0.1:25568"

# Where players go when they first join
try = ["survival"]

[forced-hosts]
# Force players from specific domains to a server
# "survival.yournetwork.com" = ["survival"]

[advanced]
compression-threshold = 256
compression-level = -1
login-ratelimit = 2000

Get the forwarding secret

cat ~/network/proxy/forwarding.secret
# Copy this value — you'll need it for each backend server

Step 4: Set Up Backend Servers (Paper)

Each game mode runs as a separate Paper server. Paper is strongly recommended over vanilla Spigot for network setups.

cd ~/network/survival

# Download Paper (check papermc.io for latest)
wget https://api.papermc.io/v2/projects/paper/versions/1.21.1/builds/latest/downloads/paper-1.21.1-latest.jar \
  -O paper.jar

# Accept EULA
java -Xmx2G -jar paper.jar nogui
echo "eula=true" > eula.txt

Configure server.properties for Velocity

nano server.properties
# Bind to localhost only — never expose backend servers publicly
server-ip=127.0.0.1
server-port=25566

# CRITICAL: Set to false — authentication is handled by the proxy
online-mode=false

# Prevent players from connecting directly to backend (bypassing proxy)
prevent-proxy-connections=true

Configure Paper for Velocity forwarding

nano config/paper-global.yml
proxies:
  velocity:
    enabled: true
    online-mode: true
    secret: "PASTE_YOUR_FORWARDING_SECRET_HERE"

Repeat for each backend server

# Creative server
cd ~/network/creative
# Same setup, port 25567

# SkyBlock server  
cd ~/network/skyblock
# Same setup, port 25568

Step 5: Create Start Scripts

nano ~/network/proxy/start.sh
#!/bin/bash
cd ~/network/proxy
screen -S proxy java -Xms512M -Xmx1G \
  -XX:+UseG1GC \
  -XX:G1HeapRegionSize=4M \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+ParallelRefProcEnabled \
  -XX:+AlwaysPreTouch \
  -jar velocity.jar
nano ~/network/survival/start.sh
#!/bin/bash
cd ~/network/survival
screen -S survival java -Xms1G -Xmx2G \
  -XX:+UseG1GC \
  -XX:+ParallelRefProcEnabled \
  -XX:MaxGCPauseMillis=200 \
  -XX:+UnlockExperimentalVMOptions \
  -XX:+DisableExplicitGC \
  -XX:+AlwaysPreTouch \
  -XX:G1NewSizePercent=30 \
  -XX:G1MaxNewSizePercent=40 \
  -XX:G1HeapRegionSize=8M \
  -XX:G1ReservePercent=20 \
  -XX:G1HeapWastePercent=5 \
  -XX:G1MixedGCCountTarget=4 \
  -XX:InitiatingHeapOccupancyPercent=15 \
  -XX:G1MixedGCLiveThresholdPercent=90 \
  -XX:G1RSetUpdatingPauseTimePercent=5 \
  -XX:SurvivorRatio=32 \
  -XX:+PerfDisableSharedMem \
  -XX:MaxTenuringThreshold=1 \
  -jar paper.jar nogui
chmod +x ~/network/*/start.sh

Step 6: Create a Master Network Start Script

nano ~/network/start-network.sh
#!/bin/bash
echo "Starting Minecraft Network..."

# Start backend servers first
bash ~/network/survival/start.sh
sleep 5
bash ~/network/creative/start.sh
sleep 5
bash ~/network/skyblock/start.sh
sleep 10

# Start proxy last (after backends are ready)
bash ~/network/proxy/start.sh

echo "Network started! Use 'screen -ls' to see all sessions"
chmod +x ~/network/start-network.sh

Step 7: Configure Firewall

# Exit minecraft user
exit

# Only expose the proxy port publicly
sudo ufw allow 25565/tcp   # Velocity proxy — players connect here

# Backend server ports stay on localhost — NEVER expose them publicly
# They're only accessible via 127.0.0.1 from the proxy
sudo ufw reload

Step 8: Essential Network Plugins

For Velocity (Proxy plugins)

Plugin Purpose Download
LuckPerms Cross-server permissions luckperms.net
ViaVersion Multi-version support viaversion.com
SignedVelocity Modern chat signing support GitHub
MiniMOTD Custom server list MOTD GitHub

For Paper backend servers

Plugin Purpose
LuckPerms Sync permissions across servers
EssentialsX Core commands and utilities
Multiverse-Core Multiple world management
Vault Economy API bridge
Citizens NPC-based server selectors

Step 9: Auto-Start on Reboot with Systemd

sudo nano /etc/systemd/system/minecraft-network.service
[Unit]
Description=Minecraft Network
After=network.target

[Service]
User=minecraft
WorkingDirectory=/home/minecraft/network
ExecStart=/bin/bash /home/minecraft/network/start-network.sh
ExecStop=/home/minecraft/network/stop-network.sh
Restart=on-failure
RestartSec=30

[Install]
WantedBy=multi-user.target
sudo systemctl enable minecraft-network
sudo systemctl start minecraft-network

Step 10: Monitoring the Network

# View all running screen sessions
screen -ls

# Attach to a specific server console
screen -r proxy    # Velocity proxy console
screen -r survival # Survival server console

# Detach without stopping: Ctrl+A then D

# Check resource usage
htop
# Look for java processes — each server is a separate java process

Scaling Beyond One VPS

When your network grows beyond what one VPS can handle, distribute the load:

  • VPS 1 — Velocity proxy + lobby server
  • VPS 2 — Survival + SkyBlock (CPU/RAM intensive)
  • VPS 3 — Minigames + PvP (high player count)

Velocity supports backend servers on different IPs. Update velocity.toml:

[servers]
survival = "192.168.1.2:25566"   # Different VPS
skyblock  = "192.168.1.3:25566"   # Another VPS

Use a private network between VPS instances (or VPN) to keep backend server traffic off the public internet.


Final Thoughts

A Minecraft network on a VPS is one of the most rewarding server projects you can build. Velocity’s modern architecture, Paper’s performance optimizations, and a well-structured directory layout give you a professional-grade network that can grow from 10 players to hundreds.

VPS.DO’s KVM VPS plans — with dedicated RAM, 1 Gbps ports, and full root access — provide the ideal foundation. Start with the 4 GB RAM plan for testing, and upgrade to 8 GB or the 30IPs plan as your player count grows.

Fast • Reliable • Affordable VPS - DO It Now!

Get top VPS hosting with VPS.DO’s fast, low-cost plans. Try risk-free with our 7-day no-questions-asked refund and start today!