Настройка выделенного сервера Source под Linux, часть 4

  • Сервер статистики HLstatsX
    • Установка
    • Настройка mysql
    • Настройка HLstatsX демона
    • Настройка веб-сервера
    • Трансляция логов
    • Патч
    • Первый запуск
    • Регистрация серверов
    • Начальная настройка
    • Ошибки
    • Тепловые карты
    • Автоматический запуск
    • Тюнинг
      • Шрифты
      • Превью карты
      • Раздельный учёт статистики
      • Отключение статистики
      • Ограничение доступа
      • Новое оружие
      • Восстановление пароля

Сервер статистики HLstatsX

Было бы несправдливым не осветить мельком сервер статистики HLstatsX Community Edition (HLstatsX: CE). Проект сейчас развивается не очень активно, последняя стабильная версия — 1.6.19 от 2014 года. Можно установить её, а можно текущую версию, на момент написания, отличающуюся непринципиальными правками. Всё равно придётся допиливать.


Нам ещё понадобится sql сервер (mysql/mariadb), веб сервер (nginx), perl и php с некоторыми модулями. Так же на наших игровых серверах уже должны быть установлены MetaMod и SourceMod.


Установка


Текущий репозиторий — https://bitbucket.org/Maverick_of_UC/hlstatsx-community-edition/


Скачиваем текущую версию:


   $ wget https://bitbucket.org/Maverick_of_UC/hlstatsx-community-edition/get/master.tar.bz2
   $ mkdir ~/stat
   $ tar -jxvf master.tar.bz2 -C ~/stat --strip 1

HLstatsX состоит из трёх логических частей — транслирующего игровые события SourceMod плагина, получающего их демона, и отображающей веб-части.


Статистика будет собираться следующим образом:


  • Игровые сервера со специальными SourceMod плагинами транслирует по udp расширенные логи игры на 192.0.2.0:27500 (сервер No 1) и 192.0.2.0:27501 (сервер No 2)
  • Демон HLstatsX получает логи, слушая на указанных адресах и пишет информацию в общую sql базу.
  • Веб-интерфейс HLstatsX на её основе рисует красивую (или не очень) статистику.

Переходим в каталог ~/stat. Там мы видим подкаталоги


amxmodx — плагины для AMX Mod X
heatmaps — скрипты для построения тепловых карт
scripts — скрипты демона
sourcemod — плагины для SourceMod
sql — скрипт для создания sql базы данных
web — веб-интерфейс.


