RE:NODE

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

Фиксация версии игрового сервера и откаты

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

0 прочтений

Зафиксировать версию игрового сервера - значит не дать ему перейти на новую сборку, пока вы сами этого не решите; откатить - значит вернуть его на более старую после неудачного обновления. Для игр, которые вы скачиваете сами, - Minecraft, Factorio, FiveM, Terraria - и то и другое просто: сохраните старый файл сервера и верните его на место. Для игр Steam это сложнее, потому что SteamCMD всегда ставит текущую сборку ветки, так что единственные поддерживаемые пути назад - бета-ветка, которую разработчик публикует для старых версий, или ручное скачивание депо, и оба бесполезны, если игроки не могут запустить ту же старую версию у себя. И в любой игре откатить нужно и мир: обновление, которое сконвертировало сохранение, обычно не даст старой сборке его прочитать. Продумайте это до дня обновления, потому что в ночь поломки узнавать, что старой ветки не существует, уже поздно.

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

Зачем вообще фиксировать версию#

Большинству ванильных серверов ничего фиксировать не нужно. Клиенты обновляются, значит, сервер должен следовать за ними. Фиксация имеет смысл, когда:

  • Моды не готовы. Модовый сервер Valheim, Rust, 7 Days to Die или Minecraft зависит от модов, собранных под одну версию игры. Пока они не обновятся, новая версия означает сломанный сервер.
  • Идёт событие. Турнир, финал сезона или давно запланированный рейд не должны менять правила на полпути.
  • Обновление сломано. Разработчики выпускают баги. Иногда правильный ответ на патч, который роняет серверы, - остаться на предыдущей сборке, пока не выйдет исправление.
  • Сообщество выбрало версию. Серверы модпаков, серверы Minecraft на старой версии ради определённого мода, группы Factorio посреди прохождения.

Всё решает одно ограничение: могут ли игроки тоже остаться на старой версии. Зафиксированный сервер, на который никто не может зайти, - это просто остановленный сервер с лишними шагами.

Ограничение со стороны клиента в разных играх#

ИграМогут ли игроки выбрать старую версию?Практическое следствие
Minecraft JavaДа, любую версию, в лаунчереФиксируйте свободно; игроки выбирают нужную версию
FactorioДа, старые версии доступны как беты SteamФиксируйте свободно; группа договаривается о версии
FiveMКлиенты следуют за сборкой сервера в пределах поддерживаемых диапазоновФиксируйте artifacts сервера; следите за окнами поддержки
TerrariaНе просто; Steam обновляет клиентТолько короткая фиксация, пока подтягиваются tModLoader или TShock
7 Days to DieОбычно да; старые версии хранятся как бета-ветки SteamФиксируйте на ветке; игроки выбирают ту же
ValheimТолько вокруг публичного теста, в целом не для старых сборокДолгосрочной фиксации фактически нет
Rust, CS2, PalworldНетБез фиксации; сервер должен следовать за клиентом
Project ZomboidКрупные сборки выходили как бета-ветки по выборуФиксируйте на той сборке, что по умолчанию или выбрана

Доступность веток со временем меняется и решается каждым разработчиком, поэтому прежде чем на это полагаться, проверьте список для своей игры. В клиенте Steam ветки, доступные игрокам, видны в свойствах игры на вкладке Betas; ветки выделенного сервера выводит app_info_print в SteamCMD, а также их можно посмотреть на SteamDB в разделах депо и веток приложения.

Бета-ветки Steam#

Ветка - это именованная сборка, которую разработчик опубликовал наряду с ветвью по умолчанию public. SteamCMD ставит ветку через -beta:

bash
# install or switch to a named branch$ ./steamcmd.sh +force_install_dir /srv/7dtd +login anonymous \    +app_update 294420 -beta latest_experimental validate +quit# branches protected by a password$ ./steamcmd.sh +force_install_dir /srv/game +login anonymous \    +app_update <appid> -beta <branch> -betapassword <password> +quit# back to the default$ ./steamcmd.sh +force_install_dir /srv/7dtd +login anonymous \    +app_update 294420 -beta public validate +quit

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

Чтобы посмотреть, какие ветки есть у серверного приложения, не открывая Steam:

