Запуск нескольких инстансов SRCDS с разными SourceMod и одним Metamod
Вступление
Статья предназначена для владельцев серверов, у которых в распоряжении находятся несколько игровых серверов на одной машине.
P.S: Меня постоянно спрашивают "КАК ТАК, КАК ТЫ СМОГ ЗАПУСТИТЬ ИЗ 1 СЕРВЕРА - 10 ШТУК?!". Это статья - является ответом на этот вопрос.
Введение: общая идея
Схема предельно проста:
Один установленный Metamod может загружать неограниченное количество SourceMod, если каждому из них указать свой путь через VDF-файлы. Экономия места достигается за счёт того, что ядро игры и Metamod хранятся в единственном экземпляре, а SourceMod для каждого сервера — отдельно.
1. Официальная позиция разработчиков
Главное правило, задокументированное в релизных заметках SourceMod 1.2.0 на AlliedModders Wiki:
2. Техническая основа: как Metamod загружает плагины
Согласно официальной документации Metamod:Source, загрузка плагинов осуществляется через VDF-файлы (Valve Data Format), которые должны находиться в папке
Структура VDF-файла (например,
Поле
3. Официальный метод: разделение через mm_basedir и параметры запуска
Этот метод описан в русскоязычной документации AlliedModders Wiki и подтверждён на форумах разработчиков.
3.1. Структура каталогов
Создайте отдельные папки для каждого инстанса SourceMod внутри
3.2. Настройка VDF-файлов для каждого инстанса
Создайте файл
Создайте файл
Основные параметры командной строки:
Дополнительные параметры для полного разделения инстансов:
Пример командной строки для двух инстансов (расширенный):
Инстанс 1:
Инстанс 2:
Важные замечания по параметрам:
3.4. Полный пример скрипта запуска
На основе реальной конфигурации, используемой в сообществе:
4. Проверка работоспособности
После запуска сервера выполните в консоли сервера или через RCON:
Примечание: Вся информация основана на официальных источниках AlliedModders и практическом опыте администраторов крупных серверных ферм.
Приложение: важные технические детали и дополнительные параметры
Ниже приведены уточнения, которые не вошли в основной текст, но критически важны для корректной работы нескольких инстансов с разными SourceMod.
1. Ограничение параметра
Согласно обсуждению на GitHub (Issue #1160, AlliedModders), параметр
Последствия:
2. Уточнение по
Параметр
Если этого не сделать, SourceMod может попытаться загрузить
3. Дополнительные параметры для CS:GO / CS2
Для игр на движке Source 2 (CS2) и CS:GO (Source 1) полезно знать следующие параметры:
4. Порядок загрузки конфигурационных файлов
Понимание порядка загрузки помогает правильно разместить параметры. Для большинства игр на движке Source последовательность следующая:
5. Разделение SourceTV и других сетевых служб
Если вы используете SourceTV (
Аналогично, если игра требует отдельный клиентский порт (например, для CS:GO используется
6. Использование GSLT-токенов
Для CS:GO и CS2 каждый публичный сервер требует уникальный GSLT-токен (Game Server Login Token). Токен указывается параметром:
Токены можно получить на странице Сообщество Steam :: Управление аккаунтами серверов игры в Steam.
7. Ссылки на источники
Приведённая схема (общий Metamod, раздельные SourceMod) широко используется на крупных серверных фермах. Ниже перечислены её ключевые плюсы и минусы.
Преимущества:
Вступление
Статья предназначена для владельцев серверов, у которых в распоряжении находятся несколько игровых серверов на одной машине.
P.S: Меня постоянно спрашивают "КАК ТАК, КАК ТЫ СМОГ ЗАПУСТИТЬ ИЗ 1 СЕРВЕРА - 10 ШТУК?!". Это статья - является ответом на этот вопрос.
Введение: общая идея
Схема предельно проста:
C-подобный:
Сервер (SRCDS) → Metamod (общий) → VDF-коннекторы → Разные экземпляры SourceMod → Свои папки плагинов/конфигов
1. Официальная позиция разработчиков
Главное правило, задокументированное в релизных заметках SourceMod 1.2.0 на AlliedModders Wiki:
Это прямое указание от разработчиков: нельзя использовать один экземпляр SourceMod для нескольких серверов. Каждый сервер должен иметь свою копию SourceMod.
2. Техническая основа: как Metamod загружает плагины
Согласно официальной документации Metamod:Source, загрузка плагинов осуществляется через VDF-файлы (Valve Data Format), которые должны находиться в папке
addons/metamod (или в каталоге, указанном в mm_basedir).Структура VDF-файла (например,
sourcemod.vdf):
JSON:
"Metamod Plugin"
{
"alias" "sourcemod"
"file" "addons/sourcemod/bin/sourcemod_mm"
}
"file" указывает путь к библиотеке плагина (в данном случае SourceMod). Это ключевой момент: меняя этот путь, можно загружать разные экземпляры SourceMod.3. Официальный метод: разделение через mm_basedir и параметры запуска
Этот метод описан в русскоязычной документации AlliedModders Wiki и подтверждён на форумах разработчиков.
3.1. Структура каталогов
Создайте отдельные папки для каждого инстанса SourceMod внутри
addons:
C-подобный:
home/srcds/game/
├── addons/
│ ├── metamod/ # Общий Metamod (один на все серверы)
│ │ ├── bin/
│ │ │ └── server.so
│ │ ├── cfg1/ # Конфигурация для сервера №1
│ │ │ └── sourcemod.vdf
│ │ ├── cfg2/ # Конфигурация для сервера №2
│ │ │ └── sourcemod.vdf
│ │ └── metaplugins.ini
│ ├── sourcemod1/ # SourceMod для сервера №1
│ │ ├── bin/
│ │ ├── configs/
│ │ ├── plugins/
│ │ └── ...
│ └── sourcemod2/ # SourceMod для сервера №2
│ └── ...
└── cfg/
├── server1.cfg # Конфиг для сервера №1
└── server2.cfg # Конфиг для сервера №2
3.2. Настройка VDF-файлов для каждого инстанса
Создайте файл
addons/metamod/cfg1/sourcemod.vdf:
JSON:
"Metamod Plugin"
{
"alias" "sourcemod"
"file" "addons/sourcemod1/bin/sourcemod_mm"
}
addons/metamod/cfg2/sourcemod.vdf:
JSON:
"Metamod Plugin"
{
"alias" "sourcemod"
"file" "addons/sourcemod2/bin/sourcemod_mm"
}
Основные параметры командной строки:
| Параметр | Назначение | Пример |
|---|---|---|
+mm_basedir | Путь к папке с VDF-файлами Metamod (относительно корня игры) | +mm_basedir addons/metamod/cfg1 |
+sm_basepath | Корневой путь к SourceMod (обязательно в командной строке) | +sm_basepath addons/sourcemod1 |
+sm_corecfgfile | Путь к файлу core.cfg (можно указать в командной строке или в server.cfg) | +sm_corecfgfile addons/sourcemod1/configs/core.cfg |
+servercfgfile | Основной конфигурационный файл сервера (аналог server.cfg) | +servercfgfile server1.cfg |
+mapcyclefile | Файл цикла карт | +mapcyclefile cfg/mapcycle1.txt |
+motdfile | Файл MOTD (Message Of The Day) | +motdfile cfg/motd1.txt |
+hostname | Название сервера (можно также задать в server.cfg) | +hostname "My Server #1" |
+exec | Исполняемый конфигурационный файл (дополнительный к server.cfg) | +exec custom1.cfg |
Дополнительные параметры для полного разделения инстансов:
| Параметр | Назначение | Пример |
|---|---|---|
+port / -port | Порт сервера (обязательно разный для каждого инстанса) | -port 27015 |
+ip / -ip | IP-адрес для привязки сервера | +ip 0.0.0.0 |
+maxplayers | Максимальное количество игроков | +maxplayers 16 |
+map | Стартовая карта | +map de_dust2 |
+rcon_password | Пароль для RCON-доступа | +rcon_password mysecretpass |
+sv_password | Пароль для входа на сервер | +sv_password serverpass |
+sv_setsteamaccount | GSLT-токен для Steam (обязателен для публичных серверов CS:GO/CS2) | +sv_setsteamaccount 12345678901234567890 |
+sv_lan | Режим LAN (0 — интернет, 1 — локальная сеть) | +sv_lan 0 |
+sv_region | Регион сервера (3 — Европа, 5 — Россия) | +sv_region 5 |
+tv_enable / +tv_port | Настройка SourceTV (должны быть разными для каждого инстанса) | +tv_enable 1 +tv_port 27020 |
+fps_max | Ограничение FPS сервера | +fps_max 300 |
-tickrate | Тикрейт сервера | -tickrate 128 |
+sv_visiblemaxplayers | Отображаемое в браузере количество слотов (может отличаться от реального maxplayers) | +sv_visiblemaxplayers 20 |
Пример командной строки для двух инстансов (расширенный):
Инстанс 1:
Bash:
./srcds_run -game csgo
-port 27015
+ip 0.0.0.0
+hostname "Server #1"
+map de_dust2
+maxplayers 16
+exec server1.cfg
+mm_basedir addons/metamod/cfg1
+sm_basepath addons/sourcemod1
+sm_corecfgfile addons/sourcemod1/configs/core.cfg
+servercfgfile server1.cfg
+mapcyclefile cfg/mapcycle1.txt
+motdfile cfg/motd1.txt
+rcon_password rconpass1
+sv_password serverpass1
+sv_setsteamaccount YOUR_TOKEN_1
+tv_enable 1 +tv_port 27020
+fps_max 300
-tickrate 128
+sv_region 5
Инстанс 2:
Bash:
./srcds_run -game csgo
-port 27016
+ip 0.0.0.0
+hostname "Server #2"
+map de_inferno
+maxplayers 12
+exec server2.cfg
+mm_basedir addons/metamod/cfg2
+sm_basepath addons/sourcemod2
+sm_corecfgfile addons/sourcemod2/configs/core.cfg
+servercfgfile server2.cfg
+mapcyclefile cfg/mapcycle2.txt
+motdfile cfg/motd2.txt
+rcon_password rconpass2
+sv_password serverpass2
+sv_setsteamaccount YOUR_TOKEN_2
+tv_enable 1 +tv_port 27021
+fps_max 300
-tickrate 64
+sv_region 5
Важные замечания по параметрам:
+servercfgfileи+mapcyclefile— эти параметры можно указывать как в командной строке, так и вautoexec.cfgилиserver.cfg. Однако для надёжности рекомендуется указывать их в командной строке, особенно если вы используете несколько инстансов+sm_corecfgfile— по данным сообщества, этот параметр не считывает значениеsm_basepathавтоматически. Поэтому полный путь кcore.cfgлучше указывать явно .- Порты — каждый инстанс должен использовать уникальные порты: основной (
-port), SourceTV (+tv_port) и клиентский порт (+clientportдля некоторых игр) . - GSLT-токены (
+sv_setsteamaccount) — для игр семейства CS:GO и CS2 каждый публичный сервер требует уникальный токен, полученный на странице Сообщество Steam :: Управление аккаунтами серверов игры в Steam.
autoexec.cfg для mm_basedir?autoexec.cfg выполняется на поздней стадии инициализации движка, когда Metamod уже загружен. Если попытаться изменить mm_basedir из autoexec.cfg, это не повлияет на загрузку плагинов. Поэтому все пути, от которых зависит загрузка Metamod и SourceMod, должны быть переданы через командную строку (или, в крайнем случае, через переменные окружения).3.4. Полный пример скрипта запуска
На основе реальной конфигурации, используемой в сообществе:
Bash:
#!/bin/bash
start_server1.sh
cd /home/srcds/game
screen -AmdS server1 ./srcds_run
-game csgo
-port 27015
+ip 0.0.0.0
+map de_dust2
-maxplayers 16
+mm_basedir addons/metamod/cfg1
+sm_basepath addons/sourcemod1
+sm_corecfgfile addons/sourcemod1/configs/core.cfg
+exec server1.cfg
-autoupdate
4. Проверка работоспособности
После запуска сервера выполните в консоли сервера или через RCON:
- Проверка загрузки Metamod:
meta version— должна отобразиться информация о версии Metamod:Source. - Проверка пути конфигурации:
mm_basedir— должен отобразиться правильный путь (например,addons/metamod/cfg1). - Проверка загруженных плагинов:
meta list— в списке должен быть SourceMod, загруженный из правильного пути (addons/sourcemod1/bin/sourcemod_mm). - Проверка плагинов SourceMod:
sm plugins list— должны отобразиться плагины из соответствующего экземпляра.
- SourceMod должен быть полностью скопирован для каждого сервера. Не используйте символьные ссылки на общую папку SourceMod.
- Metamod остаётся общим — это безопасно, так как он не ведёт запись файлов во время работы.
- Файл
core.cfgдолжен быть уникальным для каждого экземпляра, так как в нём хранятся настройки базы данных, логов и другие параметры инстанса. - Логи SourceMod будут разделены автоматически, если указан правильный
sm_basepath. - Обновление SourceMod выполняется для каждого инстанса отдельно путём замены содержимого папки
sourcemodX.
| Параметр | Назначение | Где указывать |
|---|---|---|
mm_basedir | Путь к папке с VDF-файлами Metamod | Командная строка (как +mm_basedir ...) |
+sm_basepath | Корневой путь к SourceMod | Командная строка |
+sm_corecfgfile | Путь к core.cfg | Командная строка |
Примечание: Вся информация основана на официальных источниках AlliedModders и практическом опыте администраторов крупных серверных ферм.
Приложение: важные технические детали и дополнительные параметры
Ниже приведены уточнения, которые не вошли в основной текст, но критически важны для корректной работы нескольких инстансов с разными SourceMod.
1. Ограничение параметра
+sm_basepathСогласно обсуждению на GitHub (Issue #1160, AlliedModders), параметр
+sm_basepath указывает SourceMod, где искать папки configs, plugins, translations и другие данные. Однако бинарные файлы SourceMod (sourcemod.[engine].so) всегда загружаются из папки addons/sourcemod/bin относительно корня игры, независимо от значения +sm_basepath. (Не во всех играх!)Последствия:
- Если вы используете
+sm_basepathдля разделения экземпляров, но оставляете единую папкуaddons/sourcemod/bin, то все серверы будут использовать одно и то же ядро SourceMod (одну версию бинарников). Плагины, конфиги и переводы при этом будут разделены. - Если вам нужно использовать разные версии SourceMod (например, один сервер на стабильной версии, другой — на dev-сборке), то простого указания
+sm_basepathнедостаточно.
- Создать отдельные физические папки
addons/sourcemod1,addons/sourcemod2и т.д., полностью скопировав в них SourceMod (включая папкуbin). Затем вsourcemod.vdfуказывать путь к соответствующей папке:"file" "addons/sourcemod1/bin/sourcemod_mm". При этом+sm_basepathтакже должен указывать на эту же папку. Этот вариант надёжнее всего, хотя и требует больше места. - Использовать символические ссылки на папку
binдля каждого экземпляра, если вы хотите сэкономить место, но при этом всё равно иметь разные версии бинарников (ссылки будут вести в разные места). Это сложнее в обслуживании.
2. Уточнение по
+sm_corecfgfileПараметр
+sm_corecfgfile не наследует значение +sm_basepath автоматически. Это подтверждено на форуме AlliedModders (2009) и в практических примерах. Поэтому всегда указывайте полный путь к файлу core.cfg, например:
C-подобный:
+sm_corecfgfile addons/sourcemod1/configs/core.cfg
core.cfg из папки по умолчанию (addons/sourcemod/configs), что приведёт к смешению конфигураций.3. Дополнительные параметры для CS:GO / CS2
Для игр на движке Source 2 (CS2) и CS:GO (Source 1) полезно знать следующие параметры:
| Параметр | Назначение | Пример |
|---|---|---|
+gamemodes_serverfile | Указывает собственный файл gamemodes_server.txt с настройками режимов и карт. Позволяет разделить эти настройки между инстансами. | +gamemodes_serverfile cfg/gamemodes_server1.txt |
+mapcyclefile | Файл цикла карт (уже был в основной таблице) | +mapcyclefile cfg/mapcycle1.txt |
+servercfgfile | Основной конфигурационный файл сервера (вместо server.cfg) | +servercfgfile server1.cfg |
+motdfile | Файл MOTD (Message Of The Day) | +motdfile cfg/motd1.txt |
+exec | Дополнительный конфигурационный файл, выполняемый после server.cfg | +exec custom1.cfg |
4. Порядок загрузки конфигурационных файлов
Понимание порядка загрузки помогает правильно разместить параметры. Для большинства игр на движке Source последовательность следующая:
autoexec.cfg(выполняется до применения параметров командной строки)- Параметры командной строки (с префиксом
+) — применяются послеautoexec.cfg, но до загрузкиserver.cfg server.cfg(или файл, указанный в+servercfgfile)mapname.cfg(выполняется при загрузке карты)
autoexec.cfg. Поэтому параметр mm_basedir и все пути, влияющие на загрузку плагинов, обязательно должны передаваться через командную строку (с префиксом +), а не через autoexec.cfg или server.cfg.5. Разделение SourceTV и других сетевых служб
Если вы используете SourceTV (
+tv_enable 1), каждому инстансу необходимо назначить уникальный порт для TV-сервера:
C-подобный:
+tv_enable 1 +tv_port 27020
+clientport), он также должен быть уникальным для каждого инстанса.6. Использование GSLT-токенов
Для CS:GO и CS2 каждый публичный сервер требует уникальный GSLT-токен (Game Server Login Token). Токен указывается параметром:
C-подобный:
+sv_setsteamaccount YOUR_TOKEN
7. Ссылки на источники
- Installing Metamod:Source - AlliedModders Wiki — официальная документация Metamod:Source
- Installing SourceMod - AlliedModders Wiki — официальная документация SourceMod
- Sourcemod loader doesn't load sourcemod.[engine].so from +sm_basepath · Issue #1160 · alliedmodders/sourcemod — обсуждение ограничений
+sm_basepath - https://forums.alliedmods.net/showthread.php?t=104031 — уточнение по
+sm_corecfgfile - Making sure you're not a bot! — параметры командной строки Source Engine
Приведённая схема (общий Metamod, раздельные SourceMod) широко используется на крупных серверных фермах. Ниже перечислены её ключевые плюсы и минусы.
Преимущества:
- Экономия дискового пространства. Один полный экземпляр SRCDS с игрой и Metamod может занимать 15–20 ГБ. При запуске 10–20 серверов дублирование только Metamod (а не всей игры) позволяет сэкономить сотни гигабайт.
- Централизованное обновление ядра игры. Если используется символьная ссылка на общую папку с игрой, обновление через SteamCMD происходит один раз для всех инстансов.
- Единый Metamod. Обновление Metamod выполняется однократно и сразу применяется ко всем серверам.
- Гибкость в настройке плагинов. Каждый инстанс имеет свой SourceMod, что позволяет независимо управлять плагинами, конфигами и даже версиями SourceMod (с учётом ограничений, описанных в Приложении).
- Может кому-то показаться недостатком - но так как Sourcemod запускается несколько раз из своей папки - то получается что файлы конфигураций, а также файлы используемые в /custom - являются общими. Да - будет свалка. Но кому-то это даже упростит жизнь. Как посмотреть - смотрите по своей задаче/архитектуре сервера сами.
- Точечное редактирование плагинов и исходников. Если требуется внести изменение в общий плагин (например, исправить ошибку или добавить функционал), это изменение необходимо применять к каждому экземпляру SourceMod отдельно. Автоматизация (например, через скрипты синхронизации) может снизить нагрузку, но полного единообразия достичь сложнее.
- Сложность обновления SourceMod. В отличие от Metamod, который обновляется один раз, SourceMod нужно обновлять для каждого инстанса. При большом количестве серверов это требует использования инструментов массового развертывания (например, SMAM2 или самописных скриптов).
- Риск путаницы с путями. При неправильной передаче параметров командной строки (
+mm_basedir,+sm_basepath) сервер может загрузить не тот экземпляр SourceMod или вообще не загрузить плагины. Отладка таких ошибок требует внимательности. - Ограничение по разделению бинарников SourceMod. Как указано в Приложении, если требуется использовать разные версии ядра SourceMod, простая схема с
+sm_basepathне работает — нужно либо полностью копировать папкуaddons/sourcemodдля каждого инстанса, либо применять более сложные методы (символические ссылки на папкуbin).