Metamod [Linux & Windows] Запуск нескольких инстансов SRCDS с разными SourceMod и одним Metamod

Запуск нескольких инстансов SRCDS с разными SourceMod и одним Metamod

Вступление
Статья предназначена для владельцев серверов, у которых в распоряжении находятся несколько игровых серверов на одной машине.
P.S: Меня постоянно спрашивают "КАК ТАК, КАК ТЫ СМОГ ЗАПУСТИТЬ ИЗ 1 СЕРВЕРА - 10 ШТУК?!". Это статья - является ответом на этот вопрос.
Введение: общая идея
Схема предельно проста:
C-подобный:
Сервер (SRCDS) → Metamod (общий) → VDF-коннекторы → Разные экземпляры SourceMod → Свои папки плагинов/конфигов
Один установленный Metamod может загружать неограниченное количество SourceMod, если каждому из них указать свой путь через VDF-файлы. Экономия места достигается за счёт того, что ядро игры и Metamod хранятся в единственном экземпляре, а SourceMod для каждого сервера — отдельно.
1. Официальная позиция разработчиков
Главное правило, задокументированное в релизных заметках SourceMod 1.2.0 на AlliedModders Wiki:
Do not use forked or multiple server instances over one copy of SourceMod. This is essential. The updater [...] can potentially write new files to the gamedata folder. If multiple servers are trying to do this at once, the end result could be undefined. Use separate copies of SourceMod.
Это прямое указание от разработчиков: нельзя использовать один экземпляр 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 / -ipIP-адрес для привязки сервера+ip 0.0.0.0
+maxplayersМаксимальное количество игроков+maxplayers 16
+mapСтартовая карта+map de_dust2
+rcon_passwordПароль для RCON-доступа+rcon_password mysecretpass
+sv_passwordПароль для входа на сервер+sv_password serverpass
+sv_setsteamaccountGSLT-токен для 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

Важные замечания по параметрам:
  1. +servercfgfile и +mapcyclefile — эти параметры можно указывать как в командной строке, так и в autoexec.cfg или server.cfg. Однако для надёжности рекомендуется указывать их в командной строке, особенно если вы используете несколько инстансов
  2. +sm_corecfgfile — по данным сообщества, этот параметр не считывает значение sm_basepath автоматически. Поэтому полный путь к core.cfg лучше указывать явно .
  3. Порты — каждый инстанс должен использовать уникальные порты: основной (-port), SourceTV (+tv_port) и клиентский порт (+clientport для некоторых игр) .
  4. 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 — должны отобразиться плагины из соответствующего экземпляра.
5. Важные замечания
  1. SourceMod должен быть полностью скопирован для каждого сервера. Не используйте символьные ссылки на общую папку SourceMod.
  2. Metamod остаётся общим — это безопасно, так как он не ведёт запись файлов во время работы.
  3. Файл core.cfg должен быть уникальным для каждого экземпляра, так как в нём хранятся настройки базы данных, логов и другие параметры инстанса.
  4. Логи SourceMod будут разделены автоматически, если указан правильный sm_basepath.
  5. Обновление SourceMod выполняется для каждого инстанса отдельно путём замены содержимого папки sourcemodX.
6. Сводка параметров
ПараметрНазначениеГде указывать
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 недостаточно.
Решения для использования разных версий бинарников:
  1. Создать отдельные физические папки addons/sourcemod1, addons/sourcemod2 и т.д., полностью скопировав в них SourceMod (включая папку bin). Затем в sourcemod.vdf указывать путь к соответствующей папке: "file" "addons/sourcemod1/bin/sourcemod_mm". При этом +sm_basepath также должен указывать на эту же папку. Этот вариант надёжнее всего, хотя и требует больше места.
  2. Использовать символические ссылки на папку bin для каждого экземпляра, если вы хотите сэкономить место, но при этом всё равно иметь разные версии бинарников (ссылки будут вести в разные места). Это сложнее в обслуживании.

2. Уточнение по +sm_corecfgfile
Параметр +sm_corecfgfile не наследует значение +sm_basepath автоматически. Это подтверждено на форуме AlliedModders (2009) и в практических примерах. Поэтому всегда указывайте полный путь к файлу core.cfg, например:
C-подобный:
+sm_corecfgfile addons/sourcemod1/configs/core.cfg
Если этого не сделать, SourceMod может попытаться загрузить 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 последовательность следующая:
  1. autoexec.cfg (выполняется до применения параметров командной строки)
  2. Параметры командной строки (с префиксом +) — применяются после autoexec.cfg, но до загрузки server.cfg
  3. server.cfg (или файл, указанный в +servercfgfile)
  4. mapname.cfg (выполняется при загрузке карты)
Важно: Metamod загружается на этапе инициализации движка, до выполнения autoexec.cfg. Поэтому параметр mm_basedir и все пути, влияющие на загрузку плагинов, обязательно должны передаваться через командную строку (с префиксом +), а не через autoexec.cfg или server.cfg.

5. Разделение SourceTV и других сетевых служб
Если вы используете SourceTV (+tv_enable 1), каждому инстансу необходимо назначить уникальный порт для TV-сервера:
C-подобный:
+tv_enable 1 +tv_port 27020
Аналогично, если игра требует отдельный клиентский порт (например, для CS:GO используется +clientport), он также должен быть уникальным для каждого инстанса.

6. Использование GSLT-токенов
Для CS:GO и CS2 каждый публичный сервер требует уникальный GSLT-токен (Game Server Login Token). Токен указывается параметром:
C-подобный:
+sv_setsteamaccount YOUR_TOKEN
Токены можно получить на странице Сообщество Steam :: Управление аккаунтами серверов игры в Steam.

7. Ссылки на источники
8. Преимущества и недостатки подхода
Приведённая схема (общий 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).
Вывод: Данный подход оптимален для средних и крупных проектов, где важна экономия ресурсов и централизованное управление Metamod и игровыми файлами, но где допустимо раздельное администрирование SourceMod. Для одиночных серверов или небольшого количества инстансов (2–3) проще использовать полностью независимые копии игры.

1775026244820.png

Первоисточник

  • WOLFA22 aka Lappland_Saluzzo
Об авторе
Lappland_Saluzzo
Наладчик сетевого оборудования; сетевой инженер

Комментарии

Нет комментариев для отображения.

Информация о статье

Автор
Lappland_Saluzzo
Article read time
9 min read
Просмотры
126
Последнее обновление

Ещё в Игровые сервера

Поделиться этой статьёй

Сверху Снизу