RE:NODE

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

Сервер Don't Starve Together: кластер, пещеры и моды

Правильная настройка выделенного кластера DST: токен Klei, cluster.ini и server.ini, шарды Master и Caves, порты, администраторы, откаты и моды из Workshop.

0 прочтений

Выделенный сервер Don't Starve Together - это не одна программа. Это кластер: папка с общей конфигурацией и по одному серверному процессу на каждый мир. Почти всем нужны два - Лес как главный шард (Master) и Пещеры как вторичный, - и именно этот факт отличает хостинг DST от любой другой игры в этом блоге. Два процесса, два порта, два набора модов, одно сохранение. Добавьте бесплатный токен кластера Klei, который никто не может сгенерировать за вас, и вы получите всю картину целиком. Дальше разобран каждый файл, каждая настройка и ошибки, из-за которых люди смотрят на сервер, который запускается и так и не появляется в списке.

Что такое кластер: шарды, Master и Caves#

Шард - это один серверный процесс с одним миром. Кластер - набор шардов, у которых общие название, пароль, список администраторов и сохранение. Ровно один шард является Master, остальные подключаются к нему. По соглашению Master ведёт Лес, а один вторичный шард ведёт Пещеры, поэтому папки обычно называют Master и Caves.

Когда игрок спускается в провал, он не загружает новую область того же мира. Он отключается от одного серверного процесса и подключается к другому, а персонажа между ними передаёт связь шардов. Этим объясняется многое в поведении DST:

  • У Пещер свой счётчик дней, своё состояние сезонов и свои настройки мира.
  • Шард Caves работает постоянно, спускается туда кто-нибудь или нет.
  • Если процесс Caves мёртв, провалы сообщают, что пещеры недоступны, а Лес спокойно продолжает работать.
  • Откат действует на один шард, если только вы не откатываете оба вместе, - так и получаются Лес на 210-м дне и Пещеры на 195-м.
входUDP 10889автосохранениеавтосохранениеИгрокиодин адрес, два мираШард MasterЛес, UDP 10999Шард CavesПещеры, UDP 10998Сохранение кластерапапка session
Кластер - это два процесса с одним сохранением

Можно запустить кластер только с Лесом, и он прекрасно работает: шард Caves необязателен. Но в Пещерах находится большая часть поздней игры, поэтому считайте их стандартом и с самого начала рассчитывайте ресурсы на два процесса.

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

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

КонфигурацияRAMCPUПримечания
Только Лес, 1-4 игрока1 GB0.75-1 ядроОдин процесс, небольшой мир
Лес и Пещеры, до 62 GB1-1.5 ядраОбычный случай
Лес и Пещеры, 8-10, немного модов3-4 GB2 ядраОба шарда нагружены одновременно
Долгий мир, 500+ дней, много модов4-6 GB2+ ядраЧисло сущностей растёт со всем, что построено
  • Память делится между шардами, на зрелом мире примерно поровну. Одному шарду Леса в начале игры хватает 512-700 MB, а по мере исследования и застройки карты потребление растёт.
  • CPU уходит на симуляцию сущностей, а миры DST копят их неустанно - каждый брошенный предмет, каждое посаженное дерево, каждая лодка. Мир на третьем лете обходится заметно дороже свежего.
  • Диск нужен небольшой. Установка занимает несколько гигабайт, а данные сохранения - мегабайты, а не гигабайты.
  • Сеть нужна скромная и растёт вместе с tick_rate и числом игроков.

pause_when_empty = true - настройка, которая делает жизнеспособными небольшие тарифы: когда никого нет, симуляция останавливается, и оба шарда почти ничего не потребляют.

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

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

bash
$ steamcmd +force_install_dir /home/dst/server +login anonymous \    +app_update 343050 validate +quit

Исполняемые файлы - bin64/dontstarve_dedicated_server_nullrenderer_x64 и 32-разрядный bin/dontstarve_dedicated_server_nullrenderer. Запускать их нужно из их собственной директории.

Конфигурация хранится не рядом с установкой. Она лежит в папке кластера внутри каталога Klei пользователя:

code
~/.klei/DoNotStarveTogether/MyDediServer/  cluster.ini              settings shared by every shard  cluster_token.txt        your Klei token, nothing else in the file  adminlist.txt            one Klei user id per line  whitelist.txt  blocklist.txt  Master/    server.ini    worldgenoverride.lua    modoverrides.lua    save/  Caves/    server.ini    worldgenoverride.lua    modoverrides.lua    save/

