Свой сервер

Сервер KF2 в Docker на VPS с картами из Workshop

Страница основана на английском руководстве из Steam в формате «заметок для себя»: как запустить выделенный сервер Killing Floor 2 в Docker на VPS и подключить кастомные карты из Workshop. Автор опирается на образ сообщества dwurf/docker-kf2 и дописывает шаги, которых в описании образа нет. Установку без контейнеров через SteamCMD смотрите в статье Выделенный сервер KF2 через SteamCMD.

Требования

  • Умение гуглить команды Linux и Docker и понимание, зачем нужен Docker вместо прямой установки.
  • VPS минимум с 30 ГБ диска (с кастомными картами больше), SSD (иначе смена карты идёт долго), 2 ГБ ОЗУ и несколькими ядрами. С будущими обновлениями KF2 размер сервера вырастет.
  • SSH-клиент и FTP-клиент. Автор пользуется MobaXterm, где есть и то, и другое.

Подготовка образа Docker

  1. Скачайте образ: docker pull dwurf/docker-kf2
  2. На хосте RHEL разрешите пересылку IPv4 в контейнеры: sysctl -w net.ipv4.ip_forward=1, затем systemctl restart docker.
  3. Создайте каталоги для файлов сервера: mkdir -p $HOME/{kf2,kf2_steamdir}
  4. Назначьте владельца: sudo chown 1000 $HOME/{kf2,kf2_steamdir}. Решение нашлось в закрытой проблеме (issue) в GitHub образа, так что при сбоях заглядывайте в закрытые issues.

Создание контейнера

Соберите собственную команду docker run, а не используйте быстрый пример: после перезапуска сервер подхватит именно переданные переменные. Пример:

docker run -d -t --name kf2 -p 0.0.0.0:20560:20560/udp \
-p 0.0.0.0:27015:27015/udp \
-p 0.0.0.0:7777:7777/udp \
-p 0.0.0.0:8080:8080 \
-v $HOME/kf2:/home/steam/kf2server \
-v $HOME/kf2_steamdir:/home/steam/steam \
-e KF_SERVER_NAME=EnterServerNameHere \
-e KF_MOTD="Some Sort of Welcome Message" \
-e KF_DISABLE_TAKEOVER=true \
-e KF_ENABLE_WEB=true \
-e KF_ADMIN_PASS=ChangeMe \
-e KF_GAME_PASS=1234 \
-e KF_DIFFICULTY=1 \
-e KF_GAME_LENGTH=1 \
-e KF_GAME_MODE=Survival \
dwurf/docker-kf2:latest

Автор настоятельно советует включить веб-доступ и пароль администратора для удобной смены карт и режимов, а также отключить takeover, если не хотите, чтобы пустой сервер использовали посторонние. У образа есть и другие переменные, например стартовая карта.

Первый запуск скачивает около 30 ГБ файлов сервера. Идентификатор контейнера покажет docker ps -a (он выводит и остановленные), а ход загрузки видно через docker logs <ID>.

Проверка на стандартных картах

Зайдите через браузер серверов в игре либо откройте http://<IP-сервера>:8080 и войдите как admin с вашим паролем. Страница может открываться несколько минут. Если появилась ошибка «invalid form data», подождите минуту и обновите: сервер ещё не успел полностью запуститься.

Советы по WebAdmin

  • Не следуйте совету из описания образа запускать команду обновления для смены настроек.
  • Настройки из WebAdmin не всегда переживают перезапуск контейнера. По умолчанию WebAdmin показывает значения из переменных docker run.
  • В разделе Change Map выберите карту и режим (Survival, Endless), а в поле «Additional URL variables» впишите ?Difficulty=1?GameLength=0. Сложность идёт от обычной через hard и suicidal до Hell on Earth, длина игры - 4, 7 или 10 волн.
  • Не меняйте эти значения через General > Game: они применяются лишь иногда после загрузки карты, а Change Map работает всегда.
  • Map Cycles показывает все карты сервера, но автор предпочитает править конфиг (ниже).
  • В General > Administration включите «Admin can pause». В игре откройте консоль клавишей тильда, выполните AdminLogin <пароль>, затем pause.

Добавление карт из Workshop

