Свой сервер

Выделенный сервер KF1 на Linux через SteamCMD: полный гайд

Хочется большего, чем кнопка «Host Game» в Killing Floor 1? В этом гайде разобран полноценный выделенный сервер на Linux: он виден в общем списке, крутит пользовательские карты, которые игроки скачивают автоматически, и загружает набор мутаторов для удобства. Инструкция написана для Debian-подобных систем, с пометками для Windows, и предполагает, что вы умеете работать в терминале. Общие понятия (listen и dedicated, что настраивать в первую очередь) есть в обзоре выделенного сервера KF1.

Серверная стойка с ноутбуком, на экране матч Killing Floor Цель: собственный сервер KF1, работающий круглосуточно.

Обозначения

  • $ означает команду от обычного пользователя, # - от root.
  • kfuser - системный пользователь, kf1server - папка сервера, 10.20.30.40 - ваш внешний IP. Подставьте свои значения.
  • Переключение между обычным режимом и Objective-режимом (KFO) из командной строки здесь не рассматривается; его можно сменить вручную в WebAdmin.

Полезно почитать также: официальную страницу Tripwire о выделенном сервере, архивный гайд KF-Wiki 2010 года и проект «Killing Floor Portable» на GitHub с готовыми конфигами и мутаторами.

Шаг 0: требования и порты

Сервер KF1 нетребовательный: один поток и около 300 МБ ОЗУ максимум. Хватит самого простого VPS или старого компьютера. Упор сделан на Linux, потому что на нем работает большинство арендованных серверов; Windows-сервер настраивается так же, отличаются только пути и некоторые действия.

В исходной установке использовался Debian 12. Подойдет любой дистрибутив с поддержкой 32-битных приложений (в Debian и Arch ее нужно сначала включить).

Откройте порты в фаерволе или на роутере:

ПортПротоколНазначение
7707UDPИгровой порт
7708UDPПорт запросов (query)
7717UDPПорт запросов GameSpy
28852TCP + UDPРегистрация в мастер-сервере
8075TCPWebAdmin (значение ListenPort)
20560UDPПорт Steam
10707UDPИспользуется сервером, назначение не задокументировано

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

Совет из комментариев: если нужен сервер только для друзей и общий список не важен, достаточно открыть 7707 UDP. Игроки подключаются командой open <ip> в консоли, но часть функций при этом теряется.

Шаг 1: установка SteamCMD и сервера

Установите SteamCMD из репозиториев дистрибутива (на вики разработчиков Valve описаны все варианты). Создайте отдельного системного пользователя для SteamCMD и сервера и храните файлы игры в его домашней папке.

Также понадобится отдельный аккаунт Steam для SteamCMD. Не используйте свой игровой аккаунт. Покупать на нем Killing Floor не нужно: он нужен только для входа и загрузки сервера. Проще оставить аккаунт пустым и без Steam Guard, но при первом входе Steam обычно все равно присылает код на почту, так что указывайте настоящий ящик.

$ cd ~
$ mkdir kf1server
$ steamcmd
Steam> force_install_dir /home/kfuser/kf1server/
Steam> login USERNAME PASSWORD
Steam> app_update 215360
Steam> quit
$ ls kf1server

AppID 215360 - сервер для Linux. Для Windows используйте 215350. После quit в папке kf1server должен появиться набор игровых папок.

Шаг 2: запуск базового сервера

В папке System лежат бинарник сервера, конфиг и туда же ставятся мутаторы. Создайте скрипт запуска:

$ touch kfserverstart.sh
$ chmod +x kfserverstart.sh
$ nano kfserverstart.sh

Минимальный вариант:

#!/bin/bash
export LD_LIBRARY_PATH=/home/kfuser/.local/share/Steam/steamcmd/linux32
/home/kfuser/kf1server/System/ucc-bin server KF-westlondon.rom?game=KFmod.KFGameType?VACSecured=true?MaxPlayers=6 -nohomedir

Рекомендуемый вариант через screen (именованная сессия, 1024 строки истории, отсоединяется сразу после старта):

#!/bin/bash
export LD_LIBRARY_PATH=/home/kfuser/.local/share/Steam/steamcmd/linux32
/usr/bin/screen -d -m -S "kf1server" -h 1024 /home/kfuser/kf1server/System/ucc-bin server KF-westlondon.rom?game=KFmod.KFGameType?VACSecured=true?MaxPlayers=6 -nohomedir

