RE:NODE

Руководства11 мин чтения

Вайпы сервера DayZ: полные и частичные сбросы

Как устроен persistence в DayZ: папка storage, players.db, economy.xml и флаги территории, а также как безопасно делать полный вайп, вайп персонажей или только мира.

0 прочтений

Всё, что мир DayZ помнит между перезапусками, хранится в одной папке: storage_<instanceId> внутри папки миссии, то есть mpmissions/dayzOffline.chernarusplus/storage_1/ на стандартном сервере Chernarus. Персонажи лежат в players.db в этой папке; палатки, базы, тайники, машины и собственное состояние экономики - в бинарных файлах в data/. Полный вайп - это удаление содержимого папки при остановленном сервере. Вайп только персонажей - удаление players.db. Вайп мира с сохранением персонажей - удаление data/ при оставленном players.db. Всё остальное - гниение баз, таймеры флагов, что вообще переживает перезапуск - задаётся в нескольких XML-файлах, и если настроить их правильно, вайпы понадобятся реже.

В этом посте persistence разобран от начала до конца. Сам спавн лута описан в руководстве по types.xml в DayZ, а ключ конфигурации, выбирающий папку storage, - в статье serverDZ.cfg по строкам.

Что сохраняется и где#

Папку persistence выбирает instanceId в serverDZ.cfg: инстанс 1 читает и пишет storage_1, инстанс 2 - storage_2, всегда внутри папки миссии, заданной template. Смените любое из этих значений, и сервер начнёт новый мир - старый по-прежнему лежит на диске, просто не загружается.

Внутри обычно находится:

ПутьЧто в нём
players.dbПерсонажи: позиция, здоровье, инвентарь, характеристики
data/dynamic_*.binОбъекты, поставленные игроками, и динамические объекты: палатки, тайники, предметы на земле
data/building.binСостояние зданий, например открытые и запертые двери
data/events.binОбъекты событий, включая машины
data/types.binУчёт экономики по типам предметов
data/vehicles.binСостояние машин в сборках, где оно вынесено отдельно

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

players.db - это база данных SQLite. Это важно по двум причинам: её можно открыть любым SQLite-браузером, если понадобится осмотреть или удалить одного персонажа, и её нельзя копировать или править на работающем сервере, потому что копия может быть снята посреди записи.

Сами файлы миссии - types.xml, events.xml, cfgeconomycore.xml и остальные - это конфигурация, а не persistence. Их правка ничего не вайпает. Удаление storage_1 их не сбрасывает. Чётко держать эту границу - уже большая часть работы.

Что определяет, что будет сохранено#

Какие категории вообще сохраняются и загружаются, задаётся в db/economy.xml. Ванильный файл выглядит так:

db/economy.xml
<economy>    <dynamic init="1" load="1" respawn="1" save="1"/>    <animals init="1" load="0" respawn="1" save="0"/>    <zombies init="1" load="0" respawn="1" save="0"/>    <vehicles init="1" load="1" respawn="1" save="1"/>    <randoms init="0" load="0" respawn="1" save="0"/>    <custom init="0" load="0" respawn="0" save="0"/>    <building init="1" load="1" respawn="0" save="1"/>    <player init="1" load="1" respawn="1" save="1"/></economy>
АтрибутЗначение
initСпавнить эту категорию при первом создании мира
loadЧитать её сохранённое состояние при старте
respawnРазрешить экономике восполнять израсходованное
saveЗаписывать её состояние в storage

Животные и заражённые не сохраняются: они заново появляются при каждом старте, поэтому перезапуск убирает «паровозики» из зомби. Динамические объекты, машины, здания и игроки сохраняются. Прежде чем отлаживать persistence, сравните свой файл с этим: мод или старое руководство могли поменять флаг, а load="0" у player заставляет каждого персонажа начинать заново при каждом перезапуске и выглядит как баг.

Эти флаги можно использовать и для осознанного разового сброса: один раз запустить сервер с load="0" у категории, дать ему записать чистое состояние и вернуть значение обратно. Это работает, но вторую половину легко забыть, а удаление файлов при наличии backup предсказуемее. Держите флаги на ванильных значениях, если нет конкретной причины.

