Как объединить несколько серверов Minecraft

1. Архитектура и подготовка

Для объединения серверов используется прокси-сервер (Velocity или BungeeCord), который принимает подключения игроков и перенаправляет их на внутренние игровые сервера (backend). Игроки видят один адрес, а внутри — несколько миров: лобби, выживание, креатив, мини-игры.

Требования к выделенному серверу на proxify.cloud:

  • Ubuntu 22.04/24.04 LTS
  • Минимум 8 ГБ RAM (рекомендуется 16+ ГБ для 3+ серверов)
  • 2+ vCPU
  • Открытые порты: 25565 (прокси), 25566-25570 (backend), 22 (SSH)

В панели proxify.cloud (Proxmox VE) убедитесь, что у контейнера/VM включен Nested Virtualization (не обязательно, но полезно для Docker) и достаточно дискового пространства (минимум 30 ГБ).

Подключитесь по SSH:

ssh root@<IP_ВАШЕГО_СЕРВЕРА_PROXIFY>

Обновите систему:

apt update && apt upgrade -y

Установите базовые утилиты:

apt install -y screen htop nano ufw curl wget git openjdk-21-jre-headless

Важно: Minecraft 1.18+ требует Java 17+, 1.20.5+ — Java 21. Используем OpenJDK 21.


2. Структура директорий

Создайте единую структуру для всех серверов:

mkdir -p /opt/minecraft/{proxy,lobby,survival,creative}
mkdir -p /opt/minecraft/backups
chown -R 1000:1000 /opt/minecraft

Рекомендуется запускать серверы от отдельного пользователя (без sudo):

useradd -r -m -d /home/mc -s /bin/bash mc
chown -R mc:mc /opt/minecraft

Дальнейшие команды выполняйте от пользователя mc:

su - mc
cd /opt/minecraft

3. Установка backend-серверов (Paper)

Paper — оптимизированный форк Spigot. Скачайте последнюю стабильную версию для каждого сервера.

3.1 Лобби (lobby)

cd /opt/minecraft/lobby
wget -O paper.jar "https://api.papermc.io/v2/projects/paper/versions/1.20.6/builds/155/downloads/paper-1.20.6-155.jar"

Создайте start.sh:

cat > start.sh << 'EOF'
#!/bin/bash
java -Xms2G -Xmx2G -XX:+UseG1GC -XX:+ParallelRefactoringEnabled -XX:MaxGCPauseMillis=200 \
     -XX:+UnlockExperimentalVMOptions -XX:+DisableExplicitGC -XX:+AlwaysPreTouch \
     -Dterminal.jline=false -Dterminal.ansi=true -jar paper.jar --nogui
EOF
chmod +x start.sh

Запустите один раз для генерации конфигов:

./start.sh

Дождитесь сообщения Done! и введите stop в консоли.

3.2 Выживание (survival)

cd /opt/minecraft/survival
wget -O paper.jar "https://api.papermc.io/v2/projects/paper/versions/1.20.6/builds/155/downloads/paper-1.20.6-155.jar"
cp ../lobby/start.sh .
chmod +x start.sh
./start.sh
# введите stop после запуска

3.3 Креатив (creative)

cd /opt/minecraft/creative
wget -O paper.jar "https://api.papermc.io/v2/projects/paper/versions/1.20.6/builds/155/downloads/paper-1.20.6-155.jar"
cp ../lobby/start.sh .
chmod +x start.sh
./start.sh
# введите stop после запуска

4. Настройка backend-серверов для работы за прокси

Каждый backend должен знать, что за ним стоит прокси. Отредактируйте server.properties в каждой папке.

4.1 Общие настройки (выполните для lobby, survival, creative)

for dir in lobby survival creative; do
  cat > /opt/minecraft/$dir/server.properties << 'EOF'
# Minecraft server properties
enable-jmx-monitoring=false
rcon.port=25575
level-seed=
gamemode=survival
enable-command-block=false
enable-query=false
generator-settings={}
enforce-secure-profile=true
level-name=world
motd=Backend Server
query.port=25565
pvp=true
generate-structures=true
difficulty=easy
network-compression-threshold=256
max-tick-time=60000
require-resource-pack=false
use-native-transport=true
max-players=100
online-mode=false
enable-status=true
allow-flight=false
initial-disabled-packs=
broadcast-rcon-to-ops=true
view-distance=10
server-ip=0.0.0.0
resource-pack-prompt=
resource-pack=
resource-pack-sha1=
resource-pack-enforce=false
simulation-distance=10
rcon.password=changeme
player-idle-timeout=0
debug=false
force-gamemode=false
rate-limit=0
hardcore=false
white-list=false
broadcast-console-to-ops=true
spawn-npcs=true
spawn-animals=true
function-permission-level=2
level-type=minecraft\:normal
spawn-monsters=true
enforce-whitelist=false
spawn-protection=16
resource-pack-id=
max-world-size=29999984
server-port=25565
EOF
done

