RE:NODE

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

Сервер DayZ: настройка, моды и центральная экономика

Сервер DayZ от начала до конца: serverDZ.cfg, порты, моды и файлы .bikey, types.xml и экономика лута, перезапуски, персистентность и ошибки, на которые все натыкаются.

Обновлено

12 прочтений

В DayZ есть две системы, с которыми новые администраторы знакомятся не в том порядке: моды, с которых все начинают, и центральная экономика, от которой зависит, есть ли на карте хоть что-нибудь, что стоит найти. Сервер с идеально подобранными модами и нетронутой экономикой - пустой сервер. Чтобы сделать всё правильно, нужно примерно 6 ГБ памяти на сервер на 40 слотов, три UDP-порта, аккаунт Steam, владеющий игрой, и готовность править XML и перезапускать. В этом руководстве весь путь: установка, serverDZ.cfg, порты, моды и их ключи, файлы экономики, администрирование и сбои, из-за которых приходят обращения в поддержку.

Что вы на самом деле запускаете#

Сервер DayZ - это отдельное приложение Steam, DayZ Server, app id 223350, и в отличие от большинства игр оно недоступно для анонимного входа в SteamCMD. Нужен аккаунт Steam, которому принадлежит DayZ, и при первом входе SteamCMD запросит у него подтверждение Steam Guard. Хостеры, которые устанавливают DayZ за вас, делают это с вашими учётными данными именно поэтому. Возьмите запасной аккаунт, где есть игра и больше ничего ценного: игровому серверу нечего делать с аккаунтом, которым вы покупаете вещи.

Из коробки сервер даёт меньше, чем ожидают:

  • Одна папка миссии в mpmissions, которая одновременно и карта, и экономика. Chernarus - это dayzOffline.chernarusplus, Livonia - dayzOffline.enoch, у более поздних карт свои папки: смотрите в каталог, а не угадывайте имя.
  • Файл конфигурации serverDZ.cfg примерно с сорока настройками.
  • BattlEye, который отвечает за античит, баны и удалённое администрирование.
  • Никакого внутриигрового меню администратора. Нет наблюдения, телепортации, создания предметов и списка игроков. Любой административный инструмент, который вы видели на сервере DayZ, - это мод или внешний клиент RCon.
  • Персистентный мир, хранящийся отдельно от файлов миссии, так что править экономику можно, не стирая базы игроков - в большинстве случаев.

Папка миссии - главная идея. Когда вы правите лут, вы правите файлы внутри mpmissions/dayzOffline.chernarusplus/, а эти файлы читаются при запуске. Ничего из сделанного там не вступит в силу, пока сервер не перезапустят, поэтому у администрирования DayZ такой ритм: правка, перезапуск, проверка, снова правка.

Требования и потребление ресурсов#

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

ИгрокиRAMCPUПримечания
10-20, ваниль4-6 GB2 ядраКомфортно; подходит для закрытой группы
30-40, ваниль6-8 GB2-3 ядраОбычный публичный сервер
40-60, ваниль8-10 GB3+ ядраОграничением становится server FPS, а не память
30-50, много модов10-12 GB3+ ядраСписки модов масштаба Expansion, торговцы, ИИ
  • CPU определяет, как ощущается полный сервер. Смотреть нужно на server FPS, он пишется в лог, если задать logAverageFps. Здорово, когда значение выше 30; ниже примерно 15 игроки начинают жаловаться на рывки, рассинхронизацию лута и двери, которые открываются дважды.
  • Память растёт со списком модов гораздо быстрее, чем с числом игроков. Ванильный сервер на 60 слотов занимает меньше, чем сервер на 30 слотов с большой сборкой Expansion.
  • Диск: установка сервера занимает примерно 3 ГБ, и каждый мод добавляет своё. Список из двадцати модов легко даёт ещё 10-15 ГБ, поэтому тарифы для DayZ начинаются с большего диска, чем можно ожидать от такой старой игры.
  • Сеть нетребовательна, несколько сотен килобайт в секунду на игрока, но это UDP, и он чувствителен к задержкам. Общее правило из статьи CPU или RAM для игровых серверов применимо здесь сильнее, чем в большинстве игр: люди покупают память, когда на самом деле упирается одно ядро.

