Как обновить плагины без ошибок

1. Подготовка и вход в панель proxify.cloud

  1. Откройте панель управления proxify.cloud и выберите нужный выделенный сервер (Dedicated Server) с установленной Ubuntu.

  2. Перейдите во вкладку Console (консоль Proxmox) или подключитесь по SSH с вашего компьютера:

    ssh root@<IP-адрес_сервера>
    

    Если используете пользователя, отличного от root (например, minecraft), подключайтесь от его имени — так безопаснее.

  3. Убедитесь, что вы находитесь в домашней директории пользователя сервера:

    cd /home/minecraft
    # или
    cd /opt/minecraft
    

    Путь зависит от того, как вы настраивали сервер при 최초 установке. Стандартная практика на proxify.cloud — отдельный пользователь minecraft и директория /home/minecraft/server.

2. Создание полного бэкапа перед обновлением

Никогда не обновляйте плагины на рабочем сервере без отката.

  1. Остановите сервер корректно (не убивайте процесс kill -9):

    # Если используете systemd (рекомендуется на Ubuntu)
    sudo systemctl stop minecraft
    
    # Если запускаете через screen/tmux вручную
    screen -S mc -X stuff "stop^M"
    # Ждите 10-15 секунд до полной остановки
    
  2. Создайте архив всего игрового каталога (включая plugins, world, config):

    DATE=$(date +%F_%H-%M)
    tar -czf "backup_full_${DATE}.tar.gz" /home/minecraft/server
    

    На выделенных серверах proxify.cloud дисковое пространство обычно не ограничено жестко, но проверьте df -h перед архивацией.

  3. Дополнительно забекапьте только папку plugins для быстрого отката отдельных плагинов:

    tar -czf "backup_plugins_${DATE}.tar.gz" /home/minecraft/server/plugins
    

