
Многие из нас когда-то проводили десятки, а то и сотни часов на публичных серверах Counter-Strike разных версий: от 1.6 до Global Offensive. Всех их объединяла атмосфера уникального хаоса, кастомных плагинов, новых знакомств и полуночных разговоров. Но с ростом киберспорта культура публичных серверов стала постепенно уходить на второй план. Молодёжь больше играет в соревновательные режимы — FaceIT или Premier.
С выходом CS2 и переходом на новый движок Source 2 ситуация стала ещё сложнее: старые плагины перестали работать, а инструменты для пользовательских серверов пришлось адаптировать. Постепенно разработчики освоили создание пользовательского контента для новой версии, и публичные серверы снова начали появляться.
В этой статье разберём, как создать собственный сервер Counter-Strike 2 на VPS, установить плагины, настроить карту и добавить на неё собственный контент.
Создание своего сервера
Заходим на RUVDS и выбираем дата-центр поближе к потенциальным игрокам, ведь для комфортной игры важен низкий пинг.

Минимальные системные требования указаны на Valve Developer Community:
Оперативная память: 2 ГБ.
Диск: 65 ГБ.
Процессор: x86-64-v2 (с поддержкой POPCNT/SSE4.2).
Операционная система: Linux (требуется glibc 2.31+, что соответствует Ubuntu 20.04+, Debian 11+ и новее) или Windows 10/11.
Однако 2 ГБ памяти — самый минимум для работы сервера. Этого не хватит в случае одновременного подключения нескольких человек. Поэтому лучше брать хотя бы 4–8 ГБ. На процессоре также не стоит экономить: движок Source 2 требователен к тактовой частоте CPU.

Подключаемся к VPS и создаём изолированную учётную запись специально для игрового сервера. Если в каком-то плагине или самом сервере обнаружится уязвимость, это снизит риск получения злоумышленником полного контроля над системой.
sudo useradd -m -s /bin/bash steam sudo passwd steam
Перед установкой SteamCMD необходимые системные пакеты ставим от администратора. Ubuntu по умолчанию работает в 64-битном режиме, а SteamCMD и часть компонентов Source 2 до сих пор используют 32-битный код, поэтому добавляем архитектуру i386 и нужные библиотеки:
sudo dpkg --add-architecture i386 sudo apt update sudo apt install wget curl nano software-properties-common lib32gcc-s1 lib32stdc++6 -y
После последней команды система может спросить о перезапуске служб. В таком случае выбираем «none of the above».

Переключаемся на пользователя steam su - steam и устанавливаем SteamCMD:
mkdir -p ~/steamcmd cd ~/steamcmd curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf -

Запускаем ./steamcmd.sh, а затем в консоли SteamCMD указываем каталог установки, авторизируемся под анонимной учётной записью и скачиваем сервер CS2 (730 — это AppID Counter-Strike 2 в базе Steam).
force_install_dir /home/steam/cs2-server login anonymous app_update 730 validate quit
Запуск
Чтобы сервер продолжал работать после закрытия SSH-сессии, а у нас всегда был доступ к его консоли, будем использовать tmux. Устанавливаем его sudo apt install tmux -y и создаём новую сессию под пользователем steam:
su - steam tmux new -s cs2
Запускаем сервер внутри этой сессии, но при первом старте может упасть Steamworks SDK с «segmentation fault». Чтобы избежать этого, сначала задаём LD_LIBRARY_PATH:
export LD_LIBRARY_PATH=/home/steam/cs2-server/game/bin/linuxsteamrt64:/home/steam/cs2-server/game/csgo/bin/linuxsteamrt64:$LD_LIBRARY_PATH cd /home/steam/cs2-server/game/bin/linuxsteamrt64/ ./cs2 -dedicated +map de_mirage
Создаём симлинк к файлу steamclient.so. По умолчанию он должен лежать по пути /home/steam/steamcmd/linux64.
mkdir -p ~/.steam/sdk64 ln -sf /home/steam/steamcmd/linux64/steamclient.so ~/.steam/sdk64/steamclient.so
Если всё сделано верно, консоль выдаст лог инициализации сети, загрузки ресурсов и успешного подключения игровой сессии:
SV: VAC secure mode is activated
GC Connection established for server version …