Тарифы DayZ в RE:NODE начинаются с 6 ГБ и трёх выделенных портов - это правильная конфигурация для ванильного или слегка модифицированного сервера на 40 слотов. Большому серверу Expansion нужна верхняя ступень.

Установка сервера и строка запуска#

На вашей машине - SteamCMD с настоящим входом:

bash
$ steamcmd +force_install_dir /home/dayz/server +login <steam_account> \    +app_update 223350 validate +quit

Затем сервер запускается с длинной строкой параметров. Вот параметры, которые важны; в панели они выглядят как поля на вкладке Startup, а не как текст, который вы набираете:

ПараметрНазначение
-config=serverDZ.cfgКакой файл конфигурации читать
-port=2302Игровой порт
-profiles=profilesКуда пишутся логи, BattlEye и дампы сбоев
-mod=@CF;@Mod2Моды для клиента и сервера, через точку с запятой, порядок важен
-servermod=@AdminToolТолько серверные моды, которых у клиентов быть не должно
-doLogsПисать логи скриптов и ошибок
-adminLogПисать журнал активности игроков .ADM
-netLogЛогирование сетевого трафика: один раз полезно, постоянно - шум
-freezeCheckСохранить лог, если сервер завис
-cpuCount=2Сколько ядер разрешено использовать движку

Разместите -profiles там, куда можно попасть через SFTP или файловый менеджер, потому что в этой папке лежат ответы на все вопросы «почему он так сделал». Если вы новичок в SteamCMD, app id и не знаете, чем validate отличается от обычного обновления, всё это разобрано в статье SteamCMD простыми словами.

serverDZ.cfg, ключ за ключом#

Файл - это список строк вида key = value; с точкой с запятой на конце и блоком миссии в конце. Значения ниже - те, что поставляются в примере от Bohemia; это разумная отправная точка, а не рекомендация.

serverDZ.cfg
hostname = "Chernarus - vanilla, no KOS in trader";password = "";passwordAdmin = "a-long-random-string";maxPlayers = 60;verifySignatures = 2;forceSameBuild = 1;disableVoN = 0;vonCodecQuality = 20;disable3rdPerson = 0;disableCrosshair = 0;serverTime = "SystemTime";serverTimeAcceleration = 12;serverNightTimeAcceleration = 1;serverTimePersistent = 0;loginQueueConcurrentPlayers = 5;loginQueueMaxPlayers = 500;instanceId = 1;storageAutoFix = 1;steamQueryPort = 2305;respawnTime = 5;timeStampFormat = "Short";logAverageFps = 300;logMemory = 300;logPlayers = 300;logFile = "server_console.log";adminLogPlayerHitsOnly = 0;enableDebugMonitor = 0;allowFilePatching = 0;multithreadedReplication = 1;speedhackDetection = 1;class Missions{    class DayZ    {        template = "dayzOffline.chernarusplus";    };};

Над этими параметрами стоит подумать, а не копировать их:

  • verifySignatures = 2 отклоняет любой мод, .bikey которого нет в папке keys сервера. Оставьте 2. Опустить до 0 - это верный способ получить сервер, на котором работают чужие изменённые PBO.
  • forceSameBuild = 1 отклоняет клиентов с другой сборкой игры. Если выключить, устаревший клиент не заработает, он просто споткнётся позже и менее понятно.
  • allowFilePatching = 0 блокирует клиентов, запущенных с -filePatching, а именно так приходит немало мелкого читерства. Включать его нужно только разработчикам модов.
  • serverTimeAcceleration умножает внутриигровые часы. 12 даёт двухчасовые сутки. serverNightTimeAcceleration умножает ещё раз в течение ночи, так что serverTimeAcceleration = 12 при serverNightTimeAcceleration = 4 даёт длинный день и короткую ночь - самое востребованное изменение на любом публичном сервере.
  • serverTimePersistent = 1 заставляет мировые часы переживать перезапуск, а не сбрасываться к serverTime. При четырёх перезапусках в день и значении 0 на вашем сервере одно и то же утро наступает четыре раза.
  • instanceId выбирает папку персистентности, storage_1 для экземпляра 1. Два сервера на одной машине не должны использовать один и тот же instance id.
  • disableVoN = 0 сохраняет внутриигровой голос. Его отключение меняет игру сильнее, чем большинство других настроек в файле.

