RE:NODE

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

Конфиг сервера Holdfast: Nations At War

Настройка сервера Holdfast: Nations At War: установка, файл serverconfig, порты, блоки ротации карт, режимы игры, голосование за карты, моды, автоперезапуски и админка через rc.

0 прочтений

Выделенный сервер Holdfast: Nations At War - это бесплатная загрузка через SteamCMD (app id 1424230), которая работает под Windows и Linux, и всё, что его касается, живёт в одном текстовом файле конфигурации: вверху блок общих настроек сервера, затем по одному блоку !map_rotation start ... !map_rotation end на каждый раунд ротации, где указаны карта, режим игры и правила этого раунда. Серверу нужны три порта - server_port (по умолчанию 20100), steam_communications_port (8700) и steam_query_port (27000), - а администрирование идёт в игре через консоль F1 командой rc login с админским паролем из файла. Прежде чем что-то править, скопируйте поставляемый serverconfig_default.txt в собственный файл, потому что обновления игры перезаписывают файл по умолчанию.

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

Как устроен сервер Holdfast#

Holdfast - игра на Unity, а сервер - это та же игра, запущенная без графики. При запуске он загружает файл конфигурации, проигрывает блоки ротации по порядку (или даёт игрокам голосовать между ними) и идёт по кругу. Каждый блок ротации - это полное описание раунда: карта, режим, какие фракции атакуют и обороняются, длительность раунда, тикеты, правила возрождения, огонь по своим, ограничения классов. Одна и та же карта может встречаться несколько раз с разными правилами.

У такого устройства есть два следствия, которые стоит знать заранее:

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

Внешнего протокола RCON в том смысле, как у игр на Source, у Holdfast нет. Администрирование - это внутриигровая консоль, а значит, чтобы управлять сервером, админ должен быть на нём.

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

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

КонфигурацияRAMCPUПримечания
Небольшое сообщество, 30-50 игроков3-4 ГБ2 ядраArmy Battlefield, умеренная артиллерия
Линейное сражение, 100-150 игроков4-6 ГБ3 ядраТипичный публичный размер
Морские сражения, большие корабли4-6 ГБ3 ядраФизика кораблей и множество пушек
Серверы под мероприятия больше 1506-8 ГБ3-4 быстрых ядраИзмерьте, прежде чем обещать такое число

Это рабочие диапазоны, а не официальные цифры, и честный совет - провести нагрузочный тест со своим сообществом, прежде чем объявлять число слотов. Для загруженного сервера важна частота процессора; как понять, какого ресурса на самом деле не хватает, объясняет статья CPU или RAM для игровых серверов. Диска нужно немного - установка весит несколько гигабайт и растёт с модами.

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

bash
$ steamcmd +force_install_dir /home/holdfast/server +login anonymous \    +app_update 1424230 validate +quit

В установке есть два скрипта запуска - LaunchServer.sh для Linux и LaunchServer.ps1 для Windows - и пример serverconfig_default.txt. Скрипты запускают сервер без графики с аргументами примерно такого вида: -startserver -batchmode -nographics -serverheadless, и указывают ему файл конфигурации через -serverConfigFilePath.

Две вещи, которые нужно сделать до первого настоящего запуска:

  1. Скопируйте конфиг. cp serverconfig_default.txt serverconfig_myserver.txt - и правьте свою копию. Файл по умолчанию заменяется каждым обновлением игры.
  2. Скопируйте и скрипт запуска и поменяйте в нём -serverConfigFilePath на свой файл. Поставляемый скрипт тоже перезаписывается при обновлении.

Для Linux-хостов есть Docker-образ, который поддерживает сообщество (cm2network/holdfastnaw), с настройкой портов через переменные окружения. На хостинговой панели скрипты трогать не нужно: путь к конфигу и порты - это переменные запуска, а файл конфигурации правится в файловом менеджере. Про validate и скрипты обновления в целом - статья SteamCMD простыми словами.

Общие настройки: название, порты и онлайн#

В начале файла лежат настройки, которые относятся ко всему серверу. Строки имеют вид <setting> <value>, комментарии начинаются с #, пустые строки игнорируются.

serverconfig_myserver.txt
# Identityserver_name [EU] 33rd Line Battles | Sundays 19:00server_welcome_message Follow your officer. Rules on Discord.server_region europeserver_passwordserver_admin_password a-long-random-admin-password# Ports - unique per instance on one machineserver_port 20100steam_communications_port 8700steam_query_port 27000# Players and population bracketsmaximum_players 150population_low_min_players 30population_medium_min_players 60population_high_min_players 100# Behaviourmap_rotation_start_randomise falseinclude_officer_only_chat trueinclude_sergeants_in_officer_chat true
НастройкаЧто делает
server_nameНазвание в браузере серверов
server_welcome_messageСообщение, которое игроки видят при входе
server_regionТег региона для фильтра в браузере, например europe, usa, usaeast, usawest, australia
server_passwordПароль для входа. Пустой для публичного сервера
server_admin_passwordПароль для rc login
server_portИгровой порт
steam_communications_portПорт связи со Steam
steam_query_portSteam query - отсюда браузер читает название и число игроков
maximum_playersМаксимум игроков
population_*_min_playersПороги, определяющие низкий, средний и высокий онлайн
map_rotation_start_randomiseНачинать ротацию со случайного блока
server_intro_title, server_intro_bodyВсплывающее окно при входе, удобно для правил
network_broadcast_modeСетевой профиль Standard или Competitive

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

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

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

