Продвинутый запуск игрового сервера
###################################

В данной инструкции будет рассмотрено:

- ведение жерналирования игрового сервера в файлы (логи)
- запуск игрового сервера с ограниченными правами в системе
- запуск игрового сервера как отдельного системного сервиса
- использование базы данных **Postgres** в качестве основного хранилища данных

.. note::
  - Предполагается, что читатель умеет собирать и запускать сервер :doc:`на удалённой системе <build-for-prod>`;
  - Предполагается, что читатель имеет базовые навыки работы с **Linux** системами;
  - Предполагается, что читатель умеет подключаться к удалённому серверу через **SSH**;
  - Данная инструкция рассчитана на пользователей операционной системы **Windows**;
  - В качестве удалённой операционной системы будет использоваться **Debian 12**.

.. note::
  Предполагаются те же условности, что были приняты в
  :doc:`прошлой статье <build-for-prod>`


Активация логов
***************

То как отображаются логи в консоли screen-сессии это не совсем удобно, потому
как screen-сессию нельзя просто так "промотать вверх" для чтения прошлых
записей, а так же сама по себе screen-сессия имеет ограниченный буффер хранения
этих самых "консольных строчек".

Потому лучшим решением станет активация журналирования игрового сервера в файлы.

1. Создаём папку для логов

  .. code-block:: bash

    mkdir /root/ss14/logs

2. Открываем на редактирование конфигурационный файл игрового сервера
   ``server_config.toml`` и в секции ``[log]`` меняем значение поля ``enabled``
   на ``true``

  .. code-block:: toml

    [log]
    path = "logs"
    format = "log_%(date)s-%(time)s.txt"
    level = 1
    enabled = true

.. note::
  Перезапустите игровой сервер для применения изменений


Запуск с ограниченными правами
******************************

Если вы читали :doc:`прошлую статью <build-for-prod>`, то должны были заметить,
что запуск игрового сервера происходит от имени ``root``, т.е. наивысших
системных прав. **Так делать не безопастно** по многим причинам, рассмотрение 
которых выходят за рамки этой статьи. Правильнее всего запускать игровой сервер
с ограниченным набором прав обычного пользователя.

Новый пользователь
==================

1. Создаём нового пользователя:

  .. code-block:: bash

    useradd -m ss14

  - ``-m`` создаст домашний каталог ``/home/ss14``

2. Переносим все файлы игрового сервера в новую папку

  .. warning::

    Если у вас включён игровой сервер, то **отключите его** перед дальнейшими
    действиями

  .. code-block:: bash

    mkdir /home/ss14/server
    mv /root/ss14/* /home/ss14/server
    chown ss14:ss14 -R /home/ss14/server

3. Переносим файлы платформы .NET в новую папку

  .. code-block:: bash

    mv /root/dotnet /home/ss14
    chown ss14:ss14 -R /home/ss14/dotnet


Системный сервис
================

.. note::
  Запускать игровой сервер в screen-сессии имеет свои плюсы и минусы.

  | **Плюсы**
  | - доступ к игровой консоли
  | **Минусы**
  | - если игровой сервер "упадёт", сам он не поднимится

  Решением является запуск игрового сервера через системный сервис (systemd).

  | **Плюсы**
  | - если игровой сервер "упадёт", система сама его "поднимет"
  | **Минусы**
  | - утрата доступа к игровой консоли

В любом удобном редакторе на удалённой системе создаём новый файл
``/etc/systemd/system/ss14.service`` со следующим содержимым

.. code-block::

  [Unit]
  Description="Space Station 14"
  After=syslog.target
  After=network.target

  [Service]
  Type=simple
  User=ss14
  Group=ss14
  WorkingDirectory=/home/ss14/server
  Environment=DOTNET_ROOT="/home/ss14/dotnet"
  ExecStart=/home/ss14/server/Robust.Server --config-file "/home/ss14/server/server_config.toml" --data-dir "/home/ss14/server/data"
  ExecStop=kill -SIGINT $MAINPID
  StandardOutput=append:/home/ss14/server/logs/sys-output.log
  StandardError=append:/home/ss14/server/logs/sys-error.log
  RestartSec=2s
  TimeoutStartSec=5
  Restart=always

  [Install]
  WantedBy=multi-user.target

После чего заставляем систему перечитать все имеющиеся у неё конфигурации
сервисов

.. code-block::
  
  systemctl daemon-reload


Команды управления сервисом
---------------------------

Запуск:

.. code-block::

  systemctl start ss14

Остановка:

.. code-block::

  systemctl stop ss14

Перезапуск:

.. code-block::

  systemctl restart ss14

Статус:

.. code-block::

  systemctl status ss14


База данных Postgres
********************

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

Для установки **Postgres** в **Debian** используется следующая команда:

.. code-block::

  apt-get install -y postgresql

Теперь подключемся к интерактивной postgres-консоли.
Дальнейшие команды будут выполняться там:

.. code-block::

  sudo -u postgres psql

Далее, создаём базу данных для нашего игрового сервера:

.. code-block:: sql

  CREATE DATABASE ss14;

Добавляем к новосозданной БД пользователя и указываем ему пароль:

.. code-block:: sql

  CREATE USER ss14_user WITH encrypted password 'ChangeMePlease';

И предоставляем новосозданному пользователю все права на игровую БД:

.. code-block:: sql

  GRANT ALL PRIVILEGES ON DATABASE ss14 TO ss14_user;
  ALTER DATABASE ss14 OWNER TO ss14_user;


Выходим из интерактивной postgres-консоли, здесь мы закончили

.. code-block::

  \q

Подключение игрового сервера к БД
=================================

Открываем на редактирование конфигурационный файл игрового сервера
``server_config.toml`` и добавляем новую секцию

.. code-block:: toml

  [database]
  engine = "postgres"
  pg_host = "127.0.0.1"
  pg_port = 5432
  pg_database = "ss14"
  pg_username = "ss14_user"
  pg_password = "ChangeMePlease"

После запуска сервера, запись в консоли/логе вида
``[DEBG] db.manager: Using Postgres "127.0.0.1:5432/ss14"``
ознаменует о подключении к БД Postgres. Значит всё настроено правильно.