Порты и подключение#

ПортПротоколНазначение
2302UDPИгровой трафик, задаётся через -port=
2303-2304UDPРезерв рядом с игровым портом; хостеры выделяют блок целиком
2305UDPЗапросы Steam, задаётся через steamQueryPort
Порт RConUDPBattlEye RCon, задаётся в BEServer_x64.cfg

Порт запросов - тот, на котором чаще всего попадаются. Игра работает, подключиться по IP можно, а в списке DayZ Launcher сервер так и не появляется - значит, steamQueryPort закрыт или указан неверно. Оба порта UDP; правило файрвола, открывающее только TCP, здесь вообще ничего не даёт. В статье порты игровых серверов разобрано, зачем порт запросов существует отдельно от игрового и как выглядит каждый из сбоев.

Почти никто не заходит на модифицированный сервер DayZ из внутриигрового браузера. Все пользуются DayZ Launcher: он читает список модов, который объявляет сервер, подписывается на эти элементы Workshop и запускает игру с подходящей строкой -mod=. Именно поэтому порядок загрузки модов и ключи должны быть верными: лаунчер автоматизирует клиентскую сторону и громко сдаётся, когда стороны расходятся.

находит серверподключениеverifySignatures 2ключ должен быть на местеDayZ Launcherчитает список модовПорт запросов2305 UDPСервер DayZ2302 UDPBattlEyeпроверка подписиПапка keys/по одному .bikey на мод
Что должно сойтись, чтобы игрок с модами смог зайти

Моды: ключи, порядок загрузки и два флага#

Моды из Workshop скачиваются через SteamCMD с app id клиента, 221100, а не сервера:

bash
$ steamcmd +force_install_dir /home/dayz/server +login <steam_account> \    +workshop_download_item 221100 1559212036 +quit