Способ через game.yml из описания образа у автора не заработал, поэтому всё делается вручную. Перед правками остановите контейнер (docker stop, потом docker start <ID>: обычный stop и start оказался надёжнее restart).

Освобождение места (по желанию)

Если вы играете только на кастомных картах, удалите ненужные папки стандартных карт в /root/kf2/KFGame/BrewedPC/Maps/ - это вернёт около 6 ГБ. Оставьте хотя бы BioticsLab: она стартовая после перезапуска. Файлы окружения в /root/kf2/KFGame/BrewedPC/Packages/Environment удалять нельзя: их используют многие карты Workshop, и без них игроки проваливаются сквозь карту в случайных местах. Если пересоздаёте контейнер, удалите каталоги kf2 и kf2_steamdir и начните сначала, чтобы вернуть стандартные карты.

Имена карт и ID Workshop

На своём ПК откройте C:\Program Files (x86)\Steam\steamapps\workshop\content\232090 (232090 - ID приложения KF2 в Steam). Каждая папка с числом - это ID Workshop. Внутри в BrewedPC лежит файл карты .kfm, и его имя и есть настоящее название карты, которое может отличаться от заголовка в Workshop. Пример: карта KF-NachtDerUntoten_TraderPod, ID 1551913612.

LinuxServer-KFEngine.ini

В конец /root/kf2/KFGame/Config/LinuxServer-KFEngine.ini добавьте по строке на карту, с комментарием, чтобы потом не путаться:

[OnlineSubsystemSteamworks.KFWorkshopSteamworks]
ServerSubscribedWorkshopItems=1551913612 // KF-NachtDerUntoten_TraderPod

LinuxServer-KFGame.ini

Сначала сохраните нетронутую копию. Если вы удаляли стандартные карты, уберите их из строки GameMapCycles и удалите их секции [KF-<Map> KFMapSummary]. Для каждой карты Workshop добавьте секцию в конец файла:

[KF-NachtDerUntoten_TraderPod KFMapSummary]
MapName=KF-NachtDerUntoten_TraderPod
MapAssociation=1
ScreenshotPathName=UI_MapPreview_TEX.UI_MapPreview_Placeholder

После следующего старта сервер может дописать или изменить поля в этих секциях, например если автор карты задал скриншот и допустимые режимы. Это нормально.

Затем отредактируйте GameMapCycles, оставив только свои карты Workshop, одной длинной строкой без переносов:

GameMapCycles=(Maps=("KF-Arid_Zedlands","KF-BikiniAtoll","KF-DeepingWall","KF-NachtDerUntoten_TraderPod"))

Запустите контейнер снова и подождите несколько минут. Сервер скачает карты в /root/kf2/KFGame/Cache с той же структурой, что и на ПК. Убедитесь, что карты появились в Change Map или Map Cycle в WebAdmin.

Другие правки KFGame.ini

Большинство переменных docker run и настроек WebAdmin в итоге оказываются в KFGame.ini, и прямая правка этого файла была у автора самым надёжным способом. Там же находятся настройки приветственного экрана и опция «admin can pause».

Итоги

Автор потратил около двух дней на отладку game.yml и ручное добавление карт, потому что хороших руководств по серверам, а тем более по серверам в Docker, мало, и написал это как справочник. По другим темам сервера см. полное руководство по выделенному серверу KF2 и сервис systemd в Linux.

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

Сколько места нужно под сервер KF2 в Docker?
От 30 ГБ без кастомных карт. Карты Workshop добавляют примерно 100-400 МБ каждая. Если удалить ненужные стандартные карты, можно освободить около 6 ГБ.
Какие порты открыть для Docker-сервера?
UDP 20560 (Steam), UDP 27015 (запросы), UDP 7777 (игра) и TCP 8080 для WebAdmin.
Куда вписывать ID карт из Workshop?
В LinuxServer-KFEngine.ini, в раздел [OnlineSubsystemSteamworks.KFWorkshopSteamworks], по строке ServerSubscribedWorkshopItems на каждую карту.
Почему настройки из WebAdmin пропадают после перезапуска?
Изменения в WebAdmin не всегда сохраняются при рестарте контейнера. В руководстве надёжнее оказалась правка LinuxServer-KFGame.ini напрямую.