RE:NODE

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

Основы SRCDS: параметры запуска и cfg

Как устроен srcds для TF2, Garry's Mod, CS:S и L4D2: srcds_run, параметры запуска, server.cfg и папка cfg, порты, логи, обновления и частые ошибки.

0 прочтений

SRCDS - Source Dedicated Server - это одна программа, которая запускает любую игру на Source 1: Team Fortress 2, Garry's Mod, Counter-Strike: Source, Left 4 Dead 2, Half-Life 2: Deathmatch, Day of Defeat: Source и длинный хвост модов. Вы устанавливаете серверные файлы игры через SteamCMD, запускаете srcds_run (Linux) или srcds.exe (Windows) с -game <folder>, стартовой картой и числом игроков, а всё остальное поведение берётся из server.cfg в папке cfg игры. Строка запуска определяет, что это за сервер; cfg-файлы определяют, как он себя ведёт. Как только вы знаете, какая настройка где живёт, любая игра на Source - это один и тот же сервер с разным контентом.

Один движок, много игр#

Все серверы на Source 1 используют общий исполняемый файл и общую структуру. Аргумент -game выбирает папку с контентом, и в этой папке лежит всё, что относится к конкретной игре:

ИграПапка -gameApp id в SteamCMDПорт по умолчанию
Team Fortress 2tf23225027015
Garry's Modgarrysmod402027015
Counter-Strike: Sourcecstrike23233027015
Left 4 Dead 2left4dead222286027015
Half-Life 2: Deathmatchhl2mp23237027015
Day of Defeat: Sourcedod23229027015

Counter-Strike 2 в этом списке нет. Он работает на Source 2, использует другой исполняемый файл (cs2 с -dedicated), другую структуру папок (game/csgo/), другой набор плагинов и другую систему карт. Многие cvar-ы перешли туда без изменений, из-за чего старые гайды обманчиво наполовину верны; как следует CS2 разобран в статье настройка сервера Counter-Strike 2. Counter-Strike 1.6 ещё старше - это GoldSrc, который запускается через hlds, - и ему посвящён гайд по серверу Counter-Strike 1.6.

Любая из этих игр устанавливается одной и той же строкой SteamCMD с другим id. Все они допускают анонимный вход:

bash
$ steamcmd +force_install_dir /home/srcds/tf2 +login anonymous \    +app_update 232250 validate +quit

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

Строка запуска, параметр за параметром#

В Linux сервер запускается через srcds_run - shell-обёртку вокруг настоящего исполняемого файла (srcds_linux). Обёртка перезапускает сервер после падения и по желанию обновляет его. В Windows srcds.exe запускается напрямую. Типичная строка:

bash
$ ./srcds_run -game tf -console -port 27015 +maxplayers 24 \    +map ctf_2fort +sv_setsteamaccount YOURTOKEN -strictportbind

В ней встречаются два вида аргументов, и разница между ними важна:

  • Параметры с дефисом (-game, -port, -console) читает движок или обёртка при старте процесса. Они настраивают сам процесс.
  • Команды с плюсом (+map, +maxplayers, +exec) - это консольные команды, которые ставятся в очередь и выполняются, когда движок поднялся, точно так же, как если бы их набрали в консоли. Так можно задать любой cvar.

Параметры, которые стоит знать:

ПараметрЧто делает
-game <folder>Какую игру запускать. Обязателен
-consoleКонсольный режим в Windows. В Linux ни на что не влияет
-port <n>Игровой порт, UDP. По умолчанию 27015
-ip <address>Привязка к одному адресу на машине с несколькими адресами
-strictportbindПадать вместо того, чтобы молча пробовать следующий порт
+maxplayers <n>Слоты для игроков. Задаётся при старте, на ходу не меняется
+map <name>Первая карта. Без неё сервер просто простаивает
+exec <file>Выполнить дополнительный cfg после старта
+sv_setsteamaccount <token>Вход с токеном игрового сервера
-tickrate <n>Tick rate, только в играх, которые это позволяют (CS:S)
-nohltvПолностью отключить SourceTV
-insecureОтключить VAC. Только для тестов
-norestartЗапретить srcds_run перезапуск после падения
-autoupdatesrcds_run обновляется через SteamCMD при перезапуске

Три из них доставляют больше всего хлопот.

`+map` не опционален. Сервер на Source без загруженной карты не появляется в браузере серверов и не принимает подключения. Он не упал - он ждёт.