В подкаталогах amxmodx и sourcemod находятся плагины для AMX Mod X и SourceMod соответственно. Так как AMX Mod X мы не используем, то содержимое amxmodx нам не актуально, в отличие от sourcemod, в котором находится плагины статистики в исходниках (sourcemod/scripting) и в скомпилированном виде (sourcemod/plugins). Теоретически могут быть проблемы, когда версия SourceMod, установленная у нас сильно отличается от той, под которой скомпилирован плагин, поэтому мы скопируем исходники плагинов hlstatsx.sp и superlogs-tf2.sp в каталог scripting первого сервера и перекомпилируем их:


   $ cp ~/stat/sourcemod/scripting/{hlstatsx.sp,superlogs-tf2.sp} ~/tf2/tf/addons/sourcemod1/scripting
   $ cp ~/stat/sourcemod/scripting/include/* ~/tf2/tf/addons/sourcemod1/scripting/include
   $ cd ~/tf2/tf/addons/sourcemod1/scripting

Во избежание ошибки при компиляции, поправим файл:


   $ sed -i -e s/char/char1/g ~/tf2/tf/addons/sourcemod1/scripting/hlstatsx.sp

Компилируем и раскладываем по каталогам:


   $ ./compile.sh hlstatsx.sp superlogs-tf2.sp
   $ cp compiled/hlstatsx.smx compiled/superlogs-tf2.smx ~/tf2/tf/addons/sourcemod1/plugins
   $ mv compiled/hlstatsx.smx compiled/superlogs-tf2.smx ~/tf2/tf/addons/sourcemod2/plugins

Если игровые сервера уже запущены, то в их консолях вводим (команды выделены угловыми скобками):


   >>> sm plugins refresh
   [SM] The plugin list has been refreshed and reloaded.
   >>> sm plugins list
   [SM] Listing 19 plugins:
   [...]
   18 "SuperLogs: TF2" (2.0.32) by Thomas "CmptrWz" Berezansky & psychonic
   19 "HLstatsX CE Ingame Plugin" (1.6.19) by psychonic

Хорошо. В принципе игроки уже могут вызвать HLstatsX плагин, введя в окне чата «hlx_menu». Правда пока без особого эффекта. Настройки этих плагинов (да и не только этих) осуществляются через их консольные переменные — ConVars, как правило путём прописывания в файлах конфигурации сервера, либо конкретной карты. Их перечень обычно есть в документации, но при желании можно посмотреть самим:


   $ grep CreateConVar ~/tf2/tf/addons/sourcemod1/scripting/hlstatsx.sp
   $ grep CreateConVar ~/tf2/tf/addons/sourcemod1/scripting/superlogs-tf2.sp

Обнаруживаем, что superlogs_headshots по умолчанию выключен. Если нужна регистрация хедшотов, то добавляем «superlogs_headshots 1» в любой файл конфигурации, а для уже запущенного сервера выполняем эту же команду в консоли.


Настройка mysql


Сервер mysql (mariadb) у нас уже установлен, настроен и запущен, поэтому сразу переходим к созданию базы данных для сервера статистики. Переходим в ~/stat/sql (где должен лежать install.sql), вспоминаем пароль администратора для mysql, запускаем клиента:


   $ cd ~/stat/sql
   $ mysql --user=root mysql --password

Создаём базу данных и пользователя с паролем:


   Enter password:
   Welcome to the MariaDB monitor.  Commands end with ; or \g.
   Your MariaDB connection id is 1513
   Server version: 5.5.47-MariaDB-log MariaDB Server

   Copyright (c) 2000, 2015, Oracle, MariaDB Corporation Ab and others.

   Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

   MariaDB [mysql]> CREATE DATABASE hlx_db;
   Query OK, 1 row affected (0.02 sec)

   MariaDB [mysql]> GRANT ALL PRIVILEGES ON hlx_db.* TO hlx_user@localhost IDENTIFIED BY 'hlx_password' WITH GRANT OPTION;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [mysql]> FLUSH PRIVILEGES;
   Query OK, 0 rows affected (0.00 sec)

   MariaDB [mysql]> QUIT;
   Bye

База данных создана, теперь удаляем ~/.mysql_history, с нескромно зафиксированным паролем от hlx_user, запускаем скрипт, создающий необходимые таблицы. При запросе вводим пароль от нашей базы данных — 'hlx_password'.


   $ rm -f ~/.mysql_history
   $ mysql --user=hlx_user hlx_db --password < ~/stat/sql/install.sql

   Enter password:
   Table                 Op         Msg_type  Msg_text
   hlx_db.hlstats_Ranks  optimize   status    OK

Всё, база данных создана


В процессе настройки, для серфинга по sql таблицам, анализа проблем и удаления результатов неудачных экспериментов может пригодиться Adminer — компактная, но мощная web-панель управления, состоящая всего лишь из одного php скрипта. Если у вас не установлен phpMyAdmin или что иное, то этот Adminer — отличный вариант.

Настройка HLstatsX демона


В каталоге ~/stat/scripts находятся основные скрипты демона сервера статистики. Редактируем файл настроек ~/stat/scripts/hlstats.conf, прописываем параметры соединения с sql сервером:


   DBHost "localhost"
   DBUsername "hlx_user"
   DBPassword "hlx_password"
   DBName "hlx_db"

В секции UDP Socket Settings мы ничего не трогаем. Если бы у нас был один игровой сервер, то там прописали бы адрес и порт, указанный в logaddress_add в server.cfg. Но так как мы настраиваем два сервера, то параметр BindIP оставляем пустым, а номера портов будем указывать в командной строке при запуске демона.


В файле ~/stat/scripts/run_hlstats исправляем каталог для логов:


   LOGDIR=/home/game/log/hlstats

Устанавливаем базу данных GeoIP. Она пригодится как для вывода на экран во время игры сообщений вида «Вошёл игрок такой-то из страны такой-то», так и для отображения статистики на сайте. Запускаем программу cal, проверяем, какой первый день недели в её выдаче. Локаль у нас везде en_US, поэтому cal показывает воскресенье. Переходим в каталог ~/stat/scripts/GeoLiteCity и редактируем файл GeoLite_Import.sh:


   # Set this value to 1 if you are running Gentoo linux, or any other linux distro
   # where the "cal" command outputs not Sunday as the first day in every row!
   LINUX_OTHER="0"

   # Login information for your MySQL server
   DBHOST="localhost"
   DBNAME="hlx_db"
   DBUSER="hlx_user"
   DBPASS="hlx_password"

Делаем скрипт GeoLite_Import.sh исполняемым и запускаем его. База GeoIP скачается и импортируется в sql базу. При успешном импорте выдаётся что-то вида:


   [...]
   hlx_db.geoLiteCity_Blocks: Records: 2359593  Deleted: 0  Skipped: 0  Warnings: 0
   hlx_db.geoLiteCity_Location: Records: 793056  Deleted: 0  Skipped: 0  Warnings: 793056

Как вариант, можно GeoIP данные хранить в отдельном файле (для этого используется скрипт install_binary.sh —, но тогда необходимо установить (если его нет) perl модуль Geo: IP: PurePerl — perl -MCPAN -e 'install Geo::IP::PurePerl. Но мы будем хранить GeoIP данные внутри нашей sql базы. Не такая уж высокая нагрузка на неё ожидается.


Настройка веб-сервера


Сервер статистики у нас будет по адресу http://stat.example.org/. Как и в случае с настройкой Fast Download, создадим отдельный каталог /var/www/stat.example.org. Логи access_log и error.log тоже вынесем в отдельные файлы и предоставим возможность пользователю game читать их.


Сервер статистики будет обслуживать оба наших игровых сервера. Из-под root создаём каталоги, переносим каталог ~/stat/web, устанавливаем владельца и права. Создаём логи. Можно заодно сделать символьные ссылки для удобства.


   # mkdir -p /var/www/stat.example.org/{htdocs,log}
   # mv /home/game/stat/web/* /var/www/stat.example.org/htdocs
   # chown -R game. /var/www/stat.example.org/htdocs
   # touch /var/www/stat.example.org/log/{access,error}.log
   # chmod 644 /var/www/stat.example.org/log/*.log
   # ln -s /var/www/stat.example.org/log /home/game/log/www-stat

В настоящее время HLstatsX развивается мягко говоря не то чтоб активно, поэтому частых обновлений не прогнозируется, и нет особого смысла давать пользователю nginx полный доступ к его файлам для работы встроенной функции автообновления.


С целью уменьшения нагрузки сервер статистики создаёт небольшой кеш в папке hlstatsimg/progress — там хранятся графики загрузки игровых серверов и графики Player Trend (видны на страницах игроков), поэтому надо веб-серверу дать возможность записи в этот каталог:


   # chown nginx. /var/www/stat.example.org/htdocs/hlstatsimg/progress

Переходим в /var/www/stat.example.org/htdocs, редактируем config.php, предварительно сделав dos2unix config.php:


   define("DB_ADDR", "localhost");
   define("DB_USER", "hlx_user");
   define("DB_PASS", "hlx_password");
   define("DB_NAME", "hlx_db");

Другие параметры пока не трогаем.


Пока мы ещё root, создаём файл конфигурации /etc/nginx/conf.d/stat.example.org.conf нашего веб-сервера для этого поддомена.


stat.example.org.conf
server
{
    server_name                 stat.example.org;
    listen                      80;
    root                        /var/www/stat.example.org/htdocs;

    # Этот rewrite понадобится нам позже, в настройках
    rewrite                     sig-(.*)-(.*).png$ /sig.php?player_id=$1&background=$2 break;

    location /
    {
        try_files               $uri $uri/ /index.php$request_uri;
    }

    # Отрабатываем .htaccess файлы, закрывающие доступ к каталогу pages, pages/admintasks, pages/ingame
    location ~ /\.ht
    {
        deny  all;
    }

    # Зависит от вашего способа подключения php
    location ~ ^.+\.php(?:/.*)?$
    {
        include                 /etc/nginx/php.conf;
        fastcgi_pass            unix:/var/run/php5-fpm.sock;
    }

    access_log                  /var/www/stat.example.org/log/access.log main;
    error_log                   /var/www/stat.example.org/log/error.log warn;
}

Выше мы дали пользователю game доступ на чтение логов веб-сервера, но лишь до первой их ротации. Исправляем и это. На основе /etc/logrotate.d/nginx создаём файл srcds-nginx, прописываем путь к логам и исправляем маску прав доступа с 640 на 644 в строчке create 640 nginx adm:


srcds-nginx
#/etc/logrotate.d/srcds-nginx

/var/www/stat.example.org/log/*.log
/var/www/fastdl.example.org/log/*.log
/var/www/replay.example.org/log/*.log
{
        daily
        missingok
        rotate 52
        compress
        delaycompress
        notifempty
        create 644 nginx adm
        sharedscripts
        postrotate
                if [ -f /var/run/nginx.pid ]; then
                        kill -USR1 `cat /var/run/nginx.pid`
                fi
        endscript
}

Здесь мы в путях для ротации указали заодно каталоги с логами от серверов с записями и с Fast Download.


Проверяем корректность конфигурации и перезапускаем веб-сервер.


   # nginx -t
   # systemctl reload nginx

Далее продолжаем как пользователь game.


Трансляция логов


Трансляцию логов мы должны были включить ещё на этапе настройки, в файлах конфигурации наших серверов. На всякий случай проверяем наличие в них параметров «log on» и «logaddress_add <...>».


Патч


Перед запуском скриптов нам придётся их немного поправить. Дело в том, что с 2014 года стала использоваться новая версия записи идентификатора Steam. Предыдущая, вторая, имела вид STEAM_0:1:12345678, а нынешняя третья — [U:1:12345678]. Но текущая версия HLstatsX (1.6.19) новую версию идентификатора не понимает, что добавляет кривизну в статистику. Для недопущения этого мы внесём несколько изменений в скрипты, которые будут новую версию steamid3 конвертировать в старую, steamid2. Патч взят с forums.alliedmods.net. Сохраняем нижеследующее в файл и запускаем.


idpatch.sh
#!/bin/sh

uudecode -o ~/idpatch << EOF
begin-base64 664 idpatch
ZGlmZiAtTmF1cnAgc2NyaXB0cy9ITHN0YXRzX0V2ZW50SGFuZGxlcnMucGxp
YiBzY3JpcHRzLmZpeGVkL0hMc3RhdHNfRXZlbnRIYW5kbGVycy5wbGliCi0t
LSBzY3JpcHRzL0hMc3RhdHNfRXZlbnRIYW5kbGVycy5wbGliCTIwMTYtMDct
MzAgMDI6NTE6NDUuMDAwMDAwMDAwICswNTAwCisrKyBzY3JpcHRzLmZpeGVk
L0hMc3RhdHNfRXZlbnRIYW5kbGVycy5wbGliCTIwMTYtMTAtMTIgMTc6MDg6
MjcuNDM0NDA0MzczICswNTAwCkBAIC0xNTk0LDYgKzE1OTQsNyBAQCBzdWIg
ZG9FdmVudF9QbGF5ZXJBY3Rpb24KIAkJCQlteSAkb3duZXJzdHJpbmcgPSAi
IjsKIAkJCQlpZiAoZGVmaW5lZCgkcHJvcGVydGllc3tvYmplY3Rvd25lcn0p
KSB7CiAJCQkJCW15ICRvd25lciA9ICRwcm9wZXJ0aWVze29iamVjdG93bmVy
fTsKKwkJCQkJJG93bmVyID1+IHMhXFtVOjE6KFxkKylcXSEnU1RFQU1fMDon
LigkMSAlIDIpLic6Jy5pbnQoJDEgLyAyKSFlZzsKIAkJCQkJJG93bmVyID1+
IC8uKz88U1RFQU1fWzAtOV0rOihbMC05XSs6WzAtOV0rKT4uKi87CiAJCQkJ
CSRvd25lciA9ICQxOwogCQkJCQlpZiAoJG93bmVyIGVxICRwbGF5ZXItPnt1
bmlxdWVpZH0pIHsKZGlmZiAtTmF1cnAgc2NyaXB0cy9obHN0YXRzLnBsIHNj
cmlwdHMuZml4ZWQvaGxzdGF0cy5wbAotLS0gc2NyaXB0cy9obHN0YXRzLnBs
CTIwMTYtMDctMzAgMDI6NTE6NDUuMDAwMDAwMDAwICswNTAwCisrKyBzY3Jp
cHRzLmZpeGVkL2hsc3RhdHMucGwJMjAxNi0xMC0xMiAxNzowOTowNS4wODA4
ODc1MDkgKzA1MDAKQEAgLTEwNjEsNiArMTA2MSw3IEBAIHN1YiBnZXRQbGF5
ZXJJbmZvCiAJCW15ICRoYXZlcGxheWVyICA9IDA7CiAJCQogCQkkcGxhaW51
bmlxdWVpZCA9ICR1bmlxdWVpZDsKKwkJJHVuaXF1ZWlkID1+IHMhXFtVOjE6
KFxkKylcXSEnU1RFQU1fMDonLigkMSAlIDIpLic6Jy5pbnQoJDEgLyAyKSFl
ZzsKIAkJJHVuaXF1ZWlkID1+IHMvXlNURUFNX1swLTldKz9cOi8vOwogCQkK
IAkJaWYgKCgkdW5pcXVlaWQgZXEgIkNvbnNvbGUiKSAmJiAoJHRlYW0gZXEg
IkNvbnNvbGUiKSkgewpkaWZmIC1OYXVycCBzY3JpcHRzL1RSY29uLnBtIHNj
cmlwdHMuZml4ZWQvVFJjb24ucG0KLS0tIHNjcmlwdHMvVFJjb24ucG0JMjAx
Ni0wNy0zMCAwMjo1MTo0NS4wMDAwMDAwMDAgKzA1MDAKKysrIHNjcmlwdHMu
Zml4ZWQvVFJjb24ucG0JMjAxNi0xMC0xMiAxNzowOTozMC42OTk4NTUzMTkg
KzA1MDAKQEAgLTMzOCw2ICszMzgsNyBAQCBzdWIgZ2V0UGxheWVycwogICAg
ICAgbXkgJGFkZHJlc3MgID0gJDg7CiAgICAgICBteSAkcG9ydCAgICAgPSAk
OTsKIAorCSAgJHVuaXF1ZWlkID1+IHMhXFtVOjE6KFxkKylcXSEoJDEgJSAy
KS4nOicuaW50KCQxIC8gMikhZWc7CiAJICAkdW5pcXVlaWQgPX4gcy9eU1RF
QU1fWzAtOV0rP1w6Ly9pOwogCSAgCiAgICAgICAjICY6OnByaW50RXZlbnQo
IkRFQlVHIiwgIlVTRVJJRDogJyR1c2VyaWQnLCBOQU1FOiAnJG5hbWUnLCBV
TklRVUVJRDogJyR1bmlxdWVpZCcsIFRJTUU6ICckdGltZScsIFBJTkc6ICck
cGluZycsIExPU1M6ICckbG9zcycsIFNUQVRFOiAnJHN0YXRlJywgQUREUkVT
UzonJGFkZHJlc3MnLCBDTElfUE9SVDogJyRwb3J0JyIsIDEpOwo=
====
EOF

patch --backup --directory ~/stat/scripts < ~/idpatch

rm -f ~/idpatch

Ну либо ручками по статье с форума.


Первый запуск


Итак, у нас должно быть всё готово:


  • nginx запущен (и, если исправляли файлы конфигурации, то перезапущен)
  • mysql запущен (база данных и таблицы созданы)
  • демон HLstatsX настроен (~/stat/scripts/hlstats.conf), но не запущен
  • веб-интерфейс подготовлен (/var/www/stat.example.org/htdocs/config.php)
  • необходимые perl/php модули установлены
  • база данных GeoIP импортирована.

Осталось настроить запуск демона. Возвращаемся в ~/stat. В принципе, там можно удалить ненужные уже каталоги amxmodx, sourcemod, sql, web. Оставим только heatmaps и scripts. В каталоге ~/stat/scripts файлы *.pl и run_* должны быть с атрибутом «исполняемый»:


   $ chmod +x ~/stat/scripts/*.pl ~/stat/scripts/run_*

Запускаем оба игровых сервера (если не запущены ранее).


Файл ~/stat/scripts/run_hlstats — это демон, получающий статистику от игровых серверов и записывающий её в sql базу. Запуск его без параметров показывает допустимые параметры запуска — start, stop, restart и другие. Для нашей конфигурации параметры его запуска таковы: run_hlstats start <количество демонов> <первый порт> <шаг увеличения номера порта> — именно поэтому в настройках наших игровых серверов, в параметрах logaddress_add номера портов должны идти последовательно — 27500 для первого сервера и 27501 для второго. Стартуем.


   $ ~/stat/scripts/run_hlstats start 2 27500 1

На экране должно появиться что-то типа:


   HLstatsX:CE daemon control
   http://www.hlxce.com
   ---------------------------
   Attempting to start HLstatsX:CE daemon on port 27500...
   Daemon successfully started on port 27500
   Attempting to start HLstatsX:CE daemon on port 27501...
   Daemon successfully started on port 27501

А в каталоге ~/log/hlstats образовались два файла с логами (для каждого демона свой). Смотрим первый лог:


   2014-01-24 14:24:16:  - MYSQL: Connecting to MySQL database 'hlx_db' on 'localhost' as user 'hlx_user' ... connected ok
   2014-01-24 14:24:16:  - CONFIG: Reading database config...
   2014-01-24 14:24:16:  - CONFIG: I have found the following server configs in database:
   2014-01-24 14:24:16:  - ERROR: GeoIP method set to binary file lookup but .//GeoLiteCity/GeoLiteCity.dat NOT FOUND
   2014-01-24 14:24:16:  - HLSTATSX: HLstatsX:CE 1.6.19 starting...
   2014-01-24 14:24:16:  - UDP: Opening UDP listen socket on port 27500 ... ok
   2014-01-24 14:24:16:  - HLSTATSX: Maximum Skill Change on all servers are 25 points
   2014-01-24 14:24:16:  - HLSTATSX: Tracking Trend of the stats are enabled
   2014-01-24 14:24:16:  - HLSTATSX: Minimum Skill Change on all servers are 2 points
   2014-01-24 14:24:16:  - HLSTATSX: Minimum Players Kills on all servers are 50 kills
   2014-01-24 14:24:16:  - HLSTATSX: Players chat logging is enabled
   2014-01-24 14:24:16:  - HLSTATSX: Broadcasting public chat is disabled
   2014-01-24 14:24:16:  - HLSTATSX: Event queue size is set to 10
   2014-01-24 14:24:16:  - HLSTATSX: HLstatsX:CE is now running (Normal mode, debug level 1)

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


Теперь необходимо обеспечить какую-нибудь движуху на наших игровых серверах — чтобы что-то писалось в логи. Проще всего самому присоединиться к серверу. Если при этом в логах всё равно раз в две минуты начинает появляться


   2014-01-24 15:21:33:  - HLSTATSX: No data since 120 seconds
   2014-01-24 15:23:33:  - HLSTATSX: No data since 120 seconds

то или игровой сервер не запущен (или запущен, но не тот или не так) или что-то с настройками — в первую очередь ip: port (если вы в настройках сервера, в logaddress_add указали ip 127.0.0.1, то попробуйте исправить его на внешний), во вторую очередь — включены ли у нас логи вообще, если да, то куда они транслируются. Ну и нельзя исключать влияние злых сил — того же файервола. При корректных настройках, запуск netstat -lpn | grep perl должен вывести что-то вида:


   udp     0      0 0.0.0.0:27500      0.0.0.0:*                 15855/perl
   udp     0      0 0.0.0.0:27501      0.0.0.0:*                 15861/perl

Если же после подключения к серверу, в логе побежали строчки:


   2014-01-24 15:39:37: 192.0.2.0:27015 - E997: NOT ALLOWED SERVER: кракозябры 01/24/2014 - 15:39:39: "Ich<4><[U:1:123456789]><>" connected, address "198.51.100.0:44098"
   2014-01-24 15:39:39: 192.0.2.0:27015 - E997: NOT ALLOWED SERVER: кракозябры 01/24/2014 - 15:39:39: "Ich<4><[U:1:123456789]><>" STEAM USERID validated

То это хорошо. HLstatsX получает логи от сервера, но так как мы ещё не настроили сам сервер статистики — в частности, не зарегистрировали там наш игровой сервер, то он его не признаёт.


В случае возникновения ошибок вида «Can’t setup UDP socket on port 27500: Address already in use» для определения виновника используем утилиту netstat -lpn


Итак, с самым интересным закончили, переходим теперь к настройке сервера статистики.


Регистрация серверов


Открываем в браузере наш сервер — http://stat.example.org/


На экране предупреждение о проверке обновления, кликаем по ссылке HLX: CE Database Updater, видим уведомление о том, что «Your database is already up to date (78)», удаляем папку updater:


   $ rm -rf /var/www/stat.example.org/htdocs/updater

Снова переходим на http://stat.example.org/, видим гуглокарту и в самом низу страницы кликаем по ссылке »[Admin]», вводим логин и пароль по умолчанию, admin: 123456. Первым делом переходим General Settings → Admin Users. Меняем пароль администратора и, по желанию, его логин. [Apply]. Затем начинаем не торопясь настраивать.


Регистрируем наши сервера. Переходим в Game Settings → Team Fortress 2 (tf) → Add Server, вводим данные для первого сервера:


Server IP Address:
IP нашего сервера — 192.0.2.0
Server Port:
порт сервера — 27015 — параметр '-port' из командной строки srcds_run
Server Name:
можно оставить пустым, сам определит
Rcon Password:
укажем тот же, что в rcon_password в настройках первого сервера
Public Address:
оставляем пустым — он совпадает с Server IP Address
Admin Mod:
у нас установлен только SourceMod, его и выбираем.


Далее [Add Server], [Apply]. Перезапускаем демона — переходим по предлагаемой ссылке, уточняем номер порта — для первого сервера 27500, для второго 27501, нажимаем 'Execute'.


Смотрим результат:


   HLstatsX: CE Daemon Control
      Sending Command to HLstatsX: CE Daemon at localhost:27500 — 50 bytes OK
      Waiting for Backend Answer...recieving 29 bytes in 1 packets...OK
      Backend Answer: OK, EXECUTING COMMAND: RELOAD
      Closing connection to backend...OK
   Return to Administration Center

Если всё сделано правильно, то обновится лог первого демона ~/log/hlstats/hlstats_27500<...>:


   2016-10-12 21:43:48:                 - PROXY, Reload request from 127.0.0.1:43992:
   2016-10-12 21:43:49:                 - CONTROL: Command received: RELOAD
   2016-10-12 21:43:49: 127.0.0.1:43992 - CONTROL: Sent 29 bytes to frontend at '127.0.0.1:43992'
   2016-10-12 21:43:49: 127.0.0.1:43992 - CONTROL: Re-Reading Configuration by request from Frontend...
   2016-10-12 21:43:49: 127.0.0.1:43992 - CONFIG: Reading database config...
   2016-10-12 21:43:49: 127.0.0.1:43992 - CONFIG: I have found the following server configs in database:
   2016-10-12 21:43:49: 127.0.0.1:43992 - S_CONFIG: 192.0.2.0:27015
   2016-10-12 21:43:49: 127.0.0.1:43992 - ERROR: GeoIP method set to binary file lookup but .//GeoLiteCity/GeoLiteCity.dat NOT FOUND
   2016-10-12 21:45:05:                 - HLSTATSX: Insert new server trend timestamp
   2016-10-12 21:45:47:                 - HLSTATSX: No data since 120 seconds
   2016-10-12 21:47:35: 192.0.2.0:27015 - SERVER: Connecting to rcon on 192.0.2.0:27015 ... ok
   2016-10-12 21:47:35: 192.0.2.0:27015 - TRCON: Trying to get rcon access (auth)
   2016-10-12 21:47:35: 192.0.2.0:27015 - TRCON: Junk packet from Source Engine
   2016-10-12 21:47:35: 192.0.2.0:27015 - TRCON: Rcon password accepted
   2016-10-12 21:47:36: 192.0.2.0:27015 - SERVER: Server running map: cp_granary
   2016-10-12 21:47:36: 192.0.2.0:27015 - SERVER: Ingame-URL: http://stat.example.org
   2016-10-12 21:47:36: 192.0.2.0:27015 - SERVER: Query results will displayed in valve browser
   2016-10-12 21:47:36: 192.0.2.0:27015 - SERVER: Showing stats is enabled
   2016-10-12 21:47:36: 192.0.2.0:27015 - SERVER: Broadcasting Live-Events with "hlx_sm_psay" is enabled

Всё, первый сервер признан родным, rcon пароль верный, соединение установлено.


Аналогично пропишем второй сервер.


Server IP Address:
192.0.2.0
Server Port:
27016 (!)
Server Name:
пусто
Rcon Password:
укажем тот же, что в rcon_password в настройках второго сервера
Public Address:
пусто
Admin Mod:
SourceMod


Далее [Add Server], проверяем детали.


Небольшой момент, который можем применить ко второму серверу. В период опытной эксплуатации, для проверки работы сервера статистики, его дальнейшей настройки и поиска возможных проблем, желательно чтобы велось накопление данных. Так как вряд ли стоит рассчитывать, что на наш свежий сервер как мухи слетятся 24 игрока, которые тут же начнут нам генерировать статистику, то придётся обойтись подручным материалом — ботами. Как населить карту молодыми, энергичными ботами рассказано в разделе «Боты», а пока при регистрации второго сервера, в окне перед окончательным »[Apply]» мы ищем параметр «IgnoreBots» и меняем его значение на »0». Тогда для второго игрового сервера боты будут учитываться как реальные игроки и по ним будет вестись статистика (ни о чём, но лишь бы была). Впоследствии, перед запуском в продуктив, мы всю статистику второго сервера обнулим и начнём жизнь с чистого листа. А пока будем считать, что на втором сервере у нас карта koth_sawmill, на которой бегают боты.


Если же нравственный стержень внутри не позволяет опускаться до такого, то можно всё на этой же странице регистрации сервера изменить другой параметр, «MinPlayers», установив его в »1». По умолчанию, рейтинг у игроков начинает считаться, когда на карте не менее четырёх человек. Сделано это для уменьшения накруток на пустых картах, ну, а сейчас мы снижаем порог до одного — себя.


Потом, когда потребуется вернуть всё обратно, в это окно мы можем попасть через раздел Game Settings — Team Fortress 2 (tf) — Edit Servers — (выбираем нужный сервер) — CONFIGURE — >> Server Details, возвращаем как было. Затем [Apply] и не забыть перезапустить демона.

Теперь перезапустим демон HLstatsX для применения настроек по регистрации второго сервера. Можно через веб-интерфейс, не забыв указать другой порт — 27501, а можно ручками:


   $ ~/stat/scripts/run_hlstats reload

   HLstatsX:CE daemon control
   http://www.hlxce.com
   ---------------------------
   Successfully reloaded daemon running on port 27500
   Successfully reloaded daemon running on port 27501

В браузере обновляем страницу http://stat.example.org/, видим на главной странице оба наши сервера. Радуемся.


Входим в игру, присоединяемся к нашему серверу. В окне чата («y») вводим «hlx_menu». Появляется меню. Можно осваивать :-)


Начальная настройка


Придадим нашему серверу минимально товарный вид. В интерфейсе администратора переходим в раздел General Settings → HLstatsX: CE Settings:


Site Name
Имя нашего сервера статистики — HLstatsX at example.org


Site URL
URL сервера статистики, который будет использоваться при генерации подписей для форумов — http://stat.example.org/


Contact URL
Контактный адрес, e-mail либо url — game@example.org


Use modrewrite to make forum signature image...
При установке в Disabled, игроку для ссылки на свою плашку придётся использовать код вида http://stat.example.org/sig.php? player_id=1&background=random. Но можно сделать этот url более красивым, установив данный параметр в Enabled и добавив строчку rewrite sig-(.*)-(.*).png$ /sig.php?player_id=$1&background=$2 break; в файл конфигурации nginx для нашего сервера (что мы и сделали ранее при настройке веб-части). Тогда будут работать url вида http://stat.example.org/sig-1-random.png.


Choose whether to use GeoCityLite data...
Указываем местоположение GeoIP данных. Так как ранее мы определились что будем хранить их внутри нашей sql базы, то выбираем вариант «GeoIP lookup via database». Требует рестарта демонов run_hlstats.


Map Download URL...
Указывает на путь, по которому можно скачать используемые карты. Если настроен Fast Download, то прописываем что-то вида http://fastdl.example.org/maps/%MAP%.bsp.bz2. При корректной установке параметра, зайдя на сервер статистики в раздел Maps → <Имя карты>, на открывшейся странице справа появится неприметная ссылка «Download this map…», причём только для тех карт, которые наличествуют по этому url (сервер предварительно проверяет наличие карты). Но мы этот функционал использовать не будем. Потому что не сможем. При настройке Fast Download мы как раз-таки приложили усилия, чтобы никто не мог скачать карты «напрямую», без корректного referer.


Всё? Ну тогда [Apply], и, так как меняли местоположение GeoIP данных, то перезапускаем обоих демонов.


После окончательной настройки HLstatsX, когда все косяки настроек будут выявлены и исправлены, для уменьшения объёмов логов в ~/stat/scripts/logs, в файле конфигурации hlstats.conf параметр «DebugLevel» устанавливаем в »0».


Ошибки


По окончании первоначальной настройки необходимо почитать лог ошибок веб-сервера — ~/log/www-stat/error.log. Типовые ошибки:


   PHP Fatal error:  Call to undefined function imagecreatetruecolor() in <...>/show_graph.php on line 194

Необходимо установить библиотеку php-gd и перезапустить php, обслуживающий веб-сервер.


   PHP Fatal error:  Call to undefined function imageftbbox() in <...>/pChart.class on line 556

Аналогично, не хватает freetype.


   PHP Warning:  imagepng(./hlstatsimg/progress/trend_123_4567890987.png): failed to open stream: Permission denied in /var/www/stat.example.org/htdocs/includes/pChart/pChart.class

Забыли веб-серверу дать возможность записи в hlstatsimg/progress.


   PHP Warning:  session_start(): open(/var/lib/php/session/sess_m5ekot332e5k97au3a21hpqto6, O_RDWR) failed: No such file or directory (2)

Проверяем наличие каталога /var/lib/php/session, он задаётся переменной «php_value[session.save_path]» в /etc/php-fpm.d/www.conf — при использовании php-fpm, конечно, и при отсутствии каталога создаём, из-под root:


   # mkdir /var/lib/php/session
   # chown nginx. /var/lib/php/session
   # chmod -R 700 /var/lib/php/session

Тепловые карты


Теперь настроим генерацию тепловых карт. Со страницы загрузки https://bitbucket.org/Maverick_of_UC/hlstatsx-community-edition/downloads из ветки dev / HLstatsX Community Edition / extras / HeatmapPack / скачиваем heatmap-src_3.zip


   $ wget https://bitbucket.org/Maverick_of_UC/hlstatsx-community-edition/raw/0577b45e5f33df4e2a6122077fa44902073a8844/extras/HeatmapPack/heatmap-src_3.zip
   $ unzip heatmap-src_3.zip tf/*.jpg -d ~/stat/heatmaps/src

В ~/stat/heatmaps/src появится каталог tf с кучей .jpg файлов — шаблонов для тепловых карт. Из 65 шаблонов, 32 соответствуют стандартным картам Team Fortress 2 (из почти сотни комплектных), а 33 — для пользовательских карт. Не идеал, но лучше чем ничего. В конце концов, ничто не мешает сделать недостающие самим.


Переходим в ~/stat/heatmaps, редактируем файл config.inc.php. В переменных DB_ прописываем параметры соединения с базой данных, в HLXCE_WEB указываем корневой каталог нашего веб-сервера статистики — в котором находится каталог hlstatsimg. При желании, в OUTPUT_SIZE можно установить размер генерируемой карты в «large». Переменную DB_PREFIX не трогаем! Итак, как-то так:


   define('DB_HOST', 'localhost');
   define('DB_USER', 'hlx_user');
   define('DB_PASS', 'hlx_password');
   define('DB_NAME', 'hlx_db');
   define('HLXCE_WEB', '/var/www/stat.example.org/htdocs');
   define('HUD_URL', 'http://stat.example.org');

Создаём каталог cache/tf — для хранения кеша


   $ mkdir -p ~/stat/heatmaps/cache/tf

На всякий случай проверяем, что у каталога /var/www/stat.example.org/htdocs/hlstatsimg/games/tf владелец game (либо он может туда писать).


В файле heatmap.class.php меняем формат вывода даты на более привычный:


   $ sed -i -e s#"m/d/y"#"d M Y"#g ~/stat/heatmaps/heatmap.class.php
   $ sed -i -e s#"Y-m-d H:i:s"#"d M Y H:i:s P"#g ~/stat/heatmaps/heatmap.class.php

Запускаем:


   $ ~/stat/heatmaps/generate.php

Как мы условились выше, на втором сервере для тестирования статистики у нас была установлена карта koth_sawmill с ботами. Наш скрипт сейчас для неё создал тепловую карту (смотрим пятую строчку):


   25-07-2016 20:38:30   DB: Connected to hlx_db as hlx_user@localhost
   25-07-2016 20:38:31   IGNORE: Game: tf, Map: cp_warpath_v3, Kills: 0, (to few kills)
   25-07-2016 20:38:47   IGNORE: Game: tf, Map: cp_wolf2_b1, Kills: 0, (to few kills)
   25-07-2016 20:38:47   IGNORE: Game: tf, Map: koth_nucleus, Kills: 0, (to few kills)
   25-07-2016 20:38:47   CREATE: Game: tf, Map: koth_sawmill, Kills: 2014
   25-07-2016 20:39:24   IGNORE: Game: tf, Map: koth_viaduct, Kills: 0, (to few kills)
   25-07-2016 20:39:24   CREATE: Heatmap creation done.

А в каталоге /var/www/stat.example.org/htdocs/hlstatsimg/games/tf/heatmaps должны появиться два файла — koth_sawmill-kill.jpg и koth_sawmill-kill-thumb.jpg.


Первоначальная генерация тепловой карты, как правило, достаточно продолжительна, но скрипт кеширует информацию и при последующих запусках всё работает гораздо быстрее. Теперь на сервере статистики переходим в раздел Maps, в строке с картой koth_sawmill, в самом правом столбце таблицы появилась иконка, при клике на которую открывается тепловая карта с номинацией TOTAL KILLS:


Тепловая карта


Данные для генерации карты берутся за последние тридцать дней. Этот период задаётся строкой $timescope = (time() - 60*60*24*$mapinfo[$code][$map]['days']); в heatmap.class.php, а, в свою очередь, столбец «days» в sql таблице hlstats_Heatmap_Config, для всех карт имеет значение »30».


Если захочется поэкспериментировать со своими, самостоятельно сделанными шаблонами для тепловых карт, то следует иметь в виду, что недостаточно просто положить .jpg в каталог к остальным шаблонам. Необходимо ещё прописать параметры карты в таблице hlstats_Heatmap_Config нашей sql базы.


Автоматический запуск


Теперь настраиваем запуск скриптов HLstatsX. У нас их аж пять:


run_hlstats
запускает демонов, получающих логи с серверов;


hlstats-awards.pl
многоцелевой скрипт, обсчитывающий статистику, работающий с геолокацией и умеющий оптимизировать sql базу данных;


hlstats-resolve.pl
пытается по ip-адресам игроков определить доменные имена;


GeoLite_Import.sh
скачивает и обновляет geoip базу;


generate.php
создаёт тепловые карты.


Все эти скрипты должны запускаться из-под пользователя game, поэтому их будем запускать из пользовательского crontab файла (его использование мы разрешили на этапе заведения пользователя), в котором у нас уже может быть прописан вызов скрипта для обновления серверов и для очистки каталогов с Записями. Запускаем crontab -e, добавляем:


crontab
*/5 * * * * cd $HOME/stat/scripts && ./run_hlstats start 2 27500 1
1  0  * * * cd $HOME/stat/scripts && ./hlstats-awards.pl
5  4  * * * cd $HOME/stat/scripts && ./hlstats-resolve.pl
20 2 12 * * cd $HOME/stat/scripts/GeoLiteCity/ && ./GeoLite_Import.sh
30 2 12 * * cd $HOME/stat/scripts && ./hlstats-awards.pl --geoip
40 3 14 * * cd $HOME/stat/scripts && ./hlstats-awards.pl --optimize
15 *  * * * cd $HOME/stat/heatmaps && ./generate.php

