середу, 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 и не только...

вівторок, 7 липня 2015 р.

Сетевой media сервер для PS3. Продолжение.

Как я и говорил в предыдущей части Сетевой media сервер для PS3 мы не будем использовать rc-скрипты для управление сервисом, а создадим отдельный контейнер для данного сервиса используя возможности Docker.
Создадим отдельную папку для размещения файла конфигурации создания контейнера и скопируем в него скомпилированый файл (смотрите предедущую часть). Для примера:
$ cd ~/docker/ps3netsrv
$ cp ~/source/ps3netsrv/ps3netsrv ./
Создадим файл конфигурации:
$ vim Dockerfile
FROM sovicua:jessie
MAINTAINER Viktor M. Sytnyk <sovicua@sovic.org.ua>
ENV DEBIAN_FRONTEND=noninteractive
RUN apt-get update && apt-get upgrade -y
RUN groupadd -g 1000 ps3netsrv
RUN useradd -u 1000 -g 1000 -m -c "PS3 Media Server" ps3netsrv
VOLUME /home/ps3netsrv/media
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/media
COPY ps3netsrv /home/ps3netsrv/
RUN chown ps3netsrv:ps3netsrv /home/ps3netsrv/ps3netsrv
WORKDIR /home/ps3netsrv
CMD ./ps3netsrv ./media
Создаем образ для данного сервиса:
$ docker build -t sovicua:ps3netsrv .
И запускаем контейнер:
$ docker run --net=host --name=ps3netsrv --user=ps3netsrv -v /mnt/media/ps3netsrv:/home/ps3netsrv/media -i -t -d sovicua:ps3netsrv
- где /mnt/media/ps3netsrv - корневой каталог в основной операционной системе, который монтируется в /home/ps3netsrv/media в контейнере. Все можно проверять работу нашего медиа-сервера на PS3. Думаю что вы сможете дальше не составить труда вам разобрать что и как.
В дальнейшем я планирую выгрузить данный контейнер в общий пул Docker, что бы каждый мог воспользоваться данным готовым контейнером для создания медиа-сервера.
Хотелось бы услышать ваше мнение по данному вопросу.

понеділок, 6 липня 2015 р.

Установка timezone в базовом образе Docker


Как то так случилось что я забыл установить в базовом образе правильную часовую зону, и после этого все контейнеры которые я делал с этого образа понятное дело имели зону UTC вместо Europe/Kiev. Каждый раз устанавливать правильную временную зону меня напрягает, соответственно что бы больше не заморачивать с данной проблемой, я решил обновить базовый образ.
Дополнительно обновим образ и установим еще несколько пакетов которые потребуются нам в дальнейшем.
$ docker run --name=jessie -i -t sovicua:jessie
# export DEBIAN_FRONTEND=noninteractive
# apt-get update && apt-get upgrade -y
# apt-get install -y apt-utils debconf-utils
# echo 'Europe/Kiev' > /etc/timezone
# dpkg-reconfigure tzdata
Выходим из контейнера и обновляем базовый образ.
$ docker commit --author="Viktor M. Sytnyk <sovicua@sovic.org.ua>" jessie sovicua:jessie
Ну вот и все, теперь в базовом образе у нас будет установлена правильная временная зона Europe/Kiev, а не UTC.

Сетевой media сервер для PS3

Давно валялась в черновиках данная заметка, все никак не мог собраться ее оформить и опубликовать. Но как говорят это вечно длится не может, так что приступим к повествовании. Собственно в чем же задача, спросите вы? У кого есть PS3 с установленной CFW, тот знает что записать файл больше 4Гб нельзя на внешний диск, так как это ограничение файловой системы FAT32 (сейчас файловые менеджеры для PS3, такие как Multiman поддерживают возможность чтения с томов NTFS, но эта функциональность появилась довольно недавно). Для решения этой проблемы можно было применить два метода:
  • записывать игру на внутренний диск
  • использовать специальные программы которые разбивали большие файлы на части, которые понимал файловый менеджер PS3 (в конечном итоге он все равно склеивал эти файлы и копировал на внутренний диск приставки) 
