Установка hlds-сервера + WEB-статистики.

Живой сервер тут - http://65.108.82.45/ps/ , steam.

Для кого

В первую очередь для себя.

В нулевых общежитие института активно погрузилось в Quake3, StarCraft BW и CS.1.6. Сейчас мне 40+, но игра по прежнему неплохо чистит мозг после работы.

Зачем

Public internet предлагает сотни серверов, но большинство из них перегружено диким количеством плагинов. Бесконечные VIP-привелегии, бесконечные деньги, какие-то новые сущности неведомые в оригинальной версии. Valve создал Вселенную, люди породили франкенштейна.

Захотелось свой чистый сервер от Steam. Пришло понимание, что все инструкции на большинстве форумов сводятся к покупке готового хостинга с готовой сборкой какой-то версии сервера с предустановленными какими-то плагинами.

Так не годится. Собираем свое, никому не платим.

Как все устроено

Для установки сервера Valve community предлагает SteamCMD. Это даст нам оригинальный сервер с официальным VAC.

Стоит отметить, что сейчас большое распостранение получила неофициальная сборка RE-HLDS. Утверждается, что Valve давно не уделяет должное внимание уязвимостям и производительности своего сервера. Новая сборка от энтузиастов делает сервер в 100500 раз круче и добавляет возможность использовать самые новомодные плагины.

Плагины

Сервер без плагинов - печальное зрелище. Плагинам быть!

Чтобы добраться до ядра CS не пересобирая его, был придуман проект AMX Mod X. Он дает возможность писать скрипты в текстовых .sma-файлах, компилировать их в бинарные .amxx-файлы.

В интернете сотни уже готовых amxx-плагинов. Задача сводится к единственному действию - подкинуть файл в нужную директорию совего сервера и все.

amxx в свою очередь общается с ядром CS через посредника metamod. Его последнюю версию я брал, с сайта AMX Mod X, см. Downloads.

Берем оригинал

Я выбрал оригинальный сервер.

Вылезла только одна проблема - не запускается metamod-модуль dproto.

Это неведомый черный ящик с неведомыми исходниками, дающий возможность подключаться к нашему серверу No-Steam клиентам. Нормальная игра, купленная в Steam за 259 рублей, использует протокол p48, а подвальная ломаная сборка работает на протоколе p47.

Да да, очень многие дядьки качают откуда попало неведомый бинарник игры, бесплатно ведь! Запускают это на своем компьютере!

В нашем случае, сервер не сможет обслужить No-Steam клиентов. Поразительно, но таких игроков больше половины по моему опыту.

На смену dproto сейчас пришел новомодный модуль reunion, но он работает только на RE-HLDS-сервере.

Под RE-HLDS идут уже другие плагины, работают через другой RE-API. Не ставил, не пробовал.

Установка

У меня есть свой VPS в Финляндии, на нем крутится OpenVPN-сервер. Полезная теперь штука, ну вы понимаете...

Вот на нем (Debian11) и раскатаем наш HLDS-сервер. Туда же подкинем WEB-сервер, чтобы рисовать статистику игроков.

Весь процесс установки расписан у меня на GitHub.

Люблю Docker за изоляцию процессов от хостовой машины, на нем и соберем.

Нам потребуются контейнеры:

  • nginx - веб страничка

  • php-fpm - статистика PsychoStats это древнючий код на PHP 5.4

  • mysql - статистике нужна БД, да и плагины CS некоторые тоже хотят БД

  • hlds16 - наш HLDS-сервер

Если в контейнерах какие-то файлы требуют частой правки, такие директории я подключаю к хостовой машине в папочку ~/share. Удобно потом расшарить эту папку и со своей домашней Windows-машины просто подкидывать нужные изменения напрямую.

Правда, в итоге, я чаще использовал VSCode-плагин SFTP: тыкнуть "upload" мне оказалось удобней чем водить мышкой по windows explorer-окнам.

Пошаговая инструкция на GitHub, ниже просто список действий, для понимания общей картины.

