Развертывание MST сервера на Linux

В принципе, для работы подойдет практически любой дистрибутив Linux. Я покажу работу с MST на примере дистрибутива Ubuntu 20.04 LTS.
Предполагается, что Ubuntu у вас уже установлен установлен и настроен. Поэтому перейдём непосредственно к настройке и запуску MST.

Скомпилированный MST дистрибутив выгружаем на сервер

Я это делаю при помощи OneDrive и консольной команды wget.

  • Архивируем наш дистрибутив любым удобным способом.
  • Загружаем его в OneDrive.
  • Находясь в OneDrive, получаем прямую ссылку на файл, которую может прочесть консольная команда wget. Кликаем правой клавишей мыши по файлу, далее «Embed». 
  • Получаем ссылку вида:
<iframe src="https://onedrive.live.com/embed?cid=набор_символов" width="98" height="120" frameborder="0" scrolling="no"></iframe>
  • Отсюда копируем https://onedrive.live.com/embed?cid=набор_символов. Меняем embed? на download? чтобы получилось что-то типа 
https://onedrive.live.com/download?cid=1111111111111&resid=1111111111111111111&authkey=11111111111111111111
  • Переходим на сервер и скачиваем архив командой:
wget --no-check-certificate "https://onedrive.live.com/download?cid=1111111111111&resid=1111111111111111111&authkey=11111111111111111111"
  • Вот и всё, теперь файлы у Вас в той папке, где Вы сейчас находились (по умолчанию, это папка пользователя под которым Вы залогинены в директории /home/имя_пользователя)

Midnight Commander

Хочется отметить, что wget распознает имя файла необычным способом и называет его очень длинным именем из строки скачивания. Удобнее всего переименовать его файловым менеджером Midnight Commander и работать уже в нём.

# Устанавливаем МС
sudo apt install mc -y
# Открываем МС
sudo mc

В появившемся окне переходим к скачанному файлу, работая стрелками на клавиатуре. Между левым и правым окном можно переключаться табулятором (клавишей Tab)

Нажимаем F6 для переименования и чтобы открылся как архив. Вводим имя (любое) и расширение файла, в котором был архив (rar, 7z, zip и т.п.)

Распаковка архива с дистрибутивом

Распаковываем архив в ту папку, из которой будет запускаться программа. Для примера создадим папку в директории /opt и назовем MasterServer (или как Вам больше нравится)). Поэтому распаковываем в /opt/MasterServer.

  • Распаковываем архив с помощью команды:
7z x имя_архива.7z -o /opt/MasterServer

Второй вариант – опять же при помощи Midnight Commander. Заходим в него и просто открываем архив (p7zip и/или urar должны быть установлены). Клавишей F5 из архива копируем всё в нужную папку (копирование происходит между левым и правым окнами, поэтому в одно окне входим в архив, а в другом открываем нужную папку)

Получение прав на выполнение файла .x86_64

  • Переходим в папку MasterServer командой
сd /opt/MasterServer
  • Далее получаем права на запуск файла командой
sudo chmod +x ./MasterServer.x86_64
  • На данном этапе мы уже можем проверить работоспособность нашего дистрибутива командой
./MasterServer.x86_64 -mstStartMaster true -mstMasterPort 5000

Как вы уже заметили аргументы командной строки, которые необходимы для работы систем MST можно указать сразу после команды запуска.

Автоматизация запуска процесса MST

Если нам необходимо, чтобы MST запускался при старте / рестарте сервера, перезапускался в случае сбоев, то я предлагаю сделать файл службой на сервере. Делается это следующим образом:

  • Создаем файл службы и сразу же редактируем его командой:
sudo vim /etc/systemd/system/MasterServer.service
  • В открывшемся файле прописываем (прежде нажав на клавиатуре анг. «o») следующее:

[Unit]
Description=MST Server
[Service]
Type=simple
Restart=always
StandardOutput=file:/opt/MasterServer/MSTstandartOutput.log
StandardError=file:/opt/MasterServer/MSTstandartError.log
ExecStart=/opt/MasterServer/MasterServer.x86_64
ExecStop=/bin/kill -s INT $MAINPID
ExecStopPost=/usr/sbin/logrotate -f /opt/MasterServer/logreboot
TimeoutSec=30
WorkingDirectory=/opt/MasterServer
[Install]
WantedBy=multi-user.target
  • Description – это краткое описание Вашего сервиса / юнита.
  • Type - Настраивает тип запуска процесса.
  • Restart - сервис будет перезапущен если процесс прекращен или достигнут timeout, за исключением случая нормальной остановки сервиса.
  • StandardOutput – то, что сервер пишет в логи. Если не установить это значение, то лог будет записываться в системные логи. Аналог команды, показанной ниже. Т.е. этот параметр можно не прописывать, если Вам не нужен отдельный лог).
sudo journalctl -u MasterServer | grep MasterServer.x86_64 > MSTstandartOutput.log
  • StandardError – касается работы только самой службы. Ошибки программы туда не выводятся! Они выводятся StandardOutput. Здесь же будут ошибки, если у самой службы возникнут какие-то проблемы (не запускается, крэшится и т.п.).
  • ExecStart - Команды вместе с аргументами, которые будут выполнены при старте сервиса.
  • ExecStop - Команды, которые будут выполнены для остановки сервиса.
  • ExecStopPost - Команды, которые будут выполнены после остановки сервиса.
  • WorkingDirectory – рабочая директория сервиса. Если не указать, то все файлы, которые будут создаваться программой (например, nonSQL базы или т.п.) создадутся в корне пользователя, от которого будет запущен сервис (в данном случае запускается от имени системы, поэтому все файлы, без этого параметра, создадутся в корне системы /).

Подробнее про то, какие параметры можно использовать, почитайте в этом файле , либо набрав команду man systemd.

Чтобы сохранить все изменения в файл MasterServer.service нужно выйти из его редактирования нажав Esc и введя команду :wq

Файл конфигурации

Как вы помните, значения командной строки для ./MasterServer.x86_64 мы указывали сразу после команды запуска файла .x86_64. Делать это можно и при помощи файла конфигурации application.cfg. Если этот файл еще не создан, то создаем это командой:

# Для создания и редактирования
sudo vim /opt/MasterServer/application.cfg

# Просто создает файл, который можно редактировать командой выше
sudo touch /opt/MasterServer/application.cfg

После создания и редактирования MasterServer.service, нам нужно записать изменения для systemctl командой:

sudo systemctl daemon-reload

# Делаем так, чтобы файл запускался при запуске системы:
sudo systemctl enable MasterServer

# После чего можем запускать MST как службу:
sudo systemctl start MasterServer

# Далее идут служебные команды, которые можно использовать по мере необходимости

# Для остановки службы вводится команда:
sudo systemctl stop MasterServer

# Посмотреть состояние работы службы можно командой:
sudo systemctl status MasterServer

# Для перезапуска службы вводится команда:
sudo systemctl restart MasterServer

Если все сделали правильно, то наш сервер должен работать. Проверить его работоспособность можно на сайте https://websocket.org/echo прописав следующий путь:

ws://your_server_ip:port/echo
  • ws:// или wss:// - в зависимости от установленного сертификата безопасности.
  • your_server_ip - IP или URL адрес вашего сервера
  • port - порт который прослушивается вашим сервером для службы MasterServer
  • echo - служба запущенная в MST для проверки ответа сервера клиенту

Ротация файлов журнала

Подробнее о ротации лог файлов можно почитать на этой странице или выполнить команду man logrotate.

Если Вы, как в моём примере выше, выбрали писать лог отдельно (т.е. ввели в MasterServer.service параметры StandardOutput, StandardError и ExecStopPost(здесь я его использую для логов, но можно использовать для любых других команд), то еще требуется сделать ротацию *.log файлов, чтобы они не заполнили весь сервер.

Создадим в директории программы папку Logs командой:

sudo mkdir /opt/MasterServer/Logs

А в ней две подпапки Archive, для ротированных логов и AfterReboot, для логов, которые останутся после рестарта / остановки службы.

sudo mkdir /opt/MasterServer/Logs/Archive
sudo mkdir /opt/MasterServer/Logs/AfterReboot

Далее создаем в папке /etc/logrotate.d/ файл MasterServer (на самом деле называть можете как угодно).

sudo vim /etc/logrotate.d/MasterServer

Где прописываем следующее:

/opt/MasterServer/*.log {
daily
rotate 7
size 10M
compress
missingok
dateext
notifempty
olddir /opt/MasterServer/Logs/Archive
postrotate
    systemctl restart MasterServer > /dev/null
    endscript
}

Согласно этому файлу, служба logrotate ежедневно будет проверять лог-файлы в рабочей директории (несмотря на то есть он там или нет), если файл больше 10Мб, то будет архивировать его и сохранять в папку Archive. Хранить будет 7 последних лог-файлов с датой в имени, пустые файлы не учитываются. После архивирования наша служба MasterServer перезапускается.

Также, нам нужно чтобы после перезапуска у нас появлялся новый лог-файл, иначе служба не видит старый и перестает писать логи. Поэтому мы ввели команду при рестарте / остановке службы ExecStopPost=/usr/sbin/logrotate -f /opt/MasterServer/logreboot.

touch /opt/MasterServer/logreboot

# Прописываем конфигурацию в этот файл 
sudo vim /opt/MasterServer/logreboot

Я выбрал следующие параметры:

/opt/MST/*.log {
daily
rotate 5
size 1
compress
missingok
notifempty
olddir /opt/MasterServer/Logs/AfterReboot
}

Итак, все необходимое для работы MST на Linux готово.