• Установка и настройка сервера на VDS

Установка и первичная настройка игрового сервера Counter-strike 1.6 на VDS

Содержание
:

Часть 0. Предисловие

Copyright ©

Автор: Nordic Warrior. (Telegram: @NordicWarrior)
Первоисточником считать: Репозиторий на GitHub
Данная статья написана лично мной с использованием моего личного опыта и открытых источников, ссылки на которые я предоставляю в конце каждого раздела.
Распространение данной статьи запрещено без указания ссылки на первоисточник и никнейма (контакта) автора.
Дата написания: октябрь-ноябрь 2021 г.

Пара слов от автора
На написание данной статьи меня сподвигло отсутствие таковых подробных статей и инструкций по установке сервера на конец 2021 года.
Всё, что мне удавалось найти либо устарело, либо не было достаточно подробным или рассматривало только какой-то один процесс в установке сервера. Я решил сделать единый гайд, с актуальными сведениями, полностью подробный и понятный даже для незнакомых с этой сферой людей.

Примечание: Я буду рассматривать только установку на ОС Linux, и даже более конкретно, Debian. Я привык работать с ней, а команды на других основных дистрибутивах различаются незначительно, поэтому нет смысла растягивать статью. Так же я буду использовать только скрипт LGSM, поскольку считаю его самым эффективным бесплатным инструментом для управления сервером Counter-strike 1.6.

Софт, который нам понадобится:
  1. FTP клиент. Я пользуюсь FileZilla
  2. SSH клиент. Я пользуюсь PuTTY
  3. (Опционально) Хороший текстовый редактор. Я использую Notepad++ (notepad-plus-plus.org)
Вы можете использовать те решения, что нравятся вам.

Часть 1. Первичная настройка системы

Выбор хостинга...

...я возлагаю на вас самих. Существует великое множество хостингов, разнящихся ценами, оборудованием, локацией и т.п. Рассматривать этот аспект здесь нет никакого смысла. Кто-то вообще содержит свой собственный домашний сервер.

Скажу лишь примерные характеристики виртуальной машины, на которые вам желательно ориентироваться.
  • Процессор: рекомендую 2.5-3.5 ГГц, 1 ядро под каждый сервер. То есть если вы собираетесь держать два сервера, заказываете 2 ядра и т.д.
  • Оперативная память: 2гб, если вы собираетесь устанавливать http сервер и базу данных MySQL, в противном случае хватит и 1гб.
  • Жёсткий диск (или SSD): 10гб вполне хватит на 1-2 сервера.
Данные и вход
Итак, мы определились с выбором хостинга и арендовали сервер. На некоторых хостингах требуется вручную начать установку системы.

Для начала, заходим в панель управления сервером и ищем там данные для подключения к нему. Нас интересует подключение по SSH и IP-адрес сервера.

После того как мы получили данные (рекомендую их записать куда-нибудь в надёжное место, например создать текстовый документ), открываем PuTTY и добавляем туда подключение к нашему серверу. Тип соединения ставим SSH, вводим IP и пароль нашего сервера. Подключиться!

Мы попадаем на страницу входа в аккаунт. Открываем данные, которые мы записали минуту назад и заходим.

Подготовка виртуальной машины
После того как мы вошли в учётную запись root, и перед тем, как мы приступим к первичной настройке виртуальной машины, необходимо обновить весь имеющийся у нас софт. Вводим в консоль:
Bash:
apt update && apt full-upgrade
BashCopy
и дожидаемся окончания выполнения команд.

Примечание: Если на вашем хостинге недоступна последняя версия дистрибутива ОС, и стоит, например 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.
C++Copy
Здесь система сообщает нам о том, что репозитории поменяли свою метку со stable на oldstable и предложит согласиться с изменениями: Do you want to accept these changes and continue updating from this repository? [y/N]. Соглашаемся, жмём enter, пока не начнётся установка.

Добавление пользователя
Теперь приступим к первичной настройке виртуальной машины.
Для начала, нам нужно создать нового пользователя и наделить его правами администратора, так как не рекомендуется работать из-под root пользователя в целях безопасности.
Вводим adduser имя_пользователя. Например:
Bash:
adduser public_server
BashCopy
Система попросит нас ввести поочерёдно пароль для пользователя, затем подтверждение пароля. Дальше нас просят ввести информацию о пользователе, но это делать совершенно не обязательно. Нажимаем последовательно enter, дожидаясь вопроса Is the information correct? [Y/n], и вводим Y, enter.

Установим пакет sudo, отвечающий за выполнение администраторских команд не от root юзера.
Bash:
apt install sudo
BashCopy
Далее предоставим новоиспечённому пользователю права администратора.
Вписываем usermod -aG sudo имя_пользовтеля. У нас это:
Bash:
usermod -aG sudo public_server
BashCopy
Настройка брандмауэра (UFW)
Следующим шагом выполним установку и базовую настройку брандмауэра.
Те, кто хочет использовать другие решения по защите сети, например iptables или защиту от хостинга, могут пропустить этот шаг.

Для начала установим пакет UFW. Вписываем в терминал:
Bash:
apt install ufw
BashCopy
Это и есть наш брандмауэр. Переходим к его настройке.
Для начала запретим все входящие соединения и разрешим исходящие. Выполняем команду:
Bash:
ufw default deny incoming && ufw default allow outgoing
BashCopy
Теперь нам надо разрешить те входящие соединения, которые потребуются нам для корректной работы сервера.
Прежде всего разрешим SSH, так как это, собственно, доступ к терминалу сервера. Вводим:
Bash:
ufw allow ssh
BashCopy
Затем разрешим http соединения, которые понадобятся для быстрой загрузки (и работы веб-дополнений).
Bash:
ufw allow http
BashCopy
Те, кто собирается организовывать, например, полноценный форум или сайт, скорее всего будут использовать протокол с шифрованием, так что им следует разрешить ещё и https:
Bash:
ufw allow https
BashCopy
И конечно же, нам потребуется разрешить входящие соединения на порт, который будет использовать игровой сервер. У меня это стандарт - 27015. Выполняем:
Bash:
ufw allow 27015
BashCopy
Теперь активируем брандмауэр командой:
Bash:
ufw enable
BashCopy
Система предупредит вас, что активация может прервать соединение, но поскольку мы настроили всё правильно, соглашаемся, нажав Y и enter.
На этом настройка брандмауэра окончена. Если вы сомневаетесь в её правильности, проверить можно, выполнив команду ufw status verbose. Если защита включена, вы получите список разрешающих/запрещающих правил.
На всякий случай приведу здесь базовые команды для отключения/сброса брандмауэра.
  • ufw disable - отключение.
  • ufw reset - сброс.
  • ufw status numbered - вывод списка активных правил и их номеров.
  • ufw delete номер_правила - удаление определённого правила по его номеру.
Литература
Часть 2. Установка и настройка скрипта LGSM
Теперь переходим к мозгу нашего будущего сервера: скрипту, управляющему сервером.

Установка LGSM

Установка зависимостей

Переходим в пользователя, которого мы создали на предыдущем этапе: su - public_server.
Для начала установим зависимости — пакеты, которые требуются для нормальной работы скрипта. Вводим в терминал:
Bash:
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
BashCopy
Вводим пароль пользователя для подтверждения и ждём завершения.

Примечание: на Debian 11 я получил предупреждение о том, что пакет lib32gcc1 в репозитории был заменён пакетом lib32gcc-s1. Если вы получили такое же сообщение, просто замените название пакета в строке выше.

Далее выполняем команду, загружающую скрипт в текущую папку:
Bash:
wget -O linuxgsm.sh https://linuxgsm.sh && chmod +x linuxgsm.sh && bash linuxgsm.sh csserver
BashCopy
Литература
(Опционально) Выбираем имя скрипта
На текущем этапе, если вы хотите задать своё имя скрипта, вместо стандартного csserver, это можно легко сделать. В противном случае, этот шаг можно пропустить.
Ниже по тексту я не буду изменять имя скрипта со стандартного, чтобы не было путаницы.

Чтобы переименовать скрипт, воспользуйтесь командой mv:
Bash:
mv csserver новое_имя
BashCopy
Например: mv csserver public.

Процесс установки
Запускаем автоматическую установку командой:
Bash:
./csserver auto-install
BashCopy
Скрипт сам проверит, установлены ли все зависимые компоненты, и если нет, установит их.
Если установка скрипта и сервера прошла успешно, вы получите соответствующую надпись об этом.

Теперь можно попробовать запустить сервер для проверки.
Пишем в терминале:
Bash:
./csserver start
BashCopy
Если всё успешно, можно попробовать подсоединиться к серверу.
Для подключения используйте IP VDS-сервера и стандартный порт 27015.

Примечание: на текущем этапе зайти на сервер можно только с лицензионной версии игры.

Важно: выходить из консоли следует только через сочетание клавиш CTRL + B, затем D. Если вы попытаетесь выйти из консоли нажав по обыкновению CTRL + C, это завершит процесс сервера.

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

Устанавливаем через терминал пакет gdb, пишем:
Bash:
apt install gdb
BashCopy
Подключаемся к серверу через FileZilla, используя SFTP протокол. Для этого вводим в поле "Хост" адрес вашего сервера, логин и пароль в соответствующие поля (не забываем, что войти нам сейчас надо не за root, а за пользователя, у которого установлен наш скрипт), а в поле "Порт" пишем "22", что соответствует SFTP. Подключаемся.
Мы попадаем в домашнюю директорию пользователя, в примере я использовал public_server.
Далее переходим в папку serverfiles через FileZilla и находим здесь файл hlds_run.
Открываем его для редактирования. Поиском находим такую строку:
Код:
ulimit -c 2000
C++Copy
и заменяем 2000 на "unlimited", чтобы получилось так:
Код:
ulimit -c unlimited
C++Copy
На этом всё! Сохраняем и закрываем файл.

Литература
Настройка LGSM
Теперь можно перейти к настройкам скрипта.
Первое, что нам нужно сделать, это сконфигурировать основные настройки.

Настройки сервера и скрипта
Заходим через 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}"
C++Copy
Вообще, на мой взгляд здесь интуитивно всё понятно, но всё-таки я считаю должным пройтись по этому конфигу.
  • 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 - тогда появится список всех команд с их описанием.

Я приведу с переводом здесь основные, которые могут нам понадобиться.

КомандаСокращениеОписание
startstЗапускает сервер
stopspОстанавливает сервер
restartrПерезапускает сервер
monitormПроверяет доступность сервера и перезапускает его в случае падения
test-alerttaОтправляет тестовое предупреждение (об этом позже)
detailsdtПоказывает основную информацию о сервере
postdetailspdТо же, что и предыдущее, только загружает информацию на сервис Termbin (аналог Pastebin) и выдаёт ссылку
update-lgsmulПроверяет и производит обновление скрипта LGSM
backupbДелает бэкап сервера
consolecОткрывает консоль игрового сервера
sendsdДаёт возможность отправить команду в консоль сервера, не заходя в неё

Литература
Настройка расписаний
Настало время выполнить немаловажную часть нашей работы — настроить расписания для автоматизации важных для работы сервера действий.

Сейчас мы установим:
  • Перезагрузку виртуальной машины раз в месяц.
  • Автоматический запуск сервера при включении виртуальной машины.
  • Перезагрузку игрового сервера раз в сутки.
  • Создание резервной копии сервера каждые две недели.
  • "Мониторинг" сервера на предмет падений.
Приступим.
Делать будем всё при помощи стандартной утилиты Linux - "crontab".
Для начала, зайдём в терминале за пользователя root: su - root. Вводим пароль. Далее вызываем окно редактирования crontab. Пишем:
Bash:
crontab -e
BashCopy
Если вы выполняете эту команду впервые на текущей виртуальной машине, система попросит выбрать вас, какой текстовый редактор вы предпочитаете использовать (и если в вашем дистрибутиве установлено несколько редакторов "из коробки"). В моём случае мне предложили Vim или nano. Всем новичкам я настоятельно рекомендую выбрать именно nano, поскольку Vim имеет весьма специфическое управление.

Итак, вы выбрали редактор и перед вами открылся файл, содержащий cron jobs (именно так они называются). По умолчанию он пуст (не считая "комментариев").
Обратите внимание, что каждый cron job пишется с новой строки.

Стрелками на клавиатуре опускаем ввод в самый низ.
Устанавливаем перезагрузку виртуальной машины. Разумнее будет сделать её под утро, когда на сервере низкий онлайн. Я выбрал время 4 утра.
Код:
0 4 1 * * reboot
C++Copy
Нажимаем CTRL + X, система предложит сохранить наш файл с заданиями. Жмём Y.

Можно проверить, что мы всё сделали правильно, пишем следующую команду:
Bash:
crontab -l
BashCopy
которая выведет на экран содержимое файла. Если вы видите в конце строчку, которую только что вписали, значит всё в порядке.

Далее, для работы с заданиями по игровому серверу, лучше всего использовать юзера, под которым работает наш скрипт. Можно перейти в учётную запись этого юзера и повторить действия выше, а можно просто отредактировать файл заданий того юзера, не выходя с root.

Пишем:
Bash:
crontab -u имя_пользователя -e
BashCopy
Откроется такой же самый файл, только в дальнейшем он будет исполняться от нашего пользователя, запускающего LGSM.

Настроим автоматический запуск сервера после включения виртуальной машины:
Код:
@reboot ./csserver st > /dev/null 2>&1
C++Copy
Установим перезагрузку игрового сервера раз в сутки. Опять же, ранним утром:
Код:
0 4 * * * ./csserver r > /dev/null 2>&1
C++Copy
Далее зададим резервное копирование раз в две недели (в 04:05, после перезагрузки):
Код:
5 4 */14 * * ./csserver b > /dev/null 2>&1
C++Copy
И наконец, добавим мониторинг сервера на доступность.
Команда monitor, которая будет проверять сервер на предмет падений, например, каждые 5 минут:
Код:
*/5 * * * * ./csserver m > /dev/null 2>&1
C++Copy
Для справки: > /dev/null 2>&1 - используется для блокировки текстового вывода на экран от выполнения команды.

Литература
Часть 3. Установка основных дополнений. Настройка игрового сервера
Теперь пришло время заняться самим игровым сервером. И начнём мы с движка.

Установка ReHLDS
Переходим по ссылке: 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
C++Copy
Создание и настройка конфига
Поскольку ReHLDS не имеет собственного конфига, мы создадим его своими руками. Переходим в папку cstrike и создаем файл rehlds.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++Copy
Теперь открываем server.cfg и добавляем в самый конец такие строки:
Код:
// Execute ReHLDS Config
exec "rehlds.cfg"
C++Copy
Готово!

Примечание:
Если вы будете устанавливать ReGameDLL (следующий шаг), чтение конфига ReHLDS лучше добавить в его конфиг - game.cfg.
Так же при обновлении ReGameDLL, если вы обновляете его конфиг, не забывайте и про строчки с конфигом ReHLDS.

Установка ReGameDLL
Далее поставим 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
C++Copy
Сразу, не отходя от кассы, можно настроить под свой сервер конфиг game.cfg, отвечающий за геймплей на сервере.
Не стану разбирать его здесь, потому что, во-первых, это потребует целой отельной статьи, во-вторых, это слишком индивидуально от сервера к серверу и в-третьих, в нём уже имеются подписи к каждому квару.

Не забывайте добавить в game.cfg чтение конфига ReHLDS из предыдущего шага.

Установка Metamod
Мы будем использовать 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
C++Copy
Установка AmxModX
Здесь у вас есть выбор: ставить стабильную ветку разработки (версия 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
C++Copy
Сохраняем и перезапускаем сервер.

Заходим в консоль и убеждаемся, в том что AmxModX работает, введя команду meta list. В списке должна быть такая надпись:
Код:
[ 1] AMX Mod X     RUN   -    amxmodx_mm_i386.so        v1.9.0.5293  ini  Start ANY
C++Copy
Если она есть, значит мы всё сделали правильно, и можно переходить к следующему шагу.

(Опционально) Проверка дампов падений сервера
Здесь же можно сразу проверить, правильно ли мы настроили показ дампов падений сервера.

Создаём новый файл в любом месте у нас на компьютере и называем его, например, 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);
}
C++Copy
Сохраняем.

Далее у нас есть два пути: скомпилировать файл на Windows или на Linux.
Те, кто умеет компилировать плагины на Windows, могут скомпилировать его и переходить к следующему шагу с установкой.

Для остальных я вкратце расскажу, как скомпилировать плагин на Linux.
Полная статья: Локальное компилирование плагинов | Dev-CS.ru

В FileZilla идём по пути serverfiles/cstrike/addons/amxmodx/scripting.
Загружаем сюда наш файл crash_test.sma.
Находим файл amxxpc, кликаем на него правой кнопкой мыши и выбираем пункт Права доступа к файлу. В поле для ввода вписываем права 754 -> OK.

Открываем PuTTY. Теперь нам надо убедиться, что мы в корневой папке пользователя, командой:
Bash:
cd
BashCopy
Далее переходим в папку, куда мы поместили исходник плагина с краш-тестом:
Bash:
cd serverfiles/cstrike/addons/amxmodx/scripting
BashCopy
Запускаем компиляцию:
Bash:
./amxxpc crash_test.sma
BashCopy
Если вы увидели такой вывод на экран, значит вы сделали всё правильно:
Код:
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.
C++Copy
Не забывайте снова вернуться в корневую папку пользователя командой 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
----------------------------------------------
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++Copy
Попробуйте перечитать и выполнить заново шаг с активацией полных краш-логов.

Литература
Настройка быстрой загрузки файлов
Итак, для полноценной работы сервера нам необходимо настроить быструю загрузка файлов (FastDL).
В противном случае, если у вас не стандартный сервер с дополнительными ресурсами, никто не захочет качать их по 10 минут.

Начнём с установки веб-сервера Nginx. Пишем:
Bash:
sudo apt install nginx
BashCopy
После установки он автоматически начнёт свою работу. Проверить это можно зайдя на адрес нашего сервера в браузере. Если вы видите страницу с текстом: # Welcome to nginx!, значит всё прошло успешно.

Теперь перейдён к конфигурации Nginx под сервер быстрой загрузки.
Для этого заходим под root пользователем через FileZilla, и идём по следующему пути: /etc/nginx/sites-available. Здесь будет находиться файл конфига nginx по умолчанию (default).
Открываем его для редактирования. В разделе server, перед закрывающей скобкой '}', вставляем следующее:
Код:
    # Быстрая загрузка для 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 на нашем сервере. Проверьте его и исправьте на свой вариант, если он отличается.

Сохраняем этот файл и проверяем его на корректность. Для этого нам понадобится такая команда:
Bash:
sudo nginx -t
BashCopy
Если мы получили сообщение, что все конфиги в порядке, перезагружаем Nginx:
Bash:
sudo service nginx restart
BashCopy
Теперь можно проверить, что у нас получилось. Снова открываем браузер, заходим на наш веб сервер и пытаемся скачать какой-нибудь файл, например карту de_dust2.
Код:
http://адрес_сервера/fastdl/maps/de_dust2.bsp
C++Copy
Если она скачалась, значит вы всё сделали правильно!

Теперь откроем конфиг игрового сервера (server.cfg) и добавим туда следующие квары:
Код:
sv_allowdownload 1
sv_downloadurl "http://адрес_сервера/fastdl/"
C++Copy
На этом основная настройка сервера завершена!

Литература
Часть 4. Дополнительные инструменты для сервера. Рекомендации

Установка и настройка Reunion

Наиболее вероятно, к вам на сервер будут заходить игроки с пиратской копией игры (Non-steam). Возможно, даже вы сами. Однако, они не смогут подключиться к серверу без специального модуля, обеспечивающего игру на сервере для пиратских клиентов.

Скачать Reunion можно отсюда:
Требуется регистрация, но зато это надёжные источники, за которые я могу поручиться.
На момент написания статьи стабильная версия - 0.1.92d.

Помещаем бинарный файл reunion_mm_i386.so по пути addons/reunion/, затем прописываем в файле Metamod-плагинов:
Код:
linux addons/reunion/reunion_mm_i386.so
C++Copy
После этого помещаем файл конфигурации 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
C++Copy
Примечание:
По более тонкой настройке Reunion есть отличный гайд по этой ссылке: Подмена SteamID | Dev-CS.ru
Если вы собираетесь содержать выделенный сервер для всех, а не просто поиграть с друзьями или ботами, я рекомендую выполнить настройку по статье выше.

Установка компонентов веб-сервера
Большинство серверодержателей наверняка захотят установить CSBans или другие веб-дополнения. Я расскажу, как установить основные необходимые для этого инструменты: PHP и MySQL.

Установка MariaDB
Начнём мы с установки СУБД.

Вводим команду:
Bash:
sudo apt install mariadb-server
BashCopy
После установки необходимо произвести конфигурацию командой:
Bash:
sudo mysql_secure_installation
BashCopy
Сейчас нам предложат указать пароль для 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 пользователем:
Bash:
mysql -u root -p
BashCopy
Теперь создадим пользователя (admin - логин и password - пароль укажите свои):
SQL:
CREATE USER 'admin'@'localhost' IDENTIFIED BY 'password';
SQLCopy
Затем выдадим этому пользователю все привилегии:
SQL:
GRANT ALL PRIVILEGES ON * .* TO 'admin'@'localhost';
SQLCopy
И пишем exit для выхода из БД.
На этом установка базы данных завершена!

Литература
Установка PHP
Данное действие почти не займёт у вас времени, поскольку PHP не нуждается в дополнительной настройке.
Вводим в консоль:
Bash:
apt install php-fpm php-mysql
BashCopy
На этом установка завершена.
Но на всякий случай проверим, всё ли в порядке.
Переходим в FileZilla по следующему пути: /var/www/html.
Здесь создаём файл info.php. Открываем его и вставляем туда следующее содержание:
PHP:
<?php

phpinfo();

?>
PHPCopy
Сохраняем.

В браузере переходим по адресу нашего файла, т.е.: http://адрес_сервера/info.php.
Если вы видите страницу с конфигурацией php, значит вы всё сделали правильно.

Литература
(Опционально) Установка Phpmyadmin
Если вам не нужна панель для управления базами данных MySQL, можете пропустить этот шаг.

Для начала установим необходимые компоненты:
Bash:
apt install php-mbstring mcrypt
BashCopy
Теперь приступим к установке самой утилиты:
Bash:
apt install phpmyadmin
BashCopy
Сначала нам будет предложено выбрать сервер для работы с приложением. К сожалению, Nginx нет в списке, так что снимаем выбор с обеих строк и нажимаем ОК.
Следующим шагом будет автоматическое создание баз данных для phpmyadmin, соглашаемся.
После этого у нас попросят ввести пароль для пользователя phpmyadmin. Вводим.

Затем нам понадобится включить расширение mcrypt, что мы и делаем:
Bash:
phpenmod mcrypt
BashCopy
И последний шаг. Открываем уже знакомый нам конфиг 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;
C++Copy
Добавляем в этот список index.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:
Код:
    # Конфигурация для 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++Copy
Сохраняем файл. Как обычно проверяем конфигурацию командой nginx -t, исправляем ошибки, если они есть. Перезагружаем Nginx.
На этом всё!

Теперь идём смотреть, что у нас получилось. В браузере переходим по ссылке: http://адрес_сервера/phpmyadmin. Если вы видите страницу входа в phpmyadmin, значит установка прошла успешно.

Литература
(Опционально) Настройка автоматического резервного копирования баз данных
Во избежание непредвиденных ситуаций, можно так же настроить бэкап баз данных MySQL.

Воспользуемся инструментом mysqldump и уже знакомым нам crontab.

