RE:NODE

Эксплуатация11 мин чтения

Безопасное автообновление игрового сервера

Обновление при рестарте, плановые обновления через SteamCMD и validate: какие серверы могут обновляться сами, каким это запрещено и как обновлять остальные поэтапно.

0 прочтений

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

Что такое сам SteamCMD и как работают его аргументы, рассказано в статье SteamCMD простыми словами. Здесь предполагается, что строку установки вы знаете и решаете, как часто её запускать и с какими предохранителями.

Зачем вообще обновлять игровые серверы#

Выделенный сервер должен работать на точно той же версии игры, что и подключающиеся к нему клиенты. В большинстве игр Steam это проверяется: клиент при подключении передаёт номер сборки, и сервер отклоняет всё остальное, обычно с бесполезным сообщением вроде «Incompatible version» или «Server is running a different version». Когда разработчик выпускает патч, Steam-клиент каждого игрока скачивает его в течение нескольких часов, и с этого момента на старый сервер зайти нельзя.

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

  • Minecraft Java ничего не обновляет автоматически, а игроки сами выбирают версию клиента в лаунчере. Сервер на 1.21.1 остаётся доступным для клиентов 1.21.1 сколько угодно, а плагины вроде ViaVersion позволяют более новым клиентам подключаться к старому серверу.
  • Factorio позволяет игрокам выбрать старую версию игры на вкладке бета-версий в Steam и никому не навязывает обновления, так что сервер может оставаться на версии, пока группа с этим согласна.
  • FiveM отделяет сборку сервера («artifact») от игры. Клиенты подключаются к тому, на чём работает сервер, в пределах диапазона сборок, которые платформа ещё поддерживает.
  • Terraria обновляет клиенты через Steam, но выделенный сервер - отдельная загрузка, так что новую версию кто-то должен скачать вручную.

Всё остальное - Valheim, Rust, Palworld, Project Zomboid, 7 Days to Die, Counter-Strike 2, Unturned, Satisfactory, DayZ, Arma 3 - требует, чтобы сервер был на той же сборке, что и клиенты, и задержка на день означает день, когда никто не может зайти.

Обновление при рестарте: стандарт для ванильных серверов#

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

start.sh
#!/bin/shset -e/home/steam/steamcmd/steamcmd.sh +force_install_dir /srv/valheim \    +login anonymous +app_update 896660 +quitcd /srv/valheimexec ./valheim_server.x86_64 -nographics -batchmode \    -name "Longship Crew" -port 2456 -world "Midgard" -password "$PASS"

В панели на базе Pterodactyl большинство egg для игр Steam предлагают то же поведение в виде переменной запуска - обычно это переключатель с названием вроде auto-update, - которая запускает SteamCMD перед каждой загрузкой. Название и значение по умолчанию у разных egg отличаются, поэтому проверьте вкладку Startup на своём сервере, а не полагайтесь на догадки.

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

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

Когда не обновлять автоматически#

Отключайте автоматические обновления, если верно хоть одно из этого:

  1. На сервере стоят моды или плагины, которые цепляются за код игры. BepInEx в Valheim, Oxide или Carbon в Rust, UE4SS в Palworld, моды на Harmony в 7 Days to Die и Rimworld, скриптовые моды DayZ, RocketMod в Unturned. Они патчат собственный код игры во время работы, а патч игры сдвигает тот код, который они патчат. Мод либо не загружается, либо, что хуже, загружается и что-нибудь портит.
  2. Сервер намеренно сидит на закреплённой или бета-ветке. Автоматическое обновление с неверным аргументом ветки переключит вас обратно на public.
  3. С обновлением меняется формат мира. Крупные обновления иногда конвертируют сохранение при первой загрузке. После конвертации оно редко загружается в старой версии. Нужен backup, сделанный вручную за минуту до этого.
  4. Идёт соревновательное событие. Выходные с турниром - не лучшее время узнать, что патч поменял значение cvar по умолчанию.

Для таких серверов порядок действий описан в статье чек-лист дня обновления: прочитать патчноуты, дождаться авторов модов, сделать заблокированный backup, сначала обновить тестовую копию, потом настоящий сервер.

Validate: что он чинит и почему не стоит запускать его каждый раз#

validate заставляет SteamCMD посчитать хеш каждого файла установки и заменить всё, что не совпадает с опубликованным манифестом. Это правильный инструмент после:

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

При каждом рестарте это неправильный инструмент, по двум причинам. На большой установке - Arma 3, DayZ и Rust вместе с контентом занимают десятки гигабайт - хеширование читает с диска всю установку и может добавлять минуты к каждой загрузке. А ещё validate откатывает любой поставляемый приложением файл, который вы правили: скрипт запуска, конфиг по умолчанию в каталоге установки, изменённый .json, который идёт с игрой и который вы настроили. Правка молча заменяется оригиналом.

Работающая схема - обычное обновление при каждом рестарте и validate только когда что-то не так:

code
app_update 896660            # normal: changed files onlyapp_update 896660 validate   # repair: hash and replace everything

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

Как запланировать обновление, чтобы оно не пришлось на середину сессии#

Для активного сообщества лучше, чтобы обновления происходили в выбранное вами время. На RE:NODE это вкладка Schedules: cron-выражение и упорядоченный список задач с задержками - консольная команда, backup, действие питания. Ночное обновление с рестартом для ванильного сервера с включённым обновлением при рестарте выглядит так:

Nightly update window, 05:00
Cron     0 5 * * *Task 1   command  say Restarting for updates in 5 minutes      (delay 0)Task 2   command  say Restarting in 1 minute                   (delay 240 s)Task 3   command  save                                         (delay 60 s)Task 4   backup                                                (delay 30 s)Task 5   power    restart                                      (delay 60 s)

Рестарт запускает обновление, backup перед ним позволяет откатить неудачный патч, а предупреждения избавляют игроков от сюрпризов. Подставьте подходящие для своей игры команды сохранения и оповещения; они перечислены в статье запланированные задачи, которые стоит завести, а синтаксис cron и часовые пояса разобраны в статье cron-выражения простыми словами.

На загруженном сервере стоит добавить два улучшения:

  • Проверяйте перед рестартом. Если у вас собственная машина, сравнивайте установленную сборку с последней и пропускайте рестарт, если они совпадают. Установленная сборка указана в steamapps/appmanifest_<appid>.acf как "buildid"; последнюю выводит +app_info_update 1 +app_info_print <appid> в разделе branches, затем public. Формат вывода app_info_print не является стабильным интерфейсом, поэтому скрипт, который его разбирает, стоит проверять после каждого обновления SteamCMD.
  • Не воюйте с политикой рестартов. Расписание, которое перезапускает сервер каждую ночь, и плагин, который тоже перезапускает его по таймеру, рано или поздно наложатся друг на друга. Выберите что-то одно.

Как понять, что обновление прошло#

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

  1. Строка успеха SteamCMD. Завершённое обновление выводит Success! App '<appid>' fully installed.. Ошибки вроде Error! App '<appid>' state is 0x202 after update job. (обычно нехватка места) или 0x6 / 0x602 (зависшая загрузка) означают, что обновления не было. Если вы обновляете скриптом, ищите строку успеха, а не доверяйте коду возврата, который не всегда был надёжным.
  2. Собственная строка версии игры. Почти каждый сервер выводит свою версию в начале лога запуска. Valheim пишет строку Valheim version:, Minecraft - Starting minecraft server version, игры на Source выводят номер сборки в ответ на version. После обновления проверьте, что он изменился.
  3. Одно настоящее подключение. Вход клиента - единственная проверка, которая доказывает, что клиент и сервер согласны.
bash
$ grep -E "Success! App|Error! App" steamcmd-update.logSuccess! App '896660' fully installed.

Если обновление на сервере в панели не удалось, первым делом смотрите на место на диске. SteamCMD складывает новые файлы на тот же том, прежде чем подменить ими старые, поэтому ему нужно свободное место примерно равное объёму изменённого контента сверх установленной игры. Диск, заполненный на 95%, - это диск, на котором следующий большой патч не встанет; что почистить, описано в статье на игровом сервере закончилось место.

Игры, которые не используют SteamCMD#

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

ИграКак обновляется серверАвтоматизировать?
Minecraft (Paper)Заменить jar сервера новой сборкойСборки в пределах одной версии: осторожно. Новые версии: никогда
FiveMЗаменить artifact сервераЗакрепить рекомендованную сборку; обновлять вручную
FactorioСкачать новую headless-сборку с factorio.comТолько если группа согласна на версию
TerrariaЗаменить файлы выделенного сервера вручнуюВручную, после того как подтянутся tModLoader или TShock
Minecraft BedrockЗаменить сборку Bedrock Dedicated ServerВручную; на телефонах и консолях клиенты обновляются автоматически

В Minecraft обновление сборки Paper в пределах одной версии Minecraft обычно исправляет баги и его можно применять по расписанию - хотя изредка сборка меняет поведение, на которое опираются плагины. Переход между версиями Minecraft, например с 1.21.4 на 1.21.5, конвертирует мир при первой загрузке и может сломать половину плагинов. Это всегда ручная операция с backup, описанная в статье обновление версии Minecraft. Безопасный путь обновления FiveM - в статье обновления сервера FiveM и artifacts.

Контент Workshop тоже обновляется#

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

Разные игры ведут себя по-разному. Project Zomboid проверяет предметы Workshop, когда игрок заходит, и кикает игроков с отличающимися версиями; Garry's Mod, Arma 3 и DayZ получают контент Workshop через SteamCMD или собственный загрузчик игры. Общая защита та же, что и для игры: вечернее окно обновлений, backup перед ним и тестовый сервер для всего, где длинный список модов. Как каждая игра получает контент и где его кеширует, описано в статье моды Steam Workshop на выделенных серверах.

Разумная политика по типам серверов#

Если собрать всё вместе:

СерверОбновления игрыОбновления модовValidate
Ванильный, небольшая группаОбновление при каждом рестартеn/aТолько после сбоя
Ванильный, активное сообществоНочное окно по расписанию с предупреждением и backupn/aТолько после сбоя
С небольшим числом модов (только серверных)Окно по расписанию, сначала читать патчноутыРаз в месяц, вручнуюТолько после сбоя
С большим числом модовВручную, после того как подтянутся моды, сначала тестВручную, по одномуПосле прерванного обновления
Событие или соревнованиеЗаморожены на время событийЗамороженыНикогда посреди события

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

FAQ#

Стоит ли включать автообновление на игровом сервере?

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

Замедляет ли обновление при рестарте каждый рестарт?

Совсем немного, если ничего не изменилось: SteamCMD сравнивает манифесты и выходит. Медленный - это validate, потому что он читает каждый файл. Для обычных запусков оставляйте validate выключенным.

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

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

Можно ли отложить обновление, пока моды не будут готовы?

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

Что будет, если сервер перезапустится во время загрузки обновления?

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


Комментарии

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

0/2000