Параметри виділеного сервера 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 © 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 виправляємо каталог для логів:
РЕЄСТРАЦІЇ=/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 on Change 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 on Change 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: public Broadcasting 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 now is 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 browser valve
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 -> <Ім'я карти>, то для багатьох стандартних карт праворуч буде показано невелике превью. Якщо нам хочеться таке ж для коханої користувача карти або для нової стандартної, то робимо красивий (це обов'язково!) скріншот з гри, кадрируем, змінюємо розмір до 218x164 пікселя і зберігаємо як <ім'я карти>.jpg в каталог /var/www/stat.example.org/htdocs/hlstatsimg/games/tf/maps. Тобто для карти cp_orange_x3 створюємо файл з превью cp_orange_x3.jpg і отримуємо наступне:
Прев&#39;ю карти
Роздільний облік статистики
При стандартних налаштуваннях, у межах одного типу гри 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, то там є рядок
INSERT INTO `hlstats_Users` VALUES ('admin','e10adc3949ba59abbe56e057f20f883e',100,0);

Ось її-то і зберігаємо в окремому файлі, наприклад reset_pwd.sql який і завантажуємо в sql базу:
$ mysql --user=hlx_user hlx_db --password < reset_pwd.sql

Після чого заходимо в адмінку сервера статистики з логіном-паролем за замовчуванням (admin:123456) і General Settings -> Admin Users міняємо на своє.
Джерело: Хабрахабр
  • avatar
  • 0

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.