`+maxplayers` фиксируется при старте. Менять его в server.cfg бесполезно, потому что server.cfg выполняется уже после того, как число слотов определено. У каждой игры есть и потолок: TF2 допускает до 100, L4D2 рассчитан на 4 выживших (8 в режиме versus) и для большего требует плагинов, а Garry's Mod доходит до 128.

`-tickrate` зависит от игры. CS:S его учитывает, поэтому и существуют серверы CS:S на "66 тиков" и "100 тиков". В TF2 частота зафиксирована на 66, и параметр игнорируется. Garry's Mod принимает -tickrate, и многие roleplay-серверы понижают его, чтобы сэкономить CPU. Об этом компромиссе - в статье что на самом деле значит tick rate.

Токены входа для игровых серверов

+sv_setsteamaccount принимает токен, созданный на странице управления аккаунтами игровых серверов Steam и привязанный к app id клиента игры (440 для TF2, 4000 для Garry's Mod). Нужен ли он, зависит от игры: без токена большинство серверов на Source 1 входят анонимно и работают, хотя некоторые хуже отображаются в списке или ограничены в функциях. CS2 без токена вообще не попадает в список. Подробности, включая ошибку "token in use", когда два сервера используют один токен, - в статье токены игровых серверов Steam.

Папка cfg и порядок выполнения#

Всё, что идёт после строки запуска, живёт в <game>/cfg/ - tf/cfg/, garrysmod/cfg/ и так далее. Это обычные текстовые файлы с консольными командами, по одной в строке, с комментариями через //. Некоторые из них движок выполняет сам:

  1. valve.rc при старте, который по умолчанию вызывает autoexec.cfg. Используйте autoexec.cfg для того, что должно происходить один раз при запуске процесса.
  2. server.cfg после каждой загрузки карты. Сюда идёт почти всё, и он выполняется заново при каждой смене карты, так что изменения в нём вступают в силу на следующей карте без перезапуска.
  3. Всё, что выполняет плагин. Например, плагины SourceMod для конфигов карт выполняют отдельный файл для каждой карты или префикса карты после server.cfg - так один сервер держит разные настройки на картах ctf_ и pl_.

Всё остальное выполняется, только когда его кто-то вызывает: exec mysettings из консоли, +exec в строке запуска или строка exec внутри server.cfg. Разбивать длинный конфиг на части, подключаемые через exec (exec banned_user.cfg, exec competitive.cfg), - обычная практика, так его проще читать.

Разумный стартовый server.cfg для публичного сервера TF2:

tf/cfg/server.cfg
hostname "Ten-Second Respawns | 2Fort and friends"sv_password ""rcon_password ""sv_contact "admin@example.org"sv_region 3sv_lan 0mp_timelimit 30mp_winlimit 0mp_maxrounds 0sv_allowupload 0sv_allowdownload 1sv_downloadurl ""log onsv_logbans 1sv_logecho 1sv_logfile 1exec banned_user.cfgexec banned_ip.cfg

Заметки о тех настройках, в которых чаще всего ошибаются:

  • rcon_password "" отключает удалённую консоль. Это правильное значение по умолчанию; задавайте пароль, только если он нужен какому-то инструменту, и сначала прочитайте статью безопасный RCON.
  • sv_region - число для фильтрации в браузере серверов. 255 - это "весь мир"; остальные значения - региональные коды, 3 - Европа.
  • sv_lan 1 скрывает сервер от интернета и отключает клиентов не из локальной сети. Это для LAN-мероприятий, а случайно включённый параметр - классика жанра "локально сервер работает, а зайти никто не может".
  • sv_downloadurl указывает на веб-сервер со сжатым пользовательским контентом (FastDL). Без него клиенты медленно скачивают карты с самого игрового сервера - если sv_allowdownload вообще включён.
  • banned_user.cfg и banned_ip.cfg записываются командами writeid и writeip. Баны, выданные через banid и addip, хранятся в памяти, пока их не запишут, и перезапуск их забудет, если никто этого не сделал.

Другие файлы в папке игры

Вокруг cfg лежат ещё несколько файлов, которые читает сервер:

  • cfg/mapcycle.txt в TF2 (в некоторых старых играх он лежит в корне игры): карты, которые сервер прокручивает по очереди, по одной в строке. cvar mapcyclefile может указывать на другой файл. Подробно о ротации - в статье карты и ротация карт на игровом сервере.
  • motd.txt и motd_text.txt: сообщение дня, которое показывается при входе, в виде HTML или URL, и текстовая версия для клиентов с отключённым HTML.
  • addons/: здесь живут Metamod:Source и SourceMod, если они установлены.
  • maps/, materials/, models/, sound/: пользовательский контент, который клиенты тоже должны скачать.

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

ПортПротоколНазначение
27015UDPИгровой трафик и запросы к серверу
27015TCPRCON, на том же номере, что и игровой порт
27020UDPSourceTV, если включён (tv_port)
27005UDPКлиентский порт, исходящий со стороны клиента

Source 1 отвечает на запросы браузера серверов прямо на игровом порту, поэтому отдельный query-порт пробрасывать не нужно. Если вы меняете -port, RCON переезжает вместе с ним. SourceTV работает как дополнительный клиент на своём порту и занимает слот; -nohltv убирает его, если вам не нужны зрители или демо.

Игроки подключаются командой connect 203.0.113.10:27015 в консоли игры, через вкладку Favourites в браузере серверов или по ссылке steam://connect/203.0.113.10:27015. Варианты, включая пароль в ссылке, разобраны в статье ссылки steam://connect и прямое подключение. Если сервер отвечает по IP, но так и не появляется в браузере, проверьте sv_lan, затем вход в Steam, а потом дайте мастер-серверу несколько минут - дальше об этом в статье порты игрового сервера.

Ресурсы: что на самом деле потребляет сервер на Source#

По современным меркам серверы на Source 1 лёгкие, и именно поэтому их до сих пор дёшево держать спустя двадцать лет. Движок симулирует игру в одном главном потоке, поэтому удержит ли сервер свой tick, решает скорость одного ядра, а не количество ядер. Второе ядро помогает только с работой по краям: SourceTV, логирование, потоки плагинов.

СерверRAMCPUПримечания
TF2, 24 игрока, ванилла1-2 GB1 ядроКомфортно почти на чём угодно
TF2, 32 игрока, SourceMod2-3 GB1-1.5 ядраПлагины добавляют нагрузку на CPU каждый tick
CS:S, 100 тиков, 20 игроков1-2 GB1.5 ядраВысокий tick стоит CPU, а не памяти
Garry's Mod, DarkRP, 40 игроков3-4 GB2 ядраВсё определяют аддоны
L4D2, 8 игроков1-2 GB1 ядроDirector и AI заражённых дешёвые

Память растёт с пользовательским контентом и плагинами, а не с числом игроков. Сервер TF2 с несколькими сотнями пользовательских карт в ротации занимает больше, чем сервер со стандартным списком, а сервер Garry's Mod с большой коллекцией из Workshop может занять несколько гигабайт ещё до того, как кто-то зайдёт. Нагрузка на CPU растёт с игроками, tick rate и плагинами, которые работают каждый кадр, - поэтому один плохо написанный плагин может навредить сильнее, чем десять лишних игроков.

Показатель, по которому видно, здоров ли сервер, - не процент CPU, а то, держит ли он свой tick. Консольная команда stats выводит частоту кадров и CPU; net_graph на клиенте показывает частоту кадров сервера sv и её разброс. Сервер, у которого время кадра выскакивает за интервал тика, пропускает шаги симуляции, и игроки ощущают это как регистрацию попаданий, которой нельзя доверять. Статья почему падает TPS и что делать построена на примере Minecraft, но метод - сначала измерить, потом найти, что съедает время каждый tick, - тот же. Если график в панели показывает одно ядро, упёршееся в потолок, поможет более быстрое ядро; больше памяти - нет.

Логи и консоль#

У Source есть три отдельных вида логирования, и путаница между ними - причина, по которой люди "не могут найти логи":

  • Вывод консоли: то, что вы видите в панели. Исчезает при завершении процесса, если его не сохранять. -condebug в строке запуска пишет его в console.log в папке игры.
  • Логи сервера: включаются командой log on и пишутся в <game>/logs/ в файлы, имена которых начинаются с L, за которой следуют дата и порядковый номер (L0712001.log). В них записываются подключения со SteamID и IP, чат, убийства, кики и баны, и именно к ним сводится любой спор о модерации. sv_logecho 1 дублирует их в консоль.
  • Логи плагинов: SourceMod пишет свои в addons/sourcemod/logs/, ошибки - в errors_<date>.log. Сломанный плагин редко роняет сервер; он просто заполняет этот файл.

Старые файлы L*.log сервер никогда не удаляет. На загруженном сервере они за несколько месяцев незаметно заполняют диск, поэтому чистите их по расписанию. Что хранить и сколько, подсказывает статья какие логи стоит хранить.

Админы, плагины и чего не хватает в ванилле#

В ванильном SRCDS нет никакой системы администрирования, кроме RCON. Любой, у кого есть пароль RCON, может выполнить любую команду; все остальные не могут ничего. Поэтому почти на каждый сервер на Source ставят Metamod:Source и SourceMod, которые добавляют админов с флагами, иммунитет, голосования, управление картами и тысячи плагинов. Исключение - Garry's Mod: в нём есть встроенный скриптинг на Lua и собственные админ-аддоны, обычно ULX или SAM.

Установка SourceMod - это распаковка двух архивов в папку игры и перезапуск. Затем админы прописываются в addons/sourcemod/configs/admins_simple.ini:

addons/sourcemod/configs/admins_simple.ini
"STEAM_0:1:12345678"   "99:z"    // full admin, top immunity"[U:1:24691357]"       "bcdfg"   // kick, ban, slay, map, cvars

Флаги и уровни иммунитета разобраны в статье флаги админов и иммунитет в SourceMod, а более широкое сравнение по разным играм - в статье сравнение админ-плагинов для игровых серверов. Для TF2 установка пошагово описана в статье плагины SourceMod для Team Fortress 2.

Обновления, 64 бита и падения#

Valve выпускает обновления Source без предупреждения, и обновлённые клиенты отказываются подключаться к устаревшему серверу. srcds_run умеет с этим справляться: с -autoupdate, -steam_dir и -steamcmd_script он запускает SteamCMD перед каждым перезапуском. Панели делают то же самое, обновляясь при старте. В любом случае порядок одинаковый - остановить, обновить, запустить, - а сервер с плагинами стоит обновлять только тогда, когда вы знаете, что плагины пережили патч. Порядок действий описан в чек-листе на день обновления.

В 2024 году Valve выпустила 64-битные серверные сборки под Linux для TF2 и нескольких других игр на Source, с обёрткой srcds_run_64 рядом со старой. 64-битная сборка снимает ограничения по памяти, которые мучили большие серверы, но Metamod и SourceMod понадобились соответствующие 64-битные релизы, а старые плагины, скомпилированные под 32 бита, перестали работать. Если плагин загружается на одной сборке и не загружается на другой, причина именно в этом.

srcds_run перезапускает сервер после падения, если не задан -norestart, и пишет core dump-ы, если система это разрешает. Падения, которые повторяются на одной и той же карте, обычно означают сломанную пользовательскую карту или плагин, цепляющийся за сущности карты; падения при входе игрока обычно означают плагин; падения после обновления обычно означают устаревшие gamedata у Metamod или SourceMod. Надёжная проверка - запустить сервер, убрав в сторону файл загрузчика Metamod (addons/metamod.vdf или его 64-битный аналог): так одним действием отключается весь стек плагинов.

СимптомВероятная причина
Сервер работает, но его никто не находитsv_lan 1, нет +map или не удался вход в Steam
"Server is using a different version"Сервер не обновлён после патча
Баны пропадают после перезапускаБаны не записаны через writeid
После обновления в консоли Unknown commandУстаревшие gamedata у плагина
Клиенты зависают на загрузкеНет sv_downloadurl, контент не сжат

FAQ#

Чем srcds_run отличается от srcds_linux?

srcds_linux - это настоящий исполняемый файл сервера. srcds_run - shell-скрипт, который настраивает пути к библиотекам, запускает его, перезапускает после падения и по желанию сначала обновляет. Запускайте через скрипт, если у вас нет причин поступать иначе.

Почему не работает maxplayers в server.cfg?

Потому что maxplayers фиксируется при запуске процесса, а server.cfg выполняется позже, при загрузке карты. Укажите +maxplayers 24 в строке запуска - в панели это обычно поле на вкладке Startup.

Нужен ли токен Steam для сервера TF2 или Garry's Mod?

Он не обязателен так, как в CS2. Без токена сервер входит анонимно и в целом работает. Токен даёт серверу постоянную идентичность, на которую опираются некоторые сайты-мониторинги и избранное, так что для публичного сервера его стоит завести.

Может ли одна установка srcds запускать несколько игр?

Нет. Каждая игра - отдельное приложение в SteamCMD со своими файлами, даже если исполняемый файл выглядит одинаково. Устанавливайте каждую игру отдельно и запускайте каждую как отдельный сервер.

SRCDS - это то же самое, что сервер CS2?

Нет. CS2 работает на Source 2 с другим исполняемым файлом, структурой и системой плагинов. Cvar-ы вроде sv_password и hostname выглядят знакомо, но параметры запуска, группы карт и плагины другие.


Комментарии

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

0/2000