Теперь к нему можно подключиться в игре, введя в консоль разработчика connect IP_ВАШЕГО_VPS.

Пока это сервер с базовыми настройками на обычной карте с одним ботом. Чтобы сменить карту, надо ввести в tmux map НАЗВАНИЕ или, если карта из мастерской, host_workshop_map ID_КАРТЫ. Для кастомизации (фризтайм, гравитация, читы и т. д.) создадим конфигурационный файл:
cd /home/steam/cs2-server/game/csgo/cfg/ nano server.cfg
Мы поставили карту de_dust2 и добавили на неё автобаннихоп. Так выглядит конфиг:

Сохраняем и прописываем exec server.cfg в сессии tmux.
Варианты монетизации
Если сервер станет популярным, создатель может на этом заработать. Здесь надо найти рекламодателей — и сделать либо автоматическую рассылку в чате через определённый промежуток времени, либо разместить баннер прямо на карте.
Рассылка в чате
Для автоматической рассылки на нашем сервере напишем свой плагин. Скачиваем нужные компоненты: Metamod и CounterStrikeSharp (выбираем версию with-runtime). Распаковываем их в папку addons по пути /game/csgo. Далее заходим в файл game/csgo/gameinfo.gi и в структуре SearchPath добавляем строчку Game csgo/addons/metamod над Game csgo.

Сохраняем и проверяем на сервере (meta version, meta list), что всё в порядке. В списке плагинов должен появиться CounterStrikeSharp. Его версию запоминаем, она пригодится дальше:

Осталось добавить свой плагин. Для этого переходим в папку /game/csgo/addons/counterstrikesharp/plugins и создаём отдельную папку (каждый плагин обязательно должен быть в своей папке с совпадающим названием).

Код можно написать и скомпилировать прямо на сервере, но в нашем случае это удобнее сделать локально в Visual Studio. Создаём проект .NET, подключаем через NuGet пакет CounterStrikeSharp.API, версия которого должна совпадать с версией установленного на сервере плагина CounterStrikeSharp. У нас версия 1.0.373, с ней совместима net10.0.
Реализуем логику плагина: простой вывод текста в чат по таймеру (параметр функции AddTimer в секундах):
using CounterStrikeSharp.API; using CounterStrikeSharp.API.Core; using CounterStrikeSharp.API.Modules.Timers; namespace HabrAnnouncer; public class HabrAnnouncer : BasePlugin { public override string ModuleName => "Habr Announcer"; public override string ModuleVersion => "1.0.0"; public override void Load(bool hotReload) { AddTimer(10.0f, () => { Server.PrintToChatAll(" Привет, Хабр!"); }, TimerFlags.REPEAT); } }
Сверяем версии в .csproj-файле:
<Project Sdk="Microsoft.NET.Sdk"> <PropertyGroup> <TargetFramework>net10.0</TargetFramework> <ImplicitUsings>enable</ImplicitUsings> <Nullable>enable</Nullable> </PropertyGroup> <ItemGroup> <PackageReference Include="CounterStrikeSharp.API" Version="1.0.373" /> </ItemGroup> </Project>
Затем собираем и публикуем проект командой dotnet publish -c Release. В папке проекта \bin\Release\net10.0 берём все файлы и переносим на сервер в созданную ранее папку нашего плагина:

После этого в консоли игры загружаем плагин css_plugins load ВАШЕ_НАЗВАНИЕ и проверяем, что игра его видит css_plugins list.

Заходим в игру и видим, что всё работает:

Баннер на карте
Заходим на своём ПК в папку content\csgo_addons и создаём там addon1\materials. Переносим в неё картинку, которую хотим поместить на карту, и создаём файл с расширением .vmat.

