Данная статья написана лично мной с использованием моего личного опыта и открытых источников, ссылки на которые я предоставляю в конце каждого раздела. Распространение данной статьи запрещено без указания ссылки на первоисточник и никнейма (контакта) автора. Первоисточником считать: Nord1cWarr1or/cs-1.6-server-installation-on-vds-using-lgsm (github.com) Автор: Nordic Warrior. (Telegram: @NordicWarrior) Дата написания: октябрь-ноябрь 2021 г.
На написание данной статьи меня сподвигло отсутствие таковых подробных статей и инструкций по установке сервера на конец 2021 года. Всё, что мне удавалось найти либо устарело, либо не было достаточно подробным или рассматривало только какой-то один процесс в установке сервера. Я решил сделать единый гайд, с актуальными сведениями, полностью подробный и понятный даже для незнакомых с этой сферой людей.
Примечание: Я буду рассматривать только установку на ОС Linux, и даже более конкретно, Debian. Я привык работать с ней, а команды на других основных дистрибутивах различаются незначительно, поэтому нет смысла растягивать статью. Так же я буду использовать только скрипт LGSM, поскольку считаю его самым эффективным бесплатным инструментом для управления сервером Counter-strike 1.6.
- FTP клиент. Я пользуюсь FileZilla
- SSH клиент. Я пользуюсь PuTTY
- (Опционально) Хороший текстовый редактор. Я использую Notepad++ (notepad-plus-plus.org)
Вы можете использовать те решения, что нравятся вам.
...я возлагаю на вас самих. Существует великое множество хостингов, разнящихся ценами, оборудованием, локацией и т.п. Рассматривать этот аспект здесь нет никакого смысла. Кто-то вообще содержит свой собственный домашний сервер.
Скажу лишь примерные характеристики виртуальной машины, на которые вам желательно ориентироваться.
- Процессор: рекомендую 2.5-3.5 ГГц, 1 ядро под каждый сервер. То есть если вы собираетесь держать два сервера, заказываете 2 ядра и т.д.
- Оперативная память: 2гб, если вы собираетесь устанавливать http сервер и базу данных MySQL, в противном случае хватит и 1гб.
- Жёсткий диск (или SSD): 10гб вполне хватит на 1-2 сервера.
Итак, мы определились с выбором хостинга и арендовали сервер. На некоторых хостингах требуется вручную начать установку системы.
Для начала, заходим в панель управления сервером и ищем там данные для подключения к нему. Нас интересует подключение по SSH и IP-адрес сервера.
После того как мы получили данные (рекомендую их записать куда-нибудь в надёжное место, например создать текстовый документ), открываем PuTTY и добавляем туда подключение к нашему серверу. Тип соединения ставим SSH, вводим IP и пароль нашего сервера. Подключиться!
Мы попадаем на страницу входа в аккаунт. Открываем данные, которые мы записали минуту назад и заходим.
После того как мы вошли в учётную запись root, и перед тем, как мы приступим к первичной настройке виртуальной машины, необходимо обновить весь имеющийся у нас софт. Вводим в консоль:
apt update && apt full-upgrade
и дожидаемся окончания выполнения команд.
Примечание: Если на вашем хостинге недоступна последняя версия дистрибутива ОС, и стоит, например Debian 10, то apt update
может выдать вам следующее:
E: Repository 'http://security.debian.org/debian-security buster/updates InRelease' changed its 'Suite' value from 'stable' to 'oldstable'
N: This must be accepted explicitly before updates for this repository can be applied. See apt-secure(8) manpage for details.
Здесь система сообщает нам о том, что репозитории поменяли свою метку со stable на oldstable и предложит согласиться с изменениями: Do you want to accept these changes and continue updating from this repository? [y/N]
. Соглашаемся, жмём enter, пока не начнётся установка.
Теперь приступим к первичной настройке виртуальной машины.
Для начала, нам нужно создать нового пользователя и наделить его правами администратора, так как не рекомендуется работать из-под root пользователя в целях безопасности.
Вводим adduser имя_пользователя
. Например:
adduser public_server
Система попросит нас ввести поочерёдно пароль для пользователя, затем подтверждение пароля. Дальше нас просят ввести информацию о пользователе, но это делать совершенно не обязательно. Нажимаем последовательно enter, дожидаясь вопроса Is the information correct? [Y/n]
, и вводим Y, enter.
Установим пакет sudo, отвечающий за выполнение администраторских команд не от root юзера.
apt install sudo
Далее предоставим новоиспечённому пользователю права администратора.
Вписываем usermod -aG sudo имя_пользовтеля
. У нас это:
usermod -aG sudo public_server
Следующим шагом выполним установку и базовую настройку брандмауэра. Те, кто хочет использовать другие решения по защите сети, например iptables или защиту от хостинга, могут пропустить этот шаг.
Для начала установим пакет UFW
. Вписываем в терминал:
apt install ufw
Это и есть наш брандмауэр. Переходим к его настройке. Для начала запретим все входящие соединения и разрешим исходящие. Выполняем команду:
ufw default deny incoming && ufw default allow outgoing
Теперь нам надо разрешить те входящие соединения, которые потребуются нам для корректной работы сервера. Прежде всего разрешим SSH, так как это, собственно, доступ к терминалу сервера. Вводим:
ufw allow ssh
Затем разрешим http соединения, которые понадобятся для быстрой загрузки (и работы веб-дополнений).
ufw allow http
Те, кто собирается организовывать, например, полноценный форум или сайт, скорее всего будут использовать протокол с шифрованием, так что им следует разрешить ещё и https:
ufw allow https
И конечно же, нам потребуется разрешить входящие соединения на порт, который будет использовать игровой сервер. У меня это стандарт - 27015. Выполняем:
ufw allow 27015
Теперь активируем брандмауэр командой:
ufw enable
Система предупредит вас, что активация может прервать соединение, но поскольку мы настроили всё правильно, соглашаемся, нажав Y и enter.
На этом настройка брандмауэра окончена. Если вы сомневаетесь в её правильности, проверить можно, выполнив команду ufw status verbose
. Если защита включена, вы получите список разрешающих/запрещающих правил.
На всякий случай приведу здесь базовые команды для отключения/сброса брандмауэра.
ufw disable
- отключение.ufw reset
- сброс.ufw status numbered
- вывод списка активных правил и их номеров.ufw delete номер_правила
- удаление определённого правила по его номеру.
Теперь переходим к мозгу нашего будущего сервера: скрипту, управляющему сервером.
Переходим в пользователя, которого мы создали на предыдущем этапе: su - public_server
.
Для начала установим зависимости — пакеты, которые требуются для нормальной работы скрипта. Вводим в терминал:
sudo dpkg --add-architecture i386; sudo apt update; sudo apt install curl wget file tar bzip2 gzip unzip bsdmainutils python util-linux ca-certificates binutils bc jq tmux netcat lib32gcc1 lib32stdc++6
Вводим пароль пользователя для подтверждения и ждём завершения.
Примечание: на Debian 11 я получил предупреждение о том, что пакет lib32gcc1
в репозитории был заменён пакетом lib32gcc-s1
. Если вы получили такое же сообщение, просто замените название пакета в строке выше.
Далее выполняем команду, загружающую скрипт в текущую папку:
wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh csserver
На текущем этапе, если вы хотите задать своё имя скрипта, вместо стандартного csserver
, это можно легко сделать. В противном случае, этот шаг можно пропустить.
Ниже по тексту я не буду изменять имя скрипта со стандартного, чтобы не было путаницы.
Чтобы переименовать скрипт, воспользуйтесь командой mv
:
mv csserver новое_имя
Например: mv csserver public
.
Запускаем автоматическую установку командой:
./csserver auto-install
Скрипт сам проверит, установлены ли все зависимые компоненты, и если нет, установит их. Если установка скрипта и сервера прошла успешно, вы получите соответствующую надпись об этом.
Теперь можно попробовать запустить сервер для проверки. Пишем в терминале:
./csserver start
Если всё успешно, можно попробовать подсоединиться к серверу. Для подключения используйте IP VDS-сервера и стандартный порт 27015.
Примечание: на текущем этапе зайти на сервер можно только с лицензионной версии игры.
Важно: выходить из консоли следует только через сочетание клавиш CTRL + B
, затем D
. Если вы попытаетесь выйти из консоли нажав по обыкновению CTRL + C
, это завершит процесс сервера.
На этом этапе можно сразу же активировать создание полных краш-логов. Иначе если у вас будет падать сервер, вам никто не сможет помочь. Делается это быстро и просто.
Устанавливаем через терминал пакет gdb, пишем:
apt install gdb
Подключаемся к серверу через FileZilla, используя SFTP протокол. Для этого вводим в поле "Хост" адрес вашего сервера, логин и пароль в соответствующие поля (не забываем, что войти нам сейчас надо не за root, а за пользователя, у которого установлен наш скрипт), а в поле "Порт" пишем "22", что соответствует SFTP. Подключаемся.
Мы попадаем в домашнюю директорию пользователя, в примере я использовал public_server
.
Далее переходим в папку serverfiles
через FileZilla и находим здесь файл hlds_run
.
Открываем его для редактирования. Поиском находим такую строку:
ulimit -c 2000
и заменяем 2000 на "unlimited", чтобы получилось так:
ulimit -c unlimited
На этом всё! Сохраняем и закрываем файл.
Теперь можно перейти к настройкам скрипта. Первое, что нам нужно сделать, это сконфигурировать основные настройки.
Заходим через FTP-клиент в папку lgsm -> config-lgsm -> csserver
. Здесь хранятся конфиги LGSM.
Нас интересует конфиг csserver.cfg
, который отвечает за наш игровой сервер.
Открываем его и производим первичную настройку.
Все доступные параметры можно посмотреть в стандартном конфиге _default.cfg
, который находится в этой же директории. Описания к ним можно прочитать по ссылкам, приведённым в конфиге.
Я приведу пример своих настроек.
##################################
####### Instance Settings ########
##################################
# PLACE INSTANCE SETTINGS HERE
## These settings will apply to a specific instance.
#### Game Server Settings ####
## Predefined Parameters | https://docs.linuxgsm.com/configuration/start-parameters
ip="0.0.0.0"
port="27015"
clientport="27005"
defaultmap="de_dust2"
maxplayers="16"
## Server Parameters | https://docs.linuxgsm.com/configuration/start-parameters#additional-parameters
startparameters="-game cstrike -strictportbind +ip ${ip} -port ${port} +clientport ${clientport} +map ${defaultmap} +servercfgfile ${servercfg} -maxplayers ${maxplayers} -pingboost 3 -debug"
#### LinuxGSM Settings ####
## Backup | https://docs.linuxgsm.com/commands/backup
maxbackups="4"
maxbackupdays="30"
stoponbackup="on"
## Logging | https://docs.linuxgsm.com/features/logging
consolelogging="on"
logdays="7"
#### Directories ####
# Edit with care
## Game Server Directories
systemdir="${serverfiles}/cstrike"
executabledir="${serverfiles}"
executable="./hlds_run"
servercfgdir="${systemdir}"
servercfg="${servercfgdefault}"
servercfgdefault="server.cfg"
servercfgfullpath="${servercfgdir}/${servercfg}"
Вообще, на мой взгляд здесь интуитивно всё понятно, но всё-таки я считаю должным пройтись по этому конфигу.
ip
- отвечает за IP сервера. Если на предыдущем шаге у вас получилось зайти на сервер, оставьте его в стандартном виде.0.0.0.0
- обозначает автоматическое определение IP-адреса. В противном случае можно попробовать вставить сюда непосредственно IP сервера.port
- желаемый порт сервера. Не забываем давать доступ к нему через UFW.clientport
- клиентский порт. Не трогаем.defaultmap
- карта, с которой будет стартовать сервер.maxplayers
- кол-во слотов сервера.startparameters
- параметры запуска сервера.maxbackups
- максимальное кол-во хранимых бэкапов сервера.maxbackupdays
- сколько дней будет храниться каждый бэкап.stoponbackup
- останавливать ли сервер во время бэкапа. Лучше оставить включённым.consolelogging
- лог всего происходящего в консоли сервера. На мой взгляд, очень удобная фича, которой не хватает на хостингах.logdays
- сколько дней будут храниться логи.systemdir
- директория, где находится корневая папка игрового сервера.executabledir
- директория, где находится корневая папка самого скрипта.executable
- название исполняемого файла скрипта. Не рекомендую трогать само название, но сюда можно приписать параметры запуска процесса сервера, например привязку к определённому ядру процессора.servercfgdir
- директория, где находится конфиг игрового сервера (server.cfg).servercfg
- название конфига игрового сервера.Здесь я изменил значение на"${servercfgdefault}"
, чтобы использовать более привычное для CS 1.6 названиеserver.cfg
. По стандарту здесь указано"${selfname}.cfg"
- название конфига по имени скрипта. В результате было:csserver.cfg
.servercfgdefault
- стандартное название конфига. Не меняем.servercfgfullpath
- полный путь до конфига сервера.
После того как настроили конфиг, перезапускаем сервер командой ./csserver restart
, чтобы настройки применились.
Лучше всего сразу изучить команды, которыми располагает наш скрипт. Для этого введём ./csserver
- тогда появится список всех команд с их описанием.
Я приведу с переводом здесь основные, которые могут нам понадобиться.
Команда | Сокращение | Описание |
---|---|---|
start | st | Запускает сервер |
stop | sp | Останавливает сервер |
restart | r | Перезапускает сервер |
monitor | m | Проверяет доступность сервера и перезапускает его в случае падения |
test-alert | ta | Отправляет тестовое предупреждение (об этом позже) |
details | dt | Показывает основную информацию о сервере |
postdetails | pd | То же, что и предыдущее, только загружает информацию на сервис Termbin (аналог Pastebin) и выдаёт ссылку |
update-lgsm | ul | Проверяет и производит обновление скрипта LGSM |
backup | b | Делает бэкап сервера |
console | c | Открывает консоль игрового сервера |
send | sd | Даёт возможность отправить команду в консоль сервера, не заходя в неё |
Настало время выполнить немаловажную часть нашей работы — настроить расписания для автоматизации важных для работы сервера действий.
Сейчас мы установим:
- Перезагрузку виртуальной машины раз в месяц.
- Автоматический запуск сервера при включении виртуальной машины.
- Перезагрузку игрового сервера раз в сутки.
- Создание резервной копии сервера каждые две недели.
- "Мониторинг" сервера на предмет падений.
Приступим.
Делать будем всё при помощи стандартной утилиты Linux - "crontab".
Для начала, зайдём в терминале за пользователя root: su - root
. Вводим пароль. Далее вызываем окно редактирования crontab. Пишем:
crontab -e
Если вы выполняете эту команду впервые на текущей виртуальной машине, система попросит выбрать вас, какой текстовый редактор вы предпочитаете использовать (и если в вашем дистрибутиве установлено несколько редакторов "из коробки"). В моём случае мне предложили Vim или nano. Всем новичкам я настоятельно рекомендую выбрать именно nano, поскольку Vim имеет весьма специфическое управление.
Итак, вы выбрали редактор и перед вами открылся файл, содержащий cron jobs (именно так они называются). По умолчанию он пуст (не считая "комментариев"). Обратите внимание, что каждый cron job пишется с новой строки.
Стрелками на клавиатуре опускаем ввод в самый низ. Устанавливаем перезагрузку виртуальной машины. Разумнее будет сделать её под утро, когда на сервере низкий онлайн. Я выбрал время 4 утра.
0 4 1 * * reboot
Нажимаем CTRL + X, система предложит сохранить наш файл с заданиями. Жмём Y.
Можно проверить, что мы всё сделали правильно, пишем следующую команду:
crontab -l
которая выведет на экран содержимое файла. Если вы видите в конце строчку, которую только что вписали, значит всё в порядке.
Далее, для работы с заданиями по игровому серверу, лучше всего использовать юзера, под которым работает наш скрипт. Можно перейти в учётную запись этого юзера и повторить действия выше, а можно просто отредактировать файл заданий того юзера, не выходя с root.
Пишем:
crontab -u имя_пользователя -e
Откроется такой же самый файл, только в дальнейшем он будет исполняться от нашего пользователя, запускающего LGSM.
Настроим автоматический запуск сервера после включения виртуальной машины:
@reboot ./csserver st > /dev/null 2>&1
Установим перезагрузку игрового сервера раз в сутки. Опять же, ранним утром:
0 4 * * * ./csserver r > /dev/null 2>&1
Далее зададим резервное копирование раз в две недели (в 04:05, после перезагрузки):
5 4 */14 * * ./csserver b > /dev/null 2>&1
И наконец, добавим мониторинг сервера на доступность.
Команда monitor
, которая будет проверять сервер на предмет падений, например, каждые 5 минут:
*/5 * * * * ./csserver m > /dev/null 2>&1
Для справки: > /dev/null 2>&1
- используется для блокировки текстового вывода на экран от выполнения команды.
- Home - LinuxGSM_
- Crontab.guru - The cron schedule expression editor - неплохой сервис для настройки времени cron'ов.
Теперь пришло время заняться самим игровым сервером. И начнём мы с движка.
Переходим по ссылке: Releases · dreamstalker/rehlds (github.com). Скачиваем и устанавливаем последний релиз.
Установка предельна проста: выключаем наш сервер командой ./csserver sp
и просто загружаем файлы через FileZilla в корневую папку сервера (то есть /serverfiles), заменяя текущие. Включаем сервер, заходим в консоль и проверяем версию командой version
.
На момент написания статьи я получаю такой вывод:
Protocol version 48
Exe version 1.1.2.7/Stdio (cstrike)
ReHLDS version: 3.11.0.767-dev
Build date: 03:13:55 Oct 25 2021 (2753)
Build from: https://github.com/dreamstalker/rehlds/commit/471158b
Поскольку ReHLDS не имеет собственного конфига, мы создадим его своими руками. Переходим в папку cstrike и создаем файл rehlds.cfg
. Открываем его, и вписываем туда те квары1, которые привносит в движок именно ReHLDS. И добавим строчку, которая будет выводиться в консоль при чтении конфига.
echo Executing ReHLDS Configuration File
// Конфигурационный файл для ReHLDS
// Автоматически подгружать звуки, используемые в v_* моделях
sv_auto_precache_sounds_in_models "0"
// Загружать пользовательские спреи после входа в игру, а не при подключении. Это увеличивает скорость загрузки
sv_delayed_spray_upload "1"
// Выводить в консоль попытки использования неизвестных команд
sv_echo_unknown_cmd "1"
// Позволяет отключить логирование пароля RCON
sv_rcon_condebug "0"
// Исправлять застревание на передвижной платформе/энтити. (Глобальная проблема на DeathrunMod и на картах с транспортом эвакуации)
sv_force_ent_intersection "0"
// Принудительно выставить клиентский квар cl_dlmax 1024. Позволяет избежать чрезмерной фрагментации пакетов
sv_rehlds_force_dlmax "1"
// Устанавливает размер энтити по центру
sv_rehlds_hull_centering "0"
// Отправлять mapcycle.txt в сообщении serverinfo (Не используется на клиенте)
sv_rehlds_send_mapcycle "0"
// Исправляет ошибку с анимациями модели игрока, когда игрок имеет присоединенные объекты (aiments). Может вызвать отставание анимации, когда cl_updaterate низка
sv_rehlds_attachedentities_playeranimationspeed_fix "0"
// Ограничить количество подключений с одного IP-адреса
sv_rehlds_maxclients_from_single_ip "5"
// Позволяет использовать свой список энтити для карт. Файл с энтити находится по адресу "maps/[map name].ent")
// 0 - использовать исходные энтити.
// 1 - использовать файлы .ent из каталога карт.
// 2 - использовать файлы .ent из каталога карт и создать новый файл .ent, если он отсутствует.
sv_use_entity_file "0"
// Функция локального игрового времени, которая уменьшает лаги, если у вас долго запущена одна и та же карта
sv_rehlds_local_gametime "0"
// Максимальный средний уровень «move» команд для бана
sv_rehlds_movecmdrate_max_avg "400"
// Время в минутах, на которое игрок будет забанен (0 - навсегда, отрицательное число - кикнуть)
sv_rehlds_movecmdrate_avg_punish "-1"
// Максимальное отклонение уровня «move» команд для бана
sv_rehlds_movecmdrate_max_burst "2500"
// Время в минутах, на которое игрок будет забанен (0 - навсегда, отрицательное число - кикнуть)
sv_rehlds_movecmdrate_burst_punish "-1"
// Максимальный средний уровень «string» команд для бана
sv_rehlds_stringcmdrate_max_avg "80"
// Время в минутах, на которое игрок будет забанен (0 - навсегда, отрицательное число - кикнуть)
sv_rehlds_stringcmdrate_avg_punish "-1"
// Максимальное отклонение уровня «string» команд для бана
sv_rehlds_stringcmdrate_max_burst "400"
// Время в минутах, на которое игрок будет забанен (0 - навсегда, отрицательное число - кикнуть)
sv_rehlds_stringcmdrate_burst_punish "-1"
// setinfo поля которые будут переданы клиентам от сервера.
// Если значение не установлено, то все поля будут переданы, за исключением приставки с подчеркиванием (к примеру _ah). Каждый ключ должен начинаться на слеш.
// Например "/name/model/*sid/*hltv/bottomcolor/topcolor"
// Больше информации: https://github.com/dreamstalker/rehlds/wiki/Userinfo-keys
sv_rehlds_userinfo_transmitted_fields ""
// Если включено, сервер будет устанавливать дополнительное случайное число независимо от клиента. Используется для того чтобы сломать norecoil в читах.
sv_usercmd_custom_random_seed "0"
Теперь открываем server.cfg
и добавляем в самый конец такие строки:
// Execute ReHLDS Config
exec "rehlds.cfg"
Готово!
Примечание:
Если вы будете устанавливать ReGameDLL (следующий шаг), чтение конфига ReHLDS лучше добавить в его конфиг - game.cfg
.
Так же при обновлении ReGameDLL, если вы обновляете его конфиг, не забывайте и про строчки с конфигом ReHLDS.
Далее поставим ReGameDLL.
Повторяем предыдущие действия, скачиваем последний релиз с GitHub: Releases · s1lentq/ReGameDLL_CS (github.com).
Выключаем сервер, заменяем файлы в корне сервера, включаем обратно. Проверяем свои действия командой в консоли game version
.
На текущий момент увидим следующее:
ReGameDLL version: 5.21.0.540-dev
Build date: 17:33:16 Oct 25 2021
Build from: https://github.com/s1lentq/ReGameDLL_CS/commit/b9cccc6
Сразу, не отходя от кассы, можно настроить под свой сервер конфиг game.cfg
, отвечающий за геймплей на сервере.
Не стану разбирать его здесь, потому что, во-первых, это потребует целой отельной статьи, во-вторых, это слишком индивидуально от сервера к серверу и в-третьих, в нём уже имеются подписи к каждому квару.
Не забывайте добавить в game.cfg
чтение конфига ReHLDS из предыдущего шага.
Мы будем использовать Metamod-r, поскольку эта версия содержит множество оптимизаций и исправлений, а так же полностью совместима с ReHLDS.
Переходим по ссылке: Releases · theAsmodai/metamod-r (github.com) и скачиваем последний доступный релиз.
Загружаем в папку cstrike папку addons из архива, и переходим в неё, а далее в папку /metamod
. Удаляем файл metamod.dll
, поскольку он предназначен для Windows.
Здесь же создаём файл plugins.ini
- он понадобится нам для установки дополнений.
Теперь активируем Metamod, для этого вернёмся в папку cstrike, в которой ищем файл liblist.gam
и открываем его вашим текстовым редактором.
Нас интересует параметр gamedll_linux
.
Заменяем его значение на путь до .so-файла Metamod.
gamedll_linux "dlls/cs.so"
-> gamedll_linux "addons/metamod/metamod_i386.so"
Перезагружаем сервер.
На этом установка Metamod завершена.
Заходим в консоль и убеждаемся в том, что он работает, введя команду meta version
.
На момент написания статьи вы должны получить вот такой вывод:
Metamod-r v1.3.0.128, API (5:13)
Metamod-r build: 17:47:54 Aug 24 2018
Metamod-r from: https://github.com/theAsmodai/metamod-r/commit/0cf2f70
Здесь у вас есть выбор: ставить стабильную ветку разработки (версия 1.9.0) или же экспериментальную (1.10.0), куда вносится новый функционал. Лично я рекомендую 1.9.0, поскольку если вы не знакомы со скриптингом под AmxModX, версия 1.10.0 не даст вам абсолютно никаких преимуществ.
Итак, переходим по ссылке: AMX Mod X - Half-Life Scripting for Pros!. Находим самый последний билд, вверху таблицы, нажимаем на значок Linux, и скачиваем там Base Package, а так же Counter-Strike. Открываем оба архива, и загружаем в папку cstrike папку addons из них, сначала из Base Package, потом из Counter-Strike, соглашаясь на замену файлов.
Открываем ранее созданный нами файл со списком плагинов для Metamod по пути: addons/metamod/plugins.ini
и добавляем туда следующую строчку:
linux addons/amxmodx/dlls/amxmodx_mm_i386.so
Сохраняем и перезапускаем сервер.
Заходим в консоль и убеждаемся, в том что AmxModX работает, введя команду meta list
. В списке должна быть такая надпись:
[ 1] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5293 ini Start ANY
Если она есть, значит мы всё сделали правильно, и можно переходить к следующему шагу.
Здесь же можно сразу проверить, правильно ли мы настроили показ дампов падений сервера.
Создаём новый файл в любом месте у нас на компьютере и называем его, например, crash_test.sma
. Открываем его текстовым редактором и копируем туда следующий код:
#include <amxmodx>
#include <fakemeta>
public plugin_init()
{
register_plugin("Crash", "1.0", "Dev-CS Team");
// Generate exception code 0xC0000005
set_task(1.0, "GenerateExceptionCode");
}
public GenerateExceptionCode()
{
server_print("[Crash]: I call segmentation fault! Exception code: 0xC0000005");
// Put invalid pointer that will be generate access violation exception
set_tr2(0xDEADBEEF, TR_InWater, true);
}
Сохраняем.
Далее у нас есть два пути: скомпилировать файл на Windows или на Linux. Те, кто умеет компилировать плагины на Windows, могут скомпилировать его и переходить к следующему шагу с установкой.
Для остальных я вкратце расскажу, как скомпилировать плагин на Linux. Полная статья: Локальное компилирование плагинов | Dev-CS.ru
В FileZilla идём по пути serverfiles/cstrike/addons/amxmodx/scripting
.
Загружаем сюда наш файл crash_test.sma
.
Находим файл amxxpc
, кликаем на него правой кнопкой мыши и выбираем пункт Права доступа к файлу. В поле для ввода вписываем права 754
-> OK.
Открываем PuTTY. Теперь нам надо убедться, что мы в корневой папке пользователя, командой:
cd
Далее переходим в папку, куда мы поместили исходник плагина с краш-тестом:
cd serverfiles/cstrike/addons/amxmodx/scripting
Запускаем компиляцию:
./amxxpc crash_test.sma
Если вы увидели такой вывод на экран, значит вы сделали всё правильно:
AMX Mod X Compiler 1.9.0.5293
Copyright (c) 1997-2006 ITB CompuPhase
Copyright (c) 2004-2013 AMX Mod X Team
Header size: 300 bytes
Code size: 288 bytes
Data size: 456 bytes
Stack/heap size: 16384 bytes
Total requirements: 17428 bytes
Done.
Не забывайте снова вернуться в корневую папку пользователя командой cd
.
Дальше разворачиваем опять FileZilla, находим в той же папке scripting наш новый файл crash_test.amxx
(не .sma!) и перетаскиваем его на две точки вверху, чтобы переместить в директорию выше.
Следуем стандартной процедуре установки плагинов: перетаскиваем файл в папку plugins, переходим в папку configs, находим там файл plugins.ini
и вставляем в самый конец: crash_test.amxx
. Сохраняем.
Теперь перезагрузим наш сервер и посмотрим, что получилось. В терминале выполняем: ./csserver r
.
Не забудьте сразу отключить плагин краш-теста сервера! Закомментируйте или удалите его название в plugins.ini
.
Разворачиваем FTP и переходим в папку serverfiles. Здесь ищем файл debug.log
и открываем его.
Если вы видите примерно такое содержание:
----------------------------------------------
CRASH: Sat 16 Oct 2021 07:27:08 AM MSK
Start Line: ./hlds_linux -game cstrike -strictportbind +ip 0.0.0.0 -port 27015 +clientport 27005 +map de_dust2 +servercfgfile server.cfg -maxplayers 16 -pingboost 3 -debug -pidfile hlds.5833.pid
[New LWP 5870]
[New LWP 5871]
[New LWP 5876]
[New LWP 5877]
[New LWP 5878]
[New LWP 5879]
[New LWP 5880]
[New LWP 5881]
[New LWP 5872]
[Thread debugging using libthread_db enabled]
Using host libthread_db library "/lib/x86_64-linux-gnu/libthread_db.so.1".
Core was generated by `./hlds_linux -game cstrike -strictportbind +ip 0.0.0.0 -port 27015 +clientport'.
Program terminated with signal SIGSEGV, Segmentation fault.
#0 0xf265935b in set_tr2(tagAMX*, int*) () from cstrike/addons/amxmodx/modules/fakemeta_amxx_i386.so
[Current thread is 1 (Thread 0xf7b8c700 (LWP 5870))]
#0 0xf265935b in set_tr2(tagAMX*, int*) () from cstrike/addons/amxmodx/modules/fakemeta_amxx_i386.so
#1 0xf293bb08 in CLog::LogError(char const*, ...)::msg () from /home/cs/serverfiles/cstrike/addons/amxmodx/dlls/amxmodx_mm_i386.so
#2 0xf24f9454 in ?? ()
Backtrace stopped: previous frame inner to this frame (corrupt stack?)
No symbol table info available.
From To Syms Read Shared Object Library
0xf7f5b130 0xf7f5c1c4 Yes (*) /lib/i386-linux-gnu/libdl.so.2
0xf7ecd914 0xf7f13c78 Yes ./libstdc++.so.6
0xf7d8b170 0xf7e4c4af Yes (*) /lib/i386-linux-gnu/libm.so.6
0xf7bbc0e0 0xf7d08d76 Yes (*) /lib/i386-linux-gnu/libc.so.6
0xf7f6f090 0xf7f8a50b Yes (*) /lib/ld-linux.so.2
0xf7b8fe04 0xf7b9f490 Yes ./libgcc_s.so.1
0xf74b02b0 0xf75a0660 Yes (*) /home/cs/serverfiles/engine_i486.so
0xf74733d0 0xf7476cb4 Yes (*) /lib/i386-linux-gnu/librt.so.1
0xf74605c0 0xf746ad74 Yes (*) ./libsteam_api.so
0xf74425e0 0xf7451eff Yes (*) /lib/i386-linux-gnu/libpthread.so.0
0xf7417e00 0xf7433838 Yes (*) /home/cs/serverfiles/filesystem_stdio.so
0xf567e000 0xf6bdb0c4 Yes (*) /home/cs/.steam/sdk32/steamclient.so
0xf2cfa6a0 0xf2d3cf70 Yes (*) /home/cs/serverfiles/./cstrike/addons/metamod/metamod_i386.so
0xf2a95280 0xf2c2c0b0 Yes (*) /home/cs/serverfiles/cstrike/dlls/cs.so
0xf2779a20 0xf27dcdb7 Yes (*) /home/cs/serverfiles/cstrike/addons/amxmodx/dlls/amxmodx_mm_i386.so
0xf2702b60 0xf274a624 Yes (*) cstrike/addons/amxmodx/modules/hamsandwich_amxx_i386.so
0xf2671120 0xf2677404 Yes (*) cstrike/addons/amxmodx/modules/csx_amxx_i386.so
0xf262f9d0 0xf265bd6c Yes (*) cstrike/addons/amxmodx/modules/fakemeta_amxx_i386.so
0xf0328000 0xf18468a4 Yes (*) ./steamclient.so
0xf2260670 0xf22d6020 Yes (*) ./crashhandler.so
0xf24db300 0xf24e1cd4 Yes (*) /lib/i386-linux-gnu/libnss_files.so.2
0xf24d21c0 0xf24d51f4 Yes (*) /lib/i386-linux-gnu/libnss_dns.so.2
0xf24ba3a0 0xf24c6014 Yes (*) /lib/i386-linux-gnu/libresolv.so.2
(*): Shared library is missing debugging information.
Stack level 0, frame at 0xff9c4734:
eip = 0xf265935b in set_tr2(tagAMX*, int*); saved eip = 0xf293bb08
called by frame at 0xff9c4738
Arglist at 0xff9c472c, args:
Locals at 0xff9c472c, Previous frame's sp is 0xff9c4734
Saved registers:
ebx at 0xff9c4728, ebp at 0xff9c472c, esi at 0xff9c4720, edi at 0xff9c4724, eip at 0xff9c4730
End of crash report
----------------------------------------------
Значит у вас всё получилось. В противном случае вы увидите урезанный краш-лог:
----------------------------------------------
CRASH: Wed 13 Oct 2021 09:16:04 PM MSK
Start Line: ./hlds_linux -game cstrike -strictportbind +ip 0.0.0.0 -port 27015 +clientport 27005 +map de_dust2 +servercfgfile server.cfg -maxplayers 16 -pingboost 3 -debug -pidfile hlds.20701.pid
End of crash report
----------------------------------------------
Попробуйте перечитать и выполнить заново шаг с активацией полных краш-логов.
Итак, для полноценной работы сервера нам необходимо настроить быструю загрузка файлов (FastDL). В противном случае, если у вас не стандартный сервер с дополнительными ресурсами, никто не захочет качать их по 10 минут.
Начнём с установки веб-сервера Nginx. Пишем:
sudo apt install nginx
После установки он автоматически начнёт свою работу. Проверить это можно зайдя на адрес нашего сервера в браузере. Если вы видите страницу с текстом: # Welcome to nginx!
, значит всё прошло успешно.
Теперь перейдён к конфигурации Nginx под сервер быстрой загрузки.
Для этого заходим под root пользователем через FileZilla, и идём по следующему пути: /etc/nginx/sites-available
. Здесь будет находиться файл конфига nginx по умолчанию (default
).
Открываем его для редактирования. В разделе server, перед закрывающей скобкой '}', вставляем следующее:
# Быстрая загрузка для Counter-Strike
location /cstrike/ {
alias /home/public_server/serverfiles/cstrike/;
autoindex on;
location ~* (\.wad$|(maps|sprites|models|gfx|sound|media|overviews)/.*(bsp|mdl|spr|wav|mp3|bmp|tga|txt|res)$) {
allow all;
}
deny all;
}
Где /home/public_server/serverfiles/cstrike/
- это путь до папки cstrike на нашем сервере. Проверьте его и исправьте на свой вариант, если он отличается.
Сохраняем этот файл и проверяем его на корректность. Для этого нам понадобится такая команда:
sudo nginx -t
Если мы получили сообщение, что все конфиги в порядке, перезагружаем Nginx:
sudo service nginx restart
Теперь можно проверить, что у нас получилось. Снова открываем браузер, заходим на наш веб сервер и пытаемся скачать какой-нибудь файл, например карту de_dust2.
http://адрес_сервера/fastdl/maps/de_dust2.bsp
Если она скачалась, значит вы всё сделали правильно!
Теперь откроем конфиг игрового сервера (server.cfg) и добавим туда следующие квары:
sv_allowdownload 1
sv_downloadurl "http://адрес_сервера/fastdl/"
На этом основная настройка сервера завершена!
- Как установить LEMP на Debian 9 – База знаний Timeweb Community
- Правильная настройка FastDL на VDS (c-s.net.ua)
Наиболее вероятно, к вам на сервер будут заходить игроки с пиратской копией игры (Non-steam). Возможно, даже вы сами. Однако, они не смогут подключиться к серверу без специального модуля, обеспечивающего игру на сервере для пиратских клиентов.
Скачать Reunion можно отсюда:
- CS.RIN.RU - Steam Underground Community • Просмотр темы - Reunion 0.1.92 - no-steam for ReHLDS
- addons Reunion | Dev-CS.ru
Требуется регистрация, но зато это надёжные источники, за которые я могу поручиться. На момент написания статьи стабильная версия - 0.1.92d.
Помещаем бинарный файл reunion_mm_i386.so
по пути addons/reunion/
, затем прописываем в файле Metamod-плагинов:
linux addons/reunion/reunion_mm_i386.so
После этого помещаем файл конфигурации reunion.cfg
из архива в папку cstrike.
Важно!: Reunion должен быть на первом месте в списке meta плагинов.
Важно!:
Даже если вы не собираетесь проводить глубокую настройку Reunion, настоятельно рекомендуется задать "соль". Это нужно, чтобы чтобы никто не мог взять SteamID другого игрока.
Находим в конфиге строку SteamIdHashSalt
и вписываем туда набор из случайных символов длиной не менее 16-ти знаков.
Перезапускаем сервер, чтобы модуль начал свою работу.
Теперь убедимся, что он работает. В консоли сервера пишем уже знакомую нам команду meta list
. Reunion должен иметь статус RUN:
Currently loaded plugins:
description stat pend file vers src load unlod
[ 1] Reunion RUN - reunion_mm_i386.so vX.X.X ini Start Never
На этом установка завершена.
Важно!: По более тонкой настройке Reunion есть отличный гайд по этой ссылке: Подмена SteamID | Dev-CS.ru Если вы собираетесь содержать выделенный сервер для всех, а не просто поиграть с друзьями или ботами, я рекомендую выполнить настройку по статье выше.
Большинство серверодержателей наверняка захотят установить CSBans или другие веб-дополнения. Я расскажу, как установить основные необходимые для этого инструменты: PHP и MySQL.
Начнём мы с установки СУБД2.
Вводим команду:
sudo apt install mariadb-server
После установки необходимо произвести конфигурацию командой:
sudo mysql_secure_installation
Сейчас нам предложат указать пароль для root пользователя MariaDB, если он был уже указан. Посльку мы только установили эту СУБД, оставляем поле пустым и жмём enter.
В некоторых случаях на текущем этапе система может предложить переключиться на unix_socket аутентификацию (Switch to unix_socket authentication [Y/n]
). Отклоняем.
Теперь нам предложат сменить пароль для root пользователя (Change the root password? [Y/n]
). Соглашаемся и задаём свой пароль.
В ином случае, если вам будет сразу предложено задать пароль для root пользователя (Set root password? [Y/n]
), соглашайтесь и задайте его.
Далее идёт стандартная процедура настройки, система предложит удалить анонимных пользователей, отключить удалённый доступ к root пользователю, удалить тестовую базу данных и перезагрузить таблицу привелегий. Во всех вариантах можете выбрать Y.
На этом установка завершена.
Но теперь нам необходимо создать нового пользователя MySQL чтобы использовать его из-под игрового сервера. Заходим в нашу базу данных под root пользователем:
mysql -u root -p
Теперь создадим пользователя (admin - логин и password - пароль укажите свои):
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
Затем выдадим этому пользователю все привилегии:
GRANT ALL PRIVILEGES ON * .* TO 'admin'@'localhost';
И пишем exit
для выхода из БД.
На этом установка базы данных завершена!
Данное действие почти не займёт у вас времени, поскольку PHP не нуждается в дополнительной настройке.
Вводим в консоль:
apt install php-fpm php-mysql
На этом установка завершена. Но на всякий случай проверим, всё ли в порядке.
Переходим в FileZilla по следующему пути: /var/www/html
.
Здесь создаём файл info.php
. Открываем его и вставляем туда следующее содержание:
<?php
phpinfo();
?>
Сохраняем.
В браузере переходим по адресу нашего файла, т.е.: http://адрес_сервера/info.php
.
Если вы видите страницу с конфигурацией php, значит вы всё сделали правильно.
Если вам не нужна панель для управления базами данных MySQL, можете пропустить этот шаг.
Для начала установим необходимые компоненты:
apt install php-mbstring mcrypt
Теперь приступим к установке самой утилиты:
apt install phpmyadmin
Сначала нам будет предложено выбрать сервер для работы с приложением. К сожалению, Nginx нет в списке, так что снимаем выбор с обеих строк и нажимаем ОК. Следующим шагом будет автоматическое создание баз данных для phpmyadmin, соглашаемся. После этого у нас попросят ввести пароль для пользователя phpmyadmin. Вводим.
Затем нам понадобится включить расширение mcrypt
, что мы и делаем:
phpenmod mcrypt
И последний шаг. Открываем уже знакомый нам конфиг Nginx по пути /etc/nginx/sites-available
.
Находим следующую строку:
# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
Добавляем в этот список index.php
. Должно получиться так:
# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
Затем вставляем в конец общего раздела конфигурацию для phpmyadmin:
# Конфигурация для phpmyadmin
location /phpmyadmin {
alias /usr/share/phpmyadmin/;
location ~ \.php$ {
fastcgi_pass unix:/var/run/php/php7.4-fpm.sock;
fastcgi_index index.php;
fastcgi_param SCRIPT_FILENAME $request_filename;
include fastcgi_params;
fastcgi_ignore_client_abort off;
}
location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ {
access_log off;
log_not_found off;
expires 1M;
}
}
Сохраняем файл. Как обычно проверяем конфигурацию командой nginx -t
, исправляем ошибки, если они есть. Перезагружаем Nginx.
На этом всё!
Теперь идём смотреть, что у нас получилось. В браузере переходим по ссылке: http://адрес_сервера/phpmyadmin
. Если вы видите страницу входа в phpmyadmin, значит установка прошла успешно.
Во избежание непредвиденных ситуаций, можно так же настроить бэкап баз данных MySQL.
Воспользуемся инструментом mysqldump
и уже знакомым нам crontab
.
На мой взгляд, хранить резервные копии удобнее в директории сервера, поэтому надо перейти за того пользователя, у которого установлен сервер. У нас это public_server
.
Открываем редактор crontab и самый конец файла вписываем такую строку:
0 12 */7 * * mysqldump -u admin -ppassword -A > db.sql
Синтаксис:
mysqldump -u [пользователь mysql] -p[его пароль] -A > [название базы данных].sql
Обратите внимание, что -p
и последующий пароль пользователя пишутся слитно.
О том, как настроить время в crontab, было описано в разделе "Настройка расписаний".
В примере у нас получилось следующее: Каждый седьмой день месяца (раз в неделю) в 12 часов дня будет создан дамп за mysql пользователя admin с паролем password и будет помещён в корневую папку пользователя, за которого запущен crontab (у нас это public_server
), с названием db.sql.
Можно помещать файл в каталог, но в таком случае он должен быть заранее создан. Пример команды:
mysqldump -u admin -ppassword -A > mysql_backup/db.sql
В LGSM так же можно включить оповещения о недоступности сервера, если команда monitor
её выявила.
Есть довольно большой список мессенджеров и служб для оповещения, но они больше популярны на западе, чем в странах СНГ. Для нас можно выделить Email, Telegram и Discord. С полным списком можно ознакомиться здесь: Alerts - LinuxGSM_.
Здесь я рассмотрю подключение к Telegram.
Итак, первое, что нам нужно сделать, это создать бота в телеграме.
Переходим по этой ссылке Telegram: Contact @BotFather или ищем в телеграме @BotFather, если он у вас не установлен на компьютере.
Запускаем этого бота и выполняем команду /newbot
.
Следуя инструкциям, задаём боту имя и никнейм. В результате у нас появится токен бота, который нам надо будет указать в настройках скрипта.
Открываем конфиг LGSM по уже знакомому нам пути:lgsm/config-lgsm/csserver/csserver.cfg
.
В самый конец добавляем:
## Notification Alerts
# (on|off)
# More info | https://docs.linuxgsm.com/alerts#more-info
postalert="on"
# Telegram Alerts | https://docs.linuxgsm.com/alerts/telegram
# You can add a custom cURL string eg proxy (useful in Russia) in "curlcustomstring".
# For example "--socks5 ipaddr:port" for socks5 proxy see more in "curl --help".
telegramalert="on"
telegramtoken="token"
telegramchatid="chatid"
Итак, рассмотрим приведённые здесь параметры.
postalert
- позволяет получить дополнительную информацию о сервере на момент неисправности и загружает её на Termbin, аналогично команде./csserver postdetails
.telegramalert
- собственно, включить или нет оповещения в Telegram.telegramtoken
- сюда нужно вставить токен нашего нового бота.telegramchatid
- здесь надо указать индекс вашего с ботом чата. Об этом ниже.
Вставляем полученный на предыдущем шаге индекс бота в параметр telegramtoken
.
Затем в браузере переходим по следующему пути:
https://api.telegram.org/botXXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX/getUpdates
Где XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- заменяем на токен бота. Например:
https://api.telegram.org/bot3104437352:AAE2XjHxOIBbfM2U1HStmcOkLdCTw5DJsjY/getUpdates
Оставляем вкладку открытой.
Теперь пишем боту любое сообщение, например LGSM test
. Затем обновляем страницу, и у нас должны появиться технические параметры сообщения.
Ищем наше сообщение в конце строки и двигаемся к её началу, чтобы найти данные примерно такого вида: "chat":{"id":845483018,
.
Число 845483018
- это и будет индекс чата, который нам нужен. Копируем его и вставляем в параметр telegramchatid
.
Закрываем конфиг и сохраняем его. На этом настройка оповещений завершена.
Мы можем проверить их работоспособность. Для этого воспользуемся командой скрипта ./csserver test-alert
.
В результате её выполнения нам в телеграм должен написать наш новый бот с тестовым оповещением.
- Telegram - LinuxGSM_ Примечание: здесь же можно найти инструкцию о том, как подключить бота к группе, а не только к личному чату.
Примечание: На момент написания статьи оповещение в телеграм выдаёт ошибку.
Чтобы её исправить, я использовал код из предыдущего коммита в необходимом файле (alert_telegram.sh
).
Так же я отправил разработчикам баг-репорт. Надеюсь, в скором времени они исправят этот баг.