RE:NODE

Обновление сервера Valheim и ошибка 'Incompatible version'

Автор Команда RE:NODE
11 мин чтения


"Incompatible version" на сервере Valheim означает, что игра на ПК игрока и сервер находятся на разных сборках, и почти всегда лечится обновлением сервера: корректно остановите его, выполните steamcmd +login anonymous +app_update 896660 validate +quit для его папки установки и запустите снова. Игра обновляется через Steam сразу после выхода патча, а выделенный сервер - отдельное приложение, которое обновляется только тогда, когда его кто-то об этом просит. Остальная часть статьи посвящена случаям, когда одной этой команды недостаточно: серверы с модами, игроки на публичной тестовой ветке, игроки на Xbox и Game Pass, отстающие на день, и группы, которые не хотят терять вечер из-за патча.

Почему версии расходятся#

В Steam Valheim - это два продукта. Игра - приложение 892970, выделенный сервер - приложение 896660. Выходят они одновременно, но устанавливаются и обновляются по отдельности:

  • Клиент обновляется через Steam автоматически, обычно как только игрок открывает Steam после патча. Отказаться от обновления игроку непросто.
  • Сервер обновляется, когда SteamCMD или клиент Steam запускает обновление его установки. Сервер, проработавший неделю, находится на той сборке, которая была актуальна, когда его в последний раз запускали с обновлением.

Поэтому в день патча всё идёт так: Iron Gate выпускает патч, игры у половины группы обновляются, они пробуют зайти, и сервер их отклоняет. Ничего не сломалось. Просто сервер отстал на день.

Расхождение возможно и в других направлениях:

  • Сервер новее клиента. Игрок, не перезапустивший Steam или приостановивший обновления, отстаёт. Ошибка при этом та же самая.
  • Разные платформы обновляются в разные дни. Патчи сначала получает Steam. Сборки для Microsoft Store и Xbox иногда приходят позже, так что в группе с кроссплеем могут оказаться игроки в Steam, которым нужен новый сервер, и игроки на Xbox, которые пока не могут на него зайти. Этот случай разобран в статье кроссплей Valheim и игроки на Xbox.

Как узнать версию на обеих сторонах#

Прежде чем что-либо менять, убедитесь в несовпадении.

На клиенте версия указана в нижнем углу главного меню - строка вроде 0.219.14. Любой игрок прочитает её за пару секунд.

На сервере версия выводится в начале лога при запуске:

code
Valheim version: l-0.219.14 (network version 34)

Префикс l- обозначает тип сборки и не входит в номер. Число в скобках - сетевая версия, и именно по ней в последних сборках проверяется совместимость подключения: сборки с одинаковой сетевой версией могут общаться друг с другом. Iron Gate не сохраняет её неизменной между патчами с новым контентом, и заранее надёжно узнать, изменил ли её тот или иной хотфикс, игрок не может, поэтому рабочее правило проще: если номера в меню и в логе различаются, обновите ту сторону, которая отстаёт.

Когда игрока отклоняют, сервер тоже записывает это в лог. Точная формулировка менялась от сборки к сборке, но в строке указаны игрок и обе версии, так что сразу видно, какая сторона старше.

Обновление через SteamCMD#

На вашей собственной машине обновление выполняется той же командой, что и установка. SteamCMD сравнивает установленную сборку с актуальной и скачивает только изменившееся.

bash
$ sudo systemctl stop valheim$ steamcmd +force_install_dir /home/valheim/server \    +login anonymous +app_update 896660 validate +quit$ sudo systemctl start valheim

Порядок важен:

  1. Сначала корректно остановите сервер. При корректной остановке мир записывается. Обновление под работающим сервером само по себе миру не вредит, а вот последующий перезапуск вредит, если процесс был убит, а не остановлен. Дождитесь World saved в логе.
  2. Запускайте обновление от пользователя, которому принадлежат файлы. Если запустить SteamCMD от root для папки, принадлежащей пользователю valheim, останутся файлы root, которые сервер потом не сможет перезаписать, и следующее обновление остановится на полпути.
  3. Каждый раз используйте один и тот же `+force_install_dir`. Если по ошибке указать другой путь, SteamCMD установит там вторую, актуальную копию, а ваша служба продолжит запускать старую.
  4. Запустите сервер и прочитайте строку с версией. Если она не изменилась, обновление попало не туда, куда вы думаете.

В актуальных версиях SteamCMD +force_install_dir должен стоять раньше +login, иначе он игнорируется с предупреждением. Анонимный вход здесь правильный: выделенному серверу не нужна учётная запись, владеющая игрой.

