MAATRIX GAMES / Блог / Valheim: краш сервера при загрузке мира

Valheim: краш сервера при загрузке мира

MAATRIX GAMES

Заходишь на сервер, консоль весело крутит «Loading world», а потом — тишина, процесс сдох, в логе бессмысленный стектрейс на английском. Или того хуже: сервер стартует, но при первом же коннекте игрока роняет обратно в консоль. Это одна из самых неприятных категорий проблем в Valheim, потому что причина может лежать в четырёх совершенно разных местах — от банально битого файла до тупо нехватки памяти. Разберём по порядку, как сузить круг подозреваемых и что делать с каждым сценарием.

Как отличить краш на загрузке от других падений

Первое, что нужно понять — падает сервер именно во время чтения файла мира, или же по другой причине, а сообщение «краш при загрузке» просто совпало по времени. Открой лог сервера (обычно это консольный вывод процесса valheim_server.x86_64, который панель хостинга пишет в файл вроде server.log или показывает во вкладке «Консоль»). Ищи характерные строки:

World save-file loading complete
Failed to load world '<имя_мира>'
Zone: Cannot load level
Exception in ZoneSystem.Load

Если краш происходит после World save-file loading complete и до полной инициализации ZoneSystem — почти наверняка проблема в самом файле мира. Если сервер вообще не доходит до этой строки и падает сразу после старта — скорее всего дело в BepInEx-плагине, который ломается ещё до подгрузки сохранения. А если процесс живёт минуту-другую и падает при подключении первого игрока — это часто память: сервер тянет террейн и объекты в момент, когда клиент начинает синхронизацию зон вокруг точки спавна.

Держи под рукой блокнот с временными метками — сравнение с логами и краш-репортами по другим играм показывает общий принцип: сначала локализуй момент падения, потом уже причину.

Повреждённый .db и .fwl — самая частая причина

Мир Valheim хранится в двух файлах: <имя_мира>.fwl (метаданные — сид, версия, настройки) и <имя_мира>.db (собственно террейн, постройки, зоны, инвентари). На выделенном сервере они обычно лежат в:

~/.config/unity3d/IronGate/Valheim/worlds_local/

Битый .db — классика после жёсткого килла процесса (OOM-killer, обрыв питания хоста, force-stop из панели во время автосохранения). Игра пишет данные не мгновенно — если процесс убили посреди записи, файл может оказаться усечён или с некорректным чек-каунтом внутри, и при следующей загрузке движок падает в исключении при десериализации зоны.

Проверить гипотезу просто: скопируй пару .fwl/.db к себе на ПК, положи в %appdata%\..\LocalLow\IronGate\Valheim\worlds_local\ (или в путь worlds_local в Steam-версии) и попробуй открыть мир в одиночной игре. Если краш повторяется даже в клиенте — файл действительно повреждён, дело не в серверном окружении.

Поднять сервер Valheim за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Восстановление из автоматических .old бэкапов

Хорошая новость: Valheim сам держит откат. При каждом сохранении движок перед перезаписью копирует старую версию файла в <имя_мира>.fwl.old и <имя_мира>.db.old (иногда встречается и .old.old — вторая ступень отката). Это твой первый и самый быстрый вариант восстановления:

cd ~/.config/unity3d/IronGate/Valheim/worlds_local/
cp MyWorld.db MyWorld.db.broken
cp MyWorld.fwl MyWorld.fwl.broken
cp MyWorld.db.old MyWorld.db
cp MyWorld.fwl.old MyWorld.fwl

Потеряешь прогресс с последнего автосохранения (обычно это минуты, не часы), зато сервер снова живой. Дедик Valheim принимает при запуске параметры для управления частотой и глубиной автобэкапов — если ты запускаешь сервер сам через shell-скрипт, а не через готовую панель, стоит явно прописать их в команде старта:

./valheim_server.x86_64 -name "MyServer" -port 2456 -world "MyWorld" -password "changeme" \
  -backups 4 -backupshort 7200 -backuplong 43200

-backups — сколько версий хранить, -backupshort/-backuplong — интервалы в секундах между короткими и длинными автосохранениями-бэкапами. Если восстановление из .old не помогло (файл был битым уже несколько сохранений подряд), ищи более старую копию в папке backups рядом с миром — туда движок кладёт снапшоты с меткой времени в имени. А если и там пусто — остаётся только штатный бэкап хостинга; в MAATRIX GAMES это делается через панель, подробный процесс восстановления описан в статье про восстановление сервера из бэкапа.

Несовместимость версий после обновления

Valheim активно развивается, и крупные патчи (вроде тех, что меняют генерацию биомов или структуру зон) иногда меняют внутренний формат сохранения. Steam обновляет клиент и сервер автоматически по расписанию — если у тебя авто-апдейт сервера включён, а игроки ещё сидят на старой версии клиента (или наоборот, кто-то из админов откатил сервер вручную через +app_update <id> -beta <ветка> в SteamCMD), при попытке загрузить мир новой версией движка на старом формате данных может вылезти исключение конвертации.