Токен - единственное, что нельзя пропустить. Войдите на сайт аккаунтов Klei, откройте раздел серверов Don't Starve Together, добавьте сервер и скопируйте выданный токен. Вставьте его в cluster_token.txt как единственное содержимое файла - без кавычек и без лишнего текста. Он бесплатный и привязан к вашему аккаунту Klei, а любой токен, который Klei не выдавала, она отклонит, поэтому ни один хостинг не может создать его за вас. Два работающих кластера с одним токеном выбьют один из них из сети, так что генерируйте по одному токену на сервер.

RE:NODE запрашивает его до установки: линейка Don't Starve Together - одна из немногих, где нужны ваши собственные учётные данные. Сервер создаётся, как только пройдёт оплата, а установка ждёт на вкладке Setup, пока вы не вставите токен.

Затем запустите оба шарда. На собственной машине это две команды, обычно две службы:

bash
$ cd /home/dst/server/bin64$ ./dontstarve_dedicated_server_nullrenderer_x64 \    -console -cluster MyDediServer -shard Master$ ./dontstarve_dedicated_server_nullrenderer_x64 \    -console -cluster MyDediServer -shard Caves

Полезные флаги: -console включает ввод в консоль, -cluster выбирает папку кластера, -shard выбирает папку шарда внутри неё, -persistent_storage_root переносит весь каталог Klei в другое место, а -monitor_parent_process заставляет шард завершаться вместе с его супервизором, что не даёт остаться осиротевшим процессам Caves.

Шарду Caves нужно сказать, что он должен сгенерировать мир пещер, а не ещё один лес. Это делает файл worldgenoverride.lua в папке Caves:

Caves/worldgenoverride.lua
return {  override_enabled = true,  preset = "DST_CAVE",}

Для Master используется preset = "SURVIVAL_TOGETHER". Если ошибиться, получится кластер с двумя лесами и без пещер, и исправить это можно только заново сгенерировав мир Caves.

cluster.ini, настройка за настройкой#

Один файл, четыре-пять секций, общий для всех шардов кластера.

cluster.ini
[GAMEPLAY]game_mode = survivalmax_players = 6pvp = falsepause_when_empty = truevote_enabled = true[NETWORK]cluster_name = The Long Wintercluster_description = Cooperative, mods on, no griefingcluster_password = hollow-stalagmitecluster_intention = cooperativelan_only_cluster = falseoffline_cluster = falsetick_rate = 15whitelist_slots = 0autosaver_enabled = true[MISC]console_enabled = truemax_snapshots = 6[SHARD]shard_enabled = truebind_ip = 127.0.0.1master_ip = 127.0.0.1master_port = 10889cluster_key = a-long-random-string[STEAM]steam_group_only = falsesteam_group_id = 0steam_group_admins = false
НастройкаПо умолчаниюЧто делает
game_modesurvivalsurvival, endless или wilderness
max_players6Всего на кластер, а не на шард
pvpfalseУрон между игроками
pause_when_emptyfalseОстанавливает симуляцию, когда никого нет
vote_enabledtrueГолосования за кик и откат в игре
cluster_intention-cooperative, social, competitive или madness
cluster_password-Пустой пароль - заходить может любой
offline_clusterfalseБез служб Klei, без записи в списке, без модов
lan_only_clusterfalseТолько локальная сеть
tick_rate15Обновлений сервера в секунду
whitelist_slots0Слоты, зарезервированные за игроками из белого списка
autosaver_enabledtrueСохранение в каждые сумерки
console_enabledtrueРазрешает консоль в игре и на сервере
max_snapshots6Сколько точек отката хранится
shard_enabledfalseДля кластера из двух шардов должно быть true
master_port10889Связь между шардами, а не порт для игроков
cluster_key-Общий секрет шардов, любая строка

Про четыре из них стоит сказать отдельно.

`shard_enabled`. Если стоит false, шард Caves запустится, не найдёт Master и будет просто сидеть. Это самая частая причина, по которой процесс Caves работает, а провалы всё равно сообщают, что пещеры недоступны.

`cluster_key` и `master_port`. Шарды проходят друг перед другом аутентификацию с помощью ключа и общаются через master_port на master_ip. Когда оба шарда на одной машине, оставьте 127.0.0.1 и 10889: этот трафик не должен покидать машину и не должен быть доступен снаружи.

`tick_rate`. Пятнадцать - значение по умолчанию, и для кооперативной группы его достаточно. Если поднять до 30, бой ощущается чётче, но стоимость по CPU на игрока и трафик примерно удваиваются. На небольшом тарифе такая сделка обычно не стоит того.

`offline_cluster`. Значение true полностью отключает кластер от Klei: токен не нужен, в списке серверов записи нет, модов из Workshop нет. Это режим для LAN-вечеринки, а не для сервера, который должны находить люди.

server.ini и порты, которые нужны каждому шарду#

В папке каждого шарда есть свой server.ini, и значения в разных шардах должны различаться:

Master/server.ini
[NETWORK]server_port = 10999[SHARD]is_master = true[STEAM]master_server_port = 27018authentication_port = 8768[ACCOUNT]encode_user_path = true
Caves/server.ini
[NETWORK]server_port = 10998[SHARD]is_master = falsename = Cavesid = 2[STEAM]master_server_port = 27019authentication_port = 8769[ACCOUNT]encode_user_path = true
ПортПротоколНазначение
10999UDPШард Master, порт, к которому подключаются игроки
10998UDPШард Caves
27018 / 27019UDPМастер-сервер Steam, по одному на шард
8768 / 8769UDPАутентификация Steam, по одному на шард
10889UDPСвязь между шардами, только loopback

Всё, что использует DST, - это UDP. У каждого шарда должны быть свои server_port, master_server_port и authentication_port, отличные от портов всех остальных шардов: совпадение любого из трёх - причина, по которой один шард запускается, а другой тихо нет. Если вы хотите, чтобы работало обнаружение в локальной сети, держите server_port в диапазоне 10998-11018; для игры через интернет подойдёт любой свободный порт. Зачем вообще нужны порты в стиле query, объяснено в статье порты игрового сервера.

is_master - то, что делает шард главным. Два шарда с is_master = true в одном кластере - кластер, который не соединится. id должен быть уникален для каждого шарда, а name - подпись, которую игра показывает для этого мира.

В панели вручную править всё это приходится реже, чем кажется: порты выделяются за вас. В тарифах RE:NODE для Don't Starve Together есть два выделения портов, а дополнительные порты добавляются и убираются на вкладке Network, если вам понадобится третий шард.

Игроки находят сервер через браузер серверов в игре, отфильтровав по названию. Прямое подключение тоже работает: откройте консоль в игре клавишей «обратный апостроф» и выполните c_connect("203.0.113.10", 10999, "hollow-stalagmite"). Это надёжный путь, когда браузер тормозит, и единственный, если запись в списке ещё не обновилась.

Администраторы, белый список и список блокировок#

Три обычных текстовых файла в папке кластера, по одному идентификатору пользователя Klei на строку. Идентификаторы Klei выглядят как KU_aB3dEf7h и остаются постоянными для аккаунта.

adminlist.txt
KU_aB3dEf7hKU_9zQ2mNp1

whitelist.txt работает вместе с whitelist_slots: если на шестиместном сервере поставить whitelist_slots = 2, то четыре слота открыты для всех, а два удерживаются за перечисленными игроками, даже когда сервер выглядит заполненным. blocklist.txt - список банов, и сервер записывает его сам, когда вы банете кого-нибудь в игре.

Надёжный способ узнать идентификатор игрока - пусть он один раз зайдёт, а вы выполните в консоли c_listallplayers(): она выведет всех подключённых игроков с их идентификаторами. Игроки могут также посмотреть свой идентификатор на странице аккаунта Klei. Файлы читаются при запуске шарда, поэтому добавьте идентификаторы и перезапустите либо назначьте администратора в игре и позвольте серверу записать файл самому.

Команды консоли, откаты и снимки#

Консоль DST работает на Lua. Команды вводятся в консоль шарда - в поле консоли панели либо во внутриигровую консоль, которая открывается клавишей «обратный апостроф», если вы администратор. В игре у консоли есть локальный и удалённый режимы; удалённый отправляет команду на сервер, а переключаются они сочетанием control и «обратный апостроф». Если выполнить серверную команду в локальном режиме, покажется, что ничего не произошло, - в этом и причина.

КомандаЧто делает
c_save()Немедленно записывает сохранение
c_shutdown()Сохраняет и останавливает шард
c_shutdown(false)Останавливает без сохранения
c_rollback(1)Откатывает этот шард на один снимок
c_regenerateworld()Удаляет этот мир и генерирует новый
c_reset()Перезагружает шард из последнего сохранения
c_announce("text")Сообщение сервера всем
c_listallplayers()Все подключённые игроки с их идентификаторами Klei
TheNet:Kick("KU_aB3dEf7h")Кик
TheNet:Ban("KU_aB3dEf7h")Бан и запись в список блокировок
c_spawn("deerclops")Создаёт prefab под курсором
c_give("goldnugget", 10)Выдаёт предметы выбранному игроку
c_freecrafting()Включает или выключает свободный крафт для выбранного игрока

Снимки - это собственные точки отката DST, их число ограничено max_snapshots, а хранятся они в папке save шарда. c_rollback(2) возвращает на два снимка назад. Тут есть две вещи, на которых обычно ошибаются. Снимки существуют для каждого шарда отдельно, поэтому откат Леса без Пещер оставит два мира на разных днях - откатывайте оба, один за другим. И снимки лежат на том же диске, что и сохранение, так что они защищают от неверного решения, а не от потери сервера.