В Windows команда та же, только с steamcmd.exe и путём Windows. Если вы ставили сервер через раздел Tools клиента Steam, Steam обновляет его как любое другое приложение; проверьте, что автоматические обновления для него включены в свойствах, и останавливайте сервер до того, как Steam начнёт править файлы под ним.

Что делает validate и когда его не использовать

validate заставляет SteamCMD сверить каждый установленный файл с манифестом и заново скачать все отличающиеся. Это лечит повреждённую или недоустановленную сборку. Но он также перезаписывает любой изменённый вами файл в папке установки, включая start_server.sh или start_headless_server.bat, если вы правили копию, которую поставил Steam.

Отсюда два вывода:

  • Храните свой скрипт запуска под другим именем, например start_valheim.sh, чтобы validate никогда не сбрасывал ваши аргументы запуска.
  • Файлы BepInEx в манифест не входят, поэтому validate не трогает BepInEx/, doorstop_libs и start_server_bepinex.sh. Если сервер с модами после обновления всё равно перестал загружать моды, проверьте, что он по-прежнему запускается через start_server_bepinex.sh, а не через ванильный скрипт, и затем переустановите актуальный BepInExPack поверх сервера: паки иногда обновляются вместе с патчем игры.

Обычный +app_update 896660 без validate подходит для плановых обновлений. Используйте validate, когда сервер ведёт себя странно после обновления или установка была прервана. Общие плюсы и минусы разобраны в статье автоматизация обновлений игровых серверов.

Серверы с модами: дождитесь модов#

На ванильном сервере обновляться в день патча всегда правильно. На сервере с BepInEx это часто неправильно.

Моды встраиваются в код игры. Патч, который переименовывает или меняет метод, затронутый модом, ломает мод - иногда с ошибкой при запуске, иногда молча, иногда повреждая то, что мод сохраняет. А поскольку игроки запускают те же моды на своих клиентах, их игра после обновления Steam оказывается в том же состоянии.

Разумный порядок для сервера с модами:

  1. До установки патча где бы то ни было сделайте бэкап мира и скопируйте всю папку BepInEx, и плагины, и конфигурацию.
  2. Проверьте страницу каждого мода на предмет обновления или отметки, что он по-прежнему работает. Библиотеки вроде Jotunn обычно обновляются первыми, а зависящие от них моды - следом.
  3. Обновляйте сервер, только когда готовы все нужные вам моды. До тех пор игроки, уже обновившиеся, зайти не смогут - такова цена модов.
  4. Обновляйте моды на сервере и на всех клиентах одновременно, лучше всего из общего профиля менеджера модов, чтобы версии совпадали точно.
  5. Запустите сервер и прочитайте `BepInEx/LogOutput.log`: нет ли плагинов, которые не загрузились, до того как кто-либо зайдёт.

Игроки, обновившие игру раньше, чем были готовы моды, получают несовпадение версии от самой игры, несовпадение модов от Jotunn или ServerSync, а то и оба сразу. Это разные ошибки с разными решениями: про модовую рассказано в статье кики из-за несовпадения версий модов Valheim. Откат одного неудачного мода описан в статье что делать, если обновление мода всё сломало.

Откат обновления сервера#

В обычной работе Steam не предлагает старых сборок выделенного сервера. После того как SteamCMD обновил установку, старая версия пропадает, если вы её не сохранили.

Поэтому практичный откат - это копия, сделанная заранее:

bash
$ sudo systemctl stop valheim$ cp -a /home/valheim/server /home/valheim/server-0.219.14$ steamcmd +force_install_dir /home/valheim/server \    +login anonymous +app_update 896660 +quit

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

Чаще правильный "откат" - это откат мира: если патч и сломанный мод вместе повредили сохранение, восстановите мир из состояния до обновления, а не бинарный файл сервера. Именно поэтому бэкап из первого пункта списка для серверов с модами важнее копии установки.

Публичная тестовая ветка#

Крупные обновления Iron Gate проверяет на публичной тестовой ветке до выхода. Игроки подключаются к ней через Steam: свойства игры, вкладка Betas и код, который Iron Gate публикует для каждого теста - исторически это yesimadebackups, и это хорошо показывает, что они думают о тех, кто не делает бэкапы.

Игрок на публичной тестовой сборке не может зайти на обычный сервер, а обычный игрок - на тестовый. Чтобы запустить тестовый сервер, установите соответствующую ветку сервера:

bash
$ steamcmd +force_install_dir /home/valheim/ptb \    +login anonymous \    +app_update 896660 -beta public-test -betapassword yesimadebackups validate \    +quit

