Skip to main content
McDis-RCON excels at managing multiple Minecraft servers and proxy networks simultaneously. This guide covers configuration, organization, and best practices for multi-server setups.

Configuration Overview

Multiple servers are defined in md_config.yml under the Processes section:
md_config.yml
Bot Token: "your_discord_bot_token"
Panel ID: 1234567890
Language: "en"
Backups: 3

Flask:
  Allow: true
  IP: "203.0.113.42"
  Port: 5000

Processes:
  Servers:
    SMP:
      start_cmd: "java -Xmx4G -jar server.jar nogui"
      stop_cmd: "stop"
      blacklist:
        - "[debug]"
    
    CMP:
      start_cmd: "java -Xmx2G -jar server.jar nogui"
      stop_cmd: "stop"
      blacklist: []
    
    MMP:
      start_cmd: "java -Xmx6G -jar server.jar nogui"
      stop_cmd: "stop"
      blacklist: []
  
  Networks:
    Velocity:
      start_cmd: "java -Xmx512M -jar velocity.jar"
      stop_cmd: "end"
      blacklist: []
You can define up to any number of servers and networks. Each process gets its own folder, console thread, and management interface.

Process Types

McDis-RCON supports two process types:

Servers

Typical Minecraft server instances:
  • Paper, Spigot, Fabric, Forge servers
  • Independent worlds and configurations
  • Each gets a separate folder: McDis/SMP/, McDis/CMP/, etc.

Networks

Proxy servers that connect multiple Minecraft servers:
  • Velocity, BungeeCord, Waterfall
  • Route players between backend servers
  • Gets folder: McDis/Velocity/, McDis/BungeeCord/, etc.
The distinction between β€œServers” and β€œNetworks” is organizational. Both are treated as processes with the same capabilities.

File Structure for Multiple Servers

When managing multiple servers, your McDis folder structure looks like:
McDis/
β”œβ”€β”€ .mdbackups/          ← Backups for all processes
β”‚   β”œβ”€β”€ SMP/
β”‚   β”‚   β”œβ”€β”€ SMP 1.zip
β”‚   β”‚   β”œβ”€β”€ SMP 2.zip
β”‚   β”‚   └── SMP 3.zip
β”‚   β”œβ”€β”€ CMP/
β”‚   └── Velocity/
β”œβ”€β”€ .mdaddons/           ← Global addons
β”‚   └── status_tracker.py
β”œβ”€β”€ SMP/                 ← First server
β”‚   β”œβ”€β”€ .mdplugins/
β”‚   β”œβ”€β”€ .mdcommands/
β”‚   β”œβ”€β”€ server.jar
β”‚   β”œβ”€β”€ world/
β”‚   └── plugins/
β”œβ”€β”€ CMP/                 ← Second server
β”‚   β”œβ”€β”€ .mdplugins/
β”‚   β”œβ”€β”€ .mdcommands/
β”‚   β”œβ”€β”€ server.jar
β”‚   β”œβ”€β”€ world/
β”‚   └── plugins/
β”œβ”€β”€ MMP/                 ← Third server
β”‚   β”œβ”€β”€ .mdplugins/
β”‚   β”œβ”€β”€ .mdcommands/
β”‚   β”œβ”€β”€ server.jar
β”‚   └── world/
└── Velocity/            ← Network proxy
    β”œβ”€β”€ .mdplugins/
    β”œβ”€β”€ .mdcommands/
    β”œβ”€β”€ velocity.jar
    └── plugins/

Panel Layout

When McDis-RCON loads, it creates console threads for each process: Multi-Server Panel Panel threads:
  • Main panel message (controls)
  • Console SMP
  • Console CMP
  • Console MMP
  • Console Velocity
  • Error Reports
  • Console Flask
Use Discord’s thread sidebar to quickly navigate between server consoles.

Managing Individual Servers

Starting Specific Servers

# Start one server
!!start SMP

# Start multiple servers
!!start SMP
!!start CMP
!!start Velocity

# Start all servers
!!start-all

Stopping Specific Servers

# Stop one server
!!stop CMP

# Stop all servers
!!stop-all

Restarting Servers

# Restart individual server
!!restart SMP

