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.