Как исправить ошибку «Internal Exception»

1. Понимание природы ошибки

Ошибка Internal Exception: java.io.IOException (или Internal Exception: java.lang.NullPointerException и подобные) — это обобщённое сообщение клиента о разрыве соединения по причине, которую сервер не смог корректно обработать. В логах сервера (latest.log) она почти всегда сопровождается стектрейсом (stack trace). Без анализа логов лечение сводится к гаданию.

Где смотреть логи на proxify.cloud:

  1. Зайдите в панель proxify.cloud → выберите ваш выделенный сервер → вкладка Console (консоль Proxmox) или подключитесь по SSH.
  2. Перейдите в директорию инстанса Minecraft (обычно /var/lib/pterodactyl/volumes/<UUID>/ или /home/minecraft/server/, зависит от способа установки).
  3. Файл логов: logs/latest.log.

2. Подключение к серверу и сбор диагностики

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

# 1. Подключение по SSH к выделенному серверу proxify.cloud
ssh root@<IP_ВАШЕГО_СЕРВЕРА_PROXIFY>

# 2. Если сервер в контейнере LXC (стандарт для Proxmox), зайдите в него
# Узнайте CTID: pct list
pct enter <CTID>

# 3. Переход в папку сервера (пример для Pterodactyl/Panel)
cd /var/lib/pterodactyl/volumes/<ВАШ_UUID>/
# Или если ставили вручную:
# cd /home/minecraft/server/

# 4. Просмотр последних 100 строк лога с ошибкой
tail -n 100 logs/latest.log

Что искать в логе:

  • Строку Caused by: — она указывает на корневую причину.
  • Имя мода/плагина в стектрейсе (например, com.example.mod.ItemRegistry).
  • Тип исключения: NullPointerException, IndexOutOfBoundsException, ClassCastException, OutOfMemoryError.

3. Классификация частых причин и исправления

3.1. Несовместимость версий модов/плагинов (Forge/Fabric/Spigot/Paper)

Симптомы: ClassNotFoundException, NoSuchMethodError, IncompatibleModException, ошибки при регистрации предметов/блоков.

Действия:

  1. Проверьте версию загрузчика (Forge/Fabric) в server.properties или логе запуска: Forge Mod Loader version 47.2.0 for Minecraft 1.20.1.
  2. Сравните версии модов в папке mods/ с требованиями загрузчика и Minecraft.
  3. Удалите подозрительные моды по одному (метод бинарного поиска):
    mkdir mods_disabled
    mv mods/<подозрительный_мод>.jar mods_disabled/
    # Перезапуск сервера через панель proxify.cloud (кнопка Restart)
    
  4. Обновите загрузчик до последней рекомендуемой (Recommended) сборки для вашей версии Майнкрафт.

3.2. Повреждение чанков или сущностей (TileEntity / Entity)

Симптомы: NullPointerException в ChunkMap, EntityTracker, TileEntity, ошибка возникает при заходе конкретного игрока или в конкретном месте.

Инструмент: Minecraft Region Fixer (работает с мирами Java Edition).

# 1. Остановите сервер (обязательно!)
# В панели proxify.cloud: Stop -> Kill (если завис)

# 2. Установка инструмента (нужен Python3)
apt update && apt install -y python3 git
cd /tmp
git clone https://github.com/Fenixin/Minecraft-Region-Fixer.git
cd Minecraft-Region-Fixer

# 3. Сканирование мира (замените world на имя папки вашего мира)
python3 region_fixer.py --scan /var/lib/pterodactyl/volumes/<UUID>/world

# 4. Автоисправление (удаляет битые чанки/сущности, создает бэкап .bak)
python3 region_fixer.py --fix /var/lib/pterodactyl/volumes/<UUID>/world --delete-corrupted

# 5. Если ошибка у конкретного игрока — удалите его playerdata
rm /var/lib/pterodactyl/volumes/<UUID>/world/playerdata/<UUID_ИГРОКА>.dat
rm /var/lib/pterodactyl/volumes/<UUID>/world/playerdata/<UUID_ИГРОКА>.dat_old

3.3. Утечка памяти и OutOfMemoryError (OOM)

Симптомы: Internal Exception: java.lang.OutOfMemoryError: Java heap space или Metaspace. Сервер лагает перед крашем, в консоли Can't keep up!.