4.2 Уникальные порты и настройки для каждого сервера

Лобби (порт 25566, gamemode=adventure, force-gamemode=true):

sed -i 's/server-port=25565/server-port=25566/' /opt/minecraft/lobby/server.properties
sed -i 's/gamemode=survival/gamemode=adventure/' /opt/minecraft/lobby/server.properties
sed -i 's/force-gamemode=false/force-gamemode=true/' /opt/minecraft/lobby/server.properties
sed -i 's/motd=Backend Server/motd=Lobby Server/' /opt/minecraft/lobby/server.properties

Выживание (порт 25567):

sed -i 's/server-port=25565/server-port=25567/' /opt/minecraft/survival/server.properties
sed -i 's/motd=Backend Server/motd=Survival Server/' /opt/minecraft/survival/server.properties

Креатив (порт 25568, gamemode=creative):

sed -i 's/server-port=25565/server-port=25568/' /opt/minecraft/creative/server.properties
sed -i 's/gamemode=survival/gamemode=creative/' /opt/minecraft/creative/server.properties
sed -i 's/force-gamemode=false/force-gamemode=true/' /opt/minecraft/creative/server.properties
sed -i 's/motd=Backend Server/motd=Creative Server/' /opt/minecraft/creative/server.properties

4.3 Настройка spigot.yml (view-distance, entity-activation-range)

Для каждого backend:

for dir in lobby survival creative; do
  cat > /opt/minecraft/$dir/spigot.yml << 'EOF'
config-version: 13
settings:
  save-user-cache-on-stop-only: true
  entity-activation-range:
    animals: 16
    monsters: 24
    raiders: 48
    misc: 8
    water: 4
    villagers: 16
    flying-monsters: 48
  nerf-spawner-mobs: true
  mob-spawn-range: 4
  item-despawn-rate: 6000
  arrow-despawn-rate: 1200
  allow-permanent-chunk-loaders: false
  max-auto-save-chunks-per-tick: 24
  optimize-explosions: true
  prevent-tnt-from-setting-off-other-tnt: true
  disable-chest-cat-detection: true
  container-update-tick-rate: 1
  hopper-transfer: 8
  hopper-check: 1
  hopper-amount: 1
  random-light-updates: false
  structure-saving-tick-rate: 800
  disable-end-credits: true
  disable-save-validation: true
  filter-creative-items: true
  net-tick-rate: 20
  max-entity-collisions: 8
  grass-spread-tick-rate: 1
  despawn-ranges:
    soft: 28
    hard: 96
  enable-player-collisions: true
  arm-stands-do-collisions: false
  per-player-mob-spawns: true
  alt-item-despawn-rate:
    enabled: false
  max-tnt-per-tick: 100
  experience-merge-max-value: -1
  item-merge: 2.5
  entity-tracking-range:
    players: 48
    animals: 48
    monsters: 48
    misc: 32
    other: 48
  debug: false
  save-empty-scoreboard-teams: false
  player-inventory-save-tick-rate: 600
messages:
  whitelist: "Server is whitelisted."
  unknown-command: "Unknown command. Type \"/help\" for help."
  server-full: "The server is full."
  outdated-client: "Outdated client! Please use {0}"
  outdated-server: "Outdated server! I'm still on {0}"
  restart: "Server is restarting."
stats:
  disable-saving: false
  forced-stats: {}
advancements:
  disable-saving: false
  disabled: []
world-settings:
  default:
    verbose: false
    enable-zombie-pigmen-portal-spawns: true
    wither-spawn-sound-radius: 0
    hunger:
      walk-exhaustion: 0.2
      sprint-exhaustion: 0.8
      combat-exhaustion: 0.3
      regen-exhaustion: 3.0
      swim-multiplier: 0.01
      jump-exhaustion: 0.05
    entity-per-chunk-save-limit:
      experience_orb: 16
      item: 32
      area_effect_cloud: 8
    max-growth-height:
      cactus: 3
      reeds: 3
      bamboo: 16
      kelp: 25
      twisting_vines: 25
      weeping_vines: 25
      twisting_vines_plant: 25
      weeping_vines_plant: 25
    max