Выделенный сервер 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 держат большое число игроков - линейные сражения с сильно больше чем сотней игроков и есть суть игры, - а нагрузка на сервер растёт вместе с игроками, кавалерией, артиллерией и, на морских картах, кораблями.
| Конфигурация | RAM | CPU | Примечания |
|---|---|---|---|
| Небольшое сообщество, 30-50 игроков | 3-4 ГБ | 2 ядра | Army Battlefield, умеренная артиллерия |
| Линейное сражение, 100-150 игроков | 4-6 ГБ | 3 ядра | Типичный публичный размер |
| Морские сражения, большие корабли | 4-6 ГБ | 3 ядра | Физика кораблей и множество пушек |
| Серверы под мероприятия больше 150 | 6-8 ГБ | 3-4 быстрых ядра | Измерьте, прежде чем обещать такое число |
Это рабочие диапазоны, а не официальные цифры, и честный совет - провести нагрузочный тест со своим сообществом, прежде чем объявлять число слотов. Для загруженного сервера важна частота процессора; как понять, какого ресурса на самом деле не хватает, объясняет статья CPU или RAM для игровых серверов. Диска нужно немного - установка весит несколько гигабайт и растёт с модами.
Установка и запуск#
$ 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.
Две вещи, которые нужно сделать до первого настоящего запуска:
- Скопируйте конфиг.
cp serverconfig_default.txt serverconfig_myserver.txt- и правьте свою копию. Файл по умолчанию заменяется каждым обновлением игры. - Скопируйте и скрипт запуска и поменяйте в нём
-serverConfigFilePathна свой файл. Поставляемый скрипт тоже перезаписывается при обновлении.
Для Linux-хостов есть Docker-образ, который поддерживает сообщество (cm2network/holdfastnaw), с настройкой портов через переменные окружения. На хостинговой панели скрипты трогать не нужно: путь к конфигу и порты - это переменные запуска, а файл конфигурации правится в файловом менеджере. Про validate и скрипты обновления в целом - статья SteamCMD простыми словами.
Общие настройки: название, порты и онлайн#
В начале файла лежат настройки, которые относятся ко всему серверу. Строки имеют вид <setting> <value>, комментарии начинаются с #, пустые строки игнорируются.
# 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_port | Steam query - отсюда браузер читает название и число игроков |
maximum_players | Максимум игроков |
population_*_min_players | Пороги, определяющие низкий, средний и высокий онлайн |
map_rotation_start_randomise | Начинать ротацию со случайного блока |
server_intro_title, server_intro_body | Всплывающее окно при входе, удобно для правил |
network_broadcast_mode | Сетевой профиль Standard или Competitive |
Пороги онлайна стоит задать осознанно. У ряда настроек раундов и голосования за карты есть варианты для низкого, среднего и высокого онлайна, так что сервер может, например, предлагать только маленькие карты, когда он почти пуст, и большие, когда полон. Это одна из лучших возможностей файла, и работает она, только если пороги соответствуют вашему реальному онлайну.
Тег региона - это только метка для браузера. Ставьте тот, где сервер находится на самом деле: сервер в Германии - это europe. Игроки фильтруют по нему ради пинга, так что неверный регион порождает поток жалоб на лаги.
Порты и подключение#
| Порт | По умолчанию | Назначение |
|---|---|---|
server_port | 20100 | Игровой трафик |
steam_communications_port | 8700 | Связь со Steam |
steam_query_port | 27000 | Steam query - информация для браузера и число игроков |
Все три должны быть доступны по UDP, и все три должны быть уникальными для каждого экземпляра, если на одной машине работает несколько серверов. Именно query-порт позволяет браузеру показывать число игроков; сервер с заблокированным query-портом может нормально работать и при этом выглядеть пустым или не появляться вовсе. Почему игры так разделяют трафик, объясняет статья порты игровых серверов простыми словами.
Блоки ротации карт#
Каждый раунд ротации - это блок между !map_rotation start и !map_rotation end. Примеры, поставляемые с сервером (и папка example_map_rotations в свежих сборках), показывают полные блоки для каждого режима; начинайте с них, а не по памяти, потому что имена карт - это внутренние идентификаторы и должны совпадать в точности.
!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, стартовое оружие, расстановка артиллерии, появление кораблей и их прочность в морских раундах. Это мощные и многословные настройки. Добавляйте их по одному блоку за раз и проверяйте каждый раунд до мероприятия, а не во время него.
Голосование за карты#
Вместо фиксированной ротации сервер может давать игрокам голосовать между кандидатами в конце каждого раунда. Основные переключатели:
map_voting_enabled truemap_voting_duration 20map_voting_max_choices 3map_voting_allow_same_map falsemap_voting_history_count 4map_voting_include_random_choice truemap_voting_history_count не даёт снова предлагать только что сыгранную карту указанное число раундов, и у него есть варианты для разного онлайна (_verylow, _low, _medium, _high), так что почти пустой сервер может быстрее повторять свои маленькие карты. Ключи population_*_playable внутри блоков ротации отмечают, какие раунды подходят при каком онлайне, - так голосование не предлагает осаду на 150 игроков двенадцати людям.
Голосование подходит публичным серверам. Организованные сообщества с запланированными мероприятиями обычно хотят фиксированную ротацию и выключают его.
Моды, плановые перезапуски и логирование в Discord#
Моды берутся из Steam Workshop. Конфиг указывает их по id в Workshop:
mods_installed 1234567890mods_installed_server_only 2345678901mods_installed - для модов, которые нужны и серверу, и клиентам; mods_installed_server_only - для серверных. Ключи вроде load_mod, load_mod_client_only и load_mod_server_only управляют загрузкой, а mod_variable передаёт моду настройки. id выше - заглушки, а какие ключи нужны моду, указано на его странице в Workshop. Как и в любой игре, каждый клиентский мод должен совпадать у сервера и игроков, а обновление игры может сломать мод, пока его автор не выпустит обновление, - смотрите статьи моды Steam Workshop на выделенных серверах и что делать, когда обновление мода всё ломает.
Плановые перезапуски и выключения встроены в конфиг, что необычно:
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 существуют ради организованных линейных сражений: полки записываются, офицеры командуют, а вечер идёт по расписанию. Файл конфигурации либо поддерживает эту дисциплину, либо подрывает её.
- Используйте фиксированную ротацию для мероприятия. Выключите голосование за карты и перечислите раунды мероприятия по порядку. Игроки должны знать до входа, какая карта и какой режим будут следующими.
- Зафиксируйте стороны.
faction_balancing trueиallow_faction_switching falseдержат полки там, куда их поставили организаторы. В асимметричных режимах задайтеfaction_attackingиfaction_defendingявно. - Контролируйте классы.
spawn_overrideограничивает, сколько бойцов одного класса может появиться в точке. Линейные сражения живут или умирают в зависимости от того, удаётся ли держать застрельщиков, кавалерию и артиллерию в пропорции к линейной пехоте; задавайте ограничения в каждом блоке, а не полагайтесь на добрую волю. - Решите насчёт опоздавших.
allow_midround_spawning false- частый выбор для мероприятий, чтобы бой вели те, кто был на старте. Публичным серверам эта настройка нужна включённой. - Дайте офицерам свой канал.
include_officer_only_chat trueдаёт офицерам собственный канал, аinclude_sergeants_in_officer_chatрешает, входят ли в него сержанты. - Разместите правила там, где их увидят.
server_intro_titleиserver_intro_bodyпоказывают всплывающее окно при входе. Используйте его для трёх правил, за которые выгоняют, а не для всего свода.
Держите отдельный файл конфигурации для вечеров мероприятий и ещё один для публичного сервера между ними и переключайтесь, указывая при запуске другой файл и перезапуская сервер. Это гораздо безопаснее, чем каждую неделю править один файл туда и обратно, и значит, что ошибка при подготовке воскресного мероприятия не сломает публичный сервер во вторник. Делайте backup обоих файлов перед каждым изменением.
Админские команды#
Админы открывают консоль клавишей F1 в игре и входят:
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. Мы храним имя, которое вы ввели, текст и время - больше ничего. Количество ссылок ограничено, разметка не отображается.