Первая строка — каждые пять минут запускаем демона run_hlstats на случай скоропостижной кончины ранее запущенного. Если тот жив-здоров, то ничего страшного не произойдёт. Это официально рекомендуемый способ запуска.


Вторая строка — раз в сутки запускаем скрипт hlstats-awards.pl, который со своими параметрами по умолчанию --inactive --awards --ribbons --prune подводит итоги и определяет героев дня.


Третья строка — раз в сутки запускаем скрипт hlstats-resolve.pl, который по ip определяет имена хостов с которых заходили игроки и позволяет в админке, в Tools → Host Statistics посмотреть статистику по провайдерам. Запуск данного скрипта можно сделать более частым — он хотя и перелопачивает всю базу, но однажды определённые ip повторно не определяет.


Четвёртая строка — раз в месяц обновляем базу GeoIP.


Пятая строка — после обновления GeoIP, для ip-адресов в нашей базе с отсутствующей географической привязкой пытаемся заново определить местоположение.


Шестая строка — раз в месяц запускаем оптимизацию sql базы данных.


Седьмая — раз в час запускаем генерацию тепловых карт.


Настройка перенаправления логов cron в лог, доступный пользователю game описана в разделе «Логи»


Тюнинг


Шрифты


При формировании плашек игроков, как в примере ниже, используется шрифт DejaVu Sans, распространяющийся под свободной лицензией, но не способный похвастаться широким охватом символов Unicode, что приводит к невозвожности вывода на плашку, рядом с флагом, имени игрока в каком-нибудь экзотическим алфавите. Поэтому заменим его шрифтом Bitstream Cyberbit с подходящей для наших условий лицензией и с поддержкой гораздо большего количества символов.


   $ wget http://ftp.netscape.com/pub/communicator/extras/fonts/windows/Cyberbit.ZIP
   $ unzip Cyberbit.ZIP -d /var/www/stat.example.org/htdocs/hlstatsimg/sig/font/