Время жизни, гниение и флаги территории#

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

  • Предметы и контейнеры. lifetime каждого типа в types.xml, в секундах, - сколько он проживёт без взаимодействия. У палаток, бочек и закопанных тайников в ванильных файлах долгое время жизни, порядка недель. Взаимодействие с контейнером - открыть его, переложить в нём предметы - сбрасывает таймер.
  • Элементы базы и флаги территории. Поднятый флаг территории поддерживает жизнь элементов базы в своём радиусе. Флаг должен обновлять игрок: FlagRefreshFrequency и FlagRefreshMaxDuration в db/globals.xml задают, как часто его можно обновить и как долго полностью поднятый флаг защищает базу.
  • Глобальная очистка. В globals.xml также есть CleanupLifetimeDefault, CleanupLifetimeDeadPlayer, CleanupLifetimeDeadInfected, CleanupLifetimeRuined и похожие значения для всего, у чего нет собственного времени жизни.
db/globals.xml (excerpt)
<var name="FlagRefreshFrequency" type="0" value="432000"/><var name="FlagRefreshMaxDuration" type="0" value="3456000"/>

С этими ванильными значениями флаг можно обновлять раз в пять дней, и он держит базу до сорока дней. Поднимете их - брошенные базы будут задерживаться, заполняя карту и файлы persistence; опустите - активные игроки будут терять базы, уехав в отпуск. Большинство серверов их не трогают. Если у вас ежемесячный цикл вайпов, система гниения не так важна; если вайпов нет вовсе, это единственное, что не даёт миру зарасти хламом.

Когда мир действительно сохраняется#

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

Из этого следуют три практических вывода:

  1. Всегда останавливайте сервер штатно. Используйте Stop или Restart в панели, #shutdown через RCon или сообщение об остановке в db/messages.xml. На RE:NODE кнопка Restart отправляет штатную остановку, так что persistence записывается до завершения процесса. Принудительное завершение - для сервера, который уже завис.
  2. Оставляйте `storageAutoFix = 1;` в serverDZ.cfg. Это позволяет серверу при старте починить повреждённый файл, а не отказаться от него. Без этого одна неудачная остановка может оставить сервер, который не запускается.
  3. Следите за памятью. Если сервер упирается в лимит памяти, его останавливают принудительно - на RE:NODE контейнер останавливается и чисто перезапускается, а не уходит в swap, и это правильное поведение, но всё равно не штатное сохранение. Сервер, который раз за разом упирается в лимит, каждый раз теряет прогресс. Как это распознать, описано в статье почему ваш игровой сервер постоянно перезапускается.

Виды вайпов#

Любой вайп проходит по одной и той же процедуре безопасности: объявить, штатно остановить сервер, сделать backup, затем удалять. Разница лишь в том, что вы удаляете.

ВайпУдалитьОставить
ПолныйВсё в storage_<n>Файлы миссии, конфигурацию, баны
Только персонажиplayers.dbdata/, чтобы базы и тайники остались
Только мирСодержимое data/players.db, чтобы персонажи сохранили снаряжение
Один игрокОдного персонажа в players.dbВсё остальное
Смена картыНичего - у новой миссии свой storageСтарую папку, на случай возврата

Полный вайп

Стандартный ежемесячный или сезонный сброс. Остановите сервер, сделайте backup, удалите содержимое storage_1 (или переименуйте папку - это заодно быстрая локальная копия) и запустите. Сервер создаст новый storage, экономика заполнит карту с нуля, и каждый игрок начнёт как новый персонаж. Файлы миссии, serverDZ.cfg, баны BattlEye и конфигурация админ-мода лежат в других местах и не затрагиваются.

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

Вайп только персонажей

Удаление players.db сбрасывает каждого персонажа до нового спавна, а все палатки, базы и машины остаются на месте. Этим пользуются админы после эксплойта с дюпом, который забил инвентари, или в начале нового сезона на сервере, где базы - долгосрочное вложение. Будьте готовы к тому, что базы быстро зарейдят новые персонажи, которые знают, где они стоят, - объявите об этом.

Вайп мира с сохранением персонажей

Удалите содержимое data/ и оставьте players.db. Мир сбрасывается - базы, тайники, машины, состояние экономики, - а персонажи сохраняют то, что было при них. Полезно, когда сломанный мод оставил мир полным некорректных объектов, или когда вы хотите сбросить базы, не наказывая игроков за снаряжение. Персонажи загружаются в сохранённых позициях, что нормально на той же карте.

Удаление одного игрока

Есть два пути. Если ваши админ-инструменты умеют удалять или сбрасывать персонажа, воспользуйтесь ими, пока игрок не в сети. Иначе остановите сервер, сделайте backup и откройте players.db в SQLite-браузере; персонажи хранятся с идентификатором игрока, и удаление этой строки сбрасывает персонажа. Делайте это только при наличии backup и только при остановленном сервере.

