Как оптимизировать сервер Purpur

1. Подготовка окружения на proxify.cloud

  1. Зайдите в панель proxify.cloud → раздел «Выделенные серверы» → выберите ваш сервер → вкладка Console (или подключитесь по SSH).
  2. Обновите систему и установите необходимые пакеты:
    apt update && apt upgrade -y
    apt install -y openjdk-21-jre-headless screen htop iotop ncdu jq curl wget git unzip
    
  3. Проверьте версию Java (Purpur 1.20.4+ требует Java 21):
    java -version
    # Ожидаемый вывод: openjdk version "21.x.x"
    
  4. Создайте пользователя для сервера (без sudo-прав):
    adduser --disabled-password --gecos "" mcuser
    su - mcuser
    mkdir -p ~/server && cd ~/server
    

2. Скачивание и базовая настройка Purpur

  1. Получите последнюю стабильную сборку через API PaperMC (Purpur использует тот же API):
    VERSION=$(curl -s https://api.purpurmc.org/v2/purpur | jq -r '.versions[-1]')
    BUILD=$(curl -s "https://api.purpurmc.org/v2/purpur/${VERSION}" | jq -r '.builds[-1]')
    JAR_NAME="purpur-${VERSION}-${BUILD}.jar"
    curl -o "purpur.jar" "https://api.purpurmc.org/v2/purpur/${VERSION}/${BUILD}/download"
    
  2. Примите EULA и создайте стартовый скрипт:
    echo "eula=true" > eula.txt
    cat > start.sh << 'EOF'
    #!/bin/bash
    # Настройки JVM для выделенного сервера на proxify.cloud (пример под 32GB RAM, оставьте 2-4GB под ОС)
    HEAP="28G"
    JAVA_ARGS=(
        -Xms${HEAP} -Xmx${HEAP}
        -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
        -Dusing.aikars.flags=https://mcflags.emc.gs
        -Daikars.new.flags=true
        -jar purpur.jar --nogui
    )
    exec java "${JAVA_ARGS[@]}"
    EOF
    chmod +x start.sh
    
  3. Первый запуск для генерации конфигов:
    ./start.sh
    # Дождитесь "Done (X.Xs)! For help, type "help"", затем введите stop
    

3. Настройка server.properties (ключевые параметры)

Откройте файл и измените следующие значения:

nano server.properties
# Сеть и производительность
network-compression-threshold=256
max-tick-time=60000
enable-jmx-monitoring=false
use-native-transport=true
region-file-compression=deflate

# Игровые механики (снижение нагрузки)
view-distance=6
simulation-distance=5
entity-broadcast-range-percentage=80
mob-spawn-range=4
max-entity-cramming=16

# Античит и эксплойты
enable-command-block=false
force-gamemode=true
hardcore=false
white-list=false
enforce-whitelist=false
spawn-protection=16
max-players=100
online-mode=true
prevent-proxy-connections=true
rate-limit=0

Совет: На proxify.cloud с NVMe дисками region-file-compression=deflate дает лучший баланс CPU/IO, чем zstd.

4. Оптимизация purpur.yml — основные секции

Файл находится в корне сервера. Редактируйте только указанные параметры, остальные оставьте по умолчанию.

4.1. Тики и сущности (ticks, entities)

ticks:
  # Частота обновления сущностей (меньше = менее плавно, выше FPS сервера)
  entity-per-tick:
    animal: 2
    monster: 2
    villager: 1
    flying: 2
    water: 2
    misc: 1

entities:
  # Отключение ИИ для дальних мобов
  activate-ai:
    only-if-player-in-range: true
    activation-dist: 32

  # Лимиты спавна (жестче, чем в spigot.yml)
  spawn-limits:
    monster: 50
    animal: 8
    water-creature: 3
    water-ambient: 2
    ambient: 1
    axolotls: 3
    underground-water-creature: 3

  # Удаление застрявших/бесполезных сущностей
  auto-remove:
    dropped-items:
      enabled: true
      threshold: 150
      interval: 30
    arrow-despawn-rate: 300
    experience-orb-despawn-rate: 300

  # Оптимизация сенсоров (Purpur-specific)
  use-vanilla-entity-targeting: false
  disable-creeper-lingering-effect: true
  disable-ender-dragon-death-sound: true

4.2. Чанки и генерация (chunks, generation)

chunks:
  # Задержка выгрузки чанков (в тиках) — критично для RAM
  delay-chunk-unloads-by: 10s
  # Макс. чанков на тик для сохранения (снижает лаги автосейва)
  max-auto-save-chunks-per-tick: 8
  # Предзагрузка чанков при телепорте
  player-chunk-load-threads: 2

generation:
  # Отключение генерации структур, если не нужны (экономит CPU при эксплоре)
  generate-structures: true
  # Кэширование высот (ускоряет генерацию)
  cache-heightmaps: true

4.3. Хопперы и контейнеры (hoppers, containers)

hoppers:
  # Объединение предметов в хопперах (менее частые проверки)
  cooldown-when-full: true
  push-limit: 64
  transfer-cooldown: 8
  # Отключение проверки контейнеров над хоппером (риск дюпов, но +TPS)
  ignore-occluding-blocks: false

containers:
  # Оптимизация шалкеров/сундуков
  shulker-box:
    allow-entity-inside: false

4.4. Игроки и античит (players, anti-cheat)

players:
  # Отправка пакетов только для видимых чанков
  send-full-position-update-when-moving: false
  # Отключение анимации еды/потения для других (сетевой трафик)
  disable-chest-cat-detection: true
  # Лимит команд в секунду (защита от спама)
  command-spam-limit: 20

anti-cheat:
  # Встроенный античит Purpur (легче плагинов)
  enabled: true
  # Настройки для высокой нагрузки
  movement:
    max-ping-millis: 250
    max-tps-penalty: 10.0

5. Настройка paper-global.yml (наследуется Purpur)

Файл: config/paper-global.yml. Создайте, если отсутствует.

verbose: false
config-version: 1.20.4
settings:
  # Оптимизация пулов потоков
  use-faster-eigencraft-redstone: true
  use-alternative-keepalive: true
  # Отключение ненужных проверок
  disable-chest-cat-detection: true
  disable-creeper-lingering-effect: true
  # Кэширование рецептов
  cache-recipe-results: true
  # Оптимизация карты
  maps:
    item-frame-cursor-limit: 16
    item-frame-cursor-update-frequency: 10
  # Контейнеры
  container-update-tick-rate: 1
  # Хопперы (дополнительно к purpur.yml)
  hopper:
    disable-move-event: true
    ignore-occluding-blocks: false
  # Энтити
  entity:
    max-entity-collisions: 2
    zombie-aggressive-towards-villager-when-lagging: false
  # Спавн
  spawn:
    alt-item-despawn-rate:
      enabled: true
      items:
        cobblestone: 300
        dirt: 300
        stone: 300
    spawn-limits:
      ambient: -1
      axolotls: -1
      creature: -1
      monster: -1
      underground_water_creature: -1
      water_ambient: -1
      water_creature: -1
  # Чанки
  chunk-loading:
    async-chunk-loading: true
    chunk-load-threads: 2
  # Логирование (убираем спам в консоль)
  log:
    log-named-deaths: false
    log-player-ip-addresses: false

6. Настройка spigot.yml (дополнительные лимиты)

settings:
  save-user-cache-on-stop-only: true
  moved-wrongly-threshold: 0.0625
  moved-too-quickly-threshold: 100.0
  timeout-time: 60
  restart-on-crash: true
  restart-script: ./start.sh
  netty-threads: 4
  bungeecord: false
  sample-count: 12
  player-shuffle: 0
  user-cache-size: 1000
  int-cache-limit: 1024
  # Критично для больших ферм
  filter-creative-items: true

commands:
  log: false
  tab-complete: 0
  send-namespaced: false
  replace-commands:
    - "minecraft:give"
    - "minecraft:gamemode"
    - "minecraft:tp"
    - "minecraft:teleport"

messages:
  whitelist: "Сервер на техническом обслуживании."
  unknown-command: "Неизвестная команда."
  server-full: "Сервер полон."

stats:
  disable-saving: false
  forced-stats: {}

advancements:
  disable-saving: false
  disabled: []

world-settings:
  default:
    verbose: false
    # Спавн мобов (Purpur переопределяет, но оставим совместимость)
    spawn-limits:
      monsters: 50
      animals: 8
      water-animals: 3
      water-ambient: 2
      ambient: 1
    # Чанки
    chunks-per-tick: