> 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 — начало работы

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

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

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

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

<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/) (аккаунт не требуется).
* Перезагрузите компьютер после завершения установки.
* Перейдите в Настройки ⚙️ > Расширения > Включить 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="/files/59c0ba8e90039fe46e40cf28594ebf3e276911eb" alt=""><figcaption></figcaption></figure>

</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>

{% hint style="info" %}
Этот способ не требует загрузки исходного кода Unreal Engine или сборки его из исходников!
{% endhint %}

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

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

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

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

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

* **Имя образа** — это уникальный идентификатор на ваш выбор, которым вы помечаете сборку сервера перед публикацией.
  * Обычно сюда входит название вашей игры — например, “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`  (в большинстве случаев эквивалентно),
* `порт`  = случайно сгенерированное внешнее значение порта контейнера в Docker GUI.

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

<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 Registry и созданию новой [версии приложения](/ru/learn/orkestraciya/application-and-versions.md) в вашем веб-браузере. **Обязательно создайте свой** [**вашего контейнера**](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) **когда появится запрос,** со значениями по умолчани&#x44E;**.**

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

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

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

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

<details>

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

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

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

***

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

* После того как развертывание станет 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 минут.

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

***

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

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

***

Мой сервер показывает загрузку CPU 100% после того, как стал Ready.

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

***

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

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

***

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

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

***

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

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

</details>

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

### Остановить развертывания

Когда матч заканчивается (или игроки уходят), ваше развертывание можно остановить, чтобы сэкономить средства. [Запуск пустого или лишь частично заполненного сервера может неоправданно увеличить ваши расходы!](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 %}

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

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

* [Переменные развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) - автоматически предоставляются Edgegap,
* [Переменные матчмейкинга](/ru/learn/podbor-matchei/matchmaker-in-depth.md#injected-environment-variables) - автоматически предоставляются Edgegap при использовании [Подбор матчей](/ru/learn/podbor-matchei.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").

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

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

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

* Изучите [техники и рекомендации по 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` чтобы войти в интерактивный терминал внутри контейнера. После этого вы можете использовать команды shell в базовом образе, чтобы продолжить исследование (например, `top` в ubuntu).

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

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым нужен больший контроль над образами из-за оптимизации размера сборки, лишних зависимостей или необходимости более сложного процесса запуска. Далее мы поделимся несколькими советами и лучшими практиками “сделай сам”.&#x20;

[^1]: Personal Access Token


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.edgegap.com/ru/unreal-engine.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