Внутри пишем:
Layer0 { shader "csgo_complex.vfx" TextureColor "materials/image.png" //название вашей картинки }
Теперь нам нужно скомпилировать .png в .vtex_c. Это можно сделать с помощью встроенной утилиты resourcecompiler в файлах игры CS2. Она лежит в папке game\bin\win64.
Открываем командную строку и переходим в директорию с программой, после этого прописываем: resourcecompiler.exe -i "полный путь к файлу .vmat" У нас компилятор ругался на картинку из Photoshop, поэтому пришлось использовать Paint. Готовые файлы лежат по пути game\csgo_addons\addon1\materials.

Теоретически есть два подхода, как добавить баннер на карту: подмена уже существующего материала по тому же пути или декомпиляция карты и внесение изменений в Hammer Editor (официальном редакторе от Valve).
Можно попробовать упаковать скомпилированные файлы материалов в собственный .vpk-архив и заставить движок считать его вместо родного.
Рассмотрим способ декомпиляции карты. Для этого скачиваем программу Source 2 Viewer. В ней ищем файл .vmap_c нужной нам карты по пути game/csgo/maps/ВАША_КАРТА.vpk, нажимаем на него правой кнопкой и Decompile & Export, выбираем путь content\csgo_addons\addon1\maps:

Далее заходим в Hammer Editor. В библиотеке Steam переходим в свойства CS2, вкладка «Дополнительный контент».

Устанавливаем Workshop Tools и во вкладке «Общие» в параметрах запуска ставим, чтобы нас спрашивали, какую версию игры запускать.

Заходим в Workshop Tools:

Дважды кликаем на уже созданный addon1:

В окне Asset Browser справа вверху нажимаем на шестерёнку и выбираем Hammer Editor:

В редакторе File → Open и открываем нашу декомпилированную карту:

Слева внизу нажимаем Browse и в поиске пишем название нашей текстуры, выбираем её.


Теперь включаем режим просмотра граней (Faces, горячая клавиша 3) и летаем по карте в поисках подходящего места. Когда нашли, выбираем с зажатой клавишей Shift грани, на которые хотим поместить баннер. Затем нажимаем на них правой кнопкой мыши и выбираем Apply Material.

Если текстура отображается некорректно, можно её поправить слева в Tool Properties.

Когда всё готово, выбираем File → Build Map. Выбираем пресет или ставим кастомные настройки сборки и нажимаем кнопку Build. Готовая карта должна появиться в корневой директории нашего аддона. Останется лишь скопировать аддон целиком на игровой сервер и подключить его в конфиге, либо указать через параметр запуска -addon_name addon1. И, в конце концов, запустить карту через консоль сервера, прописав в ней map addon_de_dust2_d (или то имя файла, которое получилось при компиляции).
Но в этом способе велик шанс, что карта соберётся с ошибками или не полностью. У нас так и вышло:

Это произошло, потому что мы собирали не исходник карты, а декомпилированную версию из .vmap_c. Программа Source 2 Viewer прямо предупреждает, что часть геометрии и скайбоксов может восстановиться не полностью, сетки объединяются по материалам, объекты лишаются деталей. Поэтому после обратной сборки редактор восстанавливает сцену лишь приблизительно. Отсюда и артефакты: чёрные поверхности, странное освещение, местами сломанные материалы.
Итог
Так создаётся свой сервер и небольшое сообщество Counter-Strike 2. Его можно развивать и вне игры: общие серверы Discord и TeamSpeak, регулярные стримы, нарезки в TikTok и YouTube, анонсы мероприятий в соцсетях — всё это помогает сообществу расти. Игроки возвращаются не столько ради конкретной карты, сколько в атмосферу, которая создана вокруг.
К нашему серверу можно подключиться, прописав в консоли разработчика CS2 команду connect 191.44.37.29. Сервер поработает ещё некоторое время после публикации статьи.
© 2026 ООО «МТ ФИНАНС»