Свой сервер

Редирект кастомных карт KF2 через nginx - Epic и Steam

Кастомные карты - самое частое место, где ломаются домашние серверы KF2. Игрокам нужно откуда-то скачать карту при входе, а публичный редирект, которым многие пользовались, больше не работает. Этот гайд по мотивам поста на Reddit показывает, как поднять собственный редирект карт на nginx под Windows. Он подходит и для версии из Epic Games Store, и для Steam.

Оговорка автора остается в силе: это то, что сработало у него. Часть шагов может быть лишней, и не у всех все заработает.

Справочные гайды

Полезно держать открытыми два подробных гайда:

  • официальную страницу вики Tripwire "Dedicated Server (Killing Floor 2)" - установка через SteamCMD и список портов
  • гайд Steam с ID 1110775580 - особенно раздел "Custom Map Data Store & Map Cycle"

Установка сервера

  • SteamCMD - ставьте сервер в отдельную папку, не в папку игры, по официальной вики.
  • Версия Epic Games - можно просто запустить KF2Server.bat из папки установки Epic. Он поднимет рабочий сервер, но без WebAdmin (см. ниже).

Пробросьте порты из официального гайда. Порт NTP нужен только для Weekly Outbreak. Если проброс невозможен, смотрите раздел про VPN в конце. Базовые шаги установки - в статье выделенный сервер KF2 через SteamCMD.

Настройка и WebAdmin

Для запуска и настройки сервера автор советует KF2ServerTool - в нем есть и встроенная вкладка WebAdmin.

Если сервер поднят через KF2Server.bat из установки Epic, WebAdmin работать не будет: нет нужных файлов. Решение - один раз установить сервер через SteamCMD и скопировать папку ...\kf2server\KFGame\Web со всем содержимым в свой сервер.

Хостинг кастомных карт через nginx

  1. Соберите карты. Скачайте нужные файлы .kfm (для карт из Workshop без копии игры в Steam - см. последний раздел).
  2. Скачайте nginx. Возьмите сборку для Windows с nginx.org и распакуйте.
  3. Создайте папку для карт. Рядом с nginx.exe создайте папку kf2 и положите туда все .kfm.
  4. Настройте nginx. Замените содержимое conf\nginx.conf на:
worker_processes  1;

events {
    worker_connections  1024;
}

http {
    server {
        listen 80 default_server;
        server_name localhost;

        access_log <nginx_install_folder>logs/access.log;
        error_log  <nginx_install_folder>logs/error.log;

        root <nginx_install_folder>;
        index index.php;

        location /kf2 {
            autoindex on;
        }
    }
}

Замените <nginx_install_folder> на реальный путь, в конце обязательно прямой слэш (/).

  1. Пробросьте порт 80 на роутере на этот ПК.
  2. Проверьте. Запустите nginx.exe и откройте в браузере http://localhost/kf2. Должен появиться список ваших .kfm. Окна у nginx нет - он виден только как фоновый процесс в диспетчере задач.
  3. Скопируйте карты на сервер в ...\kf2server\KFGame\BrewedPC\Maps. Автор клал каждую карту в отдельную подпапку с тем же именем, но, возможно, это не обязательно.
  4. Настройте менеджер загрузки. Откройте ...\kf2server\KFGame\Config\PCServer-KFEngine.ini. В секции [IpDrv.TcpNetDriver] оставьте ровно одну строку:
DownloadManagers=IpDrv.HTTPDownload

Остальные строки DownloadManagers= удалите.

  1. Направьте редирект на nginx. В секции [IpDrv.HTTPDownload] оставьте только:
RedirectToURL=http://<external_IPv4>/kf2/

<external_IPv4> - ваш внешний IP.

  1. Добавьте записи карт и цикл карт. В PCServer-KFGame.ini выполните шаги из раздела "Custom Map Data Store & Map Cycle" упомянутого гайда Steam. Имена карт и записи чувствительны к регистру.

Подвох с локальной сетью

Когда редирект указывает на внешний IP, ПК из той же сети, что и сервер, обычно не могут скачать карты. Обходной путь: временно пропишите в RedirectToURL локальный IPv4 сервера, зайдите с каждого локального ПК, чтобы карты скачались в кэш, а затем верните внешний IP.

Запуск и подключение

Сначала запустите nginx, затем сервер (bat-файлом или через KF2ServerTool). Чтобы зайти, откройте консоль игры клавишей ~ и введите:

ОткудаКоманда
Откуда угодно (порты проброшены)open <external_IPv4>:7777
Из той же сети, что и серверopen <internal_IPv4>
С самого ПК с серверомopen 127.0.0.1

Из комментариев: если сервер из SteamCMD работает на том же ПК, где вы играете в версию Epic, он может не появиться во вкладке LAN, но open <локальный IP> все равно работает. Сервер без проброшенных портов по-прежнему виден во вкладке LAN для локальных игроков.

Игра без проброса портов

Если пробросить порты нельзя, используйте программу виртуальной локальной сети, чтобы все оказались в одной сети: Hamachi, Radmin VPN или ZeroTier (выбор автора). Все подключаются к одной виртуальной сети, а к серверу заходят по IP, который эта программа выдала ПК с сервером.

Скачивание кастомных карт при этом по-прежнему требует проброшенного порта 80 для nginx. Без него игроки вне вашей реальной сети не смогут получить карты, и файлы придется передавать иначе, например через облачный диск.

Как скачать предмет Workshop без игры в Steam

Игроки Epic все равно могут вытянуть файлы Workshop через SteamCMD:

  1. Скачайте SteamCMD с вики разработчиков Valve.
  2. Возьмите App ID из ссылки на игру в Steam (для Killing Floor 2 это 232090).
  3. Возьмите ID предмета из конца ссылки на Workshop.
  4. В SteamCMD выполните:
login anonymous
workshop_download_item <AppID> <ModID>
  1. Файлы окажутся в ...\steamcmd\steamapps\workshop\content\<AppID>\<ModID>.

Редирект на Apache, IIS или HFS

Заметки w.a.l из темы «KF2 - Редирект для карт, мутаторов и всего остального» на форуме killingfloor.ru (2017):

  • В ссылке редиректа не должно быть порта. На момент написания KF2 не понимал адрес вида http://host:8080/maps/, поэтому веб-сервер должен отдавать файлы на стандартном 80-м порту. HFS и похожие программы на порту 80 сами дают ссылку без двоеточия.
  • Научите веб-сервер отдавать файлы KF2. Расширения .kfm, .upk и .u ему неизвестны, и без MIME-типа он может отдавать их неправильно. В Apache добавьте типы в mime.types или положите в папку редиректа .htaccess (в IIS — MIME-тип для каждого расширения):
AddType "map/download" .kfm
AddType "package/download" .upk
AddType "mutator/download" .u

Из темы «Скачивание карт с сервера» (форум killingfloor.ru): при RedirectToURL=http://<IP>:8080/<путь>/redirect/ в PCServer-KFEngine.ini игра писала «Ошибка при открытии файла». Что советовали:

  • создать в папке редиректа подпапку maps и положить карту туда, чтобы получилось .../redirect/maps/ (siriushard, со ссылкой на форум Tripwire);
  • в [IpDrv.TcpNetDriver] того же файла проверить AllowDownloads=True и строку DownloadManagers=IpDrv.HTTPDownload (RaideN-);
  • помнить, что порт 8080 по умолчанию занят WebAdmin, и качать через него не получится (STaJIKeR). У автора темы WebAdmin был на другом порту.

После этих правок у автора всё заработало, но скачивание шло очень медленно.

Хостинг на Linux

Один из комментаторов советует LinuxGSM для серверов KF2 на Linux - с ним легко обновляться. Конфиг nginx на Linux выглядит немного иначе, но принцип редиректа тот же.

Вопросы и ответы

Зачем свой редирект, если есть Steam Workshop?
Workshop помогает только игрокам Steam и у автора работал ненадежно. Собственный веб-сервер позволяет и игрокам Epic, и игрокам Steam скачивать ваши .kfm при входе.
Какой порт нужен редиректу на nginx?
Порт 80 TCP, проброшенный на ПК с nginx, в дополнение к обычным портам сервера KF2.
Почему ПК из моей сети не скачивают карты?
RedirectToURL указывает на внешний IP, а локальные ПК часто не могут к нему обратиться. Временно поставьте локальный IPv4, скачайте карты на этих ПК и верните внешний адрес.
Есть ли WebAdmin в версии Epic Games?
У сервера, запущенного через KF2Server.bat из папки Epic, нет файлов WebAdmin. Установите сервер один раз через SteamCMD и скопируйте папку KFGame\Web в свой сервер.