Только машины

Поддерживаемого вайпа «только машины» нет. В сборках, где машины хранятся в отдельном файле, удаление этого файла при остановленном сервере сбрасывает их до новых спавнов. В сборках, где машины лежат вместе с другими объектами событий, вы сбросите заодно места крушений и другие события. Как и с любым частичным вайпом, зависящим от имён файлов, сначала проверьте на копии папки.

Когда вайп действительно нужен#

Большинству изменений он не нужен. Изменение nominal, времени жизни, времени суток или почти чего угодно в serverDZ.cfg вступает в силу при следующем перезапуске, и мир остаётся целым.

Изменения, которым вайп нужен или как минимум нужен аккуратный вайп:

  • Другая карта или миссия. У новой миссии и так свой storage - см. статью запуск карты сообщества.
  • Удаление мода, который добавляет сохраняемые объекты. Моды на строительство баз, хранилища и машины оставляют в persistence объекты, у которых больше нет класса. Сервер может писать ошибки в лог, удалить их или отказаться запускаться. Удаляйте такой мод во время вайпа.
  • Крупные изменения фреймворков. Добавление или удаление чего-то вроде DayZ Expansion меняет то, из чего состоит мир; его собственные рекомендации - начинать с чистого storage. См. руководство по DayZ Expansion.
  • Повреждение, которое `storageAutoFix` не может исправить. Если сервер не запускается, а логи указывают на persistence, выбор - backup или вайп.

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

Backup и график вайпов#

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

Что включать в backup:

  • Всю папку storage_<n> вместе с папкой миссии, к которой она относится. Если восстановить одно без другого, получится persistence, не согласованный с экономикой.
  • serverDZ.cfg, папку BattlEye с bans.txt и конфигурацию админ-мода в папке профилей.
  • Не нужно включать бинарные файлы сервера и моды из Workshop - их можно скачать заново.

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

Что до самого графика, сообщества останавливаются на одном из трёх ритмов:

РитмКому подходитКомпромисс
Полный вайп раз в месяцЗагруженным PvP-серверамСвежая конкуренция; любители долгого строительства уходят
Сезонный, раз в 2-4 месяцаСмешанным сообществамЕсть время строить; карта заполняется
Никогда, только гниениеPvE и ролевым серверамНепрерывность; зависит от хорошо настроенного времени жизни

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

Устранение неполадок#

Мир сбросился сам после обновления. Изменился instanceId или template, и сервер читает другую папку storage. Старая на месте; верните прежнее значение.

Персонажи сбрасываются при каждом перезапуске. У player в economy.xml стоит 0 в load или save, или players.db не удаётся записать. Проверьте флаги, затем лог.

Сервер не запускается после падения. Повреждён файл persistence. Убедитесь, что стоит storageAutoFix = 1;, найдите в логе .RPT название файла и, если починка не помогла, восстановите эту папку storage из backup.

Пропали базы, которые должны были уцелеть. Флаг территории не обновили в пределах FlagRefreshMaxDuration, или у предметов было короткое время жизни. Проверьте globals.xml и lifetime соответствующих типов.

Запуск занимает несколько минут. Слишком большой persistence. Уменьшите время жизни у мусора, держите гниение рабочим и запланируйте вайп.

Частичный вайп что-то сломал. Восстановите backup, сделанный перед ним, - а в следующий раз проверьте удаление на копии.

FAQ#

Вайпает ли сервер DayZ правка types.xml?

Нет. Файлы экономики - это конфигурация. Persistence находится в папке storage и сбрасывается только её удалением, сменой instanceId или переключением миссии.

Как вайпнуть персонажей, но сохранить базы?

Остановите сервер, сделайте backup и удалите players.db из storage_<instanceId>. Каждый персонаж начнёт как новый спавн, а мир останется прежним.

Как сбросить мир, но оставить игрокам снаряжение?

Остановите сервер, сделайте backup и удалите содержимое data/ в папке storage, оставив players.db. Базы, тайники и машины сбросятся; персонажи загрузятся со своим инвентарём.

Сколько живут базы без вайпа?

Пока обновляется их флаг территории. В ванильном globals.xml полностью поднятый флаг защищает базу до сорока дней, и обновлять его можно раз в пять дней. Незащищённые объекты подчиняются собственным значениям lifetime.

Можно ли отменить вайп?

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

Почему первый запуск после вайпа такой долгий?

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


Комментарии

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

0/2000