> 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's Unity Dedicated Servers Quickstart Plugin</a></summary>

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

{% 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>Я получил ошибку</summary>

`!Success: 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).
* Пожалуйста, свяжитесь с нами на [Community 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="/files/26fc1e613ea5a824da67070b999585c5a7eba2a5" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/5387bad926a87b546f7dbbe1250b649ccef94bbf" alt=""><figcaption></figcaption></figure>

</details>

☑️ Измените Build Settings, чтобы **убедиться, что все необходимые сцены игры включены**.

{% hint style="info" %}
**Опытные пользователи Unity** — при необходимости измените [Unity Build Settings](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 не совпадают с вашим [сопоставлением портов версии приложения](/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>Я получил ошибку</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 %}

☑️ На данный момент начните с нажатия **Validate** кнопки, чтобы убедиться, что вы завершили [Инструменты разработчика](/ru/unity/developer-tools.md#usage-requirements).

<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-server-image](#customize-server-image "mention").
* **Необязательные параметры сборки docker** могут использоваться, чтобы дополнительно указать Docker более тонкие нюансы.
  * Мы рекомендуем пока оставить значение по умолчанию, вы можете [прочитать больше позже в документации Docker](https://docs.docker.com/reference/cli/docker/image/build/#options).

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

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

<details>

<summary>Я получил ошибку</summary>

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

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

***

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

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

***

`(HTTP code 400) unexpected - invalid tag format`

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

***

`ERROR: failed to solve: ubuntu:22.04: failed to resolve source metadata for http://docker.io/library/ubuntu:22.04: failed to authorize: failed to fetch oauth token`

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

***

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

* Если вы установили наш плагин Unity quickstart, скачав 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) — возможно, мы уже выпустили исправление. Если это не поможет, пожалуйста, свяжитесь с нами в нашем [Community Discord](https://discord.gg/NgCnkHbsGp) и мы оперативно разберёмся вместе с вами.

</details>

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

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

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

* **Тег образа сервера** из предыдущего шага.
  * По умолчанию используется последний тег, который вы собрали с помощью плагина.
* **Необязательные параметры docker run** могут быть заданы для открытия нескольких портов или запуска вашего образа на машинах macOS.
  * При необходимости вы можете опубликовать несколько портов для вашего контейнера, просто добавьте параметр `-p {внутренний порт}/{протокол}` для каждого, например `-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>Я получил ошибку</summary>

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

* Сначала убедитесь, что статус контейнера Up и он не находится в состоянии Restarting или Exited, что указывало бы на исключение во время выполнения. Если ваш контейнер не запущен, просмотрите его журналы через вкладку Containers в Docker Desktop (нажмите на ваш контейнер) или с помощью `docker logs {container_id} --timestamps` через Docker CLI.
* Далее, пожалуйста, убедитесь, что значение порта Network Manager из вашей серверной сборки совпадает с опубликованным портом в **Необязательные параметры docker run**. Если нет, попробуйте сбросить или вручную изменить значение этого поля, чтобы оно соответствовало `{контейнер}` порту в настройке 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 error 35: Cert handshake failed. Fatal error. UnityTls error code: 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 может совпадать с именем вашего образа или быть настроено вручную.
  * Мы решили пока скопировать имя вашего образа.
* **Версия приложения** в Edgegap может совпадать с вашим тегом или быть настроена вручную.
  * Отметки времени — отличный вариант для имён версий приложения, например `2024.01.30-16.50.20-UTC` .
  * Несколько версий приложения могут указывать на один и тот же тег образа, например `v1.1.0` и `dev` .
  * Узнайте больше о [Приложения и версии](/ru/learn/orkestraciya/application-and-versions.md) позже.
* **Имя образа сервера** из шага [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").
* **Тег образа сервера** из шага [#id-3.-containerize-your-game-server](#id-3.-containerize-your-game-server "mention").

{% hint style="success" %}
Найдите любое имя образа и тег, сохранённые на вашей машине, в **Docker Desktop / Images**.
{% 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).

☑️ Теперь вам будет предложено определить порт для вашей новой версии приложения. Убедитесь, что установили то же значение порта сервера, что и на шаге [#id-4.-test-your-server-locally](#id-4.-test-your-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's:

* **Хост** **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>Я получил ошибку</summary>

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

* Сначала убедитесь, что развёртывание готово, и что в журнале развёртывания нет исключений или ошибок во время выполнения. Если развёртывание остановилось, проверьте журналы в нашей [Панели управления](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`) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через [Matchmaker](/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.
* Пожалуйста, убедитесь, что ваш игровой клиент подключается к **внешнему порту** , указанному на странице сведений о развёртывании; это значение всегда будет случайным по соображениям безопасности.
* Если вы используете протокол Secure Websocket (WSS) в вашей интеграции netcode, убедитесь, что в [версии приложения](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-puly.md) с [Персистентность](/ru/learn/orkestraciya/persistentnost.md).
* См. [/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped](https://docs.edgegap.com/ru/pages/4ad5d792bc82dceeaec6d7dd56165ae188da0417#id-5.-deployment-stopped "mention") чтобы узнать все причины остановки вашего развёртывания.

***

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

* После того как развёртывание становится готовым, начинается инициализация игрового движка. Этот процесс может занимать от нескольких секунд до нескольких минут, и в этот период сервер не принимает подключения игроков.
* Рассмотрите возможность оптимизации инициализации сервера, чтобы сократить это время.
* Игровые клиенты должны повторять попытку подключения каждые 1 секунду в течение ограниченного времени (в зависимости от длительности инициализации), после чего они должны возвращаться в матчмейкинг.
* Рассмотрите возможность добавления загрузочного экрана, чтобы сервер мог выполнять инициализацию (и переход в случае 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) или [Сеансы](https://docs.edgegap.com/docs/deployment/session).

***

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

* Это может не быть проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развёртывания, возможно, вам нужно оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение частоты тиков может влиять на использование CPU, поскольку сервер выполняет меньше операций обмена сообщениями.
* Если вы используете 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 kill`

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

***

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

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

***

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

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

</details>

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

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

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

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

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

{% 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 %}

### Session Automation

{% 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 %}

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

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

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

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

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

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

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

* Если вы получаете `Curl error 35: Cert handshake failed. Fatal error. UnityTls error code: 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, убедитесь, что ваша серверная сборка Unity может быть запущена и что процесс сборки в Unity не выдал исключений или ошибок.

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

* Тестирование образа локально сэкономит вам много времени, пока идет загрузка. Это также полностью бесплатно ✨, так как не требует ресурсов Edgegap.
* При тестировании локально убедитесь, что правильно указали внутренний порт:

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

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

* `FROM {image}` является вашим базовым образом, для проектов на Unity мы обычно используем долгосрочно поддерживаемый 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-бакет, см. [Endpoint Storage](https://docs.edgegap.com/docs/deployment/endpoint-storage),
* `EXPOSE 7777/UDP`  не обязателен! Это фактически не сделает внутренний порт сервера доступным извне контейнера, это лишь подсказка для разработчика, и порт должен быть
  * опубликован при локальном тестировании с `docker run <image> -p 7777/udp` ,
  * или замаплен в [Edgegap Port Mapping](/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.
* Рассмотрите использование наших [Managed Clusters](https://app.edgegap.com/cluster-management/clusters/list) для размещения баз данных и долгоживущих сервисов.

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