Но существовал и еще один метод, это поднять медиа-сервер для "стриминга" контента на PS3. Собственно этим мы займемся :)
У меня на PS3 установлена CFW с функцией Cobra, что позволяет использовать ISO образы, и не требует разворачивания образа в отдельный каталог, как того требуется. Дополнительно у меня еще установлен webMAN что позволяет мне монтировать образы игр не запуская файловый менеджер и даже управлять образами и самой приставкой из веб-браузера (даже с мобильного). Но не это есть предметом данного сообщения. Кому интересно, может обратиться к документации по этому ПО или мне написать личное сообщение.
Собственно, ничего сложного в сборке этого нет (сложно было найти это все в разных форумах и собрать вместе), скачиваем подготовленный архив с исходными файлами. Этот архив предназначен для платформы Linux x86_64, хотя я его собирал и под FreeBSD и даже для роутера ASUS RT-N56U. Я уже не помню всех нюансов сборки под данную платформу, если вас интересует данный вопрос, можете мне написать в личку или почитать Issue 1106: compiling ps3netsrv. В данный архив уже включены измененные файлы "main.cpp" и "netiso.h". Разворачиваем архив и собираем.
$ tar -xzvf ps3netsrv.tar.gz
$ make
Примечание.
В архиве есть скелет rc-скрипта для автоматического запуска/остановки сервиса, но я пошел другим путем и так его и не закончил. 
Запускаем все это очень просто:
$ ./ps3netsrv /mnt/media/ps3netsrv
 - где /mnt/media/ps3netsrv root-директория где будет лежать контент для PS3. Внутри корневой директории создаем папки - GAMES, PS3ISO. В первую складываем обычные распакованые образы, а в вторую образы в формате ISO.

пʼятницю, 3 липня 2015 р.

Собираем и настраиваем DNS сервер bundy (BIND10). Часть 2.

Итак, продолжим наши эксперименты.
После того как закончится сборка, выполняем инсталляцию:
# make install
Подготовка к первому запуску.
По умолчанию сервисы DNS и DHCP не запускаются, их нужно отдельно активировать при помощи утилиты bundyctl. Перед этим нам нужно добавить пользователя от которого мы будем управлять сервисом.
# bundy-cmdctl-usermgr add root
Так же стоит подготовить базу данных для DHCP сервера.
# mysql -u root -p
mysql> CREATE DATABASE bundy;
mysql> CONNECT bundy;
mysql> SOURCE /usr/share/bundy/dhcpdb_create.mysql
mysql> CREATE USER 'bundy'@'localhost' IDENTIFIED BY 'bundy';
mysql> GRANT ALL ON bundy.* TO 'bundy'@'localhost';
mysql> quit
Ну вот и все мы готовы к запуску и посмотреть что же это за зверь такой этот BUNDY 

Поехали...
Из родительской системы выполняем команду запуска, для первого запуска можно даже добавить ключ --verbose
$ docker exec -i -t bundy /usr/sbin/bundy --verbose
В контейнере подключаемся к сервису используя утилиту bundyctl которая позволяет нам  управлять и настраивать все сервисы bundy.
# bundyctl
Username: root
Password:
["login success"]
> help

usage: <module name> <command name> [param1 = value1 [, param2 = value2]]
Type Tab character to get the hint of module/command/parameters.
Type "help(? h)" for help on bundyctl.
Type "<module_name> help" for help on the specific module.
Type "<module_name> <command_name> help" for help on the specific command.

Available module names:
    help        Get help for bundyctl.
    config      Configuration commands.
    execute     Execute a given set of commands
    Stats       Stats daemon
    tsig_keys   The TSIG keyring is stored here
    Init        Init process
    Logging     Logging options
    data_sources
            The sources of authoritative DNS data
    Cmdctl      Interface for command and control
    Msgq        The message queue