ПортПо умолчаниюНазначение
server_port20100Игровой трафик
steam_communications_port8700Связь со Steam
steam_query_port27000Steam query - информация для браузера и число игроков

Все три должны быть доступны по UDP, и все три должны быть уникальными для каждого экземпляра, если на одной машине работает несколько серверов. Именно query-порт позволяет браузеру показывать число игроков; сервер с заблокированным query-портом может нормально работать и при этом выглядеть пустым или не появляться вовсе. Почему игры так разделяют трафик, объясняет статья порты игровых серверов простыми словами.

Блоки ротации карт#

Каждый раунд ротации - это блок между !map_rotation start и !map_rotation end. Примеры, поставляемые с сервером (и папка example_map_rotations в свежих сборках), показывают полные блоки для каждого режима; начинайте с них, а не по памяти, потому что имена карт - это внутренние идентификаторы и должны совпадать в точности.

serverconfig_myserver.txt
!map_rotation startmap_name PalisadeArenagame_mode ArmyBattlefieldround_time_minutes 30faction_balancing trueallow_faction_switching falseallow_midround_spawning truefriendly_fire truespawn_immunity_timer 3!map_rotation end!map_rotation startmap_name Azuregame_mode NavalBattlefieldround_time_minutes 25max_tickets 2000max_player_respawns -1faction_balancing true!map_rotation end

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

РежимЧто это
ArmyBattlefieldОткрытое сухопутное сражение, основа линейных боёв
ArmyConquestСухопутное сражение за точки захвата с тикетами
ArmySiegeАтакующие штурмуют укреплённую позицию
CoastalSiegeКорабли и сухопутные силы атакуют береговой форт
NavalBattlefieldБой корабля против корабля
NavalConquestМорское сражение за точки захвата
FrontlinesOffensiveРежим Frontlines, при включённом frontlines_mode

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

  • `faction_attacking` и `faction_defending` задают стороны для асимметричных режимов вроде осад. Не указывайте их там, где режиму они не нужны.
  • `round_time_minutes` - длительность раунда. -1 означает без ограничения по времени, что подходит для арен и тренировочных карт.
  • `max_tickets`, `reinforcements_per_faction`, `max_player_respawns` - как долго каждая сторона может продолжать бой. -1 в max_player_respawns означает без ограничений.
  • `faction_balancing` и `allow_faction_switching` - для организованных линейных сражений балансировка включена, а смена стороны выключена, чтобы полки не скапливались на одной стороне.
  • `friendly_fire` - включён в большинстве сообществ линейных боёв, где это часть дисциплины. damage_split возвращает часть урона по своим атакующему.
  • `spawn_immunity_timer` - защита после возрождения в секундах, максимум пять.
  • `allow_midround_spawning` - могут ли опоздавшие войти в идущий раунд.
  • `class_system_orders` - система приказов офицеров.
  • `admin_console_allowed` - работает ли админская консоль в этом раунде.

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

Голосование за карты#

Вместо фиксированной ротации сервер может давать игрокам голосовать между кандидатами в конце каждого раунда. Основные переключатели:

code
map_voting_enabled truemap_voting_duration 20map_voting_max_choices 3map_voting_allow_same_map falsemap_voting_history_count 4map_voting_include_random_choice true

map_voting_history_count не даёт снова предлагать только что сыгранную карту указанное число раундов, и у него есть варианты для разного онлайна (_verylow, _low, _medium, _high), так что почти пустой сервер может быстрее повторять свои маленькие карты. Ключи population_*_playable внутри блоков ротации отмечают, какие раунды подходят при каком онлайне, - так голосование не предлагает осаду на 150 игроков двенадцати людям.

Голосование подходит публичным серверам. Организованные сообщества с запланированными мероприятиями обычно хотят фиксированную ротацию и выключают его.

Моды, плановые перезапуски и логирование в Discord#

Моды берутся из Steam Workshop. Конфиг указывает их по id в Workshop:

code
mods_installed 1234567890mods_installed_server_only 2345678901

