Skip to content

NFK server on Linux

HarpyWar edited this page Jan 26, 2020 · 24 revisions

Для NFK сервера подойдет VDS на платформе виртуализации KVM с гарантированным выделением CPU ресурсов, в минимальной конфигурации (256 МБ памяти, 1 ядро). На OpenVZ не заработает.

Установка Wine (Debian)

dpkg --add-architecture i386
apt-get update
apt-get install wine32 xorg
dpkg-reconfigure xserver-xorg-legacy

Настройка сервисов

X сервер необходим для запуска NFK

nano /etc/systemd/system/xserver.service

[Unit]
Description=X server

[Service]
User=root
WorkingDirectory=/usr/bin/
ExecStart=/usr/bin/X :0
Restart=on-failure

[Install]
WantedBy=multi-user.target

Запускаем Wine отдельно, т.к. иначе он завершается при остановке одного из NFK серверов (если их запущено много). При запущенном notepad.exe Wine будет запущен постоянно.

nano /etc/systemd/system/wine.service

[Unit]
Description=Wine service
After=xserver.service

[Service]
User=root
Environment=DISPLAY=:0
ExecStart=/usr/bin/wine notepad.exe
Restart=on-failure

[Install]
WantedBy=multi-user.target

Каждый запускаемый NFK сервер установить в разных папках (например, 29995, 29996 и т.д.)

Если процессор многоядерный, то внутри service файла параметром CPUAffinity можно для каждого NFK сервера задать по одному логическому ядру, которыми будет ограничена нагрузка. Например, при CPUAffinity=0,1 будет использоваться только первое и второе ядро. Аналогично можно повесить сервис Wine на отдельное ядро.

nano /etc/systemd/system/nfk_29995.service

[Unit]
Description=NFK server
After=wine.service

[Service]
User=root
Environment=DISPLAY=:0
WorkingDirectory=/usr/local/nfk/29995/
ExecStart=/usr/bin/wine /usr/local/nfk/29995/SERVER.exe +gowindow +nosound +nfkplanet +game server +exec server +dontsavecfg
Restart=on-failure

[Install]
WantedBy=multi-user.target

Включаем службы

systemctl enable /etc/systemd/system/xserver.service
systemctl enable /etc/systemd/system/wine.service
systemctl enable /etc/systemd/system/nfk_29995.service
systemctl start xserver.service
systemctl start wine.service
systemctl start nfk_29995.service

Установка nginx + PHP

apt-get install nginx php7.0-fpm

nano /etc/nginx/nginx.conf

...
http {
    ...
    
    server { 
	listen 80; 
	server_name localhost; 

	# Путь к папке с кодом
	root /var/www/;

	index index.php; 

	# Обработка php файлов с помощью fpm
	location ~ \.php$ { 
		try_files $uri =404; 
		include /etc/nginx/fastcgi.conf;
		fastcgi_pass unix:/run/php/php7.0-fpm.sock; 
	}
    }
}

nano /etc/php/7.0/fpm/pool.d/www.conf

...
listen = /run/php/php7.0-fpm.sock

Перезапустить nginx и php-fpm

nginx -s reload
service php7.0-fpm restart

Порты

Для работы сервера необходимо открыть игровой UDP порт сервера + TCP порт основного сервера минус 1000 для загрузки карт.

Например, если игровой порт 29995, то порт для карт будет 28995.

Так же необходимо открыть исходящий порт 10003 для соединения сервера с планетой.

Настройка серверной части контроллера

  1. Скопировать файлы из web/server в отдельную папку веб сервера. Например, чтобы основной скрипт был доступен через http://server/nfkcontrol/api.php
  2. Переименовать config.php.example -> config.php, внутри поменять все параметры:
$ApiKey - любой уникальный
$ServerPath - абсолютный путь к папке, в которой находятся другие папки с NFK сервером
$Servers - перечислить в массиве названия папок NFK серверов по пути $ServerPath.
  1. Установить права на запуск chmod 777 script/control.sh
  2. apt-get install sudo и в файле /etc/sudoers разрешить запуск и остановку NFK сервисов для пользователя, под которым запущен веб-сервер (по-умолчанию www-data):
%www-data ALL=(ALL:ALL) NOPASSWD: /bin/systemctl start nfk_29995.service
%www-data ALL=(ALL:ALL) NOPASSWD: /bin/systemctl stop nfk_29995.service
%www-data ALL=(ALL:ALL) NOPASSWD: /bin/systemctl status nfk_29995.service
  1. Установить права для записи и чтения для www-data на папку с NFK серверами:
chown -R www-data /usr/local/nfk/

Чтобы управление серверами этого хоста появились на клиентской части контроллера, достаточно добавить в config.php на клиенте путь к URL, по которому доступна настроенная серверная часть, вместе с $ApiKey.

Так же установить права на запуск для скриптов

chmod 777 script/*.sh
  1. Cron В папке script находятся два скрипта, которые можно добавить в crontab на запуск раз в день:
0 6 * * * /var/www/html/nfkcontrol/script/restart.sh
0 6 * * * /var/www/html/nfkcontrol/script/maps_sync.sh

Первый для перезапуска служб NFK, чтобы они более стабильно работали. В нем нужно изменить названия служб для перезапуска.

Второй для синхронизации карт с удаленного сервера. В нем нужно изменить путь к папке с картами.

Чтобы не дублировать карты, для них можно создать отдельную папку ссылаться на неё из папки каждого сервера. Структура папок может быть следующей:

/usr/local/nfk/maps // сюда скачиваются карты
/usr/local/nfk/29991 // первый сервер
/usr/local/nfk/29992 // второй сервер
/usr/local/nfk/29991/SERVER/maps -> /usr/local/nfk/maps // symlink
/usr/local/nfk/29992/SERVER/maps -> /usr/local/nfk/maps // symlink