Выделенный сервер KF1 на Linux через SteamCMD: полный гайд
Хочется большего, чем кнопка «Host Game» в Killing Floor 1? В этом гайде разобран полноценный выделенный сервер на Linux: он виден в общем списке, крутит пользовательские карты, которые игроки скачивают автоматически, и загружает набор мутаторов для удобства. Инструкция написана для Debian-подобных систем, с пометками для Windows, и предполагает, что вы умеете работать в терминале. Общие понятия (listen и dedicated, что настраивать в первую очередь) есть в обзоре выделенного сервера KF1.
Цель: собственный сервер 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 ее нужно сначала включить).
Откройте порты в фаерволе или на роутере:
| Порт | Протокол | Назначение |
|---|---|---|
| 7707 | UDP | Игровой порт |
| 7708 | UDP | Порт запросов (query) |
| 7717 | UDP | Порт запросов GameSpy |
| 28852 | TCP + UDP | Регистрация в мастер-сервере |
| 8075 | TCP | WebAdmin (значение ListenPort) |
| 20560 | UDP | Порт Steam |
| 10707 | UDP | Используется сервером, назначение не задокументировано |
На типичном 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.
Нужное имя класса - значение после 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 есть еще исправления и удобства. Основы установки: как добавить мутатор на сервер.
Волна 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), автор вместо перезагрузки машины делал так:
/etc/init.d/kf-server stop- остановить зависший сервер.ps axu | grep ucc- найти PID всех процессов, оставшихся от этого сервера (или посмотреть их вtop).- Убить каждый
killс сигналом 9: сигнал 15 (Terminate) может и не убить процесс. - Запустить сервер 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.