> 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/unity.md).

# Unity — Начало работы

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

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

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

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

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

<details>

<summary>Установите модули поддержки сборки Unity для Linux</summary>

* Используйте Unity Hub, чтобы выбрать вкладку **Устанавливает**, доступ **Настройки** и **Добавить модули** для каждой версии Unity, которую вы планируете использовать с платформой Edgegap:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FylRG4r8orenZrw5ijjpJ%2Fimage.png?alt=media&amp;token=fb981825-8a15-4c07-9180-0f79a6a77a91" alt=""><figcaption></figcaption></figure>

* Прокрутите вниз, чтобы выбрать и установить следующие модули Unity:
  * **Поддержка сборки для Linux (IL2CPP),**
    * **Поддержка сборки для Linux (Mono),**
    * **Поддержка сборки выделенного сервера для Linux**

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FuXtyqoLhBOk8CZJ4WdzA%2Fimage.png?alt=media&amp;token=19e956ed-a731-420d-b911-130c334794fc" alt=""><figcaption></figcaption></figure>

</details>

<details>

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

* [Установите Docker Desktop из официального источника](https://www.docker.com/products/docker-desktop/) (аккаунт не требуется).
* Перезагрузите компьютер после завершения установки.

</details>

<details>

<summary><a href="https://github.com/edgegap/edgegap-unity-plugin">Установите Quickstart-плагин Edgegap для выделенных серверов Unity</a></summary>

Пожалуйста, обратитесь к [официальному репозиторию плагина](https://github.com/edgegap/edgegap-unity-plugin) за подробными инструкциями по установке.

Этот плагин был протестирован и поддерживает версии Unity 2021.2+, включая все версии LTS, Unity 2023 и Unity 6.

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

</details>

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

## ⚙️ 1. Подключить аккаунт

☑️ Войдите в систему и убедитесь, что в консоли Unity нет новых ошибок, связанных с плагином Edgegap.

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

<details>

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

`Ошибка: 400 BAD REQUEST - POST | https://api.edgegap.com/v1/wizard/init-quick-start - {"message": "Браузер (или прокси) отправил запрос, который этот сервер не смог понять."}`

* Если вы устанавливали, копируя ZIP-файл, или использовали пример проекта с копией плагина, установленной таким способом, вам потребуется вручную установить зависимости пакетов, включая библиотеку Newtonsoft JSON, см. [официальный репозиторий плагина](https://github.com/edgegap/edgegap-unity-plugin/tree/main?tab=readme-ov-file#instructions-1).
* Свяжитесь с нами в [Discord сообщества](https://discord.gg/NgCnkHbsGp) за помощью, если это не так.

</details>

## 🔧 2. Собрать игровой сервер

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

☑️ **Проверьте, что вы установили необходимые инструменты сборки Unity для Linux.**

<details>

<summary>Установите модули поддержки сборки Unity для Linux</summary>

* Используйте Unity Hub, чтобы выбрать вкладку **Устанавливает**, доступ **Настройки** и **Добавить модули** для каждой версии Unity, которую вы планируете использовать с платформой Edgegap:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FylRG4r8orenZrw5ijjpJ%2Fimage.png?alt=media&amp;token=fb981825-8a15-4c07-9180-0f79a6a77a91" alt=""><figcaption></figcaption></figure>

* Прокрутите вниз, чтобы выбрать и установить следующие модули Unity:
  * **Поддержка сборки для Linux (IL2CPP),**
    * **Поддержка сборки для Linux (Mono),**
    * **Поддержка сборки выделенного сервера для Linux**

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FuXtyqoLhBOk8CZJ4WdzA%2Fimage.png?alt=media&amp;token=19e956ed-a731-420d-b911-130c334794fc" alt=""><figcaption></figcaption></figure>

</details>

☑️ Отредактируйте настройки сборки, чтобы **убедиться, что все необходимые игровые сцены включены**.

{% hint style="info" %}
**Продвинутые пользователи Unity** - при желании измените [настройки сборки Unity](https://docs.unity3d.com/Manual/BuildSettings.html). Внимание! Это может сломать вашу сборку.
{% endhint %}

☑️ Необязательно: добавьте netcode-специфичный скрипт для проверки порта и инициализации окружения в начальную сцену сервера из меню Edgegap Server Hosting (щелкните правой кнопкой / :heavy\_plus\_sign: в окне Hierarchy).

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FZ8dV9ERoV3rczrXXUdV9%2Fimage.png?alt=media&amp;token=f7c44a27-7521-4392-9d11-276c48410ed0" alt="" width="360"><figcaption></figcaption></figure>

{% hint style="info" %}
После завершения шага [#id-6.-deploy-to-cloud](#id-6.-deploy-to-cloud "mention"), скрипт проверки порта выведет предупреждение, если адрес или порты netcode не совпадают с вашим [сопоставлением портов версии приложения Edgegap](/ru/learn/orkestraciya/application-and-versions.md#other-parameters-optional) конфигурацией.
{% endhint %}

{% hint style="success" %}
Серверные сборки должны использовать адрес `0.0.0.0`  и порт `7777`  в вашем netcode transport. Если вы настраиваете порт вручную, укажите то же самое в вашем [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md#port-mapping) после того как вы [#id-5.-upload-to-edgegap](#id-5.-upload-to-edgegap "mention").
{% endhint %}

☑️ Когда вы будете довольны своей конфигурацией, нажмите **Собрать сервер**, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведет к **появлению новой папки в корне проекта** - `Builds/EdgegapServer/ServerBuild` .

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

<details>

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

Unity: Поддерживаются только автономные целевые платформы Windows x64 и OSX с OpenXR.

* Откройте Packages и отключите OpenXR перед сборкой сервера.
* Плагин OpenXR требуется только для клиентов и несовместим со сборками Linux для серверов. Исключая его из серверных сборок, вы не теряете никакой функциональности.

</details>

## 🐋 3. Контейнеризировать сервер

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

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

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

☑️ Сначала нажмите кнопку **Проверить** чтобы убедиться, что вы завершили [#preparation](#preparation "mention").

<details>

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

* [Установите Docker Desktop из официального источника](https://www.docker.com/products/docker-desktop/) (аккаунт не требуется).
* Перезагрузите компьютер после завершения установки.

</details>

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

* **Путь сборки** — это относительный путь к артефакту сборки сервера, пока оставим значение по умолчанию.

{% hint style="warning" %}
**Храните сборки внутри папки проекта**, Docker принимает только относительные пути сборки относительно корня проекта.
{% endhint %}

* **Имя образа** — это уникальный идентификатор на ваш выбор, обозначающий вашу серверную сборку перед отправкой.
  * Обычно сюда входит название вашей игры — например, «my-game-server».
* **Тег образа** — это идентификатор, указывающий на конкретную версию вашего образа.
  * Термин «артефакт сборки» иногда используется для обозначения конкретной версии вашего образа.
  * Отметки времени — отличный вариант по умолчанию для тегов, например `2024.01.30-16.23.00-UTC` .
* **Путь к Dockerfile** может использоваться для настройки рецепта ваших образов.
  * Мы рекомендуем пока оставить значение по умолчанию; позже вы сможете прочитать об этом в разделе [#customize-image](#customize-image "mention").
* **Необязательные параметры сборки docker** можно использовать, чтобы дополнительно указать Docker более тонкие нюансы.
  * Мы рекомендуем пока оставить значение по умолчанию, вы можете [позже прочитать подробнее в документации Docker](https://docs.docker.com/reference/cli/docker/image/build/#options).

☑️ Когда вы будете довольны своей конфигурацией, нажмите **Контейнеризировать с Docker**, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведет к **новый образ, появляющийся на вашей локальной машине**. Вы можете проверить это либо в Docker Desktop, на вкладке Images в разделе Local (по умолчанию), либо в CLI docker, выполнив `docker images` .

{% hint style="info" %}
**Пересобрать из исходного кода** будет автоматически собирать и контейнеризовать, чтобы **ускорить вашу следующую сборку**.
{% endhint %}

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

<details>

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

`/bin/bash: docker: команда не найдена` , или `не удалось найти Packages\com.edgegap.unity-servers-plugin\Editor`

* Сначала убедитесь, что вы завершили [Инструменты разработчика](/ru/unity/developer-tools.md#usage-requirements).
* Подтвердите, что вы подтвердили свой аккаунт Edgegap; вы должны были получить ссылку для подтверждения по электронной почте.
* Некоторые настройки могли сброситься после обновления Docker Desktop. Попробуйте перейти в Settings / Advanced Docker Desktop и для «Choose how to configure the installation of Docker’s CLI tools:» выберите «System (requires password)».

***

`docker build требует ровно 1 аргумент`

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

***

`(HTTP code 400) unexpected - неверный формат тега`

* Это [известная проблема с macOS Docker версии 4.33](https://github.com/docker/for-win/issues/14258), пожалуйста, рассмотрите откат до 4.32 или обновление до 4.35.

***

`ОШИБКА: не удалось решить: ubuntu:22.04: не удалось получить исходные метаданные для http://docker.io/library/ubuntu:22.04: не удалось авторизоваться: не удалось получить OAuth-токен`

* Вы находитесь в Китае? Ваше соединение может прерываться из-за Великого файрвола. Попробуйте выполнить `docker pull ubuntu:22.04` вручную в командной строке (откройте командную строку, нажав Win+R, затем введите `cmd` и нажмите Enter).

***

`System.IndexOutOfRangeException: Индекс был за пределами массива.`

* Если вы установили наш quickstart-плагин Unity, скачав ZIP, кэш вашего Unity Editor может быть поврежден. Попробуйте удалить копию плагина и установить его по git URL или из Unity Asset Store. Пакет Newtonsoft.JSON вам больше не понадобится, так как он автоматически включается вместе с другими источниками.

***

Размер моего docker-образа огромный (более 1 ГБ) / крошечный (менее 100 МБ), это нормально?

* В некоторых случаях это может быть нормально, если вы можете запустить сервер и успешно подключиться (см. [#id-4.-test-your-server-locally](#id-4.-test-your-server-locally "mention")). Если это не так, рассмотрите возможность пересмотра параметров сборки, сброса их к значениям по умолчанию и постепенного добавления параметров, чтобы увидеть, как они влияют на размер сборки. См. также [#optimize-server-build-size](#optimize-server-build-size "mention").

***

У меня возникла другая проблема, не упомянутая нигде в этой документации.

* Сначала, пожалуйста, попробуйте [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity) возможно, мы уже выпустили исправление. Если это не поможет, пожалуйста, свяжитесь с нами в нашем [Discord сообщества](https://discord.gg/NgCnkHbsGp) и мы оперативно разберёмся вместе с вами.

</details>

## 🧪 4. Тестирование сервера локально

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

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

* **Тег образа сервера** из предыдущего шага.
  * По умолчанию используется последний тег, который вы собрали с помощью плагина.
* **Необязательные параметры запуска docker** можно указать для открытия нескольких портов или запуска вашего образа на машинах macOS.
  * При необходимости вы можете опубликовать несколько портов для вашего контейнера; просто добавьте параметр `-p {внутренний порт}/{протокол}` для каждого, например `-p 8080/tcp -p 7777/udp` чтобы опубликовать и сопоставить порт вашего сервера `8080` с случайным внешним портом для TCP-подключения и портом сервера `7777` со случайным внешним портом для UDP-подключения одновременно. **Найдите конфигурацию порта сервера в ваших настройках Transport или специфичных для netcode.**
  * Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр в ваших Optional docker build parameters: `--platform=linux/amd64` .

☑️ Когда вы будете довольны своей конфигурацией, нажмите **Развернуть локальный контейнер**, дождитесь завершения процесса и убедитесь, что в консоли Unity нет новых ошибок. Выполнение этого шага приведет к **запуску нового контейнера** на вашей машине разработки.

{% hint style="info" %}
Для более подробной информации см. Docker Desktop / Containers или команду Docker CLI `docker ps` .
{% endhint %}

☑️ Теперь пора **подключить ваш игровой клиент Unity Editor к локальному docker-контейнеру** чтобы проверить, что ваш серверный образ работает правильно. Найдите настройки клиента netcode и укажите:

* `localhost` или `0.0.0.0` (в большинстве случаев эквивалентно) вместо IP сервера,
* случайное значение внешнего порта, найденное в Docker Desktop / Containers / edgegap-server-test.

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

Я не могу подключиться к локальному docker-контейнеру с помощью игрового клиента в Unity Editor.

* Сначала убедитесь, что статус контейнера — Up и он не Restarting и не Exited, что указывало бы на исключение во время выполнения. Если контейнер не запущен, просмотрите его журналы через вкладку Docker Desktop Containers (щелкните по контейнеру) или с помощью `docker logs {container_id} --timestamps` через docker CLI.
* Далее проверьте, что параметр порта Network Manager в вашей серверной сборке совпадает с опубликованным портом в **Необязательные параметры запуска docker**. Если не совпадает, попробуйте сбросить или вручную изменить значение этого поля ввода, чтобы оно соответствовало `{container}` порту в настройке Network Manager. Найдите ваш протокол в настройках netcode.
* Наконец, убедитесь, что настройки netcode игрового клиента Unity Editor используют порт, опубликованный в **Необязательные параметры запуска docker** (см. скриншот выше).

***

`(Сбой сегментации) - core dumped`

* Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр в ваших Optional docker build parameters: `--platform=linux/amd64` . Если нет, попробуйте сбросить значение этого поля ввода.

***

`SceneId 9120233082191360994 не найден в SceneObjects.`

* Это может означать, что сцена, которую вы пытаетесь загрузить, не была корректно включена в сборку — известная проблема в старых версиях плагина. Чтобы исправить это, попробуйте обновить вашу версию интеграции netcode или [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

***

`http2: server: error reading preface from client //./pipe/docker_engine: файл уже был закрыт`

* Это [известная проблема в старых версиях Docker Desktop для Windows](https://github.com/docker/for-win/issues/13611). Пожалуйста, обновите приложение Docker Desktop и попробуйте контейнеризировать снова.

***

`Curl error 35: ошибка проверки сертификата при рукопожатии. Критическая ошибка. Код ошибки UnityTls: 7`

* Эта ошибка указывает на проблему проверки корневого SSL-сертификата — известную проблему в старых версиях плагина. Чтобы исправить это, попробуйте [обновить ваш плагин Edgegap](https://github.com/edgegap/edgegap-unity-plugin?tab=readme-ov-file#update-the-plugin-in-unity).

</details>

## ☁️ 5. Загрузить в Edgegap

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

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

* **Имя приложения** в Edgegap может совпадать с именем вашего образа или быть настроено вручную.
  * Пока мы решили скопировать имя вашего образа.
* **Серверный образ** из шага [#id-3.-containerize-server](#id-3.-containerize-server "mention").

{% hint style="success" %}
Найдите любое имя образа и тег, хранящиеся на вашем компьютере в **Docker Desktop / Образы**.
{% endhint %}

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

☑️ Вас перенаправят в наш [Панель управления](https://app.edgegap.com/), где вы сможете настроить необязательные параметры. Выполнение этого шага приведет к [созданию новой версии приложения](https://app.edgegap.com/application-management/applications/list), а также к [маркировке и загрузке артефакта сборки в Container Registry Edgegap](https://app.edgegap.com/registry-management/repositories/list).

* **Версия приложения** в Edgegap может совпадать с вашим тегом или быть настроена вручную.
  * Отметки времени — отличный вариант для названий версий приложения, например `2024.01.30-16.50.20-UTC` .
  * Несколько версий приложения могут указывать на один и тот же тег образа, например `v1.1.0` и `dev` .
  * Узнайте больше о [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md) позже.

☑️ Теперь вам будет предложено указать порт для вашей новой версии приложения. Убедитесь, что указали то же значение серверного порта, что и на шаге [#id-4.-test-server-locally](#id-4.-test-server-locally "mention") из ваших настроек Transport или специфичных для netcode.

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

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

## 🚀 6. Развернуть в облаке

Это последний шаг в этом руководстве, после которого у вас будет сервер, развернутый в облаке 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 или память), иначе новые подключения игроков могут быть отклонены, или ваш сервер застрянет в цикле перезапуска. См. ниже шаги по устранению неполадок для решения любых проблем.

☑️ Теперь мы выполним финальный тест и **подключим игровой клиент Unity Editor к вашему облачному развертыванию**. Введите данные подключения игрового клиента из Deployment:

* **Host** **URL** указывающий на IP сервера, обычно в `NetworkManager` компоненте.
* **Внешний порт** сопоставленный с [внутренним портом прослушивания сервера](/ru/learn/orkestraciya/application-and-versions.md#port-mapping), обычно в компоненте Transport.

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

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

* Сначала убедитесь, что развертывание Ready, и в журнале развертывания нет исключений или ошибок во время выполнения. Если развертывание остановилось, просмотрите журналы в нашем [Панель управления](https://app.edgegap.com/deployment-management/deployments/list).
* Если вы используете netcode Mirror, вам нужно иметь [«Автозапуск сервера»](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) выбранным в вашем `NetworkManager` , пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [«Запуск в headless-режиме»](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) в вашем `ServerManager`, пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode Photon Fusion 2, убедитесь, что ваш сервер передает публичный IP развертывания, внешний порт и `roomCode` на сервере, а тот же код комнаты на клиенте в [«NeworkRunner.StartGame»](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) параметре `StartGameArgs`. Deployment ID (например, `b63e6003b19f`) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через [матчмейкер](/ru/learn/podbor-igrokov/matchmaker-in-depth.md) и [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#injected-environment-variables).
* Далее проверьте, что настройка порта в netcode ваших серверных сборок совпадает с внутренним портом в вашем [версии приложения](https://app.edgegap.com/application-management/applications/list). Вы можете изменить сопоставление портов, отредактировав [версии приложения](https://app.edgegap.com/application-management/applications/list) без пересборки. Найдите ваш протокол в вашей интеграции netcode.
* Убедитесь, что ваш игровой клиент подключается к **внешнему порту** , указанному на странице сведений о вашем Deployment; это значение всегда будет случайным из соображений безопасности.
* Если вы используете в своей интеграции netcode протокол Secure Websocket (WSS), убедитесь, что в вашей [версии приложения](https://app.edgegap.com/application-management/applications/list) конфигурации порта WSS включено TLS Upgrade.
* Вы находитесь в Китае и используете [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)? Ваше соединение может быть заблокировано Великим файрволом. Рассмотрите возможность добавить в свой флот сервер, расположенный в Китае, или использовать VPN для подключения.

***

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

* Если процесс сервера аварийно завершится из-за исключения, наша система попытается автоматически перезапустить сервер. Рассмотрите [тестирование вашего сервера локально](#id-4.-test-your-server-locally) чтобы выявить первопричину.
* Мы храним журналы только в течение времени развертывания; если вы хотите просмотреть журналы после остановки развертывания, пожалуйста, [интегрируйте стороннее хранилище журналов](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-parki-serverov.md) с [Персистентность](/ru/learn/orkestraciya/persistentnost.md).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развертывания.

***

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

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

***

Моё устройство Meta Quest выдаёт `HTTP 0: Не удается разрешить целевой хост` .

* При сборке приложений Unity для Android ваша разрешение Internet Access может быть автоматически удалено из выходного APK-артефакта клиентской сборки.
* Снова добавьте разрешения в (требуется последующая пересборка клиента):
  * Project Settings / OpenXR / :gear: Meta Quest Support / Force Remove Internet Permissions (снимите флажок).
  * Player Settings / Internet Access (установите Require).

***

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

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

***

Мой сервер показывает 100% загрузку CPU после перехода в состояние Ready.

* Это может не быть проблемой, поскольку игровые движки, как правило, выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развертывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение tick rate может повлиять на загрузку CPU, поскольку сервер выполняет меньше операций обмена сообщениями.
* Если вы используете netcode Mirror, вам нужно иметь [«Автозапуск сервера»](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) выбранным в вашем `NetworkManager` , пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [«Запуск в headless-режиме»](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) в вашем `ServerManager`, пересоберите, отправьте и повторно разверните сервер.
* В Free Tier вам доступно 1,5 vCPU и 3 ГБ памяти (RAM).
* Вы можете изменить выделенные ресурсы для существующих версий или продублировать свою версию и изменить ресурсы в новой копии. Ни то, ни другое не требует пересборки сервера.

***

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

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

***

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

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

***

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

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

</details>

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

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

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

{% hint style="info" %}
Если вам нужна помощь, [свяжитесь с нами через Discord](https://discord.gg/MmJf8fWjnt). Для поддержки по играм в реальном времени см. нашу [систему тикетов](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

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

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

{% hint style="success" %}
Импортируйте наш `DeploymentAgent`  пример из Unity SDK, чтобы **легко и надёжно останавливать серверы**.
{% endhint %}

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

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

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

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

{% hint style="success" %}
Импортируйте наш `DeploymentAgent`  пример из Unity SDK, чтобы **легко считывать строго типизированные переменные**.
{% endhint %}

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

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

Автоматизируйте популярные игровые сценарии для управления сессиями и масштабирования по требованию с помощью одного из:

{% columns %}
{% column width="33.33333333333333%" %}
[Подбор игроков](/ru/learn/podbor-igrokov.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 %}

### Оптимизируйте сборки

**Пересобирайте только те ресурсы, которые изменились с последней сборки.**

Рассмотрите возможность использования [инкрементальных сборок Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) чтобы ускорить время сборки.

* Рассмотрите возможность использования [инкрементальных сборок Unity](https://docs.unity3d.com/Manual/incremental-build-pipeline.html) чтобы ускорить время сборки.

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

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

**Отключите статический батчинг мешей, чтобы уменьшить размер образа.**

* [Отключите статический батчинг для более быстрой сборки, загрузки и развертывания.](https://docs.unity3d.com/Manual/DrawCallBatching.html)

**Сжимайте меши, чтобы уменьшить размер образа.**

* [Установите сжатие мешей на High для более быстрой сборки, загрузки и развертывания.](https://docs.unity3d.com/6000.0/Documentation/Manual/compressing-mesh-data-optimization.html)
* Вершинное сжатие не влияет на размер образа.

**Реализуйте условную ленивую загрузку ресурсов.**

* Исключите активы только для клиента с помощью [отключения чтения/записи CPU для текстур и мешей](https://docs.unity3d.com/6000.0/Documentation/Manual/dedicated-server-optimizations.html).
* Рассмотрите возможность использования [Unity Addressables](https://docs.unity3d.com/Packages/com.unity.addressables@2.1/manual/index.html) для ваших клиентских сборок, чтобы ускорить сборку и развертывание за счёт [загрузки ресурсов точно в нужный момент](https://docs.unity3d.com/Packages/com.unity.addressables@1.19/manual/LoadingAddressableAssets.html), либо пропуская загрузку некоторых ресурсов в серверных сборках, проверяя наличие [Развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables).

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

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

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

Мы также поддерживаем добавление собственного Dockerfile для пользователей, которым нужен больший контроль над своими образами из-за оптимизации размера сборки, лишних зависимостей или необходимости более сложного процесса запуска. При желании вы можете указать путь к вашему пользовательскому Dockerfile на шаге [#id-3.-containerize-server](#id-3.-containerize-server "mention"). Теперь мы поделимся несколькими советами и лучшими практиками «сделай сам».

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

* Прежде чем предполагать, что проблема связана с пользовательским 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) для размещения баз данных и длительно работающих сервисов.

{% hint style="info" %}
Упёрлись в стену? Мы доступны в нашем [Discord сообщества](https://discord.gg/MmJf8fWjnt) и будем рады помочь.
{% endhint %}