>
Как я и говорил выше, по умолчанию сервисы DNS и DHCP (и другие) не запущены, для их инициализации есть готовый скрип который выполняет инициализацию авторизированного DNS сервер. Итак, для начала посмотрим какие у нас процессы запущены до начала инициализации.
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ]
]
Выполняем скрипт инициализации и снова смотрим что у нас теперь с процессами:
> execute init_authoritative_server
adding Authoritative server component
adding Xfrin component
adding Xfrout component
adding Zone Manager component
Components added. Please enter "config commit" to
finalize initial setup and run the components.
> config commit
> Init show_processes
[
    [
        18493,
        "Socket creator",
        null
    ],
    [
        18494,
        "msgq",
        null
    ],
    [
        18496,
        "cfgmgr",
        "ConfigManager"
    ],
    [
        18498,
        "bundy-stats",
        "Stats"
    ],
    [
        18499,
        "bundy-cmdctl",
        "Cmdctl"
    ],
    [
        18559,
        "bundy-xfrout",
        "Xfrout"
    ],
    [
        18560,
        "bundy-xfrin",
        "Xfrin"
    ],
    [
        18561,
        "bundy-zonemgr",
        "Zonemgr"
    ],
    [
        18562,
        "bundy-auth",
        "Auth"
    ]
]
Думаю, что разница заметна :) У нас появились 4 новых процессов:



  • bundy-xfrout
  • bundy-xfrin
  • bundy-zonemgr
  • bundy-auth

  • Проверим работу DNS сервера через запрос его версии.
    # dig @127.0.0.1 -c CH -t TXT version.bind
    
    ; <<>> DiG 9.9.5-9-Debian <<>> @127.0.0.1 -c CH -t TXT version.bind
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 27337
    ;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
    ;; WARNING: recursion requested but not available
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;version.bind.   CH TXT
    
    ;; ANSWER SECTION:
    version.bind.  0 CH TXT "bundy 1.2.0"
    
    ;; AUTHORITY SECTION:
    bind.   0 CH NS bind.
    
    ;; Query time: 1 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Fri Jul 03 07:39:41 UTC 2015
    ;; MSG SIZE  rcvd: 79
    

    Ну что же нас можно поздравить - не взирая на всякие препятствия при компиляции, мы смогли запустить и инициализировать  авторизированный DNS сервер BUNDY|BIND10. Думаю что на сегодня достаточно буковок 

    В следующей части мы немного разберемся с модулями которые входят в bundy и кто за что отвечает.

    четвер, 2 липня 2015 р.

    Scala первые впечетления

    Вспомнить все и забыть, так можно описать мое впечатление от знакомства с Scala. Все началось с того, что однажды в выходные я вытянул архив с исходниками что я когда то писал на Java. Посмотрел на все это, мне захотелось что то написать небольшое, так сказать для души... хотя какая может быть душа, если последний раз я что то писал серьезно на Java наверное несколько лет назад.
    У меня иногда случаются такие вот "хотелки", которые возникают после просмотра архивов прошлых работ ☺ И даже иногда я все таки что-то могу написать, но как обычно это просто небольшие программки (даже не программки, а просто скелеты/заготовки) которые в конечном итоге я так и не доводил до готовой программы которую можно было бы использовать.

    Последнее такое мое желание наступило когда мне захотелось написать небольшую программку для Android, что то типа напоминалки и базы данных клиентов в одном флаконе. Для хранение базы клиентов я решил использовать SQLite, ну так как в наше время напрямую с базой практически не работают, зачем писать какие то там SQL-запросы, если все можно типа обернуть в классы и работать с базой через них.
    В общем модно сейчас работать напрямую с базами, но это мое мнение и вы можете с ним не согласиться. По крайней мере для небольших проектов, как мне кажется оно может быть и удобно и позволяет не призываться к особенностям реализации каждой БД. Выдержка с wiki о данной технологии:

    ORM (англ. object-relational mapping, рус. объектно-реляционное отображение) — технология программирования, которая связывает базы данных с концепциями объектно-ориентированных языков программирования, создавая «виртуальную объектную базу данных»

    Собственно для этих целей я выбрал популярный фреймворк для Java - ORMLite, который по отзывам очень не плох как по функционалу так и по производительности.

    ... нда, что-то я отвлекся сильно от темы данного поста.

    Итак, возвращаемся к Scala... правда это наверное будет уже в следующий раз. ☺

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

    Собираем и настраиваем DNS сервер bundy (BIND10). Часть 1.

    Как то незаметно ☺ дошли руки все таки потрогать BIND10. Для начала немного истории о данном продукте.
    Первый релиз BIND10 был представлен консорциумом ISC в феврале 2013. 17 апреля 2014 консорциум ISC выпустил последний релиз BIND10 1.2.0, после это передал все наработки сообществу независимых разработчиков. Данного решение было принято в связи с тем что у консорциума нет ресурсов для разработки двух альтернативных проектов. Поэтому они будут развивать только BIND9, а BIND10 полностью переходит в руки сообщества. Для уменьшения путаницы с BIND9, на GitHub был создан новый проект в который перенесли все наработки консорциума по BIND10 и данный проект получил название Bundy.

    Ну что же, думаю можно приступать к эксперименту.

    Создадим новый контейнер и подключаемся к нему:
    $ docker run --name bundy --hostname=bundy -d -i -t sovicua:jessie
    $ docker attach bundy
    

    Как обычно обновляемся и устанавливаем нужные пакеты для сборки.
    # apt-get update
    # apt-get upgrade
    # apt-get install git-core g++ make pkg-config python3-dev sqlite3 libsqlite3-dev libbotan1.10-dev liblog4cplus-dev libboost-dev python3-setproctitle dnsutils net-tools autoconf autoconf-archive automake libtool
    

    Получаем исходные коды проекта и выполняем сборку:
    # git clone https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --enable-experimental-resolver
    # make
    

    И получаем ошибку при сборке resolver :(
    Ошибку получаем из-за того что ветке master отсутствуют некоторые файлы, в частности в папки src/lib/xfr которая нужна для сборки resolver. Если собирать без этой опции то все собирается и работает. Но так как мне хотелось попробовать все, то мне пришлось загрузить исходные коды с другой ветки и собирать все снова.
    Дополнительно включаем для сервера DHCP хранение базы в MySQL. В процессе инсталляции нам зададут несколько вопросов на которые думаю не сложно будет ответить ☺
    # wget http://dev.mysql.com/get/mysql-apt-config_0.3.6-1debian8_all.deb
    # dpkg -i mysql-apt-config_0.3.6-1debian8_all.deb
    
    Выбираем самую последнюю версию (DRM - Developer milestone releases)
    Configuring mysql-apt-config
    ----------------------------
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 1
    
    This configuration program will detect the current state of your system, check for any installed MySQL Server packages, and try to select the most appropriate version
    of MySQL Server to be installed. If you are not sure which version to choose for yourself, do not change the auto-selected version. Advanced users can always change
    the version later, depending on their own needs.
    
      1. mysql-5.6  2. mysql-5.7-dmr  3. none
    
    Which server version do you wish to receive? 2
    
    MySQL APT Repo features MySQL Server along with a variety of MySQL components. You may select the appropriate product to choose the version that you wish to receive.
    
    Once you are satisfied with the configuration then select last option 'Apply' to save the configuration. Advanced users can always change the configurations later,
    depending on their own needs.
    
      1. Server  2. Connector-Python  3. Utilities  4. Apply
    
    Which MySQL product do you wish to configure? 4
    
    Если вы решили использовать стабильную версию, то нужно выполнить команду:
    # dpkg-reconfigure mysql-apt-config
    
    ... и выбрать требуемую версию ПО которое вы хотите использовать.
    После этого обновляем данные репозитория и устанавливаем MySQL сервер.
    # apt-get update
    # apt-get install mysql-server libmysqlclient-dev libz-dev
    
    Запускаем сервер MySQL
    # service mysql start
    ..
    [info] MySQL Community Server 5.7.7-rc is started.
    # service mysql status
    [info] MySQL Community Server 5.7.7-rc is running.
    

    Теперь мы готовы к повторной сборке.
    # git clone --branch bundyfork --single-branch https://github.com/bundy-dns/bundy.git
    # cd bundy
    # autoreconf --install
    # ./configure --prefix=/usr --sysconfdir=/etc --without-werror --with-dhcp-mysql --enable-experimental-resolver 
    # make
    ...

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