Запустите ./kfserverstart.sh. Без screen терминал заполнится сообщениями запуска, а потом статусом игры. Со screen проверьте сессию через screen -ls и подключитесь screen -r kf1server. Останавливайте сервер через Ctrl+C: это самое корректное завершение, какое есть у сервера KF1.

Фикс видимости сервера (устаревшие библиотеки Steam)

Сделайте это до всего остального. Сервер поставляется со старыми библиотеками Steam, которые больше не работают, поэтому он не появляется в игровом браузере и не отдает информацию о себе. Решение (найдено участником сообщества): сохранить три библиотеки из комплекта и заменить их ссылками на копии из SteamCMD:

$ mv ~/kf1server/System/steamclient.so ~/kf1server/System/steamclient.so.bak
$ mv ~/kf1server/System/libtier0_s.so ~/kf1server/System/libtier0_s.so.bak
$ mv ~/kf1server/System/libvstdlib_s.so ~/kf1server/System/libvstdlib_s.so.bak
$ ln -s ~/.local/share/Steam/steamcmd/linux32/steamclient.so ~/kf1server/System/steamclient.so
$ ln -s ~/.local/share/Steam/steamcmd/linux32/libtier0_s.so ~/kf1server/System/libtier0_s.so
$ ln -s ~/.local/share/Steam/steamcmd/linux32/libvstdlib_s.so ~/kf1server/System/libvstdlib_s.so

В Debian 12 библиотеки SteamCMD по умолчанию лежат в ~/.local/share/Steam/steamcmd/linux32/. Оба скрипта выше уже направляют туда LD_LIBRARY_PATH. На Windows аналогичные ссылки создаются командой mklink. Если список серверов пуст уже у клиента, смотрите пустой список мастер-сервера.

Включение WebAdmin

Первый запуск создает KillingFloor.ini - основной конфиг. Править все вручную неудобно, поэтому включите WebAdmin и настраивайте остальное в браузере. Пользуйтесь поиском редактора (Ctrl+W в nano, поиск чувствителен к регистру):

СекцияПараметрЧто делает
[UWeb.WebServer]bEnabled=TrueВключает веб-сервер
[UWeb.WebServer]ListenPort=8075Порт WebAdmin (8075 по умолчанию)
[Engine.GameReplicationInfo]AdminName=YOURNAMEЛогин администратора
[Engine.AccessControl]AdminPassword=YOURPASSWORDПароль администратора

WebAdmin работает по обычному HTTP без шифрования, поэтому задайте уникальный пароль, который больше нигде не используется. Перезапустите сервер и откройте http://10.20.30.40:8075/. В домашней сети может понадобиться локальный IP (из ifconfig) вместо внешнего.

Заметки по WebAdmin

  • Интерфейс рассчитан на старые мониторы с низким разрешением, увеличьте масштаб.
  • Current: список игроков, кик и бан, прямой доступ к консоли сервера и список мутаторов.
  • Defaults: все остальное - имя сервера, пароль, списки карт, чат, голосование за карту и кик, sandbox, длина игры и сложность, баны.
  • Задайте имя сервера, настройте голосование за карты и выберите длину Long для 10 волн.
  • Maps: по умолчанию активны только стартовые карты. Слева установленные, но не включенные в ротацию, справа - доступные для игры. Нажмите >>, чтобы перенести все, затем верните KF-Menu кнопкой < (это сцена меню клиента, а не карта).
  • Пароль на игру пригодится, если сервер должен быть закрытым.
  • Restart Level/Map работает как теплый перезапуск. Изменения в WebAdmin, включая мутаторы, применяются после рестарта карты или ее обычной смены. Так быстрее всего сменить сложность.

На этом этапе у вас есть сервер в общем списке со всеми официальными картами.

Шаг 2.5: автозапуск через systemd

Простой unit-файл запускает сервер вместе с системой и позволяет управлять им через systemctl:

[Unit]
Description=Killing Floor 1 Server
After=network.target

[Service]
WorkingDirectory=/home/kfuser/kf1server/System/
User=kfuser
Group=kfuser
Type=forking
Restart=always
Environment=LD_LIBRARY_PATH=/home/kfuser/.local/share/Steam/steamcmd/linux32/
ExecStart=/usr/bin/screen -d -m -S "kf1server" -h 1024 /home/kfuser/kf1server/System/ucc-bin server KF-westlondon.rom?Mutator=MutLoader.MutLoader?game=KFmod.KFGameType?VACSecured=true?MaxPlayers=6 logs=./kf1dslogs.log -nohomedir