bash
$ ./steamcmd.sh +login anonymous +app_info_update 1 \    +app_info_print 294420 +quit | grep -A 40 '"branches"'

В выводе перечислена каждая ветка с её build id и, если заданы, описанием и пометкой о том, нужен ли пароль. Формат этого вывода не является документированным интерфейсом и уже менялся, так что читайте его глазами, а не разбирайте вслепую.

Для веток везде действуют два правила. Клиент и сервер должны быть на одной ветке, а ошибка несовпадения редко упоминает ветки - она говорит «version mismatch» или «incompatible». И когда ветка задана, все последующие обновления остаются на ней, включая автоматические обновления от переключателя обновления при рестарте, - именно это и делает ветку фиксацией.

В панели на базе Pterodactyl многие egg для игр Steam выводят ветку (а иногда и её пароль) в переменную запуска рядом с переключателем автообновления. Названия у разных egg разные; смотрите вкладку Startup на своём сервере.

Фиксация точной сборки через download_depot#

Если для нужной версии ветки нет, у SteamCMD есть более низкоуровневая команда, которая скачивает конкретный исторический манифест депо:

code
download_depot <appid> <depotid> <manifestid>

Депо - это набор файлов внутри приложения, обычно по одному на операционную систему плюс общий контент, а манифест - одно опубликованное состояние этого депо. Идентификаторы берутся со страниц приложения на SteamDB, где перечислены все депо и история их манифестов. Команда скачивает файлы в собственную папку SteamCMD, в steamapps/content/app_<appid>/depot_<depotid>/, а не на ваш сервер; потом эти файлы копируют поверх установки.

Это работает, но с условиями, которые стоит знать, прежде чем на это полагаться:

  • Обычно нужен настоящий вход в Steam, а не anonymous, а для некоторых приложений - аккаунт, которому принадлежит игра. Используйте запасной аккаунт, а не основной.
  • Это не поддерживаемый сценарий. Valve не документирует команду для такой цели, и временами она работала ненадёжно.
  • Следующее обычное обновление всё отменит. Последующий app_update или переключатель обновления при рестарте увидит, что установка устарела, и заменит её. Сначала отключите автоматические обновления.
  • Клиенты всё равно должны совпадать. Если игроки не могут тоже запустить старую сборку, сервер останется на ней в одиночестве.

На практике download_depot - инструмент для аварии на одну ночь в игре, клиентов которой можно удержать на старой версии, или для закрытой группы, готовой сделать то же у себя. Это не способ публично держать старую версию Rust.

Фиксация версий игр вне Steam#

Для игр, которые скачиваются файлом, фиксация - это просто хранение этого файла.

Minecraft (Paper). Сервер - это jar. Храните рабочий под именем, которое говорит, что это такое, - paper-<version>-<build>.jar - и укажите его в настройках запуска. Новая сборка Paper в пределах той же версии Minecraft обычно содержит исправления; новая версия Minecraft конвертирует мир при первой загрузке и является осознанным апгрейдом, который описан в статье обновление версии Minecraft. Плагины фиксируются так же: храните работающий jar и папку с предыдущими версиями.

Factorio. Старые headless-сборки остаются доступными для скачивания в архиве на factorio.com. Храните ту версию, на которой работаете, и помните, что сохранение, открытое в более новой версии, потом нельзя открыть в более старой.

FiveM. Сборки сервера - artifacts - пронумерованы, и вы выбираете, какую запускать. Сборка игры, которую используют клиенты, фиксируется отдельно через sv_enforceGameBuild в server.cfg - это заставляет всех перейти на определённую сборку GTA V. Старые artifacts со временем выходят из поддержки, так что фиксация там - это отсрочка, а не постоянное состояние; цикл рекомендованных сборок описан в статье обновления сервера FiveM и artifacts.

Terraria и tModLoader. Выделенный сервер скачивается отдельно для каждой версии; храните zip. tModLoader в Steam предлагает старые версии в виде веток именно по этой причине - ради совместимости модов.

Моды тоже нужно фиксировать#

