середу, 22 липня 2015 р.

Создаем игровой сервере 7 Days to Die. Немножко автоматизации.


И снова добрый день/вечер/ночь и тд. всем кто читает данный блог.
Потихоньку я осваиваю основы Docker и вникаю в его возможности и функционал. Тяжелый это труд все это описывать, проще все сделать быстренько за какой то часик, а потом тратишь несколько дней на оформление этого все в читабельный вид, что бы можно это все опубликовать. Ну что же продолжим... это было небольшое лирическое отступление :) что бы выровнять первый абзац с картинкой :)
Продолжаем наши эксперименты с Docker. Сегодня поупражняемся с созданием Dockerfile. Подопытным "кроликом" будет у нас все тот же 7 Days to Die.
Несколько слов о новых образах, которые теперь доступны через на официальном "Hub Docker".
~> docker search sovicua
NAME             DESCRIPTION           STARS     OFFICIAL   AUTOMATED
sovicua/debian   Debian Jessie (8.0)   0
Все они построены на базе Debian Jessie. На текущий момент есть два образа с тегами "jessie" и "steamcmd". Собственно первый это чистый Debian с установленными дополнительными пакетами и настроенной временной зоной. Данные настройки были описаны в Установка timezone в базовом образе Docker. Второй собран на базе первого с установленными библиотеками и steamcmd.
Итак, создаем файл конфигурации для создания образа контейнера.
~> mkdir docker/steamcmd/
~> cd docker/steamcmd/
~/d/steamcmd> vim Dockerfile
FROM sovicua/debian:jessie
MAINTAINER Viktor M. Sytnyk <sovicua sovic.org.ua>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get install -y wget \
 && echo 'deb http://download.opensuse.org/repositories/shells:/fish:/release:/2/Debian_8.0/ /' >> /etc/apt/sources.list.d/fish.list \
 && wget http://download.opensuse.org/repositories/shells:fish:release:2/Debian_8.0/Release.key \
 && apt-key add - < Release.key \
 && apt-get update && apt-get upgrade -y \
 && apt-get install -y lib32gcc1 lib32stdc++6 fish && apt-get clean \
 && useradd -m -c "SteamCMD User" -s /usr/bin/fish steam
WORKDIR /home/steam/steamcmd
RUN wget http://media.steampowered.com/installer/steamcmd_linux.tar.gz \
 && tar -xvzf steamcmd_linux.tar.gz && rm steamcmd_linux.tar.gz \
 && chown -R steam:steam /home/steam
CMD /usr/bin/fish
Как вы можете видеть, shell по умолчанию я использую Fish Shell, хотя это не существенно, но понравился он мне :)
Создаем образ:
~/d/steamcmd> docker build -t sovicua/debian:steamcmd .
После этого можно выгрузить образ на Docker Hub:
~/d/steamcmd> docker push sovicua/debian:steamcmd
Теперь у нас есть готовый образ с установленным steamcmd, что позволит нам в дальнейшем быстро развернуть любую игру которая поддерживает установку с использованием данной утилиты. Теперь переходим к созданию образа с установленным сервером 7 Days to Die.
Для начала создадим файл скрипта с помощью которого будем устанавливать, а также обновлять саму игру.
~> mkdir docker/games/7dtd
~> cd docker/games/7dtd
~/d/steamcmd> vim 7dtd.steamcmd