3. Аудит текущих плагинов и проверка совместимости

  1. Получите список установленных плагинов с версиями:

    ls -la /home/minecraft/server/plugins/ | grep "\.jar$"
    
  2. Проверьте версию ядра сервера (Paper/Spigot/Purpur/Folia):

    grep "version" /home/minecraft/server/paper-*.jar 2>/dev/null | head -1
    # Или проще — посмотрите название файла ядра:
    ls /home/minecraft/server/*.jar
    
  3. Для каждого плагина, который планируете обновить:

    • Зайдите на Modrinth, Hangar или SpigotMC.
    • Сравните версию API ядра (например, 1.20.4-R0.1-SNAPSHOT) с требованиями плагина.
    • Критично: Плагины для Folia (региональный шардинг) не совместимы с Paper/Spigot без адаптации. На proxify.cloud часто используют Paper — качайте сборки под Paper.

4. Скачивание новых версий плагинов

Не заменяйте файлы прямо в папке plugins работающего сервера. Используйте временную директорию.

  1. Создайте папку для скачивания:

    mkdir -p /home/minecraft/updates_${DATE}
    cd /home/minecraft/updates_${DATE}
    
  2. Скачайте .jar файлы через wget или curl (пример для LuckPerms, ViaVersion, WorldEdit):

    # LuckPerms (всегда качайте версию для вашего ядра: Paper/Spigot)
    wget "https://ci.lucko.me/job/LuckPerms/lastSuccessfulBuild/artifact/bukkit/loader/build/libs/LuckPerms-Bukkit-5.4.x.jar" -O LuckPerms.jar
    
    # ViaVersion (Modrinth API пример)
    wget "https://api.modrinth.com/v2/project/KQqX7O8g/version/latest?loaders=[\"paper\"]&game_versions=[\"1.20.4\"]" -O viaversion.json
    # Парсим URL из JSON (требует jq: apt install jq)
    VIA_URL=$(jq -r '.files[0].url' viaversion.json)
    wget "$VIA_URL" -O ViaVersion.jar
    
    # WorldEdit
    wget "https://dev.enginehub.org/job/WorldEdit/lastSuccessfulBuild/artifact/worldedit-bukkit/build/libs/worldedit-bukkit-7.3.x.jar" -O WorldEdit.jar
    
  3. Проверьте целостность файлов (размер > 100Кб, не HTML-страница ошибки):

    file *.jar
    # Должно выводить: Java archive data (JAR)
    

5. Применение обновлений (Hot-swap vs Перезапуск)

Вариант А: Полный перезапуск (Рекомендуемый, гарантирует чистоту конфигов)

  1. Удалите старые .jar файлы из папки плагинов (конфиги в подпапках plugins/PluginName/ не трогайте):

    rm /home/minecraft/server/plugins/LuckPerms*.jar
    rm /home/minecraft/server/plugins/ViaVersion*.jar
    rm /home/minecraft/server/plugins/WorldEdit*.jar
    
  2. Переместите новые файлы:

    mv /home/minecraft/updates_${DATE}/*.jar /home/minecraft/server/plugins/
    
  3. Исправьте права доступа (важно, если качали от root):

    chown -R minecraft:minecraft /home/minecraft/server/plugins/
    chmod 644 /home/minecraft/server/plugins/*.jar
    
  4. Запустите сервер:

    sudo systemctl start minecraft
    # Или через screen
    screen -S mc -dm bash -c 'cd /home/minecraft/server && java -Xms4G -Xmx4G -jar paper-1.20.4.jar nogui'
    

Вариант Б: Горячая перезагрузка (/plugman load или /plugman reload) — ТОЛЬКО для минорных фиксов

Используйте только если плагин официально поддерживает релоад без утечек памяти (например, LuckPerms, PlaceholderAPI). Для WorldEdit, ProtocolLib, CoreProtect — запрещено.

  1. Установите PlugManX (современный форк для Paper/Folia), если нет:

    wget "https://github.com/PlugManX/PlugManX/releases/latest/download/PlugManX.jar" -O /home/minecraft/server/plugins/PlugManX.jar
    sudo systemctl restart minecraft
    
  2. В консоли сервера (через панель proxify.cloud -> Console или screen -r mc) выполните по очереди:

    /plugman unload LuckPerms
    # Удалите старый jar вручную через SFTP или консоль:
    rm /home/minecraft/server/plugins/LuckPerms-*.jar
    # Загрузите новый jar в plugins (через SFTP/WinSCP)
    /plugman load LuckPerms
    

    Проверяйте логи на ошибки [ERROR] Could not load... после каждой команды.

6. Миграция конфигураций (Breaking Changes)

Обновления мажорных версий (v4 -> v5, 7.x -> 8.x) часто меняют формат конфигов.

  1. После первого запуска с новым плагином сразу остановите сервер (stop).
  2. Сравните старый и новый конфиг. Новый конфиг генерируется в plugins/PluginName/config.yml (или config.json).
    # Пример для LuckPerms (использует H2/SQL, конфиг минимален, но все равно проверьте)
    diff -u /home/minecraft/backup_plugins_${DATE}/LuckPerms/config.yml /home/minecraft/server/plugins/LuckPerms/config.yml
    
  3. Если плагин использует новую структуру (например, WorldEdit 7 -> 8, или EssentialsX ребрендинг):
    • Не копируйте старый конфиг поверх нового.
    • Перенесите вручную ваши кастомные настройки (permissions, messages, limits) в новый файл, используя документацию плагина.
    • Частый кейс: messages.yml вынесен отдельно — обновите его отдельно.

7. Проверка работоспособности после запуска

  1. Запустите сервер и дождитесь строки Done (X.Xs)! For help, type "help".

  2. Зайдите на сервер (или попросите тестера) и проверьте ключевые функции:

    • Permissions: /lp user <nick> info (LuckPerms).
    • WorldEdit: //wand, //set stone.
    • ViaVersion: заход с клиента другой версии.
    • Economy/Chat: баланс, префиксы в чате.
  3. Проверьте консоль на наличие [ERROR], [WARN], Stacktrace:

    # Если используете systemd/journald
    journalctl -u minecraft -f --since "5 minutes ago"
    
    # Если логи в файле
    tail -n 100 /home/minecraft/server/logs/latest.log | grep -E "ERROR|WARN|Exception"
    
  4. Выполните команду /timings on -> подождите 2-3 минуты -> /timings paste. Проверьте отчет на аномальную нагрузку от обновленных плагинов.

8. Очистка и фиксация состояния

  1. Удалите временную папку со скачанными файлами:

    rm -rf /home/minecraft/updates_${DATE}
    
  2. Удалите старые бэкапы старше 7 дней (чтобы не забить диск proxify.cloud):

    find /home/minecraft -name "backup_*.tar.gz" -mtime +7 -delete
    
  3. (Опционально) Зафиксируйте версии в файле манифеста для воспроизводимости:

    ls -1 /home/minecraft/server/plugins/*.jar > /home/minecraft/server/plugins_manifest_${DATE}.txt
    

Возможные проблемы и решения

1. java.lang.UnsupportedClassVersionError при запуске

Причина: Плагин скомпилирован под Java 21, а на сервере стоит Java 17 (или наоборот). Paper 1.20.4+ требует Java 21. Решение:

# Проверьте версию
java -version
# Установите Java 21 (Ubuntu 22.04/24.04)
sudo apt update && sudo apt install openjdk-21-jre-headless
# Обновите альтернативы
sudo update-alternatives --config java
# Укажите путь к Java 21 в systemd юните или скрипте запуска

2. Плагин не загружается: Could not load 'plugins/Plugin.jar' in folder 'plugins'

Причина: Несовместимость API (Paper vs Spigot vs Folia), отсутствие зависимостей (Libs), поврежденный скачанный файл. Решение:

  • Проверьте `file