Поднимаем контейнеры

  1. Закидываем содержимое директории ~/share на VPS-сервер. На это содержимое будут опираться контейнеры, там конфиги для nginx, Dockerfile для сборки контейнеров, конфиги и плагины HLDS, ...

  2. Собираем свою docker image hlds16:latest, см. Dockerfile.

  3. Поднимаем временный docker container, забираем из него к себе на хостовую машину директорию addons (сюда будем накидывать необходимые amxx-плагины в дальнейшем)

  4. Поднимаем рабочий docker container hlds16 с привязкой к директории addons. Так же привязываем к хостовой машине директорию logs (логи потребуются страничке статистики).

  5. Поднимаем docker container mysql с привязкой к директории /mnt/mysql (там можно складировать бэкапы БД).

  6. Поднимаем docker container nginx с привязкой к директории /mnt/www (туда будем накидывать HTML/PHP файлы)

  7. Собираем свою docker image php-fpm-my:54, см. Dockerfile.

  8. Поднимаем docker container php-fpm-54 с привязкой к директории logs от контейнера hlds16, и /mnt/www от контейнера nginx.

С этого места у нас работает hlds + nginx + php-fpm + mysql.

Инициализируем сайт статистики

  1. Распаковываем из zip-архива ~/cstrike необходимое в /mnt/www/ps. Теперь страничка доступна по URL http://65.108.82.45/ps/

  2. Подменяем несколько кривых PHP-скриптов на исправленные, см. ~/cstrike/ps

  3. Инсталируем сайт - http://65.108.82.45/ps/install/

  4. Рассказываем сайту где смотреть логи http://65.108.82.45/ps/admin/logsources_edit.php - вписываем /mnt/cstrike/logs

  5. Распаковываем из zip-архива ~/cstrike perl-скрипты парсера логов в /mnt/www/ps.stat_parser, вписываем атрибуты доступа к БД в /mnt/www/ps/stat_parser/stats.pl. Запускаем парсер в cron.

Доводим под себя сервер HLDS

  1. Правим под себя server.cfg, motd.txt в директории ~/cstrike, закидываем в контейнер hlds16

  2. Накидываем нужные плагины из ~/cstrike или из интернета в директорию addons

  3. Включаем плагины в plugins.ini. Рестартуем контейнер hlds16

Итог

Инсталяция HLDS-сервера + Сайта статистики займет минут 15.

Доводка конфигов + выбор нужных плагинов (+ их настройка) займет несколько дней. Я выбрал только самые необходимые amxmodx:

  • Blue_Fade.sma - фоновая вспышка при поражении противника

  • amx_parachute.sma - парашют за $1000

  • damager.sma - показвает урон от наших выстрелов/гранат

  • map_chooser.sma - rtv голосование за смену карты

Такую конфигурацию считаю классической, минимально необходимой.

