> 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) (кредитная карта не требуется).

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

<details>

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

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

<figure><img src="/files/26fc1e613ea5a824da67070b999585c5a7eba2a5" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/5387bad926a87b546f7dbbe1250b649ccef94bbf" 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">Установите плагин Edgegap Unity Dedicated Servers Quickstart</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**, поскольку большинство облачных провайдеров сейчас (включая Edgegap) работают на Linux. Не беспокойтесь, для этого с нашим плагином не требуется знание Linux.

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

<details>

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

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

<figure><img src="/files/26fc1e613ea5a824da67070b999585c5a7eba2a5" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/5387bad926a87b546f7dbbe1250b649ccef94bbf" 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="/files/d1e017469bc61e47646a0fb11d800cf488551f97" 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. Если вы измените порт, укажите то же самое в вашем [Приложения и версии](/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.

* Откройте свои пакеты и отключите 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 некоторые настройки могли сброситься. Попробуйте перейти в настройки Docker Desktop / Advanced и для пункта «Choose how to configure the installation of Docker’s CLI tools:» выберите «System (requires password)».

***

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

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

***

`(код HTTP 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: Индекс находился вне границ массива.`

* Если вы установили наш плагин быстрого старта 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 run** могут быть заданы для открытия нескольких портов или запуска вашего образа на машинах macOS.
  * При необходимости вы можете опубликовать несколько портов для своего контейнера, просто добавьте параметр `-p {internal port}/{protocol}` для каждого, например `-p 8080/tcp -p 7777/udp` чтобы опубликовать и сопоставить порт вашего сервера `8080` со случайным внешним портом для TCP-подключения и порт сервера `7777` со случайным внешним портом для UDP-подключения одновременно. **Найдите конфигурацию порта сервера в настройках Transport или специфичных для netcode.**
  * Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр, включённый в ваши Необязательные параметры сборки docker: `--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="/files/240860673d9f8564b1fa79c869375fa725044aa3" alt=""><figcaption></figcaption></figure>

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

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

<details>

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

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

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

***

`(Ошибка сегментации) - core dumped`

* Если вы используете машину с архитектурой ARM (macOS M1, M2, M3 и т. д.), вы должны увидеть этот необязательный параметр, включённый в ваши Необязательные параметры сборки docker: `--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 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 к вашему облачному развёртыванию**. Введите данные подключения игрового клиента из раздела развёртывания:

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

<figure><img src="/files/98226953355fc223bd5fc85adc8bffb6b90d8bec" 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).
* Если вы используете netcode Mirror, вам нужно иметь [«Auto Start Server»](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) выбранным в вашем `NetworkManager` , пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [«Start on 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`. ID развертывания (например, `b63e6003b19f`) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через [матчмейкер](/ru/learn/podbor-igrokov/matchmaker-in-depth.md) и [Подробный обзор](/ru/learn/podbor-igrokov/matchmaker-in-depth.md#injected-environment-variables).
* Далее, пожалуйста, убедитесь, что настройка порта в сетевых настройках сборки вашего сервера совпадает с внутренним портом в вашем [версии приложения](https://app.edgegap.com/application-management/applications/list). Вы можете изменить сопоставление портов, отредактировав [версии приложения](https://app.edgegap.com/application-management/applications/list) без пересборки. Найдите свой протокол в интеграции netcode.
* Пожалуйста, убедитесь, что игровой клиент подключается к **внешнему порту** указанному на странице сведений о вашем развертывании; это значение всегда будет случайным по соображениям безопасности.
* Если вы используете протокол Secure Websocket (WSS) в вашей интеграции netcode, убедитесь, что в вашей [версии приложения](https://app.edgegap.com/application-management/applications/list) конфигурации порта для WSS включено обновление до TLS.
* Вы находитесь в Китае и используете [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 минут.

* Развертывания на бесплатном тарифе имеют лимит 60 минут; пожалуйста, рассмотрите возможность обновления вашей учётной записи.
* Все развёртывания будут завершены после 24 часов работы в соответствии с нашей политикой очистки серверов, для обслуживания инфраструктуры и чтобы предотвратить неожиданные расходы, если развёртывание не было корректно остановлено. Для длительно работающих серверов рассмотрите использование [Private Fleets](/ru/learn/orkestraciya/private-fleets.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 разрешение на доступ к Интернету может автоматически удаляться из выходного артефакта сборки 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) или [Sessions](https://docs.edgegap.com/docs/deployment/session).

***

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

* Это может не быть проблемой, поскольку игровые движки обычно выполняют ресурсоемкие операции ЦП во время инициализации сервера. Если загрузка ЦП не снизится через 2–3 минуты после запуска развертывания, возможно, вам потребуется оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение tick rate может повлиять на загрузку ЦП, поскольку сервер будет выполнять меньше операций обмена сообщениями.
* Если вы используете netcode Mirror, вам нужно иметь [«Auto Start Server»](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) выбранным в вашем `NetworkManager` , пересоберите, отправьте и повторно разверните сервер.
* Если вы используете netcode FishNet, вам нужно включить [«Start on 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`

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

***

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

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

***

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

* Нет, наша платформа гарантирует, что выделенные ресурсы не будут использоваться другими студиями или другими серверами на общей инфраструктуре. С 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" %}
Подключите свой [Endpoint Storage](/ru/docs/endpoint-storage.md) чтобы сохранять журналы развертывания, иначе они будут удалены!
{% endhint %}

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

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

* [Переменные развёртывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) — автоматически предоставляются Edgegap,
* [Переменные matchmaking](/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%" %}
[Server Browser](/ru/learn/server-browser.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 read/write](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-your-game-server](#id-3.-containerize-your-game-server "mention"). Теперь мы поделимся несколькими советами «сделай сам» и лучшими практиками.

**Возникли проблемы при использовании WebSockets или HTTPS-запросов?**

* Если вы получаете `Ошибка Curl 35: сбой рукопожатия сертификата. Фатальная ошибка. Код ошибки UnityTls: 7` не отчаивайтесь, это известная проблема старых базовых (`FROM`) образов, включающих истекший сертификат корневого центра. Вы можете исправить это, обновив базовый образ до более новой версии (например, `ubuntu:22.04`), и запустив `update-ca-certificates` , добавьте это в ваш Dockerfile:

  ```docker
  FROM ubuntu:22.04

  RUN apt-get install -y ca-certificates && \
      apt-get clean && \
      update-ca-certificates
  ```

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

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