Признак именно этого сценария — в логе фигурирует что-то про version mismatch или WorldGenerator вместо чистого краша ZoneSystem. Что делать:

  • Проверь версию сервера и клиента — они должны совпадать посимвольно (номер версии виден в главном меню игры и в логе сервера при старте).
  • Если недавно обновлял сервер через SteamCMD вручную, сначала сделай полный бэкап папки worlds_local, и только потом запускай апдейт — конвертация формата мира обычно необратима в одну сторону.
  • Если сервер откатывали на старую ветку через -beta, а мир уже был пересохранён новой версией — вперёд без отката не поедет, придётся поднимать версию обратно.

Единой команды «зафиксировать версию» тут нет — надёжнее всего держать SteamCMD-апдейт сервера под ручным контролем (не в cron, а по факту, когда обновился клиент у всей группы), а не на полном автопилоте.

Конфликт модов через BepInEx

Если сервер модифицирован через BepInEx, крашей на загрузке мира ощутимо больше, потому что плагины часто цепляются именно к событиям инициализации зон и сохранений. Смотри BepInEx/LogOutput.log — там, в отличие от общего лога сервера, видно конкретный стектрейс с именем сборки-виновника (.dll в имени исключения).

Быстрый способ локализовать проблемный мод — бисекция:

  1. Останови сервер, скопируй папку BepInEx/plugins в сторону как бэкап.
  2. Оставь только моды, без которых сервер физически не работает (если такие есть, например серверные фреймворки статов), убери остальное.
  3. Запусти сервер — если мир грузится, возвращай моды пачками по 2-3 штуки, перезапускай сервер между пачками.
  4. Как только краш вернулся — сужай последнюю пачку до одного мода.

Особенно часто конфликтуют моды, которые трогают одну и ту же систему одновременно: два разных мода на управление лутом, два конкурирующих оверрайда генерации мира, или мод на постройку, рассчитанный на другую версию Valheim, чем стоит на сервере. Если у тебя ещё нет BepInEx на сервере или хочешь настроить установку модов с нуля — весь процесс пошагово описан в статье про установку BepInEx на сервер Valheim, а конкретные подборки — в материале про моды на строительство.

Нехватка памяти при подгрузке мира

Valheim не самая прожорливая игра по RAM, но требования растут вместе с миром: чем больше игроки настроили (форпосты, вырубленные леса, терраформинг), тем больше данных движок должен держать в памяти при старте и при подгрузке зон вокруг игроков. Базовая рекомендация для дедика — от 4 ГБ RAM, но это именно стартовая планка для свежего мира на 2-4 игроков; для давнего мира с большими постройками и активной группой стоит закладывать заметный запас.

Как отличить нехватку памяти от других причин:

# смотрим на нагрузку в момент краша
free -h
dmesg | grep -i "out of memory"

Если в dmesg (или в логах панели хостинга) находишь упоминание OOM-killer, убившего процесс valheim_server, — вот и причина. Сервер не «крашится» сам по себе в привычном смысле, его убивает ядро ОС, когда процессу не хватило памяти на подгрузку зон.

Варианты решения:

СитуацияЧто делать
Свежий мир, 2-4 игрока, краш стабильно повторяетсяПроверь тариф — возможно, реально мало RAM выделено
Старый мир с большими постройкамиАпгрейд тарифа на бо́льший объём RAM
Модифицированный сервер (BepInEx)Закладывай +20-30% к базовой рекомендации сверху
Разовый скачок нагрузкиПроверь swap на хосте, но это временная мера, не решение

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

Что делать, если ничего из этого не помогло

Если ты прошёл все пункты выше и мир всё равно не грузится — скорее всего, файл повреждён настолько глубоко, что даже .old-версии тоже битые (такое бывает, если проблема на диске хоста, а не в самой игре: проверь SMART/состояние диска, если у тебя выделенный сервер, а не облачный тариф с готовым хранилищем). В крайнем случае можно попытаться восстановить хотя бы часть мира сторонними инструментами для парсинга .db (в комьюнити Valheim такие тулзы периодически появляются и устаревают), но гарантий тут никто не даст — начинать стоит именно со штатных бэкапов хостинга.

Поднять сервер Valheim за пару минут

Готовый образ MAATRIX GAMES: NVMe, AMD EPYC, DDoS-защита, панель управления. Локации UK, US, RU. Оплата картой РФ, СБП или криптой.

Создать сервер

Частые вопросы

Можно ли открыть .db файл Valheim вручную, чтобы понять, что в нём битое?

Формат бинарный и не документирован официально, ковыряться в hex-редакторе смысла нет. Практичнее — тестовая загрузка в одиночной игре, она либо падает, либо нет.

Автобэкапы .old весят как основной мир — можно ли их отключить?

Технически да, через -backups 0, но тогда единственная страховка от краша — бэкапы хостинга. Отключать не советуем даже на маленьких серверах.

После отката на .old пропали постройки последних игроков — это нормально?

Да, откат откатывает мир к моменту последнего сохранения перед битым файлом, обычно это минуты, реже — до часа при больших интервалах -backupshort.

Мод, который работал месяцами, вдруг стал крашить сервер на загрузке — почему?

Скорее всего, обновился сам Valheim, а мод под новую версию ещё не адаптирован. Проверь страницу мода на Thunderstore/Nexus на предмет свежих обновлений.

Сервер падает только когда заходит конкретный игрок, а не при обычной загрузке мира — это тоже про память?

Не обязательно: иногда дело в повреждённых данных именно в его персональном сохранении на сервере (файл персонажа), а не в мире целиком — попробуй временно исключить его профиль и проверить, грузится ли мир для остальных.