# Restart all
!!restart-all

Common Multi-Server Patterns

Pattern 1: SMP + Creative + Minigames

md_config.yml
Processes:
  Servers:
    SMP:           # Survival server
      start_cmd: "java -Xmx6G -jar paper.jar nogui"
      stop_cmd: "stop"
      blacklist: []
    
    Creative:      # Creative build server
      start_cmd: "java -Xmx2G -jar paper.jar nogui"
      stop_cmd: "stop"
      blacklist: []
    
    Minigames:     # Minigame server
      start_cmd: "java -Xmx4G -jar paper.jar nogui"
      stop_cmd: "stop"
      blacklist: []
  
  Networks:
    Proxy:         # Velocity proxy
      start_cmd: "java -Xmx512M -jar velocity.jar"
      stop_cmd: "end"
      blacklist: []
Startup sequence:
!!start SMP
!!start Creative
!!start Minigames
!!start Proxy  # Start proxy last

Pattern 2: Modded + Vanilla

md_config.yml
Processes:
  Servers:
    Vanilla:
      start_cmd: "java -Xmx4G -jar server.jar nogui"
      stop_cmd: "stop"
      blacklist: []
    
    Modded:
      start_cmd: "java -Xmx8G @user_jvm_args.txt @libraries/net/minecraftforge/forge/1.20.1-47.2.0/unix_args.txt nogui"
      stop_cmd: "stop"
      blacklist:
        - "[FML]"
        - "[Forge]"
  
  Networks: {}

Pattern 3: Testing + Production

md_config.yml
Processes:
  Servers:
    Production:
      start_cmd: "java -Xmx6G -jar paper.jar nogui"
      stop_cmd: "stop"
      blacklist: []
    
    Testing:
      start_cmd: "java -Xmx2G -jar paper.jar nogui"
      stop_cmd: "stop"
      blacklist: []
  
  Networks: {}
Workflow:
  1. Test plugins on Testing server
  2. If stable, copy to Production
  3. Restart Production

Managing Server Dependencies

Network + Backend Servers

When using a proxy network, start backend servers first:
1

Start backend servers

!!start SMP
!!start CMP
!!start MMP
2

Wait for servers to finish loading

Monitor console threads until β€œDone!” message appears
3

Start proxy network

!!start Velocity
4

Players can connect

Players connect to the proxy, which routes them to backend servers
Shutdown sequence (reverse order):
!!stop Velocity  # Stop proxy first
!!stop-all       # Then stop all backend servers

Resource Allocation

Memory Distribution Example

For a server with 16GB RAM:
Processes:
  Servers:
    SMP:        # Main server - most resources
      start_cmd: "java -Xmx8G -jar server.jar nogui"
      
    Creative:   # Light usage
      start_cmd: "java -Xmx2G -jar server.jar nogui"
      
    Events:     # Moderate usage
      start_cmd: "java -Xmx4G -jar server.jar nogui"
  
  Networks:
    Velocity:   # Proxy - minimal resources
      start_cmd: "java -Xmx512M -jar velocity.jar"
Total allocation:
  • SMP: 8GB
  • Creative: 2GB
  • Events: 4GB
  • Velocity: 512MB
  • Total: 14.5GB (leaving ~1.5GB for OS)
Don’t allocate more memory than available RAM. Leave headroom for the operating system.

Port Configuration

Each server needs unique ports:
server.properties (SMP)
server-port=25565
query.port=25565
rcon.port=25575
server.properties (CMP)
server-port=25566
query.port=25566
rcon.port=25576
server.properties (MMP)
server-port=25567
query.port=25567
rcon.port=25577
velocity.toml
bind = "0.0.0.0:25565"  # Players connect here

[servers]
smp = "127.0.0.1:25565"
cmp = "127.0.0.1:25566"
mmp = "127.0.0.1:25567"
With a proxy, only the proxy port (25565) needs to be open externally. Backend servers can use localhost.

Cross-Server Plugins

Use plugins to coordinate between servers:

Example: Global Server Status Addon

server_status.py
from mcdis_rcon.classes import McDisClient
import discord
import asyncio