mods_installed - для модов, которые нужны и серверу, и клиентам; mods_installed_server_only - для серверных. Ключи вроде load_mod, load_mod_client_only и load_mod_server_only управляют загрузкой, а mod_variable передаёт моду настройки. id выше - заглушки, а какие ключи нужны моду, указано на его странице в Workshop. Как и в любой игре, каждый клиентский мод должен совпадать у сервера и игроков, а обновление игры может сломать мод, пока его автор не выпустит обновление, - смотрите статьи моды Steam Workshop на выделенных серверах и что делать, когда обновление мода всё ломает.

Плановые перезапуски и выключения встроены в конфиг, что необычно:

code
server_autorestart_interval_minutes 1440server_autorestart_overtime_minutes 15server_autorestart_broadcasted_message Server restarts at the end of this round.server_autorestart_broadcasted_message_interval_minutes 5

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

Логирование в Discord админских событий настраивается ключами discord_webhook_warning_* и discord_webhook_banmute_*, которые отправляют предупреждения, баны и муты в вебхуки, созданные вами в Discord. Его стоит включить: оно даёт персоналу запись действий модерации без ручного копирования логов. Как создать вебхук, объясняет статья вебхуки Discord для статуса сервера; обращайтесь с токеном как с секретом.

Как провести линейное сражение#

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

  1. Используйте фиксированную ротацию для мероприятия. Выключите голосование за карты и перечислите раунды мероприятия по порядку. Игроки должны знать до входа, какая карта и какой режим будут следующими.
  2. Зафиксируйте стороны. faction_balancing true и allow_faction_switching false держат полки там, куда их поставили организаторы. В асимметричных режимах задайте faction_attacking и faction_defending явно.
  3. Контролируйте классы. spawn_override ограничивает, сколько бойцов одного класса может появиться в точке. Линейные сражения живут или умирают в зависимости от того, удаётся ли держать застрельщиков, кавалерию и артиллерию в пропорции к линейной пехоте; задавайте ограничения в каждом блоке, а не полагайтесь на добрую волю.
  4. Решите насчёт опоздавших. allow_midround_spawning false - частый выбор для мероприятий, чтобы бой вели те, кто был на старте. Публичным серверам эта настройка нужна включённой.
  5. Дайте офицерам свой канал. include_officer_only_chat true даёт офицерам собственный канал, а include_sergeants_in_officer_chat решает, входят ли в него сержанты.
  6. Разместите правила там, где их увидят. server_intro_title и server_intro_body показывают всплывающее окно при входе. Используйте его для трёх правил, за которые выгоняют, а не для всего свода.

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

Админские команды#

Админы открывают консоль клавишей F1 в игре и входят:

code
rc login a-long-random-admin-passwordrc helprc mapRotation 2

Каждая админская команда начинается с rc. rc help выводит команды, доступные в вашей версии, и это и есть авторитетный список - набор расширялся с обновлениями. Кик, бан, мут и объявления - всё это команды rc, а rc mapRotation <n> переходит к блоку ротации с указанным номером - так админы двигают мероприятие дальше, когда раунд себя исчерпал.

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

Решение проблем#

После обновления сервер вернулся с настройками по умолчанию. Вы запускались с serverconfig_default.txt или со стандартным скриптом запуска. Используйте собственные копии.

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

Один раунд ротации не загружается или загружает не то. Опечатка в map_name или game_mode в этом блоке. Сравните с примерами ротаций.

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

Игроки видят раунд с неправильными сторонами. В асимметричном режиме faction_attacking и faction_defending отсутствуют или перепутаны.

`rc login` не срабатывает. Пароль не совпадает с server_admin_password или строка закомментирована через #.

Моды не загружаются у игроков. Клиентский мод указан как серверный, или у игроков другая версия.

FAQ#

Где лежит файл конфигурации сервера Holdfast?

В папке установки сервера, как serverconfig_default.txt. Скопируйте его в собственный файл, укажите на копию в скрипте запуска или переменной запуска и правьте её - обновления перезаписывают файл по умолчанию.

Какие порты нужны серверу Holdfast?

server_port (по умолчанию 20100), steam_communications_port (8700) и steam_query_port (27000) - все по UDP и все уникальные для каждого экземпляра на одной машине.

Как стать админом на своём сервере Holdfast?

Задайте server_admin_password в конфиге, перезапустите сервер, зайдите, нажмите F1 и введите rc login, а затем пароль. После этого rc help выведет админские команды.

Можно ли изменить огонь по своим для всего сервера?

Только задав friendly_fire в каждом блоке ротации. Правила задаются для раунда, поэтому копируйте настройку в каждый используемый блок.

Есть ли в Holdfast RCON?

Внешнего протокола RCON нет. Администрирование - это внутриигровая консоль с командами rc, так что админ должен быть подключён к серверу.

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

Столько, сколько позволяет maximum_players и сколько выдержит ваше железо. Серверы линейных сражений на 100-150 игроков - обычное дело; большие числа проверьте со своим сообществом, прежде чем их объявлять.


Комментарии

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

0/2000