[Install]
WantedBy=multi-user.target

Вместо этой строки в ExecStart можно указать путь к своему скрипту. Поскольку мутаторы подгружает MutLoader (шаг 4), команду запуска почти не придется менять. Как установить и включить сервис, смотрите в вики своего дистрибутива.

Шаг 3: свои карты и сервер загрузки

Где брать карты

Главный источник - Steam Workshop, но в нем есть ловушка: Killing Floor не скачивает предметы из Мастерской, если аккаунт подписан более чем на 50 предметов во всех играх, а не только в KF. При сотнях старых подписок в других играх карты KF просто не придут (или придут после множества перезапусков). Варианты:

  • Отписаться от всего (в Steam есть отдельная кнопка), перезапустить Steam, скачать карты KF и подписаться обратно. Старые предметы предварительно сохраните в коллекцию.
  • Брать карты вне Мастерской: GameBanana, ModDB, старые открытые серверы загрузки.
  • Использовать архив автора гайда на archive.org «Killing-Floor-2009-Custom-Maps»: более 700 карт без зависимостей в формате .rom одним 7z-файлом. Работают не все, проверьте их в папке Maps клиента.

Когда карта из Мастерской скачивается, справа вверху появляется белая надпись. Если ее нет, откройте вкладку Multiplayer и вернитесь в главное меню - обычно это запускает загрузку. Проверить можно по списку карт в одиночной игре. Подробнее: гайд по Steam Workshop.

Какие файлы куда

  • Карта .rom кладется в папку Maps сервера (удобно через WinSCP).
  • Дополнительный контент (текстуры, звуки, код) - в те же папки, что и у клиента. Обычно они перечислены в описании в Мастерской; иначе сравните даты изменения папок.
  • Маленький .ucl с именем карты в System можно игнорировать - сервер создаст его сам.
  • Скопируйте все эти файлы еще и в одну общую папку: это основа сервера загрузки.

Зачем нужен сервер загрузки

Можно заставить каждого игрока качать карту из Мастерской или пересылать файлы вручную, но тогда случайные игроки не зайдут, а друзьям придется чистить подписки. KF1 умеет докачивать недостающие файлы с обычного HTTP-сервера - это правильное решение. Домен и сайт не нужны, и это отдельный сервер, не WebAdmin. Теория: быстрая загрузка / редирект.

Apache2 в Debian

Apache2 в Debian сразу раздает /var/www/html/ на 80-м порту. Скопируйте туда файлы карт или сделайте ссылки (ln -s), сохраняя регистр имени. Замените стандартную страницу пустой (touch /var/www/html/index.html), чтобы содержимое папки не показывалось списком.

Настройки в KillingFloor.ini

В секции [IpDrv.HTTPDownload] укажите:

RedirectToURL=http://10.20.30.40:80/
UseCompression=False

UseCompression=False обязателен, если вы раздаете обычные .rom, а не сжатые .uz2. В RedirectToURL можно указать домен (удобно с DynDNS на домашнем подключении), но порт в адресе оставьте. Полностью перезапустите сервер и проверьте: пусть зайдет друг, или отпишитесь от карты и удалите ее файлы у себя. Карта должна быстро скачаться и загрузиться как обычно.

Заметки:

  • Сжатые .uz2 со старых сайтов распаковываются бинарником ucc-bin или через KF SDK (ставьте SDK отдельно от игры).
  • Регистр имен файлов должен совпадать.
  • Символические ссылки экономят место и упрощают порядок.

Шаг 4: мутаторы («моды»)

В KF1 «моды» и «мутаторы» здесь означают одно и то же. Цель этой сборки - «Vanilla+»: исправления багов и удобства без изменения баланса, экономики, оружия и прокачки перков.

Снятие лимита FPS и netspeed

Клиент KF1 по умолчанию ограничен 85 FPS. Отдельный гайд в Steam (ID 971828546) объясняет, как поднять лимит до 144 и выше; правки нужны и на сервере, и у клиента. См. также продвинутую настройку FPS.

MutLoader