Затем должны произойти три вещи, и пропуск любой из них даёт свой запутанный симптом:

  1. Папка мода с именем @SomeMod лежит в корне сервера.
  2. Файл keys/*.bikey из неё скопирован в папку keys сервера. Если пропустить этот шаг, BattlEye выкинет клиентов на экране загрузки с ошибкой подписи, хотя всё остальное сделано правильно.
  3. Папка указана в -mod= в порядке зависимостей. Сначала фреймворки: -mod=@CF;@DayZ-Expansion-Core;@DayZ-Expansion-Bundle. Community Framework (@CF) - зависимость очень многих модов, и загружаться он должен раньше них.

Через -servermod= подключайте всё, чего у клиента быть не должно: инструменты администратора, спавнеры лута, серверные правки. Моды из -servermod= лаунчеру не объявляются, поэтому игроков не просят их скачивать. Если по ошибке положить серверный мод в -mod=, каждый заходящий игрок будет скачивать то, что ему не нужно.

Две привычки спасают целые серверы. Первая: фиксируйте список модов и обновляйте его осознанно, а не автоматически - патч DayZ делает недействительным каждый мод, пока автор его не пересоберёт, и сервер с автообновлением в день патча - это сервер, на который в день патча никто не может зайти. Статью что делать, когда обновление мода всё сломало стоит прочитать до того, как она понадобится. Вторая: перед каждым обновлением сохраняйте копию рабочей папки мода и своих XML. В статье моды Steam Workshop на выделенных серверах разобрано, как скачивание из Workshop ведёт себя на стороне сервера в разных играх.

types.xml и центральная экономика#

Именно эта часть определяет, стоит ли играть на вашем сервере. Лут не разбрасывается случайно. Центральная экономика хранит целевое количество каждого предмета на карте и пополняет его до этой цифры, а правила лежат в XML внутри папки миссии.

ФайлЧто определяет
db/types.xmlКаждый предмет: сколько его существует, как долго живёт, как быстро возвращается
db/events.xmlТранспорт, крушения вертолётов, появление зомби и животных
db/globals.xmlОбщемировые лимиты вроде ZombieMaxCount и таймеры очистки
db/messages.xmlПлановые объявления, включая то, что выключает сервер
db/economy.xmlКакие подсистемы экономики вообще загружаются
cfgeconomycore.xmlКакие XML-файлы читаются, включая ваши собственные
cfgspawnabletypes.xmlС какими навесками и содержимым появляется предмет
cfgeventspawns.xmlКоординаты, которые разрешено использовать событиям
cfgplayerspawnpoints.xmlГде появляются новые игроки и возрождающиеся

Запись в types.xml выглядит так. Числа условные - настоящие смотрите в поставляемом файле:

db/types.xml
<type name="M4A1">    <nominal>8</nominal>    <lifetime>7200</lifetime>    <restock>1800</restock>    <min>4</min>    <quantmin>-1</quantmin>    <quantmax>-1</quantmax>    <cost>100</cost>    <flags count_in_cargo="0" count_in_hoarder="0" count_in_map="1"           count_in_player="0" crafted="0" deloot="0"/>    <category name="weapons"/>    <usage name="Military"/>    <value name="Tier4"/></type>

Каждый элемент выполняет свою задачу, и пять из них решают почти всё:

  • nominal - целевое количество на карте. min - нижняя граница: когда живое количество падает до неё, экономика ставит в очередь пополнение.
  • lifetime - сколько секунд нетронутый предмет живёт до того, как его заберёт очистка. Если предмет подобрать и снова положить, отсчёт начинается заново.
  • restock - задержка, до истечения которой экономика не вправе заменять то, что забрали. 0 означает «как только сможет».
  • cost - приоритет появления от 0 до 100: какой из подходящих предметов займёт слот.
  • usage и value определяют, где предмет может появиться: usage - тип здания (Military, Police, Medic, Farm, Industrial, Town, Village, Hunting), value - уровень лута, и чем выше уровень, тем дальше от побережья. Предмет без usage и без value не появляется нигде - это самая частая рана, которую администраторы DayZ наносят себе сами.
  • Атрибуты flags определяют, что засчитывается в nominal. count_in_cargo="1" означает, что предметы внутри контейнеров тоже считаются, так что клан-накопитель может лишить карту предмета, и при этом ничего не будет сломано.

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

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

cfgeconomycore.xml
<ce folder="custom">    <file name="mod_types.xml" type="types"/></ce>

Теперь ваши дополнения лежат в mpmissions/dayzOffline.chernarusplus/custom/mod_types.xml и переживают обновления поверх. В статье types.xml и экономика лута вся система разобрана подробно.

Персистентность существует отдельно от всего этого. Базы игроков, тайники, транспорт и данные персонажей лежат в storage_<instanceId> рядом с папкой миссии. Правка экономики их не стирает. Удаление этой папки стирает - это и есть вайп, причём единственный надёжный. Сначала сделайте копию и храните её не на сервере: статья бэкапы, которые действительно восстанавливаются существует потому, что бэкап, который никто не восстанавливал, - это гипотеза.

Администрирование: RCon, логи и перезапуски#

Администрирование - это BattlEye RCon плюс тот админ-мод, который вы выбрали. passwordAdmin в serverDZ.cfg должен быть длинным и случайным, хотя ванильная игра почти ничего с ним делать не позволяет; пароль RCon - отдельный, и лежит он в BEServer_x64.cfg в папке BattlEye внутри каталога profiles.

Собственный набор команд BattlEye, который вводится в клиенте RCon или в консоли панели, невелик:

КомандаДействие
playersПодключённые игроки с их ID и пингом
kick <id> <reason>Выгнать по id сессии
ban <id> <minutes> <reason>Забанить подключённого игрока, 0 - навсегда
addBan <GUID> <minutes> <reason>Забанить того, кто не подключён
bans / removeBan <n>Показать и снять баны
say -1 <message>Сообщение всем
loadBans / loadEventsПеречитать файлы BattlEye без перезапуска
#shutdownОстановить сервер

Баны хранятся в bans.txt как GUID BattlEye, которые получаются из SteamID, но не совпадают с ним. Копируйте их из логов, а не пересчитывайте вручную. Если вы вообще открываете RCon наружу, сначала прочитайте безопасный RCON: протокол работает по UDP, вся аутентификация - это пароль, а серверы DayZ сканируют постоянно.

Логи в папке profiles - вторая половина работы:

  • server_console.log - всё, что печатала консоль; именно здесь появляются ошибки запуска из ваших XML.
  • *.ADM - журнал администратора: подключения, отключения, позиции, смерти, попадания, кто кого убил и чем. Этот файл вы читаете после каждого спора о рейде на базу.
  • script*.log - ошибки скриптов, в том числе из модов.
  • crash_* и *.mdmp - то, что нужно отправлять автору мода.

Серверы DayZ перезапускают по расписанию, обычно каждые три-четыре часа, потому что server FPS деградирует по ходу сессии и потому что плановый перезапуск - это контролируемое сохранение. Сделать это можно одним лишь db/messages.xml, где запись сообщения может нести выключение, а вкладка Schedules в панели может выполнить перезапуск и бэкап по cron-выражению - какой интервал действительно стоит того, разбирает статья расписания перезапусков, которые помогают. В RE:NODE кнопка Restart - это чистая остановка, а наблюдатель замечает сервер, который сам постоянно перезапускается, и открывает обращение, а не оставляет его в цикле; сервер, дошедший до лимита памяти, останавливается и запускается заново, а не уходит в своп.

Диагностика#

Сервер работает, но его нет в списке DayZ Launcher. Порт запросов. Проверьте, что steamQueryPort совпадает с выделенным UDP-портом и что его не занимает ничто другое на машине.

Игроков выкидывает с ошибкой подписи BattlEye. В папке keys нет .bikey, либо мод обновился и принёс новый ключ. После каждого обновления мода копируйте ключи всех модов заново.

«You cannot play/edit this mission; it is dependent on downloadable content that has been deleted.» Список модов клиента не совпадает со списком сервера - обычно это мод, который лаунчер не скачал, или несовпадение версий. Пусть игрок выполнит проверку через лаунчер, а не через Steam.

Лут не изменился после правки `types.xml`. Либо вы не перезапустили сервер, либо файл не разобрался, и экономика откатилась. Прочитайте server_console.log сначала: некорректный XML-файл назван там вместе с элементом, на котором он сломался.

Предметы добавленного мода не появляются. У них нет записей в экономике, либо записи есть, но без usage и без value. См. выше.

Всё тормозит, когда сервер заполняется. Посмотрите залогированный server FPS, прежде чем покупать память. Большое число зомби, длинные списки модов и десятки постоянных машин стоят процессорного времени, а не RAM.

После обновления пропали базы. Персистентность в storage_<instanceId> сбросилась, либо изменился instance id. Без бэкапа этой папки восстановить ничего нельзя.

Мировые часы сбрасываются при каждом перезапуске. serverTimePersistent = 0.

FAQ#

Можно ли запустить сервер DayZ, не владея DayZ?

Нет. Приложение сервера недоступно для анонимного входа в SteamCMD, поэтому для установки нужно использовать аккаунт Steam, которому принадлежит игра. Возьмите запасной аккаунт, а не основной.

Сколько игроков вмещает сервер DayZ?

maxPlayers спокойно уходит за 60, но практический предел - CPU. Большинство публичных серверов держат 40-60 и начинают терять server FPS выше этого, особенно с большим списком модов. Сервер DayZ редко ломается из-за числа игроков; ломает его список модов.

Нужно ли перезапускать сервер каждые несколько часов?

Строго говоря, нет. Сервер продолжит работать. Но server FPS постепенно падает за долгую сессию, перезапуск - это чистое сохранение, и большинство серверов с большим числом модов после него заметно лучше. Три-четыре часа - норма сообщества; объявляйте о нём через db/messages.xml, чтобы никто не потерял из-за него рейд.

Сотрёт ли правка экономики лута карту?

Нет. Лут и персистентность разделены. Правка types.xml и других файлов экономики меняет то, что появляется после следующего перезапуска; базы игроков, тайники и персонажи в storage_<instanceId> остаются нетронутыми. Вайп - это намеренное удаление этой папки storage.

Почему мод работает у меня, а у остальных нет?

Мод есть у вас локально, а сервер его не объявляет, либо он лежит в -servermod=, хотя должен быть в -mod=. Моды для клиента и сервера относятся к -mod= вместе с ключом в keys; в -servermod= место только по-настоящему серверным модам.

Куда смотреть в первую очередь, когда что-то не так?

В server_console.log и файл .ADM в папке profiles, именно в таком порядке. Половина администрирования DayZ - это XML, а вторая половина - чтение лога, который сообщает, в какой строке вы ошиблись.


Комментарии

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

0/2000