login steam_user steam_password
force_install_dir /home/steam/games/7dtd
app_update 294420 validate
quit
Где, steam_user и steam_password это имя пользователя и пароль на учетной записи которого куплена эта игра.
Теперь создадим собственно сам файл конфигурации создания образа.
~/d/steamcmd> vim Dockerfile
FROM sovicua/debian:steamcmd
MAINTAINER Viktor M. Sytnyk <sovicua@sovic.org.ua>
WORKDIR /home/steam/steamcmd
COPY 7dtd.steamcmd /home/steam/steamcmd/
CMD /usr/bin/fish
Честно говоря, можно было бы и не делать данный образ, для этих целей можно бы использовать предыдущий образ, создав в нем скрипт установки и обновления игры, но раз уж автоматизируем то делаем все типа ка надо :) Изначально я планировал что бы при создании образа, сразу инсталлирована игра, но так как у меня настроен Steam Guard, то он запрашивал у меня код, так как это типа новая машина которая хочет получить доступ к моей учетной записи.
В Dockerfile была команда на запуск скрипта:
RUN ./steamcmd.sh +runscript 7dtd.steamcmd
Победить это, что бы инсталляция останавливалась при запросе кода, у меня так и не получилось. :( По этому инсталляцию придется выполнять руками уже в контейнере.
После этого создаем сам образ как обычно.
~/d/g/7dtd> docker build -t sovicua/games:7dtd
Вот что у нас получилось после всех этих процедур:
~/d/7dtd> docker images
REPOSITORY          TAG                 IMAGE ID            CREATED             VIRTUAL SIZE
sovicua/games   7dtd                c1c3539bbe2b        4 hours ago         594 MB
sovicua/debian  steamcmd            72ebdb1d894c        4 hours ago         594 MB
sovicua/debian  jessie              8ca03adc0398        27 hours ago        478.9 MB
Теперь мы можем быстренько создать контейнер:
~/d/7dtd> docker run --name="7dtd" --net="host" --user="steam" -i -t sovicua/games:7dtd
Выполняем инсталляцию игры, не забываем указать имя пользователя и пароль, если это не сделали раньше.
~/steamcmd> ./steamcmd.sh +runscript 7dtd.steamcmd
После инсталляции правим файл конфигурации сервера serverconfig.xml как вам удобно, и можно запускать сервер.
~/steamcmd> cd ../games/7dtd
~/g/7dtd> vim serverconfig.xml
Из параметров которые я у себя изменил, это установил пароль на доступ по telnet, и небольшие настройки самого сервера, такие как тройной лут и длина суток 2 часа реального времени. И еще пару параметров.
<property name="ServerName"             value="iHome Games Server" />
<property name="ServerPassword"         value="" />
<property name="ServerMaxPlayerCount"   value="4" />
<property name="ServerDescription"      value="iHome 7 Days to Die server" />
<property name="ServerWebsiteURL"       value="home.sovic.org.ua" />
...
<property name="DayNightLength"         value="120" />
<property name="DayLightLength"         value="18" />
...
<property name="DropOnDeath"            value="2" />
<property name="DropOnQuit"             value="0" />
...
<property name="CraftTimer"             value="0" />
<property name="LootTimer"              value="0" />
...
<property name="EnemySpawnMode"         value="4" />
...
<property name="LootAbundance"          value="300" />
<property name="LootRespawnDays"        value="30" />
Дополнительно, можно установить мод на сервер, который добавит пару дополнительных команд и самое вкусное что мне нравиться это возможность просмотра карты через веб. Очень помогает в поиске пещерок :) так как они редко сейчас встречаются, а на игровой карте искать не удобно, пока ищешь могут и "ушатать" :)
~/g/7dtd> wget http://illy.bz/fi/7dtd/server_fixes.tar.gz
~/g/7dtd> tar -xzvf server_fixes.tar.gz
Пример работы данного мода можно посмотреть у меня на сервере iHome 7 Days to Die server.
Ну вот и все, запускаем сервер:
~/g/7dtd> ./startserver.sh -configfile=serverconfig.xml
Если кто забыл, то напоминаю, что бы выйти с контейнера без его остановки, используем комбинацию клавиш Ctrl+p Ctrl+q.
На этом все, приятной игры. Если кто захочет поиграть вместе у меня на сервера, пишите.
Заходите на мой блог - UNIX и не только...

Немає коментарів:

Дописати коментар