Использование DejaVuSans.ttf прописано в коде .php скриптов, поэтому либо переименовываем Cyberbit.ttf в DejaVuSans.ttf, либо правим скрипты:


   $ sed -i -e 's/DejaVuSans.ttf/Cyberbit.ttf/g' /var/www/stat.example.org/htdocs/*.php

Корейские игроки могут быть довольны:


Плашка с иероглифами


Превью карты


Если пользователь на сервере статистики заходит в Maps → <Имя карты>, то для многих стандартных карт справа будет показано небольшое превью. Если нам хочется такое же для любимой пользовательской карты или для новой стандартной, то делаем красивый (это обязательно!) скриншот из игры, кадрируем, изменяем размер до 218×164 пикселя и сохраняем как <имя карты>.jpg в каталог /var/www/stat.example.org/htdocs/hlstatsimg/games/tf/maps. То есть для карты cp_orange_x3 создаём файл с превью cp_orange_x3.jpg и получаем следующее:


Превью карты


Раздельный учёт статистики


При стандартных настройках, в рамках одного типа игры (Team Fortress 2), учёт статистики ведётся общий для обоих серверов, то есть статистика по картам и рейтинг игроков считаются вне зависимости от того, на каком из наших двух игровых серверов они играют. Если есть желание разделить статистику, то в интерфейсе администратора, Tools → Duplicate Game settings копируем существующий тип игры «tf — Team Fortress 2» в новый. Предварительно необходимо предоставить веб-серверу право записи в каталог hlstatsimg/games: chmod o+w /var/www/stat.example.org/htdocs/hlstatsimg/games. Теперь при регистрации игровых серверов, в секции Game Settings вы сможете для каждого сервера выбирать разные типы игр.


Отключение статистики


Если нам надо исключить игру на какой-то конкретной карте из попадания в статистику — ну мало ли, решили поэкспериментировать с пользовательскими achievement картами и не хочется пачкать статистику результатами наших гм… достижений, то в ~/cfg создаём файл <имя карты>.cfg (не забыв сделать потом символьную ссылку в ~/tf2/tf/cfg/) и содержимым:


   echo "*** <имя карты>.cfg"

   logaddress_delall

Этот файл конфигурации выполнится при переходе на данную карту и игровой сервер не будет транслировать логи демону (на запись в ~/log/server2/ это не повлияет). А при следующей смене карт, перед переходом на новую карту будет выполнен файл конфигурации ~/cfg/server2.cfg, который включит трансляцию логов. При этом консольная переменная «hlx_protect_address» не должна быть установлена, иначе плагин сервера статистики будет блокировать эту команду.


Ограничение доступа


Если вы решите ограничить доступ к серверу статистики с помощью HTTP Basic Authentication по логину-паролю, то стоит иметь в виду, что при этом игроки лишатся возможности во время игры посмотреть свою статистику в motd окне, введя в чате »/hlx». Либо надо будет исключить из области аутентификации скрипт ingame.php и файлы .png, .gif, .css


Новое оружие


Настройка сервера статистики под конкретную игру осуществляется в разделе Game Settings, Team Fortress 2 (tf), секции Actions и Weapons. Там можно прописать действия и новые виды оружия, которые появились за годы, прошедшые с момента последнего релиза HLstatsX.


Восстановление пароля


Если забыли логин или пароль администратора от сервера статистики HLstatsX, то их можно сбросить в исходные (admin:123456), тем же способом, каким мы изначально устанавливали. Если посмотреть в файле ~/stat/sql/install.sql, то там есть строчка



    
            

© Habrahabr.ru