Комментарии (23)


  1. DoMoVoY
    20.10.2021 12:41

    Замечательный способ расстаться с сервером. PsychoStats 3.2.2b - релиз 2013 года, думаю дыр нашли за это время достаточно в нем. Сам сервер не идеален, и читеры на месте не сидят. Не помню, чтобы VAC кого-то останавливал раньше.

    CS1.6 - отличное занятие, чтобы тряхнуть стариной. Но только с теми, кому доверяешь. Открывать эти сервера в публичный интернет - долго не протянут...


    1. Shaman_RSHU
      20.10.2021 14:39

      Всего лишь одна CVE-2013-3721, но зато Base Score 7.5 (High).

      И есть рабочие эксплоиты.


    1. ars-anosov Автор
      20.10.2021 15:44

      PsychoStats 3.2.2b - старая так и есть. Там еще Flash в одном месте используется, теперь это совсем не работает конечно.

      Найду хорошую OpenSource статистику, поставлю. Еще один php-fpm контейнер на нормальном PHP v.7 и вперед.

      Посоветуйте хорошую, если в теме.

      Касательно VAC. Конечно можно навесить amxx-плагинов античитов. Когда разберусь, какие стоящие - прикручу.

      Посоветуйте хорошие, если в теме.


      1. Chuvi
        20.10.2021 22:28

        Хороших нет. Протокол раздеребанен вдоль и поперек. Что-нить новое изобрести сложно. Может нейросети прикрутили.


  1. Chuvi
    20.10.2021 13:11
    +2

    У вас в Blue_Fade.sma крайне странный #incude затесался.

    Не припомню такого в AmxX


    1. ars-anosov Автор
      20.10.2021 15:48

      Ага! Спасибо.

      Вообще, больше всего времени ушло на поиск amxx-плагинов. Их как грязи!

      Потихоньку вычищу, надо просто время потратить. Благо не гонюсь за количеством.


  1. bagger
    20.10.2021 15:34

    Прочитав заголовок, я как будто попал в прошлое....


    1. ars-anosov Автор
      20.10.2021 16:19
      +1

      Это ты еще пострелять не заходил. Мы там стариканы 30+ тусим в основном. Всех детей в CS GO засосало. Шикарно!


  1. Deep_Drilling
    20.10.2021 16:10

    Как человек, держащий одно время сервер CS 1.6 на 32 слота, из которых 32 были заняты н-ное время, лет 5 назад, могу сказать - почти все плагины имеют уязвимости (т.к. не обновляются, зачастую, по 10 и более лет), а половина из них выложена в интернете с добавленными шелами.

    И хорошо, если там просто будет перехвачена админка, а не сама машина, на которой это все работает.

    Мне прямо в папку с сервером, скажем, умудрялись заливать картинки и ехе-шники, видимо с надеждой на запуск, не говоря обо всяких текстовых файлах с посланиями разного рода (и это с проверенными оригинальными dll-ками и плагинами).

    Поэтому присоединяюсь к комментатору выше. Либо писать самому, либо ставить чистый сервер, все остальное, вне зависимости от популярности, превращает сервер в дуршлаг, и потенциально ОСь, на которой это крутится, во всяком случае, с виндой точно.


    1. ars-anosov Автор
      20.10.2021 16:15

      Либо писать самому, либо ставить чистый сервер...

      Не очень понял.

      hlds - чистый. Грязи добавили плагины amxx. Плагины писать самому?

      Касательно дуршлаг/перехват - Docker-контейнер не жалко. Самому интересно сколько протянет.


      1. Deep_Drilling
        20.10.2021 17:42

        Имел ввиду плагины конечно, не совсем видимо удачно мысль сформулировал. Есть такая штука, как AMXX-Studio - позволяет это удобно делать.


  1. Kuprijan
    20.10.2021 21:14
    +1

    Сейчас что, даже с этим инвайт получить можно?


  1. PbIXTOP
    21.10.2021 06:10

    Вроде стоит nginx, а раздача аддонов для клиентов происходит через основной процесс сервера CS


    1. ars-anosov Автор
      21.10.2021 07:21

      Раздача происходит через nginx - https://github.com/ars-anosov/docker-hlds16#32-%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B0%D1%8F-%D1%81%D0%BA%D0%B0%D1%87%D0%BA%D0%B0

      аддоны, если имеются в виду .amxx addons, они ничего не раздают


      1. PbIXTOP
        21.10.2021 10:22

        Просто в статье и диаграмме это не было указано


  1. BaHeK1994
    21.10.2021 07:16

    Насчет быстрой скачки:

    1) помимо карт игроки могут скачивать звуки, модели, спрайты и .wad файлы, у тебя добавлены только карты

    2) зачем физически копировать файлы, когда можно сделать алиасы nginx'ом? при закачке новых файлов на сервер они автоматически будут доступны для быстрой скачки, но тут главное правильно настроить, чтобы пользователям не были доступны для скачивария конфиги, плагины или исходники


    1. ars-anosov Автор
      21.10.2021 07:18

      1) Да, на nginx выложил только maps. Дальше дело вкуса, не стесняемся выкладываем любой custom

      2) У меня подход контейнерный. hlds - один контейнер, nginx - другой контейнер. Опять же, дело вкуса.


  1. Cyber4el
    21.10.2021 22:14

    Ты тут писал про то, что не использовал ReHLDS. Я его настоятельно советую, ибо новые API и новые возможности. Очень советую почитать про него поподробнее и потестировать в своём докере. Говорю как человек, который сейчас держит сервер. ПОмимо ReHLDS есть ещё ReGameDLL. Так же обновление, уже для самого КСа, фиксящее баги, восящее больше конфигуируемых возможностей и по умолчанию добавляющее zBot'ов.


    1. ars-anosov Автор
      22.10.2021 07:58

      Моя цель была поднять классический сервер от Valve с минимальным комплектом улучшений.

      Дополнительные свистелки, современные патчи - да, согласен, стоит посмотреть в сторону ReHLDS. Пушки лазеры, боты, голые бабы вместо C4, ну и конечно, поддержка no-steam клиентов. Все там.


      1. Cyber4el
        25.10.2021 16:27

        no-steam - ещё куда ни шло (не все любители классического 1.6 имеют лицуху и играют на пиратке) - но при чём здесь пушки лазеры и прочее, если я только сказал, что в ReHLDS идёт исправление багов HLDS, которые до сих пор не исправлены самими VALVe, а в ReGameDLL помимо этого идёт более широкая настройка игры и дополнительная поддержка zBot из коробки?


  1. navicrstl
    22.10.2021 07:58

    Играл я как-то в 1.6 на полупроф уровне и часто общался с администраторами разных LAN и онлайн турниров

    Описанный вами способ развернуть сервер достаточно казуальный и подойдёт, ну наверное большинству.

    Однако любой проф того времени вам расскажет про чудесный «серверный FPS”

    Latency игроков зависит в том числе и от того, насколько быстро сервер обрабатывает полученные от клиентов пакеты данных и формирует отправляемые пакеты клиентам. То есть чем больше FPS сервера, тем быстрее он работает и тем ниже пинг игроков. Но высокое значение FPS потребует большей нагрузки сервера на процессор.

    Насколько мне известно сделать 1000 FPS без пересборки Linux ядра на real time - невозможно. А в докере так подавно :(


    1. ars-anosov Автор
      22.10.2021 08:22

      FPS сервера, хм... под таким углом не рассматривал. Каким инструментом замеряют FPS у сервера, если не секрет?

      FPS понятие близкое к монитору и видеокарте, но суть я уловил. Если идет битва за 1000 FPS, значит сервер должен гарантированно отдавать UDP пакеты с частотой 1000 Гц, это означает максимальную задержку = 1мс.

      Одна милисекунда достижима только в локальной сети, когда устройства физически подключены к одному коммутатору, без маршрутизаторов.

      Как только вываливаемся в Public Internet, получаем 5+ мс, это если число хопов минимальное и стучимся на сервер в своем городе. Плюс джиттер на получение UDP-пакетов, думаю еще пару милисекунд приклеит.

      И того, максимально достижимый FPS между сервером и клиентом при идеальном Public Internet порядка 150 FPS. Как раз под игровой монитор с частотой 144 Hz.

      Сетевой трафик от HLDS-сервера мизерный, нагрузка на CPU мизерная, пересборка linux ядра не имеет смысла.

      И Docker в этом смысле самая легкая виртуализация из возможных, LXC-подход практически не накладывает дополнительных издержек на систему, считайте что код крутится на хостовой машине.

      На latency игрового процесса скорей влияют настройки сервера + клиента. Если есть опыт, подскажите правильный набор параметров:

      sv_lan 0

      sys_ticrate 1000

      sv_maxrate 100000

      sv_maxupdaterate 102

      sv_minrate 20000

      sv_minupdaterate 30

      sv_instancedbaseline 1

      sv_unlag 1

      sv_unlagpush 0

      sv_unlagsamples 1

      sv_maxunlag 0.5

      https://github.com/ars-anosov/docker-hlds16/blob/master/cstrike/server.cfg


      1. navicrstl
        22.10.2021 12:04

        Настройки ОК. Собственно sys_ticrate как раз отвечает за серверный FPS.

        Проверить FPS легко через rcon rcon stats

        Нормальным показателем является 500, киберспортивный - 1000.

        Описанная вами логика FPS верна, но серверный FPS магическим образом влияет на стрельбу и хитбоксы. Попробуйте пострелять и позажимать в стены с 300 FPS и 1000. Вы разницу прям на глаз увидите :)