Перед использованием проверьте актуальное название ветки и пароль в объявлении самой Iron Gate; они много лет не менялись, но менять их вправе только она.

Правила для тестовых серверов:

  • Используйте отдельную папку установки и отдельную папку сохранений. Мир, открытый на тестовой сборке, может быть сохранён в формате, который релизная сборка прочитать не сможет.
  • Никогда не направляйте тестовый сервер на свой основной мир. Скопируйте его и смиритесь с тем, что копия может пропасть.
  • Игрокам нужно снова отказаться от беты в Steam, чтобы вернуться на обычный сервер, после чего Steam скачает релизную сборку.

Как планировать обновления для группы#

Главная цена обновления Valheim - не загрузка, которая занимает минуту. Это полчаса растерянности, когда группа садится играть и никто не может зайти. Небольшая рутина это убирает.

  • Обновляйтесь при запуске, а не посреди сессии. На ванильном сервере пусть обновление выполняется при каждом запуске сервера, а ежедневный перезапуск назначьте на час, когда никто не играет. Тогда в день патча всё решится за ночь.
  • Знайте, когда выходят патчи. Iron Gate объявляет об обновлениях в Steam и на своих каналах. Если патч вышел, пока люди в игре, корректный перезапуск с обновлением занимает пару минут; предупредите об этом заранее.
  • Назначьте ответственного. Пусть кто-то в группе после каждого патча проверяет, что строка версии сервера совпадает с игрой. На сервере с модами этот же человек решает, когда обновляться.
  • Перезапустите Steam на клиенте. Игрок, у которого "Incompatible version" остаётся после обновления сервера, сидит на старой игре; перезапуск Steam обычно запускает загрузку.

Как именно происходит обновление на хостинге с панелью, зависит от панели. Многие панели запускают SteamCMD при каждом старте сервера, так что перезапуск и есть обновление; у других есть переключатель среди переменных запуска. В RE:NODE вкладка Startup показывает переменные, с которыми запускается сервер, кнопка Restart отправляет корректную остановку, чтобы мир успел сохраниться, а вкладка Schedules может в заданный час выполнить бэкап и затем перезапуск. Для ванильной группы это и есть вся процедура обновления; для группы с модами убедитесь, что в расписании нет ничего, что подтянет новую сборку игры раньше, чем будут готовы ваши моды. Примеры разумных расписаний есть в статье расписания перезапусков, которые помогают.

Обновления и файл мира#

С некоторыми обновлениями формат мира меняется. Valheim конвертирует более старый мир, когда его загружает более новая сборка, и сохраняет его в новом формате. Из этого два следствия:

  • Для этого мира пути назад нет. Как только новая сборка его сохранила, старая может отказаться его загружать. Ваш бэкап до обновления - единственная копия, которую сможет прочитать старая версия.
  • Первый запуск после крупного обновления медленнее. Конвертация и новое сохранение большого мира могут занять заметно больше времени, чем обычный запуск. Не убивайте процесс из-за того, что консоль молчит; дайте ему закончить и сохраниться.

Хорошая привычка - делать ручной бэкап непосредственно перед каждым обновлением и подписывать его версией, на которой он снят. Чек-лист дня обновления игрового сервера подходит для Valheim без изменений.

FAQ#

Почему Valheim пишет Incompatible version, если ничего не менялось?

Кое-что изменилось: патч игры дошёл до игроков раньше, чем до сервера. Сравните версию в главном меню со строкой Valheim version в логе сервера и обновите ту сторону, которая отстаёт.

Нужно ли обновлять сервер после каждого хотфикса?

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

Можно ли запретить Steam обновлять игру, чтобы группа осталась на старой версии?

Надёжно - нет. Steam устанавливает обновления при запуске, а релизная ветка не предлагает старых сборок. Группы, которым нужна замороженная версия, борются с платформой; проще дождаться модов и обновиться вместе.

Удаляет ли validate мой мир?

Нет. Он только сверяет файлы в папке установки с манифестом Steam. Миры лежат в папке сохранений вне установки, если только вы не указали -savedir внутри неё, а это хороший повод так не делать.

Почему мой друг на Xbox не может зайти после того, как я обновил сервер?

Сборки для Xbox и Microsoft Store иногда получают патчи позже Steam. Пока у него нет обновления, он остаётся на старой версии, и обновлённый сервер его отклоняет. Обычно хватает подождать день.

Сколько занимает обновление сервера Valheim?

Загрузка обычно занимает минуту-две. Прибавьте корректную остановку, запуск и загрузку мира и рассчитывайте на пять минут, а при первом запуске после большого контентного обновления - больше.