Игра, зафиксированная с незафиксированными модами, не зафиксирована. Моды движутся по собственному графику:

  • Steam Workshop всегда отдаёт последнюю версию предмета. Сервер, который скачивает предметы Workshop при запуске, получает то, что автор загрузил прошлой ночью. Чтобы зафиксировать версию, скопируйте мод из кеша Workshop в локальную папку модов игры, если игра поддерживает локальные моды, и перестаньте скачивать его из Workshop - с той оговоркой, что клиентам тогда придётся получать ту же версию каким-то другим путём.
  • Сайты модов вроде Thunderstore, CurseForge, Modrinth и Nexus хранят старые версии доступными для скачивания. Записывайте, какую версию вы используете.
  • Фреймворки плагинов - Oxide, Carbon, SourceMod, BepInEx - сами являются модами, и версия фреймворка важна не меньше версии каждого плагина.

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

Сохранения идут вперёд и редко назад#

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

  • Minecraft: миры, открытые в более новой версии, не поддерживаются в более старой. В одиночной игре клиент предупреждает об этом; сервер же просто загружает то, что ему дали, и результатом могут стать пропавшие блоки, потерянные предметы или краш.
  • Factorio: старые версии отказываются открывать такие сохранения.
  • 7 Days to Die: крупные версии обычно и так требуют нового мира; мелкие патчи, как правило, сохраняют совместимость в пределах версии.
  • Игры на выживание на Unreal (Palworld, Satisfactory, Abiotic Factor) конвертируют сохранения вперёд при загрузке, и терпимость к возврату назад у них разная.

Так что откат сервера - это только половина отката. Вторая половина - мир в состоянии до обновления, а он существует, только если вы сделали backup до первого запуска новой сборки. Этот backup - самый важный шаг любого обновления и причина, по которой в панели есть блокируемые backup: на RE:NODE заблокированный backup никогда не удаляется ротацией расписания, так что копия до обновления остаётся на месте и через неделю, когда кто-нибудь заметит проблему. Что должен содержать backup в каждой игре, описано в статье стратегия резервного копирования игрового сервера.

Порядок отката#

Когда обновление пошло не так, а исправить ситуацию вперёд этой ночью невозможно:

  1. Остановите сервер и отключите всё, что его автоматически обновляет, - переключатель автообновления, плановые рестарты с обновлением.
  2. Сделайте backup текущего состояния и заблокируйте его. В нём всё, что игроки сделали на новой версии, и это может понадобиться восстановить позже.
  3. Восстановите backup, сделанный до обновления. Если в нём есть и файлы игры, и мир, восстановится и то и другое сразу. Если ваши backup не включают бинарники (а обычно и не должны), верните старую сборку отдельно: переключитесь на старую ветку, скачайте депо или замените файл сервера.
  4. Проверьте, что версия в логе запуска совпадает с той, что вы планировали.
  5. Проверьте, что мир загрузился под своим настоящим именем и с ожидаемым прогрессом.
  6. Сообщите игрокам, какую версию запускать и как - какую бета-ветку выбрать, какой профиль лаунчера использовать, - и на какое время восстановлен мир.
  7. Запишите, что сломалось и что позволит обновиться снова: релиз мода, хотфикс, изменение конфига. Фиксация временна; знайте, что её закончит.

Откатываться или чинить вперёд?#

Откат оказывается правильным ответом реже, чем кажется в 11 вечера. Примерный ориентир:

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

В любом случае решение проще, если обновление сначала опробовали на копии, - см. статью чек-лист дня обновления.

FAQ#

Можно ли понизить версию выделенного сервера Steam?

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

Как запретить серверу обновляться автоматически?

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

Будет ли работать мой мир, если откатить сервер?

Только если он был сохранён до обновления. Миры, сконвертированные более новой версией, обычно не могут быть корректно прочитаны более старой. Восстановите backup, сделанный до обновления, вместе со старой сборкой сервера.

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

Их клиенты на ветке по умолчанию, а ваш сервер - нет. Каждый игрок должен выбрать ту же ветку на вкладке Betas в Steam, или вам нужно переключить сервер обратно на public.

Как долго можно оставаться на зафиксированной версии?

Пока игроки могут на неё заходить и вы готовы обходиться без исправлений. Для Minecraft и Factorio это могут быть годы. Для игр с принудительным обновлением клиентов - до следующего патча, поэтому фиксация там в основном касается часов или дней вокруг обновления.


Комментарии

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

0/2000