class mdaddon:
    def __init__(self, client: McDisClient):
        self.client = client

    async def on_message(self, message: discord.Message):
        if message.content == "!servers":
            status = "**Server Status:**\n"
            
            for process in self.client.processes:
                emoji = "🟒" if process.is_running() else "πŸ”΄"
                status += f"{emoji} {process.name}\n"
            
            await message.channel.send(status)
Place in McDis/.mdaddons/server_status.py and reload with !!adreload.

Backup Strategies

For multiple servers:

Individual Backups

Create backups per server:
  1. Navigate to .mdbackups/SMP/
  2. Create backup
  3. Repeat for other servers

Backup Rotation

With Backups: 3, each server maintains 3 backups:
.mdbackups/
β”œβ”€β”€ SMP/
β”‚   β”œβ”€β”€ SMP 1.zip  (newest)
β”‚   β”œβ”€β”€ SMP 2.zip
β”‚   └── SMP 3.zip  (oldest)
β”œβ”€β”€ CMP/
β”‚   β”œβ”€β”€ CMP 1.zip
β”‚   β”œβ”€β”€ CMP 2.zip
β”‚   └── CMP 3.zip
└── MMP/
    β”œβ”€β”€ MMP 1.zip
    β”œβ”€β”€ MMP 2.zip
    └── MMP 3.zip

Scheduled Backup Workflow

# Weekly backup routine
!!stop SMP
# Create backup via File Manager
!!start SMP

!!stop CMP
# Create backup via File Manager
!!start CMP

# Repeat for other servers
Stagger backups throughout the week to minimize downtime.

Troubleshooting Multi-Server Setups

Problem: Multiple servers fail to start togetherPossible causes:
  • Insufficient RAM
  • Port conflicts
  • Disk I/O limitations
Solutions:
  • Reduce memory allocation per server
  • Verify unique ports in server.properties
  • Start servers sequentially, not all at once
  • Use SSD for better I/O performance
Problem: Velocity/BungeeCord can’t reach backend serversChecklist:
  • Backend servers started before proxy?
  • Correct ports in proxy config?
  • online-mode=false in backend server.properties?
  • Firewall blocking localhost connections?
Solution:
# Stop all
!!stop-all

# Start backends first
!!start SMP
!!start CMP
# Wait for "Done!"

# Start proxy last
!!start Velocity
Problem: Process Manager lists servers multiple timesExplanation: This can happen if:
  • Servers were forcefully killed
  • Zombie processes remain
Solution:
  1. Use Process Manager to terminate duplicates
  2. Restart affected servers
  3. Use !!kill instead of force-killing from host

Best Practices

1. Naming Conventions

Use clear, descriptive names:
# Good
SMP_Main:
Creative_Build:
Minigames_Lobby:

# Avoid
Server1:
Server2:
S3:

2. Resource Monitoring

Use the Process Manager to track memory usage:
  1. Open Tools β†’ Processes
  2. Check RAM usage for each server
  3. Adjust -Xmx values if needed

3. Staggered Restarts

Avoid restarting all servers at once:
!!restart SMP
# Wait for SMP to fully restart
!!restart CMP
# Wait
!!restart MMP

4. Dedicated Plugins

Use different plugins per server type:
  • SMP: Economy, land claiming, jobs
  • Creative: WorldEdit, VoxelSniper, plots
  • Minigames: Custom game plugins
  • Proxy: Cross-server chat, lobbies

5. Blacklist Optimization

Filter unnecessary logs per server:
Modded:
  blacklist:
    - "[FML]"
    - "[Forge]"
    - "[debug]"

Vanilla:
  blacklist: []  # Keep all logs

Advanced: Dynamic Server Scaling

For advanced users, use addons to dynamically start/stop servers:
auto_scaler.py
class mdaddon:
    async def on_message(self, message: discord.Message):
        if message.content == "!start-all-smp":
            smp_servers = [p for p in self.client.servers if "SMP" in p.name]
            for server in smp_servers:
                if not server.is_running():
                    server.start()
                    await asyncio.sleep(30)  # Wait between starts

Next Steps

Process Manager

Monitor all running processes across servers

Creating Addons

Build cross-server automation with addons

Build docs developers (and LLMs) love