середу, 22 квітня 2015 р.

Игровой сервер 7 Days to Die

Ну вот я и дома, рабочий день закончился...
Иногда, когда просто все реально надоед и хочется просто отключить мозг и не думать о том что творится в стране, на работе и тд., я играю в разные игры жанра зомби-апокалипсис или песочницы, такие как DayZ, H1Z1, RUST, 7 Days to Die или в Minecraft :) куда же без него :)
Все эти игры жанра Online MMO Game, что совсем не очень то располагает к расслаблению, так как обычно там куча каких то неадекватных людей играет :( и ты быстрее умрешь от руки другого игрока чем от какого то зомби (Minecraft не считаем, так как там есть одиночный режим). Последнее время я выбираю 7 Days to Die, но самому играть не интересно, вначале конечно интересно бегать что то исследовать, но как обычно это заканчивается тем что тебя зомби быстро убивают. И приходится все начинать сначала.
Что бы хоть как то разнообразить это дело, и можно было поиграть в многопользовательский режим без всяких "бубуинов" с домашними или друзьями, я как обычно решил поднять на своем домашнем NASе, выделенный сервер для игры 7 Days to Die.  Но что бы не забивать основную ОС разными там библиотеками и тд. для этого я решил приспособить контейнеры Docker. Я не стал делать отдельный Dockerfile, так как это все делается для себя.

Итак, у меня уже был базовый образ для Debian Jessie, то его и будем использовать для создания игрового сервера.
Так как мне не нужно что бы контейнеру был выделенный отдельный сетевой адрес из подсети Docker, я использовал опцию --net=host, что позволило мне обращаться к контейнеру по адресу самого сервера.

Создаем новый контейнер
# docker run --net=host --name jessie -i -t sovicua:jessie
Обновляем образ
# apt-get update
# apt-get upgrade
Подготавливаем образ для установки SteamCMD, устанавливаем дополнительные библиотеки и утилиты
# apt-get install lib32gcc1 lib32stdc++6 wget
# useradd -m -c "SteamCMD User" -s /bin/bash steam
Скачиваем и устанавливаем SteamCMD
# su - steam
$ mkdir SteamCMD
$ cd SteamCMD/
$ wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz
$ tar -xvzf steamcmd_linux.tar.gz
После установки, файл с архивом инсталляции можно удалить что бы не путался под ногами.
Запускаем steamcmd и устанавливаем игру в ~/games/7dtd/, app_id = 294420 для 7 Days to Die Linux Dedicated Server
Важное замечание:
Для игры 7 Days to Die, нужно регистрироваться под учетной записью где она у вас куплена, в остальных случаях можно регистрироваться под анонимным пользователем. Перечень доступных серверов которые можно создать с помощью SteamCMD и их параметры можно найти по ссылке Dedicated Servers List  
$ ./steamcmd.sh
... идет установка ...
Steam> login steam_user steam_password
Steam> force_install_dir ./../games/7dtd/
Steam> app_update 294420 validate
... идет установка ...
Success! App '294420' fully installed.
Steam> exit
Осталось немножко подправить файл конфигурации serverconfig.xml на свое усмотрение и можно запускать сервер.
Данный файл хорошо документирован, так что разобраться что и как нужно править думаю не составит большого труда.
Так же стоит исправить файл запуска сервера 7DaysToDie.sh, добавив опцию -configfile=serverconfig.xml и убрав добавление даты и времени к лог файлу. Кстати я так и не понял почему в данном файле закоментировано проверка платформы и запуск 64-битной версии, у меня что та 32 что 64 битная версия заработала.
$ cd ../games/7dtd/
$ cat 7DaysToDie.sh
#!/bin/sh

export LD_LIBRARY_PATH=~/.local/share/Steam/ubuntu12_32/steam-runtime/i386/usr/lib/i386-linux-gnu
#export MALLOC_CHECK_=0

#if [ $(getconf LONG_BIT) = 64 ]; then
#   ./7DaysToDie.x86_64 -configfile=serverconfig.xml -logfile 7DaysToDie_Data/output_log__`date +%Y-%m-%d__%H-%M-%S`.txt $@
#else
    ./7DaysToDie.x86 -configfile=serverconfig.xml -logfile 7DaysToDie_Data/output.log $@ &
#fi
Можно выполнить первый запуск.
$ ./7DaysToDie.sh
После первого запуска нужно подправить serveradmin.xml что бы назначить себя администратором. Обычно он лежит в ~/7 Days To Die/Saves/

После всех исправлений, запускаем еще раз сервер руками и проверяем что все работает и клиент подключается.
Для управления сервером, подключаемся к нему телнетом на порт 8081 (по умолчанию). Если все нормально, то останавливаем сервер командой shutdown через консоль управления.

Теперь можно сохранить данный образ что бы можно быстро развернуть сервер. Запускать мы его будем руками, я не ставил перед собой цель это все автоматизировать.

Выходим из контейнера
$ exit
# exit
Сохраняем образ в локальном репозитории
# docker commit --author="Viktor M. Sytnyk <sovicua@mail.ua>" jessie sovicua/steam:7dtd
Можно посмотреть на созданный образ :)
# docker images

REPOSITORY          TAG                 IMAGE ID            CREATED              VIRTUAL SIZE
sovicua/steam       7dtd                620bfd31cc61        About a minute ago   2.643 GB
sovicua             jessie              0d4a8604eed7        24 hours ago         423 MB
sovicua/games       minecraft           e2555d48e61b        10 weeks ago         835.3 MB
debian              jessie              58052b122b60        3 months ago         122.8 MB
Контейнер с которым мы до этого игрались, можно удалить, зачем он будет только место занимать.
Итак создаем контейнер с уже настроенной игрой, используя подготовленный образ и запускаем.
# docker run --net=host --name=7dtd --user=steam -t -i sovicua/steam:7dtd
$ cd ~/games/7dtd/
$ ./7DaysToDie.sh
Для выхода из контейнера используем комбинацию Ctrl+p Ctrl+q
В дальнейшем мы сможем подключиться к контейнеру используя команду
# docker attach 7dtd

В следующий раз мы попробуем создать игровой сервер для игры Factorio, для запуска которой требуется Х-сервер.