Настройка JVM аргументов в панели proxify.cloud:

  1. Панель proxify.cloud → Ваш сервер → вкладка Startup (или ConfigurationJava Settings).
  2. Поле JVM Arguments (или JAVA_OPTS). Замените стандартные флаги на оптимизированные для Paper/Spigot/Purpur (пример для 8-16 ГБ RAM):
-Xms8G -Xmx12G -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

Важно: -Xmx не должен превышать 75-80% физической RAM контейнера/VM, оставите место для ОС и оффхип-памяти (Netty, Direct ByteBuffers).

  1. Сохраните и нажмите Restart в панели.

Диагностика утечки модов (Forge/Fabric):

  • Установите мод Sparkmods/).
  • В игре/консоли: /spark profiler --timeout 30 (снимок за 30 сек).
  • Откройте ссылку из вывода, ищите Heap Usage и GC Count. Если куча растет линейно без спадов после GC — мод утекает.

3.4. Проблемы с протоколом / пакетами (ProtocolSupport, ViaVersion, Geyser)

Симптомы: Internal Exception: io.netty.handler.codec.DecoderException, Packet ID out of range, ошибки при входе с разных версий клиента.

Решение:

  1. Обновите ViaVersion, ViaBackwards, ViaRewind, ProtocolSupport до последних версий с GitHub/Modrinth (не CurseForge, там часто устаревшие).
  2. Проверьте config.yml ViaVersion: checkforupdates: true, suppress-conversion-warnings: false.
  3. Если используете Geyser/Floodgate (Bedrock кросс-плей):
    • Убедитесь, что bedrock.port в config.yml Geyser не конфликтует с server-port в server.properties (должны быть разными).
    • В панели proxify.cloudNetwork (или Allocations) добавьте второй порт для Bedrock (UDP) и пропишите его в Geyser.
    • Включите clone-remote-player-entities: true в config.yml Geyser, если краши при спавне мобов.

3.5. Плагины/Моды, ломающие логику игры (NMS, Mixin, ASM)

Симптомы: ClassCastException, IncompatibleClassChangeError, ошибки в net.minecraft.server... или com.mojang... без упоминания конкретного плагина.

Поиск виновника:

  1. Плагин Spark (см. выше) → /spark profiler → вкладка Threads / Call Graph. Ищите методы, потребляющие много CPU или выбрасывающие исключения.
  2. Плагин Timings (встроен в Paper/Purpur):
    # В консоли сервера
    timings on
    # подождите 5-10 мин или до краша
    timings paste
    
    Откройте ссылку, анализируйте раздел Plugin Timings или Tile Entity / Entity Timings.
  3. Метод «половинного деления»:
    • Остановите сервер.
    • Переместите половину плагинов/модов в plugins_disabled / mods_disabled.
    • Запустите. Если ошибка пропала — виновник в отключенной половине. Повторите до выявления одного файла.

4. Сетевые настройки proxify.cloud (частая причина «Internal Exception: Connection reset»)

Если ошибка массовая у всех игроков одновременно — проблема в сети/файрволе.

  1. Проверка портов в панели proxify.cloud:

    • Вкладка Network / Allocations.
    • Убедитесь, что порт 25565 (или ваш кастомный) имеет статус Active и протокол TCP.
    • Для Geyser (Bedrock) нужен отдельный аллокация с UDP.
  2. Файрвол внутри Ubuntu (UFW/iptables):

    # Проверка статуса
    ufw status numbered
    # Разрешение порта Java-сервера (TCP)
    ufw allow 25565/tcp comment 'Minecraft Java'
    # Разрешение порта Geyser (UDP) — если нужно
    ufw allow 19132/udp comment 'Minecraft Bedrock'
    ufw enable
    
  3. Проверка BungeeCord / Velocity (прокси):

    • Если сервер за прокси, Internal Exception часто значит, что бэкенд упал, а прокси держит соединение.
    • В config.yml Velocity/Bungee: player-info-forwarding: MODERN (Velocity) или bungeecord: true в spigot.yml / paper-global.yml.
    • Логи прокси смотрите отдельно: tail -f proxy/logs/latest.log.

5. Полная переустановка чистого сервера (последний рубеж)

Если логи чистые, модов нет, а ошибка воспроизводится на ванильном клиенте:

# 1. Бэкап мира и конфигов
tar -czvf backup_$(date +%F).tar.gz world/ server.properties spigot.yml paper-global.yml plugins/ mods/

# 2. Удаление всего, кроме мира и бэкапа
# (ОСТОРОЖНО: проверьте pwd)
rm -rf *.jar libraries/ versions/ plugins/ mods/ config/ logs/ crash-reports/

#