> For the complete documentation index, see [llms.txt](https://docs.edgegap.com/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.edgegap.com/ru/unreal-engine.md).

# Unreal Engine — начало работы

Разверните свой первый выделенный сервер Unreal Engine на Edgegap. Практическое руководство, охватывающее сборку, загрузку и глобальное развертывание для многопользовательских игр.

Учитесь на практике и разверните свой первый выделенный сервер на Edgegap. К концу этого руководства вы бесплатно развернёте выделенный сервер с Edgegap.

Сборка с помощью Docker Desktop — самый быстрый, простой и надёжный способ начать.

{% embed url="<https://youtu.be/q7ljcr9rAWE>" %}

## ✔️ Подготовка

Прежде чем начать, обязательно [создайте бесплатную учетную запись в Edgegap](https://app.edgegap.com/auth/register) (кредитная карта не требуется). Вы можете [позже пригласить членов вашей команды](https://app.edgegap.com/user-settings?tab=organizations), даже если у них ещё нет учётной записи Edgegap.

**Настройте несколько основных параметров на вашей машине для разработки:**

<details>

<summary><a href="https://www.docker.com/products/docker-desktop/">Установите Docker Desktop и расширение Docker Edgegap</a></summary>

* [Установите Docker Desktop из официального источника](https://www.docker.com/products/docker-desktop/) (учётная запись не требуется).
* Перезагрузите компьютер после завершения установки.
* Перейдите в Настройки ⚙️ > Extensions > Enable Docker Extensions.
* [Установите расширение из официального Docker Marketplace (нажмите эту ссылку).](https://www.docker.com/products/docker-desktop/)

</details>

<details>

<summary><a href="https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension">Установите расширение Edgegap Quickstart для Docker</a></summary>

* Установите из Docker Desktop / Extensions / Browse или [по ссылке](https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension).

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FraFWUCJWPZYvBMLieBUZ%2Fimage.png?alt=media&amp;token=186886ac-accb-421d-b560-3ccefa7f29cb" alt=""><figcaption></figcaption></figure>

</details>

<details>

<summary><a href="https://www.unrealengine.com/en-US/ue-on-github">Получите доступ к ресурсам Unreal Engine на GitHub</a></summary>

* [Зарегистрируйтесь для получения аккаунта GitHub.](https://github.com/)
* Перейдите к вашей [странице панели связанных аккаунтов Unreal Engine](https://www.epicgames.com/account/connections).
* Свяжите аккаунт GitHub с вашим аккаунтом Epic.
  * Авторизуйте Epic Games для доступа к вашему аккаунту GitHub.
  * Примите приглашение по электронной почте присоединиться к организации Epic Games на GitHub.

</details>

<details>

<summary><a href="https://github.com/settings/tokens/new">Создать персональный токен доступа GitHub (классический)</a></summary>

* включить только разрешение `[read:packages]` ,
* создать токен - **сохраните это значение в безопасном месте, вы не увидите его снова**.

</details>

{% hint style="info" %}
**Уверены в своих сборках сервера?** Перейдите к [#customize-server-image](#customize-server-image "mention") и [Расширенные возможности](/ru/learn/advanced-features.md).
{% endhint %}

## ⚙️ 1. Настройка проекта <a href="#id-1-configure-project" id="id-1-configure-project"></a>

Независимо от того, используете ли вы компьютер с Windows, Mac или Linux, вы будете **должны собрать свой сервер для среды выполнения Linux**, поскольку большинство поставщиков облачных услуг в настоящее время (включая Edgegap) работают на Linux. Не беспокойтесь, знание Linux не требуется.

{% hint style="warning" %}
Не упаковывайте свой проект в Unreal Editor. Не устанавливайте набор инструментов Linux вручную. Не задавайте `LINUX_MULTIARCH_ROOT` . Не собирайте Unreal Engine из исходного кода. **Наше расширение делает всё это за вас.**
{% endhint %}

☑️ Начните с **проверки версии Unreal Engine** — предварительно заполнено значением из файлов вашего проекта.

☑️ **Введите имя пользователя GitHub и** [**PAT**](#user-content-fn-1)[^1] из [#preparation](#preparation "mention"), чтобы загружать зависимости из GitHub.

<details>

<summary><a href="https://github.com/settings/tokens/new">Создать персональный токен доступа GitHub (классический)</a></summary>

* включить только разрешение `[read:packages]` ,
* создать токен - **сохраните это значение в безопасном месте, вы не увидите его снова**.

</details>

☑️ **Отключить проверку совместимости версии Unreal Engine** для выделенных серверов и **установить `IpNetDriver` в качестве драйвера по умолчанию или запасного драйвера** для сетей репликации:

{% hint style="warning" %}
Убедитесь, что **вводите свой `DefaultServerTarget`  в конце этого фрагмента**!
{% endhint %}

<pre data-title="Config/DefaultEngine.ini"><code><a data-footnote-ref href="#user-content-fn-2">[ConsoleVariables]</a>
net.IgnoreNetworkChecksumMismatch=1
net.CurrentHandshakeVersion=2
net.MinHandshakeVersion=2
net.VerifyNetSessionID=0
net.VerifyNetClientID=0

<a data-footnote-ref href="#user-content-fn-3">[/Script/Engine.GameEngine]</a>
!NetDriverDefinitions=ClearArray
+NetDriverDefinitions=(DefName="GameNetDriver",DriverClassName="OnlineSubsystemUtils.IpNetDriver",DriverClassNameFallback="OnlineSubsystemUtils.IpNetDriver")

<a data-footnote-ref href="#user-content-fn-4">[/Script/OnlineSubsystemUtils.IpNetDriver]</a>
MaxClientRate=1000000000
MaxInternetClientRate=1000000000
InitialConnectTimeout=120.0
MaxNetTickRate=60
NetServerMaxTickRate=60

<a data-footnote-ref href="#user-content-fn-5">[/Script/BuildSettings.BuildSettings]</a>
DefaultServerTarget=LyraServer
</code></pre>

☑️ **Перезапустите Unreal Engine** чтобы загрузить последние изменения.

☑️ **Создайте скрипт целевой сборки выделенного сервера** скопировав ваш `<PROJECT>Editor.Target.cs` файл в корневой папке проекта и переименовав копию в `<PROJECT>Server.Target.cs`.

☑️ **Замените любые ссылки на** слово **`Editor`** **на** **`Server`** в вашем скрипте целевой сборки сервера.

☑️ **Измените параметры сборки сервера по умолчанию** редактируя ваш скрипт целевой сборки сервера:

<pre data-title="Source/<PROJECT>Server.Target.cs"><code>bOverrideBuildEnvironment = true;
<a data-footnote-ref href="#user-content-fn-6">bUseLoggingInShipping = true;</a>
<a data-footnote-ref href="#user-content-fn-7">bUseChecksInShipping = false;</a>
<a data-footnote-ref href="#user-content-fn-8">bBuildWithEditorOnlyData = false;</a>
<a data-footnote-ref href="#user-content-fn-9">bUsesSlate = false;</a>
<a data-footnote-ref href="#user-content-fn-10">bCompileCEF3 = false;</a>
</code></pre>

✅ Теперь вы можете перейти к следующему шагу.

<details>

<summary>Необязательно: интеграция со Steam</summary>

Чтобы **интегрировать Steam**, используйте `IpNetDriver` в качестве драйвера сети по умолчанию и убедитесь, что [64-битный steamclient.so для Linux](https://developer.valvesoftware.com/wiki/SteamCMD#Ubuntu) скопирован в образ по пути `/home/ubuntu/.steam/sdk64/` .

{% hint style="success" %}
Добавьте `steamclient.so`  библиотеку для Linux одним щелчком с помощью нашего [расширения Docker](/ru/unreal-engine.md).
{% endhint %}

<a href="https://github.com/edgegap/edgegap-unreal-buildutils/raw/refs/heads/main/steamclient.so" class="button secondary" data-icon="square-down">Скачать steamclient.so</a>

<pre class="language-docker" data-title="Dockerfile"><code class="lang-docker">...
<a data-footnote-ref href="#user-content-fn-11">RUN mkdir -p /home/ubuntu/.steam/sdk64</a>
<a data-footnote-ref href="#user-content-fn-12">COPY ./steamclient.so /home/ubuntu/.steam/sdk64/steamclient.so</a>
<a data-footnote-ref href="#user-content-fn-13">RUN chmod 755 /home/ubuntu/.steam/sdk64/steamclient.so</a>
...
</code></pre>

{% hint style="warning" %}
**Обязательно отключите сетевые функции Steam, которые отправляют пакеты через Steam Relay и могут вызывать проблемы с подключением или всплески задержки.** Это не мешает вам использовать другие функции Steamworks, такие как таблицы лидеров, достижения, голосовая связь или публикация вашей игры в магазине Steam.
{% endhint %}

<pre data-title="Config/DefaultEngine.ini"><code>[OnlineSubsystemSteam]
bUseSteamNetworking=false
bAllowP2PPacketRelay=false
<a data-footnote-ref href="#user-content-fn-14">SteamDevAppId=480</a>
<a data-footnote-ref href="#user-content-fn-14">SteamAppId=480</a>
</code></pre>

</details>

## 🔧 2. Сборка игрового сервера <a href="#id-2-build-game-server" id="id-2-build-game-server"></a>

Теперь мы соберём и подготовим ваш проект, а затем упакуем его в легко повторно используемый Docker-образ.

{% hint style="warning" %}
Не упаковывайте свой проект в Unreal Editor. Не устанавливайте набор инструментов Linux вручную. Не задавайте `LINUX_MULTIARCH_ROOT` . Не собирайте Unreal Engine из исходного кода. **Наше расширение делает всё это за вас.**
{% endhint %}

Работа в команде разработчиков предполагает совместное использование кода. Когда что-то идет не так, последнее, что вы хотите услышать — «у меня работает». Серверы игр должны надежно запускаться на любой машине, поскольку успешные игровые серверы работают на тысячах серверов по всему миру.

Чтобы сделать ваш сервер надежным, мы используем Docker — виртуализационное ПО, гарантирующее, что все зависимости вашего серверного кода вплоть до уровня операционной системы всегда будут точно такими же, независимо от того, как и где запускается сервер.

{% hint style="info" %}
Мы рекомендуем посмотреть [«Никогда не устанавливайте локально» (видео)](https://www.youtube.com/watch?v=J0NuOlA2xDc\&ab_channel=Coderized). **Вам НЕ нужно использовать Dockerhub с Docker**.  Docker ≠ Dockerhub. Думайте о Docker как о движке для программирования, а о Dockerhub — как о его магазине приложений.
{% endhint %}

☑️ Вы можете настроить следующие параметры (или оставить значения по умолчанию):

* **Имя образа** — это уникальный идентификатор по вашему выбору, который обозначает сборку вашего сервера перед публикацией.
  * Обычно сюда входит название вашей игры — например, «my-game-server».
* **Тег образа** — это идентификатор, указывающий на конкретную версию вашего образа.
  * Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.
  * Отличный вариант по умолчанию для тегов — временные метки, например `2024.01.30-16.23.00-UTC` .

☑️ **Собрать проект** когда будете довольны своей конфигурацией. Завершение этого шага добавит новый образ с исполняемым файлом вашего Linux-игрового сервера в локальный Docker-клиент.

✅ Теперь можно перейти к следующему шагу.

## 🧪 3. Локальная проверка сервера <a href="#id-3-test-server-locally" id="id-3-test-server-locally"></a>

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

☑️ **Выберите тег образа, который вы хотите запустить локально** (удалённые образы будут загружены). При желании можно указать дополнительные [аргументы docker run](https://docs.docker.com/reference/cli/docker/image/build/#options) для настройки локального теста:

* `-p 7777:7777/udp` — это сопоставление [портов локального контейнера](/ru/learn/orkestraciya/application-and-versions.md#port-mapping),
* `-e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777`  — это [переменная окружения](#environment-variables) имитирующая реальное развёртывание Edgegap и сообщающая вашему игровому серверу внутренний порт, на котором слушать подключения игроков.

☑️ Когда будете довольны настройками, нажмите **Запустить локальный сервер**. Завершение этого шага приведёт к **запуску нового контейнера** на вашей машине разработки.

☑️ Теперь пора подключить игровой клиент Unreal Engine Editor (PIE) к локальному контейнеру сервера. Откройте консоль Unreal PIE с помощью `~`  (тильда) и подключитесь с помощью `open <ip>:<port>`:

* `ip`  = `localhost`  или `127.0.0.1`  (в большинстве случаев эквивалентно),
* `port`  = случайное значение внешнего порта контейнера в Docker GUI.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FCDGTUe5ests3DI3u9rTV%2Fimage.png?alt=media&amp;token=8c4799d8-0622-4142-91a5-93fd1816149c" alt=""><figcaption></figcaption></figure>

☑️ Как только вы убедитесь, что можете подключиться к локальному серверному контейнеру и играть без проблем, вы можете удалить контейнер 🗑️, чтобы освободить ресурсы на вашей машине для других программ.

✅ Теперь можно перейти к следующему шагу.

<details>

<summary>Устранение неполадок и FAQ</summary>

Не удаётся подключить клиентов к серверу — `Время ожидания запроса истекло.` , `Тайм-аут запроса` , `ConnectionFailed` , или `Проверка порта не удалась`

* Сначала убедитесь, что контейнер запущен и в ваших логах нет ошибок выполнения.
* Пожалуйста, проверьте, что значения портов в команде `docker run` совпадают.
* Убедитесь, что ваш игровой клиент подключается к **внешнему порту** указанному на странице сведений о контейнере; это значение всегда будет случайным по соображениям безопасности.
* Убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано на шаге [#id-1-configure-project](#id-1-configure-project "mention").

***

Мой контейнер запущен, но после этого я всё равно не могу подключиться несколько минут.

* После запуска контейнера начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения с интервалом в 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления сцены загрузки, чтобы сервер мог выполнять инициализацию (и переход, если речь об Unreal Engine) одновременно с клиентами, синхронизируя состояние обоих.

***

`Предупреждение: не удалось создать сокет для адреса привязки`

* Пожалуйста, установите плагин Epic’s Steam Subsystem через магазин ассетов Fab.
* При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore, загруженной с GitHub, плагин Epic’s Steam Subsystem не включён из-за политики распространения плагинов Epic Games.

***

Я подключился, но мой экран полностью чёрный.

* Проверьте, что у вас правильно задан **Game Default Map** в **Edit / Project Settings / Maps & Modes**.

</details>

## ☁️ 4. Публикация на Edgegap <a href="#id-4-publish-to-edgegap" id="id-4-publish-to-edgegap"></a>

Пора разместить ваш сервер в интернете! Теперь, когда ваш образ успешно может обслуживать игроков, мы можем загрузить его в Edgegap и начать запускать в любой точке мира. В этом руководстве мы будем использовать [**Реестр контейнеров Edgegap**](/ru/learn/advanced-features/edgegap-container-registry.md) (хранилище для образов).

☑️ **Выберите имя приложения** чтобы маркировать и группировать похожие образы на Edgegap.

☑️ **Выберите тег образа, который вы хотите опубликовать** и **Загрузить образ**. Завершение этого шага приведёт к загрузке образа вашего сервера в реестр Edgegap и созданию новой [версии приложения](/ru/learn/orkestraciya/application-and-versions.md) в вашем веб-браузере. **Обязательно создайте** [**портов локального контейнера**](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) **когда появится запрос,** со значениями по умолчани&#x44E;**.**

{% hint style="success" %}
Нашли ошибку и нужно снова собрать/опубликовать? Используйте **Rebuild from Source** чтобы [#id-2.-build-game-server](#id-2.-build-game-server "mention") и [#id-4.-publish-to-edgegap](#id-4.-publish-to-edgegap "mention") **быстро использовать текущие значения ввода расширения.**
{% endhint %}

✅ Теперь можно перейти к следующему шагу.

<details>

<summary>Устранение неполадок и FAQ</summary>

`отказано: добавление 756,6 МиБ ресурса хранения, которое при обновлении до текущего использования 4,3 ГиБ превысит настроенный верхний предел в 4,7 ГиБ` , `ошибка фиксации на ref "layer-sha256:--------": неожиданный статус от PUT-запроса к https://registry.edgegap.com/`

* Похоже, у вас закончилось место для хранения образов на [Регистр контейнеров](https://app.edgegap.com/registry-management/repositories/list). Рассмотрите возможность удаления неиспользуемых артефактов сборки (если они у вас есть) или оптимизации размера сборки сервера. Если вы используете пользовательский Dockerfile или .dockerignore, вы могли скопировать некоторые ненужные файлы в образ.

***

`Вы достигли лимита приложений: 2` , `Не удалось обновить тег/версию docker: вы достигли лимита версий приложения: 2`

* Вы достигли лимитов нашего бесплатного тарифа, пожалуйста, рассмотрите возможность обновления учетной записи. В качестве альтернативы вы можете удалить существующие ресурсы через наш [Панель управления](https://app.edgegap.com/).

***

Моя новая версия приложения не отображается в плагине/расширении.

* Пожалуйста, убедитесь, что вы заполнили форму создания версии приложения на последнем шаге.

</details>

## 🚀 5. Развёртывание в облаке <a href="#id-5-deploy-to-cloud" id="id-5-deploy-to-cloud"></a>

Это последний шаг в этом руководстве, после которого у вас будет сервер, развернутый в облаке Edgegap, к которому игроки из любой точки мира смогут подключаться.

☑️ **Выберите приложение и версию** из предыдущего шага для развертывания.

☑️ Как только будете готовы, нажмите **Развернуть в облаке**, дождитесь достижения [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-3.-deployment-ready](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-3.-deployment-ready "mention"). Выполнение этого шага приведёт к [запуску нового Развертывания](https://app.edgegap.com/deployment-management/deployments/list) в вашей учетной записи Edgegap.

☑️ Убедитесь, что в выводе консоли нет новых ошибок. Также проверьте, что ваши [Развертывания](/ru/learn/orkestraciya/deployments.md#container-logs) не показывают ошибок и ваши [Развертывания](/ru/learn/orkestraciya/deployments.md#container-metrics) не указывают на 100% загрузку ресурсов (vCPU или память), иначе новые подключения игроков могут быть отклонены, или ваш сервер застрянет в цикле перезапуска. См. ниже шаги по устранению неполадок для решения любых проблем.

☑️ Теперь мы проведём финальный тест и **подключим Unreal Engine Editor к вашему облачному развёртыванию**. Возьмите **хост развёртывания** вместо IP сервера и **внешний порт**, откройте консоль Unreal в игровом клиенте (тильда `~`) и введите `open {host}:{port}` .

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2Fz9xjzvZwKSIp9IeC9qo8%2Fimage.png?alt=media&amp;token=e3f345ac-848d-4469-b66f-3655cd393cf3" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Внешний порт вашего развёртывания в облаке Edgegap будет выбран случайным образом, чтобы потенциальный злоумышленник (хакер) замедлялся и обнаруживался до того, как сможет нанести ущерб.
{% endhint %}

{% hint style="warning" %}
**Отключите VPN при тестировании** для более реалистичных условий и получения [развёртывания с низкой задержкой](/ru/learn/orkestraciya/deployments.md#server-placement).
{% endhint %}

☑️ Как только вы убедитесь, что можете подключиться к вашему развёртыванию без проблем и завершите тестирование, **Остановите ваше развёртывание** чтобы освободить ресурсы в вашем аккаунте для следующей сборки.

* Если вы столкнётесь с проблемами, [просмотрите логи на Панели управления вашего развёртывания](https://app.edgegap.com/deployment-management/deployments/list).
* Если вы не сможете разобраться с проблемой, мы сидим в нашем [сообществе Discord](https://discord.gg/NgCnkHbsGp) и будем рады помочь.

🙌 Поздравляем с вашим первым развёртыванием в Edgegap! Если хотите узнать больше, продолжайте чтение.

<details>

<summary>Устранение неполадок и FAQ</summary>

Не удаётся подключить клиентов к серверу — `Время ожидания запроса истекло.` , `Тайм-аут запроса` , `ConnectionFailed` , или `Проверка порта не удалась`

* Сначала убедитесь, что развёртывание Ready и что в журнале развёртывания нет исключений или ошибок времени выполнения. Если развёртывание остановилось, проверьте логи в нашей [панели управления](https://app.edgegap.com/deployment-management/deployments/list).
* Пожалуйста, проверьте, что настройка порта в сетевых параметрах вашей серверной сборки совпадает с внутренним портом в вашей [версии приложения](https://app.edgegap.com/application-management/applications/list). Для сборок с плагином порт задаётся автоматически. Вы можете изменить сопоставление портов, отредактировав [версии приложения](https://app.edgegap.com/application-management/applications/list) без пересборки. Найдите ваш протокол в вашей сетевой интеграции.
* Убедитесь, что ваш игровой клиент подключается к **внешнему порту** указанную на странице сведений о развёртывании; это значение всегда будет случайным по соображениям безопасности.
* Убедитесь, что вы переименовали целевой файл и настроили сборки игры, как описано на шаге [#id-1-configure-project](#id-1-configure-project "mention").

***

Моё развёртывание готово, но после этого я всё равно не могу подключиться несколько минут.

* После того как развёртывание становится Ready, начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения с интервалом в 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления сцены загрузки, чтобы сервер мог выполнять инициализацию (и переход, если речь об Unreal Engine) одновременно с клиентами, синхронизируя состояние обоих.

***

`Предупреждение: не удалось создать сокет для адреса привязки`

* Пожалуйста, установите плагин Epic’s Steam Subsystem через магазин ассетов Fab.
* При использовании Edgegap Integration Kit (EGIK) с исходной версией SteamCore Integration Kit (SIK), загруженной с GitHub, плагин Epic’s Steam Subsystem не включён из-за политики распространения плагинов Epic Games.

***

Я подключился, но мой экран полностью чёрный.

* Проверьте, что у вас правильно задан **Game Default Map** в **Edit / Project Settings / Maps & Modes**.
* Проверьте, что [проверка совместимости версии Unreal Engine отключена](#id-2.-configure-game-server-builds) в `DefaultEngine.ini`.

***

Моё развёртывание остановилось/перезапустилось, и я больше не могу получить доступ к его логам.

* Если процесс сервера падает из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите возможность локальной проверки сервера, чтобы выявить первопричину.
* Мы храним логи только в течение всего времени развёртывания. Если вы хотите просматривать логи после остановки развёртывания, пожалуйста, [подключите стороннее хранилище логов](https://docs.edgegap.com/docs/deployment/endpoint-storage).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

Моё развёртывание автоматически остановилось через X минут.

* Развёртывания Free Tier имеют ограничение в 60 минут, пожалуйста, рассмотрите возможность обновления вашего аккаунта.
* Все развёртывания будут завершены через 24 часа работы в соответствии с нашей политикой очистки серверов, для обслуживания инфраструктуры и чтобы избежать неожиданных расходов, если развёртывание не было корректно остановлено. Для серверов с длительным временем работы рассмотрите возможность использования [Частные флоты](/ru/learn/orkestraciya/chastnye-floty.md) с [Постоянство](/ru/learn/orkestraciya/postoyanstvo.md).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

Что произойдёт, если игрок покинет моё развёртывание?

* По умолчанию серверы не отклоняют подключения игроков. Аутентификация игроков — задача ваших разработчиков, поскольку можно использовать множество разных методов и провайдеров аутентификации игроков.
* Игровые клиенты могут локально сохранять информацию о подключении, чтобы попытаться переподключиться в случае неожиданного сбоя клиента.
* Чтобы позволить игрокам присоединяться к уже идущим играм, рассмотрите использование [Подробный обзор](/ru/learn/matchmeiking/matchmaker-in-depth.md#backfill) или [Сессии](https://docs.edgegap.com/docs/deployment/session).

***

На моём сервере загрузка ЦП показывает 100% после того, как он стал Ready.

* Это может и не быть проблемой, так как игровые движки часто выполняют ресурсоёмкие операции ЦП во время инициализации сервера. Если загрузка ЦП не снизится через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение частоты тиков может помочь контролировать загрузку ЦП за счёт обработки меньшего числа сообщений.
* В Free Tier вы ограничены 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете изменить выделенные ресурсы для существующих версий или продублировать свою версию и изменить ресурсы в новой копии. Для этого не требуется пересборка сервера.

***

Моё развёртывание перезапускается снова и снова и показывает ошибку `OOM kill`

* Это вызвано превышением выделенного объёма памяти. Рассмотрите возможность оптимизации использования памяти с помощью пулов объектов, сжатия или удаления ненужных объектов на сцене.
* В Free Tier вы ограничены 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете изменить выделенные ресурсы для существующих версий или продублировать свою версию и изменить ресурсы в новой копии. Для этого не требуется пересборка сервера.

***

Иногда использование памяти (RAM) моим сервером резко возрастает до высокого значения — это проблема?

* Пока вы укладываетесь в выделенный объём памяти версии приложения, это не проблема.
* Превышение выделенного объёма памяти версии приложения приведёт к `OOM kill` (см. выше).

***

Будет ли производительность моего сервера снижена из-за других серверов, работающих на той же машине?

* Нет, наша платформа гарантирует, что выделенные ресурсы не будут использоваться другими студиями или другими серверами на общей инфраструктуре. С Edgegap нет «шумных соседей».

</details>

## 👉 Следующие шаги

После того как у вас настроена рабочая клиент/серверная система, убедитесь, что **сохранили копию вашего проекта** (используя систему контроля версий, такую как git), чтобы вы всегда могли проследить свои шаги в случае возникновения проблем.

Продолжайте чтение, чтобы узнать больше о темах, связанных с жизненным циклом сервера и обнаруживаемостью.

### Остановка развёртываний

Когда матч закончится (или игроки уйдут), ваше развёртывание можно остановить, чтобы сэкономить средства. [Работающие пустые или лишь частично заполненные ](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)[развёртывания ](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)[могут необоснованно увеличить ваши расходы!](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs)

Если вы следовали этому руководству и собирали с помощью нашего Docker Extension, вы можете просто вызвать метод `FGenericPlatformMisc::RequestExit` . Мы добавили в упакованный образ скрипт, управляющий процессом вашего сервера, который автоматически выполнит корректное завершение развёртывания.

Чтобы настроить управление жизненным циклом сервера, измените наш [пример `скрипт StartServer.sh`](https://github.com/edgegap/edgegap-unreal-buildutils/blob/main/StartServer.sh)  .

{% hint style="info" %}
Предпочитаете управлять жизненным циклом из Unreal? См. [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit) blueprint API для самозавершения.
{% endhint %}

{% hint style="warning" %}
Подключите свой [Хранилище конечной точки](/ru/docs/endpoint-storage.md) чтобы сохранять журналы развертывания, иначе они будут удалены!
{% endhint %}

### Внедряемые переменные

Получайте полезную информацию, такую как ID развёртывания, IP-адрес сервера, расположение сервера и многое другое, обращаясь к внедрённым переменным окружения. Каждое развёртывание автоматически включает:

* [Переменные развёртывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) — автоматически предоставляются Edgegap,
* [Переменные матчмейкинга](/ru/learn/matchmeiking/matchmaker-in-depth.md#injected-environment-variables) — автоматически предоставляются Edgegap при использовании [Матчмейкинг](/ru/learn/matchmeiking.md),
* [Переменные версии приложения](/ru/learn/orkestraciya/application-and-versions.md#injected-variables) — настраиваемые вами пары ключ-значение.

{% hint style="success" %}
Импортируйте наш [Инструменты разработчика](/ru/unreal-engine/developer-tools.md#integration-kit) чтобы **легко читайте типизированные переменные с помощью Blueprints**.
{% endhint %}

### Профилирование серверов

Чтобы понять и оптимизировать проблемы производительности сервера на Edgegap, изучите [Развертывания](/ru/learn/orkestraciya/deployments.md#container-logs), [Развертывания](/ru/learn/orkestraciya/deployments.md#container-metrics), и другие [Развертывания](/ru/learn/orkestraciya/deployments.md#dashboard-monitoring) инструменты, которые у вас есть в распоряжении.

Вы также можете использовать существующие инструменты профилирования Unreal Engine вместе с Edgegap:

* [Настройте трассировку на вашем сервере Unreal Engine](https://dev.epicgames.com/documentation/en-us/unreal-engine/developer-guide-to-tracing-in-unreal-engine) (встроенные и пользовательские события):
  * сохраняйте трассировку на диск сервера с помощью `-tracefile`, загружайте в стороннее хранилище и анализируйте офлайн,
  * или передавайте данные трассировки с помощью [Развертывания](/ru/learn/orkestraciya/deployments.md#port-mapping) для внутреннего порта `1981` по протоколу UDP.
* Анализировать [Memory Insights](https://dev.epicgames.com/documentation/en-us/unreal-engine/memory-insights-in-unreal-engine) и [Networking Insights](https://dev.epicgames.com/documentation/en-us/unreal-engine/networking-insights-in-unreal-engine) и [#optimize-server-builds](#optimize-server-builds "mention").

### Автоматизация сессий

При тестировании новых сборок с разработчиками или командами QA шаг сессии часто пропускают, а игроки подключаются напрямую к развертываниям, жестко задавая или отключая функции, связанные с сессией. Это позволяет быстрее итеративно разрабатывать и изолирует побочные эффекты сессии от функций сервера.

{% hint style="warning" %}
**Ручного запуска развертываний и вставки URL и портов недостаточно для живой игры.**
{% endhint %}

Автоматизируйте популярные игровые сценарии для [Сеансы игроков](/ru/learn/orkestraciya/seansy-igrokov.md) и масштабирования серверов с помощью одного из следующих вариантов:

{% columns %}
{% column width="33.33333333333333%" %}
[Матчмейкинг](/ru/learn/matchmeiking.md):

* Соревновательные игры
* Матчи по запросу
* Рейтинг навыка и/или\
  Пользовательские правила
  {% endcolumn %}

{% column width="33.33333333333333%" %}
[Браузер серверов](/ru/learn/brauzer-serverov.md):

* Постоянные или социальные
* Длительные сессии
* Автораспределение и/или\
  Пользовательский поиск
  {% endcolumn %}

{% column width="33.33333333333333%" %}
Пользовательский бэкенд:

* Переносите игры в продакшене
* [Развертывайте с API v2](/ru/docs/api/vydelennye-servery.md)
* [Отслеживайте вебхуки](/ru/learn/orkestraciya/deployments.md#webhooks)
  {% endcolumn %}
  {% endcolumns %}

### Оптимизация сборок

**Настройте разделение ассетов на чанки, чтобы отделить ассеты только для клиента от ассетов сервера.**

* Изучите [техники и рекомендации по Asset Chunking](https://dev.epicgames.com/documentation/en-us/unreal-engine/preparing-assets-for-chunking-in-unreal-engine) от Epic.

**Исключите ассеты и плагины, которые нужны только клиенту и не требуются для работы сервера.**

* Узнайте о [исключении ассетов и плагинов на этапе сборки](https://dev.epicgames.com/community/learning/tutorials/Kp1k/unreal-engine-build-time-asset-and-plugin-exclusion).

**Пересмотрите свою стратегию подготовки контента.**

* Рассмотрите [Cooking on the Fly (COTF)](https://dev.epicgames.com/documentation/en-us/unreal-engine/build-operations-cooking-packaging-deploying-and-running-projects-in-unreal-engine#cookonthefly) чтобы отложить подготовку клиентских ассетов и ускорить сборки сервера.

**Внедрите Level Streaming, чтобы снизить нагрузку на память во время выполнения.**

* Если ваш дизайн предполагает, что игроки в основном остаются вместе в одной области карты, [level streaming может снизить использование памяти вашего сервера](https://dev.epicgames.com/documentation/en-us/unreal-engine/level-streaming-in-unreal-engine) более чем на 60% и повысить производительность клиента!

**Включайте только то, что абсолютно необходимо для работы вашего сервера.**

* Копирование неиспользуемых файлов в образы приводит к раздуванию образа, более долгой загрузке, более медленному кешированию и более медленному общему запуску сервера. [Ознакомьтесь с рекомендациями по оптимизации Docker-образов](https://docs.docker.com/build-cloud/optimization/#dockerignore-files).

<details>

<summary>Пример <code>.dockerignore</code> файл для удаления лишних файлов.</summary>

```docker
# Скомпилированные объектные файлы
*.slo
*.lo
*.o
*.obj

# Предкомпилированные заголовки
*.gch
*.pch

# Скомпилированные динамические библиотеки
*.so
*.dylib
*.dll

# Файлы модулей Fortran
*.mod

# Скомпилированные статические библиотеки
*.lai
*.la
*.a
*.lib

# Исполняемые файлы
*.exe
*.out
*.app
*.ipa

# Эти проектные файлы могут быть сгенерированы движком
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# Предкомпилированные ассеты
**/SourceArt/**/*.png
**/SourceArt/**/*.tga

# Сборки
**/Build/*

# Белый список файлов PakBlacklist-<BuildConfiguration>.txt
!**/Build/*/
**/Build/*/**
!**/Build/*/PakBlacklist*.txt

# Не игнорируйте файлы иконок в Build
!**/Build/**/*.ico

# Файлы конфигурации, сгенерированные редактором
**/Saved/*
**/Intermediate/*
**/DerivedDataCache/*
**/Binaries/*
**/Build/*
**/Releases/*
**/Packaged/*
```

</details>

**Рассмотрите возможность использования** [**многоэтапных сборок Docker (ссылка)**](https://docs.docker.com/build/building/multi-stage/)**.**

* Выделите крупные серверные зависимости в отдельный образ для повторного использования в многоэтапных сборках. Docker закеширует каждый слой и просто повторно использует предыдущую версию, пропуская загрузку этой части, если не указано иное, что экономит вам трафик и время ожидания завершения загрузки.
* Если вы не уверены, почему одна из команд вашего Dockerfile выдаёт ошибку, попробуйте отладить локально. Создайте новый этап прямо перед возникновением проблемы (добавьте вторую `FROM` команду), используйте `--target` чтобы указать процессу сборки остановиться на проблемном этапе, а затем `docker exec -it {container} /bin/bash` чтобы войти в интерактивный терминал внутри вашего контейнера. После этого вы можете использовать команды оболочки в вашем базовом образе, чтобы исследовать проблему дальше (например, `top` в ubuntu).

### Настроить образ

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым нужно больше контроля над своими образами из-за оптимизации размера сборки, лишних зависимостей или более сложного процесса запуска. Ниже мы поделимся несколькими советами и лучшими практиками «сделай сам».

**Всегда убедитесь, что вы работаете с рабочей сборкой сервера.**

* Прежде чем предполагать, что проблема связана с пользовательским Dockerfile, убедитесь, что вашу серверную сборку можно запустить, и что процесс сборки в вашем игровом движке не выдал никаких исключений или ошибок.

**Всегда тестируйте локально перед загрузкой.**

* Локальное тестирование вашего образа сэкономит вам массу времени, пока вы ждёте завершения загрузки. Это также совершенно бесплатно ✨, поскольку не требует ресурсов Edgegap.
* При локальном тестировании обязательно правильно задайте внутренний порт:

  ```bash
  docker run \
    -p 7777/udp \
    -e ARBITRIUM_PORTS_MAPPING='{"ports":{"gameport":{"internal":7777}}}' \
    'registry.edgegap.com/<repository>:<tag>'
  ```

**Убедитесь, что у вас есть базовые навыки. Каждый Dockerfile нуждается в нескольких обязательных командах:**

* `FROM {image}` — это ваш базовый образ; обычно мы используем долгосрочно поддерживаемый Linux, но подойдёт любой базовый образ на Linux. Обычно это публичные образы, хранящиеся на Docker Hub. Справочник по Dockerfile здесь. [Справочник по Dockerfile здесь](https://docs.docker.com/reference/dockerfile/#from).
* `COPY {source} {destination}` чтобы скопировать вашу серверную сборку Linux с хост-машины внутрь образа, чтобы вы могли запустить её позже. [Справочник по Dockerfile здесь](https://docs.docker.com/reference/dockerfile/#copy).
* `USER {user}` должен следовать после команды [useradd (ubuntu)](https://manpages.ubuntu.com/manpages/bionic/man8/useradd.8.html) или эквивалентной; лучше не запускать всё от `root` на случай большей безопасности. [Справочник по Dockerfile здесь](https://docs.docker.com/reference/dockerfile/#user).
* `CMD {command}` будет последней строкой, скорее всего вызывающей `StartServer.sh` или какой-то скрипт запуска, чтобы убедиться, что ваш сервер корректно инициализируется после завершения настройки. [Справочник по Dockerfile здесь](https://docs.docker.com/reference/dockerfile/#cmd).
* НЕ используйте `VOLUME` — вы не сможете смонтировать таким образом какое-либо локальное хранилище на Edgegap; вместо этого рассмотрите нашу функцию Endpoint Storage и используйте S3 bucket, см. [Endpoint Storage](https://docs.edgegap.com/docs/deployment/endpoint-storage),
* `EXPOSE 7777/UDP`  не требуется! На самом деле это не сделает внутренний порт сервера доступным извне контейнера; это лишь подсказка для разработчика, а порт должен быть
  * опубликован при локальном тестировании с помощью `docker run <image> -p 7777/udp` ,
  * или сопоставлен в [Сопоставлении портов Edgegap](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional).

**Откладывайте объявление параметров до самого последнего возможного момента. Из-за долгого времени сборки сервера конфигурируемость важнее компонуемости.** [**Применяйте этот подход к командам Dockerfile, чтобы быстрее собирать и загружать.**](https://medium.com/@esotericmeans/optimizing-your-dockerfile-dc4b7b527756)

* Сценарий: вам нужно определить параметры, такие как стадия развертывания, версия, режим игры, карта, число игроков на сервер, частота резервного копирования или подобное.
* Плохое решение: создавать отдельный образ для каждой комбинации ваших параметров. Вы потратите всё своё время на пересборку образов, получив при этом очень мало пользы от такого подхода.
* Лучшее решение — подставлять параметры конфигурации в последний момент:
  1. параметры развертывания — передаются непосредственно перед выполнением развертывания — селекторы матчмейкинга передаются как переменные среды, или ваша собственная система управления сессиями передаёт переменные среды во время развертывания,
  2. параметры версии — общие для всех развертываний в версии приложения — стадия развертывания, тег артефакта, секреты и конечные точки сторонних сервисов и подобное; затем
  3. один-единственный образ — содержит и загружает все параметры конфигурации при запуске.

**НЕ запускайте базы данных в развертываниях Edgegap.**

* Развертывания Edgegap не предназначены для длительно работающих процессов и могут быть завершены после долгого времени работы без предварительного уведомления. База данных (даже распределённая), работающая таким образом, может быть завершена, что приведёт к необратимой потере данных. Если вам нужна база данных, рассмотрите сторонний DBaaS.
* Рассмотрите использование наших [Управляемых кластеров](https://app.edgegap.com/cluster-management/clusters/list) для размещения баз данных и длительно работающих сервисов.

[^1]: Personal Access Token

[^2]: отключить проверку совместимости

[^3]: использовать IpNetDriver

[^4]: установить частоту тиков клиента/сервера и тайм-аут

[^5]: установить сборку сервера как целевую по умолчанию

[^6]: включить логи

[^7]: не использовать проверки

[^8]: не упаковывать контент редактора

[^9]: не упаковывать Slate UI (редактор)

[^10]: не компилировать CEF3 (редактор)

[^11]: создать родительский каталог

[^12]: скопировать файл steamclient.so

[^13]: разрешить выполнение клиента Steam

[^14]: найдите в портале вашего издателя в Steam