На мой взгляд, хранить резервные копии удобнее в директории сервера, поэтому надо перейти за того пользователя, у которого установлен сервер. У нас это public_server.

Открываем редактор crontab и самый конец файла вписываем такую строку:
Код:
0 12 */7 * * mysqldump -u admin -ppassword -A > db.sql
C++Copy
Синтаксис:
Bash:
mysqldump -u [пользователь mysql] -p[его пароль] -A > [название базы данных].sql
BashCopy
Обратите внимание, что -p и последующий пароль пользователя пишутся слитно.

О том, как настроить время в crontab, было описано в разделе "Настройка расписаний".

Если расшифровать строку из примера, у нас получилось следующее: Каждый седьмой день месяца (раз в неделю) в 12 часов дня будет создан дамп за mysql пользователя admin с паролем password и будет помещён в корневую папку пользователя, за которого запущен crontab (у нас это public_server), с названием db.sql.

Можно помещать файл в каталог, но в таком случае он должен быть заранее создан. Пример команды:
Bash:
mysqldump -u admin -ppassword -A > mysql_backup/db.sql
BashCopy
Литература
Включение оповещений о некорректной работе сервера
В LGSM так же можно включить оповещения о недоступности сервера, если команда monitor её выявила.

Есть довольно большой список мессенджеров и служб для оповещения, но они больше популярны на западе, чем в странах СНГ.
Для нас можно выделить Email, Telegram и Discord. С полным списком можно ознакомиться здесь: Alerts - LinuxGSM_.

Здесь я рассмотрю подключение к Telegram.

Оповещения через 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"
C++Copy
Итак, рассмотрим приведённые здесь параметры.
  • postalert - позволяет получить дополнительную информацию о сервере на момент неисправности и загружает её на Termbin, аналогично команде ./csserver postdetails.
  • telegramalert - собственно, включить или нет оповещения в Telegram.
  • telegramtoken - сюда нужно вставить токен нашего нового бота.
  • telegramchatid - здесь надо указать индекс вашего с ботом чата. Об этом ниже.
Вставляем полученный на предыдущем шаге индекс бота в параметр telegramtoken.

Затем в браузере переходим по следующему пути:
Код:
Где XXXXXXXXX:XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX - заменяем на токен бота. Например:
Код:
Оставляем вкладку открытой.

Теперь пишем боту любое сообщение, например LGSM test. Затем обновляем страницу, открытую ранее, и у нас должны появиться технические параметры сообщения.
Ищем наше сообщение в конце строки и двигаемся к её началу, чтобы найти данные примерно такого вида: "chat":{"id":845483018,.
Число 845483018 - это и будет индекс чата, который нам нужен. Копируем его и вставляем в параметр telegramchatid.

Закрываем конфиг и сохраняем его. На этом настройка оповещений завершена.

Мы можем проверить их работоспособность. Для этого воспользуемся командой скрипта ./csserver test-alert.
В результате её выполнения нам в телеграм должен написать наш новый бот с тестовым оповещением.

Литература
  • Telegram - LinuxGSM_
    Примечание: здесь же можно найти инструкцию о том, как подключить бота к группе, а не только к личному чату.
Примечание: На момент написания статьи оповещение в телеграм выдаёт ошибку.
Чтобы её исправить, я использовал код из предыдущего коммита на GitHub в необходимом файле (alert_telegram.sh).
Так же я отправил разработчикам баг-репорт. Надеюсь, в скором времени они исправят этот баг.

На этом всё. Удачи в создании сервера! 

Источник: https://dev-cs.ru/threads/21647/#4
Автор статьи: Nordic Warrior



Скришоты: Установка и настройка сервера на VDS


Гость, оставишь комментарий?
Имя:*
E-Mail:



КТО ОНЛАЙН
Сейчас на сайте: 1
Юзеры: 0
Гости: 1


Поддержать проект
Мы используем файлы cookie
Для улучшения работы сервиса и персонализации информации мы используем файлы cookie. Нажимая ПРИНЯТЬ или продолжая просмотр сайта, вы соглашаетесь с условиями пользования.
ПРИНЯТЬ