Настоящие бэкапы должны лежать в другом месте. В RE:NODE в каждый тариф Don't Starve Together входят слоты для бэкапов: они хранятся вне машины, которую защищают, и восстанавливаются кнопкой, а вкладка Schedules сделает копию по cron-выражению - разумная схема состоит из ночной копии и ещё одной перед установкой мода. В статье бэкапы, которые действительно восстанавливаются объясняется, почему важнее всего именно половина с восстановлением, а в задачах по расписанию, которые стоит завести есть ещё схемы, которые стоит перенять.

Моды на выделенном кластере#

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

Шаг первый: скажите серверу, что скачивать. В каталоге установки игры файл mods/dedicated_server_mods_setup.lua перечисляет то, что SteamCMD должен загрузить при запуске:

mods/dedicated_server_mods_setup.lua
ServerModSetup("1595631294")ServerModSetup("375850593")ServerModCollectionSetup("1234567890")

Числа - это идентификаторы файлов Workshop, их берут из конца URL мода в Workshop. ServerModCollectionSetup принимает идентификатор коллекции и подтягивает всё, что в ней есть, - для большого списка так гораздо проще поддерживать порядок.

Шаг второй: включите их для каждого шарда. Файл modoverrides.lua в папке каждого шарда решает, какие из скачанных модов действительно включены, и хранит их настройки:

Master/modoverrides.lua
return {  ["workshop-1595631294"] = {    enabled = true,    configuration_options = {      ["language"] = "en",    },  },  ["workshop-375850593"] = {    enabled = true,  },}

Ключ - это буквальная строка workshop- и следом идентификатор. Всё, что меняет мир, требует одной и той же записи и в Master/modoverrides.lua, и в Caves/modoverrides.lua с одинаковыми настройками: мод, включённый на одном шарде и не включённый на другом, приводит к отсутствующим prefab и вылетам, когда игрок переходит между ними. Проще всего держать один файл и копировать его в обе папки.

Клиенты автоматически скачивают подходящие моды при подключении, поэтому для кластера с модами нужно offline_cluster = false. Моды обновляются в Workshop, как только их авторы что-то публикуют, а обновление DST ломает часть из них, так что делайте бэкап кластера перед патчем игры и не удивляйтесь, если первый запуск после него не удастся. Общий механизм контента Workshop на серверах описан в статье моды Steam Workshop на выделенных серверах, а порядок действий при восстановлении - в статье что делать, когда обновление мода всё ломает.

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

«Your server will not start without a token». Файла cluster_token.txt нет, он пуст, лежит не в той папке или содержит что-то кроме токена. Ему место в папке кластера, а не в папке шарда.

Сервер работает, но его нет в браузере. Проверьте, что offline_cluster и lan_only_cluster оба равны false, что токен действителен и что никакой другой работающий кластер не использует тот же токен. Проверьте через c_connect из внутриигровой консоли: если прямое подключение работает, с сервером всё в порядке, а отсутствует только запись в списке.

В игре пещеры недоступны. Либо процесс Caves не запущен, либо сломана связь. Проверьте shard_enabled = true в cluster.ini, is_master = false в Caves/server.ini, что у обоих шардов одинаковый cluster_key и что у шардов разные значения server_port, master_server_port и authentication_port.

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

Моды не загружаются. Убедитесь, что идентификатор есть и в dedicated_server_mods_setup.lua, и в каждом modoverrides.lua, что в overrides присутствует префикс workshop- и что кластер не в офлайн-режиме. Лог шарда печатает по имени каждый загружаемый мод.

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

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

FAQ#

Нужен ли мне собственный токен Klei?

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

Можно ли запустить Don't Starve Together без пещер?

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

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

max_players по умолчанию равно 6 и может быть увеличено. Практический потолок задают стоимость по CPU зрелого мира и то, сколько гриферства вы готовы модерировать; большинство групп останавливается между 6 и 10. Лимит считается на весь кластер, а не на каждый шард.

Где на самом деле хранится сохранение?

В папке save внутри каждого шарда, в каталоге кластера. У Леса и Пещер отдельные данные сохранения, поэтому откаты действуют на каждый шард отдельно. Копируйте в бэкап всю папку кластера, а не один шард.

Почему моды работают в Лесу, а Пещеры от них падают?

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

Безопасно ли повышать tick rate?

Безопасно, но это стоит ресурсов. Переход с 15 на 30 примерно удваивает нагрузку на CPU и трафик на игрока, и на небольшом тарифе это проявится как лаги на полном сервере, а не как более плавный бой. Попробуйте с вашей обычной компанией и верните обратно, если график сервера пойдёт вверх.


Комментарии

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

0/2000