Установка и первичная настройка игрового сервера Counter-strike 1.6 на VDS
Содержание:
apt update && apt full-upgrade
BashCopyE: 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.
C++CopyDo you want to accept these changes and continue updating from this repository? [y/N]
. Соглашаемся, жмём enter, пока не начнётся установка.adduser имя_пользователя
. Например:adduser public_server
BashCopyIs the information correct? [Y/n]
, и вводим Y, enter.apt install sudo
BashCopyusermod -aG sudo имя_пользовтеля
. У нас это:usermod -aG sudo public_server
BashCopyUFW
. Вписываем в терминал:apt install ufw
BashCopyufw default deny incoming && ufw default allow outgoing
BashCopyufw allow ssh
BashCopyufw allow http
BashCopyufw allow https
BashCopyufw allow 27015
BashCopyufw enable
BashCopyufw 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
BashCopylib32gcc1
в репозитории был заменён пакетом lib32gcc-s1
. Если вы получили такое же сообщение, просто замените название пакета в строке выше.wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh csserver
BashCopycsserver
, это можно легко сделать. В противном случае, этот шаг можно пропустить.mv
:mv csserver новое_имя
BashCopymv csserver public
../csserver auto-install
BashCopy./csserver start
BashCopyCTRL + B
, затем D
. Если вы попытаетесь выйти из консоли нажав по обыкновению CTRL + C
, это завершит процесс сервера.gdb
, пишем:apt install gdb
BashCopypublic_server
.serverfiles
через FileZilla и находим здесь файл hlds_run
.ulimit -c 2000
C++Copyulimit -c unlimited
C++Copylgsm -> 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}"
C++Copyip
- отвечает за 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 | Даёт возможность отправить команду в консоль сервера, не заходя в неё |
su - root
. Вводим пароль. Далее вызываем окно редактирования crontab. Пишем:crontab -e
BashCopy0 4 1 * * reboot
C++CopyCTRL + X
, система предложит сохранить наш файл с заданиями. Жмём Y
.crontab -l
BashCopycrontab -u имя_пользователя -e
BashCopy@reboot ./csserver st > /dev/null 2>&1
C++Copy0 4 * * * ./csserver r > /dev/null 2>&1
C++Copy5 4 */14 * * ./csserver b > /dev/null 2>&1
C++Copymonitor
, которая будет проверять сервер на предмет падений, например, каждые 5 минут:*/5 * * * * ./csserver m > /dev/null 2>&1
C++Copy> /dev/null 2>&1
- используется для блокировки текстового вывода на экран от выполнения команды../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
C++Copyrehlds.cfg
. Открываем его, и вписываем туда те квары, которые привносит в движок именно 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"
C++Copyserver.cfg
и добавляем в самый конец такие строки:// Execute ReHLDS Config
exec "rehlds.cfg"
C++Copygame.cfg
.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
C++Copygame.cfg
, отвечающий за геймплей на сервере.game.cfg
чтение конфига ReHLDS из предыдущего шага./metamod
. Удаляем файл metamod.dll
, поскольку он предназначен для Windows.plugins.ini
- он понадобится нам для установки дополнений.liblist.gam
и открываем его вашим текстовым редактором.gamedll_linux
.gamedll_linux "dlls/cs.so"
-> gamedll_linux "addons/metamod/metamod_i386.so"
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
C++Copyaddons/metamod/plugins.ini
и добавляем туда следующую строчку:linux addons/amxmodx/dlls/amxmodx_mm_i386.so
C++Copy[ 1] AMX Mod X RUN - amxmodx_mm_i386.so v1.9.0.5293 ini Start ANY
C++Copycrash_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);
}
C++Copyserverfiles/cstrike/addons/amxmodx/scripting
.crash_test.sma
.amxxpc
, кликаем на него правой кнопкой мыши и выбираем пункт Права доступа к файлу. В поле для ввода вписываем права 754
-> OK.cd
BashCopycd serverfiles/cstrike/addons/amxmodx/scripting
BashCopy./amxxpc crash_test.sma
BashCopyAMX 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.
C++Copycd
.crash_test.amxx
(не .sma!) и перетаскиваем его на две точки вверху, чтобы переместить в директорию выше.plugins.ini
и вставляем в самый конец: crash_test.amxx
. Сохраняем../csserver r
.plugins.ini
.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
----------------------------------------------
C++Copy----------------------------------------------
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
----------------------------------------------
C++Copysudo apt install nginx
BashCopy# Welcome to nginx!
, значит всё прошло успешно./etc/nginx/sites-available
. Здесь будет находиться файл конфига nginx по умолчанию (default
). # Быстрая загрузка для Counter-Strike
location /fastdl/ {
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;
}
C++Copy/home/public_server/serverfiles/cstrike/
- это путь до папки cstrike на нашем сервере. Проверьте его и исправьте на свой вариант, если он отличается.sudo nginx -t
BashCopysudo service nginx restart
BashCopyhttp://адрес_сервера/fastdl/maps/de_dust2.bsp
C++Copysv_allowdownload 1
sv_downloadurl "http://адрес_сервера/fastdl/"
C++Copyreunion_mm_i386.so
по пути addons/reunion/
, затем прописываем в файле Metamod-плагинов:linux addons/reunion/reunion_mm_i386.so
C++Copyreunion.cfg
из архива в папку cstrike.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
C++Copysudo apt install mariadb-server
BashCopysudo mysql_secure_installation
BashCopySwitch to unix_socket authentication [Y/n]
). Отклоняем.Change the root password? [Y/n]
). Соглашаемся и задаём свой пароль.Set root password? [Y/n]
), соглашайтесь и задайте его.mysql -u root -p
BashCopyCREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
SQLCopyGRANT ALL PRIVILEGES ON * .* TO 'admin'@'localhost';
SQLCopyexit
для выхода из БД.apt install php-fpm php-mysql
BashCopy/var/www/html
.<?php
phpinfo();
?>
PHPCopyhttp://адрес_сервера/info.php
.apt install php-mbstring mcrypt
BashCopyapt install phpmyadmin
BashCopymcrypt
, что мы и делаем:phpenmod mcrypt
BashCopy/etc/nginx/sites-available
.# Add index.php to the list if you are using PHP
index index.html index.htm index.nginx-debian.html;
C++Copyindex.php
. Должно получиться так:# Add index.php to the list if you are using PHP
index index.php index.html index.htm index.nginx-debian.html;
C++Copy # Конфигурация для 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;
}
}
C++Copynginx -t
, исправляем ошибки, если они есть. Перезагружаем Nginx.http://адрес_сервера/phpmyadmin
. Если вы видите страницу входа в phpmyadmin, значит установка прошла успешно.mysqldump
и уже знакомым нам crontab
.public_server
.0 12 */7 * * mysqldump -u admin -ppassword -A > db.sql
C++Copymysqldump -u [пользователь mysql] -p[его пароль] -A > [название базы данных].sql
BashCopy-p
и последующий пароль пользователя пишутся слитно.public_server
), с названием db.sql.mysqldump -u admin -ppassword -A > mysql_backup/db.sql
BashCopymonitor
её выявила./newbot
.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"
C++Copypostalert
- позволяет получить дополнительную информацию о сервере на момент неисправности и загружает её на Termbin, аналогично команде ./csserver postdetails
.telegramalert
- собственно, включить или нет оповещения в Telegram.telegramtoken
- сюда нужно вставить токен нашего нового бота.telegramchatid
- здесь надо указать индекс вашего с ботом чата. Об этом ниже.telegramtoken
.XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
- заменяем на токен бота. Например:LGSM test
. Затем обновляем страницу, открытую ранее, и у нас должны появиться технические параметры сообщения."chat":{"id":845483018,
.845483018
- это и будет индекс чата, который нам нужен. Копируем его и вставляем в параметр telegramchatid
../csserver test-alert
.alert_telegram.sh
).