MutLoader - мутатор, который загружает другие мутаторы, чтобы не раздувать команду запуска. Возьмите его в Мастерской, скопируйте файлы в System сервера и добавьте ?Mutator=MutLoader.MutLoader в строку запуска:

ucc-bin server KF-westlondon.rom?Mutator=MutLoader.MutLoader?game=KFmod.KFGameType?VACSecured=true?MaxPlayers=6 logs=./kf1dslogs.log -nohomedir

Чтобы загрузить мутатор через MutLoader, нужно имя его класса. Часто оно есть в описании в Мастерской; иначе откройте .ucl мода в текстовом редакторе и скопируйте значение ClassName.

CountryTags.ucl в Блокноте с выделенным ClassName Нужное имя класса - значение после ClassName= в .ucl-файле мода.

Пример MutLoaderV2.ini, который загружает CountryTags на каждой сложности и меняет имя сервера в зависимости от текущей сложности:

[MutLoaderV2.MutLoader]

[Settings1 MutLoaderObject]
sGameTypeName=KFGameType
fGameDifficulty=2.0
bAppendFaked=false
bUpdateServerName=true
sServerName=My Own KF Server | Diff: NORMAL
Mutator=CountryTags.CountryTags

[Settings2 MutLoaderObject]
sGameTypeName=KFGameType
fGameDifficulty=4.0
bAppendFaked=false
bUpdateServerName=true
sServerName=My Own KF Server | Diff: HARD
Mutator=CountryTags.CountryTags

[Settings3 MutLoaderObject]
sGameTypeName=KFGameType
fGameDifficulty=5.0
bAppendFaked=false
bUpdateServerName=true
sServerName=My Own KF Server | Diff: SUICIDAL
Mutator=CountryTags.CountryTags

[Settings4 MutLoaderObject]
sGameTypeName=KFGameType
fGameDifficulty=7.0
bAppendFaked=false
bUpdateServerName=true
sServerName=My Own KF Server | Diff: HoE
Mutator=CountryTags.CountryTags

Каждый новый мутатор нужно добавить во все блоки сложности отдельной строкой Mutator=Package.ClassName. Что загрузилось, видно на странице мутаторов в WebAdmin. MutLoader читает список при старте, поэтому после изменений полностью перезапускайте сервер (это и так хорошая привычка).

Раздача клиентских модов

Чисто серверным модам больше ничего не нужно. Моды, которые должны работать у клиента (например, отображение урона), и любой другой пользовательский контент выкладывайте на сервер загрузки рядом с картами. Сам MutLoader раздавать не нужно.

Где искать мутаторы

У автора гайда есть коллекция в Мастерской с подборкой «Vanilla+» (ID 3053950873), а в проекте Killing Floor Portable на GitHub есть еще исправления и удобства. Основы установки: как добавить мутатор на сервер.

Patriarch в кафельном туалете во время волны босса Волна 11 из 10: бой с Patriarch - награда за всю эту настройку.

Частые вопросы из комментариев

  • Хост в той же локальной сети вылетает, а друзья издалека остаются. Известная странность; автор указал на отдельный фикс в Мастерской (ID 3310370082).
  • Что такое LD_LIBRARY_PATH на Windows? Это настройка только для Linux. На Windows достаточно, чтобы нужные DLL лежали в папке System.
  • Редирект не работает. Проверьте формат адреса: RedirectToURL=http://IP/ с префиксом http:// и слешем в конце.

Старые проблемы SteamCMD на Linux

Источник: форум killingfloor.ru.

Из темы «Создание выделенного сервера на Linux через SteamCMD» (REGETT, 2012). Там SteamCMD ставился вручную из архива, но ошибки встречаются и сейчас:

  • error while loading shared libraries: libstdc++.so.6 на 64-битной системе: не хватает 32-битной библиотеки. В Debian-подобных дистрибутивах: apt-get install lib32stdc++6, в Red Hat-подобных: yum install libstdc++ libstdc++-4.4.6-4.el6.i686 (версия пакета из 2012 года).
  • ERROR! Failed to request AppInfo update, not online or not logged into Steam: удалите папку Steam в домашнем каталоге (rm -rf ~/Steam) и войдите снова.
  • Нет приглашения Steam> по SSH: у автора на Ubuntu Server 11.04 оно просто не отображалось, ввод работал после нажатия Enter.
  • SteamCMD выставил права на исполнение всем файлам. Сбросить их и вернуть +x только нужным файлам:
find . -type d -exec chmod 0755 "{}" \;
find . -type f -exec chmod 0644 "{}" \;
chmod +x ./System/libgcc_s.so.1
chmod +x ./System/libstdc++.so.6
chmod +x ./System/libsteam_api.so
chmod +x ./System/libtier0_s.so
chmod +x ./System/libvstdlib_s.so
chmod +x ./System/steamclient.so
chmod +x ./System/ucc-bin
chmod +x ./System/ucc-bin-real
  • Нет KillingFloor.ini. Конфиг лежит в папке System и появляется после первого запуска сервера. На форуме также советовали скопировать Default.ini под именем KillingFloor.ini.
  • Сервер останавливается после закрытия окна SSH: запускайте его через screen (см. шаг 2 и скрипты screen и cron).

Другие проблемы Linux-сервера

Источник: форум killingfloor.ru.

  • После перезапуска сервера не работают перки. Из темы «При перезапуске сервера не работают перки» (Pir@tehnic, Debian amd64 6.0.6, чистый Steam-сервер). После остановки и нового запуска сервера пропадало меню выбора перков и перки переставали качаться - до перезагрузки самой машины. В логе было:
[S_API FAIL] SteamAPI_Init() failed; SteamAPI_IsSteamRunning() failed.
CreateBoundSocket: ::bind couldn't find an open port between 28852 and 28852
STEAMAUTH : Steam auth system activation failed

Причиной оказался скрипт, который по команде stop некорректно завершал процесс ucc. То же самое бывает, если запустить сервер вручную без screen и нажать Ctrl + Z; при Ctrl + C всё в порядке. Если сервер завис или упал и после подъёма перки не работают (в логе строка STEAMAUTH : Steam auth system activation failed), автор вместо перезагрузки машины делал так:

  1. /etc/init.d/kf-server stop - остановить зависший сервер.
  2. ps axu | grep ucc - найти PID всех процессов, оставшихся от этого сервера (или посмотреть их в top).
  3. Убить каждый kill с сигналом 9: сигнал 15 (Terminate) может и не убить процесс.
  4. Запустить сервер KF заново - перки работают.
  • Сервер не запускается после патча 1039. Совет REGETT из темы «Если не запускается Linux серер после 1039»: переименовать или удалить файл libgcc_s.so.1 в папке System.

  • Два сервера из разных папок занимают одни и те же порты. Из темы «2 сервера на одной машине» (CentOS 6.2, Steam-сервер версии 1033). Во второй папке в конфиге стояли свои порты (Port=7709, OldQueryPortNumber=7719, ListenPort=8077), но после запуска обоих серверов netstat -na|grep 770 показывал по две записи на 7707 и 7708. offutt пояснил, что параметр ?ini= в строке запуска нужен, когда два сервера живут в одной папке с разными конфигами; если папки разные, конфиг берётся по умолчанию. Когда автор удалил default.ini и killingfloor.ini из System, обнаружилась папка /home/kf2/.killingfloor/System с собственными killingfloor.ini, User.ini, ucc.log, steam_appid.txt и файлами *.ucl, а после удаления /home/kf2/.killingfloor сервер падал с ошибкой MissingIni. Затем автор привёл содержимое скрипта ucc-bin (export LD_LIBRARY_PATH=. и exec ./ucc-bin-real $*) со словами «видимо собака зарыта тут» и написал «разобрался», не уточнив, что именно поменял.

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

Какой AppID у сервера Killing Floor 1 в SteamCMD?
215360 для Linux-сервера и 215350 для Windows-сервера. Владеть игрой на аккаунте, с которого вы качаете сервер, не нужно.
Почему сервер KF1 не виден в браузере серверов?
В комплекте с сервером идут устаревшие библиотеки Steam. Замените steamclient.so, libtier0_s.so и libvstdlib_s.so в папке System на символические ссылки на файлы из установки SteamCMD.
Какое железо нужно серверу KF1?
Совсем немного. Сервер использует один поток и максимум около 300 МБ ОЗУ, так что хватит дешевого VPS или старого ПК.
Как игроки будут автоматически скачивать свои карты?
Выложите файлы карт на обычный HTTP-сервер и пропишите RedirectToURL в секции [IpDrv.HTTPDownload] файла KillingFloor.ini. Если раздаете несжатые .rom, поставьте UseCompression=False.