# Развертывания

Узнайте о развертываниях и их жизненном цикле — концепции и лучшие практики для более глубокого понимания.

## 🗺️ Оркестрация

Запускайте новые серверы за считанные секунды, чтобы соответствовать требованиям по мощности, используя наш облачно-нативный подход к edge-вычислениям. Мы рассматриваем серверы как [скот, а не домашних питомцев](https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/) — полностью заменяя неисправные экземпляры вместо того, чтобы вручную «лечить» каждый из них.

{% hint style="info" %}
Ваш выбор оркестрации будет **влиять на стоимость DevOps, стоимость серверов и масштабируемость**.
{% endhint %}

{% hint style="success" %}
[Свяжитесь в Discord](https://discord.gg/MmJf8fWjnt) чтобы узнать о гибридных вариантах оркестрации и оптимизации стоимости хостинга.
{% endhint %}

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

### Match-Bound

Золотой стандарт для современных студий, обеспечивающий **самую простую интеграцию при наилучшей эффективности по затратам**.

👍 **Преимущества**

* Лучшая эффективность по затратам — масштабирование в реальном времени в соответствии со спросом игроков поминутно.
* Наименьшая стоимость DevOps благодаря хостингу без привязки к регионам; Edgegap автоматизирует 99% задач.
* Наименьший пинг благодаря более чем 615 площадкам в публичной облачной инфраструктуре Edgegap.
* Самое быстрое масштабирование вверх (burst-способность) в случае неожиданного всплеска трафика.
* Высочайший стандарт безопасности и предотвращения читерства игроков (авторитет сервера).
* Минимальное влияние неожиданного сбоя сервера на игроков, затрагивающее лишь один матч.

👎 **Недостатки**

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

🧩 **Лучше всего подходит для**

* Игры, чувствительные к задержке, — **когда оптимизация netcode не может компенсировать высокий пинг:**
  * Шутеры от первого лица, файтинги, VR и XR (виртуальная и расширенная реальность), …
* Игры с **верхним пределом длительности матча по замыслу**,
  * Королевская битва, PvPvE[^1], кооперативные шутеры, MOBA, спортивные игры, ARPG и dungeon crawler'ы, …

🔎 **Обнаруживаемость**

* Запускайте новые игры, когда присоединяется достаточное число игроков [podbor-igrokov](https://docs.edgegap.com/ru/learn/podbor-igrokov "mention").
  * Добавляйте игроков, чтобы [заменять вышедших игроков в уже существующих матчах с помощью backfill](https://docs.edgegap.com/ru/podbor-igrokov/matchmaker-in-depth#backfill).
* Позвольте игрокам просматривать серверы и выбирать из списка с [server-browser](https://docs.edgegap.com/ru/learn/server-browser "mention").
* [Реализуйте собственный или сторонний игровой бэкенд для обнаружения серверов](https://docs.edgegap.com/ru/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="info" %}
Edgegap автоматически масштабирует все 615+ серверных локаций вверх/вниз в зависимости от активности игроков в каждом регионе. Готовьтесь к успеху — бесшовно [масштабируйте до 14 миллионов одновременных пользователей за 60 минут](https://edgegap.com/resources/performance-benchmark).
{% endhint %}

### Региональный резерв

Традиционная модель для **постоянных миров с пользовательским контентом и социальных MMO-игр**.

👍 **Преимущества**

* Знакомый и простой для понимания старошкольный подход для закалённых ветеранов.
* Высочайший стандарт безопасности и предотвращения читерства игроков (авторитет сервера).
* Легко прогнозируемая стоимость на основе ежемесячного обязательства.

👎 **Недостатки**

* Более высокая стоимость хостинга — каждому региону требуется один или несколько простаивающих резервных серверов (burst-ёмкость).
* Более высокая стоимость DevOps — масштабирование, операции и обслуживание дублируются для каждого региона.
* В регионах с меньшей базой игроков высокий пинг из-за подключения к серверам далеко от них.

🧩 **Лучше всего подходит для**

* Постоянные миры с пользовательским контентом, хранящимся на сервере даже когда игроки офлайн.
  * MMO, песочницы с постройкой базы или размещением объектов, extraction shooters, ...
* игры, терпимые к задержкам, — **когда не требуется серверная авторитетная физика в реальном времени**:
  * мобильные игры, кооперативные игры, TCG/CCG, пошаговые стратегии, …
* Асинхронный мультиплеер, **где сбои сервера минимально влияют на опыт игроков:**
  * гонка с призраками, грабёж вражеской базы, игры на строительство/фермерство с таймером, …
* приложения с тяжёлым процессом инициализации — когда подготовка серверов занимает минуты.

🔎 **Обнаруживаемость**

* Позвольте игрокам просматривать серверы и выбирать из списка с [server-browser](https://docs.edgegap.com/ru/learn/server-browser "mention").
* [Реализуйте собственный или сторонний игровой бэкенд для обнаружения серверов](https://docs.edgegap.com/ru/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="info" %}
Смотрите [managed-clusters](https://docs.edgegap.com/ru/learn/advanced-features/managed-clusters "mention") для **самостоятельного хостинга ваших микросервисов и бэкенд-сервисов** на Edgegap.
{% endhint %}

### Peer to Peer

Перенесите усилия разработки с ~~выделенных серверов~~ на **relay netcode для не соревновательных игр**.

Связанные темы: listen servers, player-host authority, NAT punch-through.

👍 **Преимущества**

* Минимальная стоимость хостинга, требующая только Relay-серверов для решения NAT punch-through.
* Минимальная стоимость DevOps — обслуживание требуется только для клиентских сборок и каналов распространения.
* Минимальное влияние неожиданного сбоя сервера на игроков, затрагивающее лишь один матч.
* Легко реализуется и быстро позволяет получить прототип, без необходимости разработки бэкенда.

👎 **Недостатки**

* Увеличенные усилия по разработке peer-to-peer netcode, требующие навыков параллельного программирования.
* Наихудшие значения пинга и наибольшая чувствительность к неблагоприятным сетевым условиям (например, мобильный интернет).
* Наихудшая безопасность, уязвимость к атакам man-in-the-middle и перехвату сессии.
* Риск потери сессий при выходе хоста, если вы не реализуете собственную миграцию хоста.

🧩 **Лучше всего подходит для**

* Кооперативные и казуальные игры — **когда читерство не мешает получению удовольствия и не ломает игру**,
  * Детские игры, игры на исследование, приключения, …

🔎 **Обнаруживаемость**

* [Реализуйте собственный или сторонний игровой бэкенд для обнаружения серверов](https://docs.edgegap.com/ru/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="success" %}
Смотрите наш [Distributed Relays](https://docs.edgegap.com/docs/distributed-relay-manager) для сервиса, обеспечивающего peer-to-peer с лучшей в классе задержкой и безопасностью.
{% endhint %}

## 📍 Размещение серверов

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

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

{% hint style="success" %}
**Edgegap разворачивается в** [**наилучшей возможной локации**](#server-score) **с доступной ёмкостью**, для быстрых матчей с низкой задержкой.
{% endhint %}

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FjiPRa6gGEku2oGm3qW5s%2Fimage.png?alt=media&#x26;token=306897d4-8ab1-4766-bc90-5d02882b573c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Смотрите [#deployment-balance-points](#deployment-balance-points "mention") на **анализировать размещение серверов в реальном времени**, в масштабе.
{% endhint %}

### Оценка сервера

Стратегия оценки сервера использует запатентованную методологию Edgegap, которая **оптимизирует размещение серверов для каждого матча отдельно**. Выполняется ненавязчивая телеметрия для приблизительной оценки сетевой близости каждого игрока к нашим серверным локациям и выбора сервера, который обеспечивает лучшее:

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

{% hint style="success" %}
Наш [Matchmaker](https://docs.edgegap.com/ru/learn/podbor-igrokov) по умолчанию использует **стратегию Server Score, чтобы обеспечить наилучший возможный опыт**. Чтобы использовать эту стратегию с [Deploy API](https://docs.edgegap.com/api/#tag/Deployments), укажите в запросе на развертывание публичные IP игроков или геокоординаты.
{% endhint %}

**Нереагирующее размещение** - сервер далеко, высокий пинг для всех игроков:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FNszxk3uRY78L7V6nLPlp%2Fimage.png?alt=media&#x26;token=904b9b3d-7499-45d3-81c6-cc2b5cb6dd32" alt=""><figcaption></figcaption></figure>

**Несправедливое размещение** - неравномерный пинг, один игрок в невыгодном положении:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FxjsD6ijYWHljBAVuV57w%2Fimage.png?alt=media&#x26;token=ab477e89-4afe-4203-9b7f-b85b035dc9eb" alt=""><figcaption></figcaption></figure>

**Пример хорошего размещения** - отзывчивый и справедливый пинг для всех игроков:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FQfSd4uo9twyxEWCkPLqu%2Fimage.png?alt=media&#x26;token=8d3cd64b-9527-48fe-886b-96393c15449d" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Эта стратегия **особенно эффективна при хостинге группы игроков, находящихся далеко друг от друга** (Северная Америка против Европы или западное побережье против восточного), что часто бывает в заранее созданных лобби.
{% endhint %}

### Геолокация

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

{% hint style="warning" %}
Стратегия геолокации не рекомендуется для [#match-bound](#match-bound "mention") оркестрации, кроме приложений со строгими регуляторными требованиями к межрегиональной передаче данных или когда IP игрока недоступен.
{% endhint %}

{% hint style="success" %}
Чтобы использовать эту стратегию с [Deploy API](https://docs.edgegap.com/api/#tag/Deployments), укажите в запросе на развертывание публичные IP игроков или геокоординаты.
{% endhint %}

### Ограничение региона

Серверы могут размещаться с использованием грубо обобщённого параметра региона, либо:

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

{% hint style="danger" %}
**Использовать только эту стратегию не рекомендуется, так как это может привести к низкой сетевой производительности.**
{% endhint %}

{% hint style="success" %}
Использование **выбора региона как предварительного фильтра в сочетании с другой стратегией** — лучшая альтернатива.
{% endhint %}

## 🟢 Качество соединения

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

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

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

#### Низкая задержка

Задержка у игрока — это сочетание задержек при передаче данных между:

* **физическими устройствами —** физическим сигналом, проходящим через [топологию интернет-сети](https://en.wikipedia.org/wiki/Internet#Routing),
* **host to host** — возникающих из-за протоколов, транспорта и мер безопасности,
* **процессом к процессу** — возникающих из-за (распаковки) и обработки данных в клиенте/сервере.

Edgegap снижает физическую задержку, размещая серверы ближе к вашим игрокам для более быстрых ответов и меньшего числа сетевых переходов. Благодаря локациям у 17 облачных и bare metal-провайдеров вы получаете **лучший в классе пинг для игроков в любой точке мира**.

Покрытие серверов и интернета по всему миру (не только у Edgegap) ограничено из-за таких факторов, как:

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

#### Высокая доступность

Доступность серверов в различных локациях по всему миру будет меняться со временем, несколько раз в течение дня. Edgegap автоматически **масштабирует вверх/вниз** локации **по требованию**, учитывая:

* **всплеск трафика** - развертывания, созданные в течение 15-минутного периода,
* **требования к vCPU** - больше vCPU на развертывание увеличивает общий спрос на конкретную локацию,
* **предложение провайдера** - в некоторых удалённых локациях доступно меньше вариантов провайдеров,
* **доступность машин** - в некоторых локациях могут быть доступны только машины с 4 vCPU или 8 vCPU,
* **запросы студии** для тестирования, контроля качества, раннего доступа, закрытых бета-версий или турниров.

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

{% hint style="success" %}
Пожалуйста, **свяжитесь с нами, чтобы спланировать релиз**, или если у вас есть какие-либо запросы относительно доступности локаций.
{% endhint %}

#### Разрешение проблем игроков

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

При расследовании сообщений от игроков или инцидентов учитывайте факторы:

* **качество матчмейкинга** - игроки должны быть близки друг к другу (в одном регионе) для [#server-placement](#server-placement "mention") чтобы дать наилучшие результаты:
  * смотрите [podbor-igrokov](https://docs.edgegap.com/ru/learn/podbor-igrokov "mention") и [ping-beacons](https://docs.edgegap.com/ru/learn/orkestraciya/ping-beacons "mention") для наших рекомендаций,
  * смотрите [#player-tracing](https://docs.edgegap.com/ru/podbor-igrokov/matchmaker-in-depth#player-tracing "mention") чтобы узнать, как находить серверные логи, связанные с сообщениями игроков,
* **региональные проблемы:**
  * локальные интернет-провайдеры (ISP) могут временно устранять инцидент,
  * некоторые регионы (например, Китай, Россия) могут быть ограничены из-за локальных санкций,
* **уровень кэширования** - Edgegap будет отдавать приоритет быстрым развертываниям в закэшированных локациях:
  * [активируйте кэширование, чтобы развертывать серверы за считанные секунды](https://docs.edgegap.com/ru/learn/application-and-versions#other-parameters-optional),
* **максимальное время развертывания** - развертывания могут завершиться неудачей из-за медленного и тяжёлого процесса инициализации:
  * смотрите [#safety-guardrails](https://docs.edgegap.com/ru/learn/application-and-versions#safety-guardrails "mention") чтобы увеличить период таймаута,
  * откладывайте шаги инициализации до момента, когда они действительно необходимы,
* **проблемы с образом сервера или интеграцией**.

{% hint style="success" %}
**Отображайте ID развертываний в UI истории матчей клиента** чтобы сопоставлять сообщения игроков при устранении неполадок.
{% endhint %}

{% hint style="info" %}
Уведомляйте пользователей о массовых багax, временных проблемах и сбоях, чтобы смягчить негативные настроения.
{% endhint %}

## 🔄 Жизненный цикл развертывания

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

#### 1. Запуск развертывания

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

* [unreal-engine](https://docs.edgegap.com/ru/unreal-engine "mention") - Docker Extension или плагина для проектов Unreal Engine,
* [unity](https://docs.edgegap.com/ru/unity "mention") - плагина для проектов Unity,
* [Dashboard Web UI](https://app.edgegap.com/deployment-management/deployments/list) - простого в использовании веб-интерфейса для тестирования интеграции сервера.

Развертывание для **рабочая производственная среда** должна быть запущена с помощью:

* [podbor-igrokov](https://docs.edgegap.com/ru/learn/podbor-igrokov "mention") - поиск других игроков и запуск серверов по требованию ([#match-bound](#match-bound "mention")).
* [server-browser](https://docs.edgegap.com/ru/learn/server-browser "mention") - предварительный прогрев серверов с длительной инициализацией ([#regional-standby](#regional-standby "mention")).
* [Deploy API](https://docs.edgegap.com/api/#tag/Deployments/operation/deploy) - индивидуальная интеграция сервер-сервер (кастомное масштабирование).

{% hint style="success" %}
**Сохраните** `request_id`  **(ID развертывания) и помечайте развертывания** чтобы позже идентифицировать и устранять проблемы.
{% endhint %}

{% hint style="info" %}
При тестировании с [Deploy API](https://docs.edgegap.com/api/#tag/Deployments/operation/deploy), вы можете переопределить стандартный Dockerfile `CMD` собственной командой.
{% endhint %}

#### 2. Развертывание

После запуска развертывания наша система выполнит ряд шагов в быстрой последовательности:

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

{% hint style="warning" %}
**Слишком много запросов 429** — чтобы обеспечить стабильность и предотвратить неожиданные счета, мы ограничиваем частоту запросов для вашей организации до **40 req/s**. [Свяжитесь с нами](mailto:info@edgegap.com) чтобы планировать релизы, оценивать трафик на запуске и готовиться к успеху.
{% endhint %}

#### 3. Развертывание готово

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

{% hint style="success" %}
Как только развертывание станет Ready, **повторяйте попытки подключения игрока до успешного соединения**или до заранее заданного таймаута клиента.
{% endhint %}

#### 4. Ошибка развертывания

Ваше развертывание может в любой момент перейти в состояние Error по неожиданным причинам. Это более вероятно при тестировании интеграции или новых сборок сервера.

**За развертывания в состоянии Error с вас не взимается плата; они автоматически останавливаются через 24 часа.**

Шаги по устранению неполадок:

* Проверьте статус сервиса Edgegap с помощью [нашей страницы мониторинга доступности](https://status.edgegap.com/).
* Попробуйте протестировать контейнер вашего сервера локально с помощью Docker Desktop, чтобы исключить проблемы Edgegap.

{% hint style="success" %}
**Когда просите о помощи,** **укажите ID развертывания и любые полезные детали** чтобы мы могли оперативно провести расследование!
{% endhint %}

#### 5. Развертывание остановлено

**Мы никогда не останавливаем ваши серверы без вашего указания**— чтобы не ухудшить опыт ваших игроков. Ваше развертывание может быть остановлено по следующим причинам:

* **Самостоятельная остановка через** [**DELETE\_URL**](#injected-environment-variables) - развертывание само остановилось после ухода игроков и завершения матча,
  * смотрите [Unreal Engine](https://docs.edgegap.com/ru/unreal-engine#stop-deployments) и [Unity](https://docs.edgegap.com/ru/unity#stop-deployments) руководства по корректной остановке развертываний,
* **Остановка из вашего бэкенда** - ваш бэкенд остановил это развертывание, используя [Deployments API](https://docs.edgegap.com/api/#tag/Deployments/operation/deployment-delete),
* **Game Max Duration** - отведённое время в вашем [#safety-guardrails](https://docs.edgegap.com/ru/learn/application-and-versions#safety-guardrails "mention") истекло,
* [private-fleets](https://docs.edgegap.com/ru/learn/orkestraciya/private-fleets "mention") Хост, на котором выполнялось ваше развертывание, был удалён через запланированное действие.

{% hint style="info" %}
После остановки развертывания, **мы запускаем корректное завершение** отправляя `SIGTERM` сигнал вашему основному процессу, предоставляя короткий период для завершения. По истечении этого времени `SIGKILL` сигнал отправляется для остановки развертывания.
{% endhint %}

## 👀 Наблюдаемость

Позвольте игровым серверам взаимодействовать со сторонними сервисами и получать эксплуатационные инсайты.

### Обнаруживаемость

После перехода в Ready развертыванию назначается URL ([fqdn](https://en.wikipedia.org/wiki/Fully_qualified_domain_name)) и внешний порт для каждого внутреннего порта.

{% hint style="success" %}
Используйте **теги развертывания (до 40 символов), чтобы легко помечать ваши развертывания** и [#filter-deployments](#filter-deployments "mention").
{% endhint %}

{% hint style="info" %}
**Исходящий трафик (к клиентам или бэкенду) с ваших игровых серверов никогда не блокируется** и не фильтруется.
{% endhint %}

#### **WebSocket (WS) и Secure WebSocket (WSS)**

Чтобы использовать netcode на основе websocket с Edgegap, у вас есть два варианта:

* **управляемый сертификат**, настраиваемый за 1 минуту без написания кода:
  * настройте свой [application-and-versions](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions "mention") на **используйте Websocket (WS) и Enable TLS Upgrade,**
  * используйте URL Edgegap для подключения клиентов (например, `https://5fa53fa00a57.pr.edgegap.net/`)
* **сертификат под вашим управлением**, если вы хотите использовать свой собственный домен:
  * настройте свой [application-and-versions](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions "mention") на **используйте Secure Websocket (WSS)**,
  * настройте собственный поток TLS-сертификата с кастомной DNS-записью (например, на [Cloudflare](https://www.cloudflare.com/application-services/products/ssl/)).

{% hint style="danger" %}
Необработанные исключения сервера приведут к перезапуску контейнера развертывания и аннулированию TLS-безопасности. В таком случае, [остановите ваш сервер](#id-5.-deployment-stopped) и [сведите игроков в новый матч на новом развертывании](https://docs.edgegap.com/ru/podbor-igrokov#custom-lobby). [Состояние сервера может быть потеряно](https://docs.edgegap.com/ru/learn/postoyanstvo#state-management).
{% endhint %}

### Внедрённые переменные <a href="#injected-environment-variables" id="injected-environment-variables"></a>

Игровым серверам часто нужна дополнительная информация, такая как IP сервера, значения внутренних портов или другое. Внедрение переменных окружения только для чтения — это надёжный, не зависящий от облака способ передачи параметров.

{% hint style="success" %}
Получайте значения переменных с помощью [GetEnvironmentVariable в C#](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) или [GetEnvironmentVariable в C++](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable).
{% endhint %}

{% hint style="info" %}
Смотрите [Переменные версии приложения](https://docs.edgegap.com/ru/learn/application-and-versions#injected-variables) и [Переменные матчмейкера](https://docs.edgegap.com/ru/podbor-igrokov/matchmaker-in-depth#injected-variables) в дополнение к переменным развертывания ниже.
{% endhint %}

#### **Пользовательские переменные**

Определите до 20 пользовательских переменных для каждого развертывания, каждая из которых может содержать до 4 КБ строковых данных.

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

Получайте важную информацию, читая переменные, внедрённые Edgegap в ваши серверы:

#### **Идентификаторы**

* **`ARBITRIUM_REQUEST_ID`**  - например `f68e011bfb01` .
  * Уникальный ID развертывания, также называемый ID запроса. Используется для получения дополнительной информации.
  * URL развертываний всегда имеют формат `{ARBITRIUM_REQUEST_ID}.pr.edgegap.net`.
* **`ARBITRIUM_PUBLIC_IP`**  - например `162.254.141.66` .
  * Публичный IP-адрес этого хоста; может использоваться для подключения вместо URL.
* **`ARBITRIUM_HOST_ID`**  - например `alpha-north-america-70364ef8` .
  * Уникальный идентификатор машины, на которой размещено ваше развертывание, общий с другими развертываниями.
* **`ARBITRIUM_DEPLOYMENT_TAGS`**  - например `tag1,tag2` .
  * Пользовательские теги развертывания, разделённые запятыми, [полезные для удобного поиска и фильтрации](#filter-deployments).
* **`ARBITRIUM_PRIVATE_FLEET_ID`** - например `PUBLIC_CLOUD` , или ID пула, если размещено на [private-fleets](https://docs.edgegap.com/ru/learn/orkestraciya/private-fleets "mention").

#### Спецификации ресурсов

* **`ARBITRIUM_HOST_IN_PRIVATE_FLEET`** - например `false` , указывающее, размещено ли на [private-fleets](https://docs.edgegap.com/ru/learn/orkestraciya/private-fleets "mention").
* **`ARBITRIUM_HOST_BASE_CLOCK_FREQUENCY`**  - например `2000` , частота процессора в МГц.
* **`ARBITRIUM_DEPLOYMENT_VCPU_UNITS`**  - например `256`, выделенные единицы vCPU (1024 = 1 vCPU).
* **`ARBITRIUM_DEPLOYMENT_MEMORY_MB`**  - например `512`, выделенная ОЗУ в МБ (1024 = 1 ГБ).

#### **Управление жизненным циклом**

* **`ARBITRIUM_DELETE_URL`**  - например `https://api.edgegap.com/v1/self/stop/9f511e17/660`.
  * Вызывается из развертывания, [развертывание будет корректно остановлено](#id-5.-deployment-stopped).
  * Требуется уникальный одноразовый `ARBITRIUM_DELETE_TOKEN` в `Authorization` заголовке.
* **`ARBITRIUM_DELETE_TOKEN`**  - например `7df4cd933df87084b34ae80d8abde293`.
* **`ARBITRIUM_CONTEXT_URL`**  - например `https://api.edgegap.com/v1/context/9170f5211e17/17`.
  * Вызывается только из развертывания, возвращает больше сведений о развертывании.
  * Требуется уникальный `ARBITRIUM_CONTEXT_TOKEN` в `Authorization` заголовке.
* **`ARBITRIUM_CONTEXT_TOKEN`**  - например `dfaf50b9333b9ee07b22ed247e4a17e6`.

#### **Обнаруживаемость**

* **`ARBITRIUM_PORT_GAMEPORT_INTERNAL`**  - например `7777` , внутренний порт для слушателя сервера.
* **`ARBITRIUM_PORT_GAMEPORT_EXTERNAL`**  - например `31504` , внешний порт для подключений клиентов.
  * Значения внешних портов рандомизируются для каждого развертывания в целях безопасности.
* **`ARBITRIUM_PORT_GAMEPORT_PROTOCOL`**  - например `UDP` , протокол транспорта вашего netcode.

{% hint style="success" %}
Примеры предполагают, что вы назвали свой порт `gameport` (по умолчанию). **Каждый порт добавляет дополнительный набор очищенных** [#port-mapping](https://docs.edgegap.com/ru/learn/application-and-versions#port-mapping "mention") **переменных:** `@Super Port!` ⇒ `ARBITRIUM_PORT_SUPER_PORT_INTERNAL` .
{% endhint %}

* **`ARBITRIUM_BEACON_ENABLED`**  - например `true`, если развёртывается на [private-fleets](https://docs.edgegap.com/ru/learn/orkestraciya/private-fleets "mention") с [ping-beacons](https://docs.edgegap.com/ru/learn/orkestraciya/ping-beacons "mention").
* **`ARBITRIUM_HOST_BEACON_PUBLIC_IP`**  - например `139.177.198.69` , публичный IP ближайшего beacon.
* **`ARBITRIUM_HOST_BEACON_PORT_UDP_EXTERNAL`**  - например `30199`, для измерения пинга по UDP.
* **`ARBITRIUM_HOST_BEACON_PORT_TCP_EXTERNAL`**  - например `30456`, для измерения пинга по TCP.

#### **Структурированная информация (JSON как строка)**

{% hint style="info" %}
Переменные окружения **хранятся как JSON в виде строки**, парсите их с помощью SDK или собственного метода.
{% endhint %}

<details>

<summary><strong>ARBITRIUM_DEPLOYMENT_LOCATION</strong>:<br>- Подробная информация о локации развертывания.</summary>

```json
ARBITRIUM_DEPLOYMENT_LOCATION="{
  "city": "Montreal",
  "country": "Canada",
  "continent": "North America",
  "administrative_division": "Quebec",
  "timezone": "Eastern Time",
  "latitude": 45.513707,
  "longitude": -73.619073
}"
```

</details>

<details>

<summary><strong>ARBITRIUM_PORTS_MAPPING</strong>:<br>- Подробная информация о ваших внутренних и внешних портах.</summary>

```json
ARBITRIUM_PORTS_MAPPING="{
  "ports": {
    "gameport": {
      "name": "Порт игры",
      "internal": 7777,
      "external": 31504,
      "protocol": "UDP"
    },
    "webport": {
      "name": "Веб-порт",
      "internal": 8888,
      "external": 31553,
      "protocol": "TCP"
    }
  }
}"
```

</details>

### Мониторинг панели управления

Наш [Панель управления](https://app.edgegap.com/) предоставляет инструменты для мониторинга масштабируемости вашего сервера и помогает в эксплуатации.

#### Аналитика

{% hint style="success" %}
Найдите [аналитические панели в боковом меню](https://app.edgegap.com/analytics/dashboards/list) в категории «Хостинг и оркестрация серверов».
{% endhint %}

:star2: [**Перейдите на тариф Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **чтобы открыть подробные метрики и аналитические данные о производительности сервера:**

* **Общая информация:** отслеживайте релизы с количеством серверов в реальном времени по версиям + обзором использования ресурсов,
* **Аналитика CPU**: устраняйте задержки на серверах из-за ресурсоёмких операций процессора,
* **Аналитика памяти**: предотвращайте перезапуски сервера из-за превышения выделенной памяти,
* **Аналитика сети:** выявляйте неэффективные сетевые паттерны и оптимизируйте netcode.

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FLxDp1yFvkj5kB6AC4xVb%2Fimage.png?alt=media&#x26;token=c0eff5f1-a374-41e0-a49a-9b3ecf0bfd1b" alt=""><figcaption></figcaption></figure>

#### Карта развертываний

{% hint style="success" %}
Найдите карту развертываний в [на странице сведений о вашем развертывании в Dashboard](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

Просматривайте на карте местоположение развертывания, доступные локации и предполагаемые местоположения игроков:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FM4h0itPU5ntPaV5N5ZlW%2Fimage.png?alt=media&#x26;token=98028901-9a40-4a2d-969e-db5f990e334f" alt=""><figcaption></figcaption></figure>

#### Точки баланса развертывания

{% hint style="success" %}
Найдите тепловую карту точек баланса развертывания в [на странице сведений о вашем приложении в Dashboard](https://app.edgegap.com/application-management/applications/list).
{% endhint %}

Просматривайте тепловую карту точек баланса развертывания и фильтруйте по [application-and-versions](https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions "mention"). Точки баланса — это приблизительные местоположения с одинаковой сетевой близостью к каждому игроку в данном развертывании:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FfDpIQxoFUJZNE77LJIwZ%2Fimage.png?alt=media&#x26;token=94e730ad-3907-486b-8a06-0f469acd19ea" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
Горячие точки баланса в странных местах (например, Гренландия) указывают на подбор игроков, находящихся далеко друг от друга. Узнайте о [#connection-quality](#connection-quality "mention") и [ping-beacons](https://docs.edgegap.com/ru/learn/orkestraciya/ping-beacons "mention") чтобы оптимизировать подбор игроков.
{% endhint %}

#### Журналы развертывания

{% hint style="success" %}
Найдите журналы развертывания в [на странице сведений о вашем развертывании в Dashboard](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

Журналы развертывания отображают информацию о [#deployment-lifecycle](#deployment-lifecycle "mention"):

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FfkyAYtylnOFmSp3yyiId%2Fimage.png?alt=media&#x26;token=6a4f6ac4-5780-46a7-bcdd-1d8829c4abd7" alt=""><figcaption></figcaption></figure>

#### Журналы контейнера

{% hint style="success" %}
Найдите журналы контейнера в [на странице сведений о вашем развертывании в Dashboard](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

Проверьте журналы вашего игрового сервера в случае проблем или при отладке:

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FTiaARmb6aAZfm0rjQmiT%2Fimage.png?alt=media&#x26;token=7eb49138-954d-44a1-a025-1f88ed855366" alt=""><figcaption></figcaption></figure>

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

#### Метрики контейнера

{% hint style="success" %}
Найдите метрики контейнера в [на странице сведений о вашем развертывании в Dashboard](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

Просматривайте метрики контейнера (процессор, память, сеть), чтобы:

* определять распространённые проблемы с подключением, когда [#troubleshooting](#troubleshooting "mention"),
* выявлять неэффективные паттерны реализации, вызывающие всплески использования ресурсов,
* точно определять неэффективное использование ресурсов в конкретных сценариях,
* проверять изменения в использовании ресурсов вашего сервера во время оптимизации,
* оценивать потребление ресурсов и длительность инициализации вашего сервера.

Исторические метрики показывают средние значения за интервал 1 минута и доступны на бесплатном тарифе.

:star2: [**Перейдите на тариф Pay as You Go**](https://app.edgegap.com/user-settings?tab=memberships) **чтобы открыть точные метрики с интервалами в 1 секунду.**

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FoIpCR3x9ibiXMEIWFgKG%2Fimage.png?alt=media&#x26;token=86dcd914-db9f-4e81-8444-6c83805be9b6" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
[Свяжитесь с нами](mailto:info@edgegap.com) перед вашим релизом, чтобы запросить поддержку live-хостинга для релизов в большом масштабе.
{% endhint %}

### Контекст и статус

Дополнительную информацию о развертывании можно получить в формате JSON:

* изнутри развертывания (игрового сервера), используя [API контекста развертывания](https://docs.edgegap.com/api/#tag/Context/operation/context-get),
* извне развертывания (backend / сторонняя система), используя [API статуса развертывания](https://docs.edgegap.com/api/#tag/Deployments/operation/deployment-status-get).

{% hint style="info" %}
API контекста (из развертывания) требует токен Context API, тогда как API статуса использует ваш токен Edgegap.
{% endhint %}

{% hint style="warning" %}
**Слишком много запросов 429** - мы ограничиваем частоту запросов для вашей организации до **20 req/s** для конечных точек Context и Status API. Используйте [#injected-environment-variables](#injected-environment-variables "mention") и [Вебхуки](https://docs.edgegap.com/docs/deployment/arbitrium-deploy-webhook) для масштабируемого решения.
{% endhint %}

### Фильтрация развертываний

Чтобы быстро искать среди всех развертываний, вы можете [использовать нашу панель управления](https://app.edgegap.com/deployment-management/deployments/list):

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2F42IaKG0pFQXSkvPCRH1T%2Fimage.png?alt=media&#x26;token=6aba8781-13c9-4c0f-87e9-2d9612a57342" alt=""><figcaption></figcaption></figure>

[Список развертываний с API](https://docs.edgegap.com/api/#tag/Deployments/operation/deployments-get) и применять фильтры с backend-интеграциями:

<table><thead><tr><th width="237">Атрибут развертывания</th><th width="193">Операторы</th><th>Пример значения</th></tr></thead><tbody><tr><td><a href="#deployment-lifecycle"><code>status</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"ready"</code> или <code>"error"</code></td></tr><tr><td><a href="#observability"><code>request_id</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a> </td><td><a data-footnote-ref href="#user-content-fn-4"><code>"7e709a0d8efd"</code></a></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><a data-footnote-ref href="#user-content-fn-4"><code>[ "7e709a0d8efd", "4ba353100b4b" ]</code></a></td></tr><tr><td><a href="#discoverability"><code>теги</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"tagA"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "tagA", "tagB" ]</code></td></tr><tr><td><a href="#id-1.-start-a-deployment"><code>created_at</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-7"><code>lte</code></a>  или <a data-footnote-ref href="#user-content-fn-8"><code>gte</code></a></td><td><a href="https://en.wikipedia.org/wiki/ISO_8601"><code>2025-05-12T20:03:20Z</code></a></td></tr><tr><td><a href="application-and-versions"><code>приложение</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"my-app"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "my-app", "my-other-app" ]</code></td></tr><tr><td><a href="application-and-versions"><code>версия</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"1.0.0"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-9"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "1.0.0", "prod" ]</code></td></tr><tr><td><a href="private-fleets"><code>fleet_name</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"my-app-fleet-europe"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "fleet-eu", "fleet-us" ]</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-10"><code>ilike</code></a></td><td><code>"%-eu%"</code></td></tr><tr><td><a href="private-fleets"><code>host_name</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  или <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"alpha-north-america-95fab093"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>в</code></a>  или <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "alpha-north-america-95fab093" ]</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-10"><code>ilike</code></a></td><td><code>"%north-america%"</code></td></tr></tbody></table>

{% hint style="info" %}
Каждый атрибут может иметь не более 1 оператора фильтра в одном запросе. Подробнее см. [api](https://docs.edgegap.com/ru/docs/api "mention") для получения дополнительной информации.
{% endhint %}

Сортируйте результаты по нескольким полям в порядке их появления в запросе:

| Атрибут развертывания                                                   | Порядок                                                                  |
| ----------------------------------------------------------------------- | ------------------------------------------------------------------------ |
| [`created_at`](#id-1.-start-a-deployment)                               | [`asc`](#user-content-fn-11)[^11] или [`desc`](#user-content-fn-12)[^12] |
| [`available_session_sockets`](https://docs.edgegap.com/ru/docs/session) | [`asc`](#user-content-fn-13)[^13] или [`desc`](#user-content-fn-14)[^14] |

Примеры запросов с фильтрами:

<details>

<summary>Список <a href="#id-4.-deployment-error">развертываний с ошибкой</a> для устранения неполадок и удаления.</summary>

URL в закодированном виде:

```
https://api.edgegap.com/v1/deployments?query={"filters":[{"field":"status","operator":"eq","value":"error"},{"field":"application","operator":"eq","value":"my-app"},{"field":"version","operator":"eq","value":"green"}],"order_by":[{"field":"created_at","order":"desc"}]}
```

Отформатированный JSON-запрос:

```json
{
  "filters": [
    {
      "field": "status",
      "operator": "eq",
      "value": "error"
    },
    {
      "field": "application",
      "operator": "eq",
      "value": "my-app"
    },
    {
      "field": "version",
      "operator": "eq",
      "value": "green"
    }
  ],
  "order_by": [
    {
      "field": "created_at",
      "order": "desc"
    }
  ]
}
```

</details>

<details>

<summary>Список <a href="../../podbor-igrokov/matchmaker-in-depth#rolling-updates-and-ab-tests">Развертывания с устаревшей версией приложения</a> чтобы подтвердить, что релиз завершён.</summary>

URL в закодированном виде:

```
https://api.edgegap.com/v1/deployments?query={"filters":[{"field":"status","operator":"eq","value":"ready"},{"field":"application","operator":"eq","value":"my-app"},{"field":"version","operator":"eq","value":"blue"}],"order_by":[{"field":"created_at","order":"desc"}]}
```

Отформатированный JSON-запрос:

```json
{
  "filters": [
    {
      "field": "status",
      "operator": "eq",
      "value": "ready"
    },
    {
      "field": "application",
      "operator": "eq",
      "value": "my-app"
    },
    {
      "field": "version",
      "operator": "eq",
      "value": "blue"
    }
  ],
  "order_by": [
    {
      "field": "created_at",
      "order": "desc"
    }
  ]
}
```

</details>

{% hint style="success" %}
Не забудьте добавить `Authorization` заголовок с вашим API-токеном Edgegap в запрос.
{% endhint %}

### Вебхуки и постбэки

Получайте простые HTTP-уведомления в backend вашей игры об изменениях в [#deployment-lifecycle](#deployment-lifecycle "mention") указав URL вебхука в вашем [запросе к API развертывания](https://docs.edgegap.com/ru/docs/api/vydelennye-servery#post-deployments). Доступно для:

* При готовности: контейнер развертывания [успешно запущен](#id-1.-start-a-deployment) (после этого сервер начинает инициализацию),
* При ошибке: развертывание не удалось запустить и произошла [#id-4.-deployment-error](#id-4.-deployment-error "mention") ошибка,
* При завершении: [#id-5.-deployment-stopped](#id-5.-deployment-stopped "mention") и игровой сервер больше недоступен.

Вебхуки Ready и Error никогда не будут сработаны для одного и того же развертывания.

<details>

<summary>Пример полезной нагрузки вебхука</summary>

```json
{
  "request_id": "f68e011bfb01",
  "application": "my-game-server",
  "version": "2024.01.30-16.23.00-UTC",
  "fqdn": "f68e011bfb01.pr.edgegap.net",
  "public_ip": "162.254.141.66",
  "deployed_at": "2026-02-10T20:35:48Z",
  "termination_scheduled_at": "2026-02-10T21:35:48Z",
  "ports": {
    "gameport": {
      "external": 31504,
      "internal": 7777,
      "protocol": "UDP",
      "name": "gameport",
      "tls_upgrade": false,
      "link": "f68e011bfb01.pr.edgegap.net:31504",
      "proxy": null
    }
  },
  "location": {
    "city": "Montreal",
    "country": "Canada",
    "continent": "North America",
    "administrative_division": "Quebec",
    "timezone": "Eastern Time",
    "latitude": 45.513707,
    "longitude": -73.619073
  },
  "tags": [
    "tag1",
    "tag2"
  ],
  "host_id": "alpha-north-america-70364ef8",
  "host_in_private_fleet": false,
  "private_fleet_id": "PUBLIC_CLOUD",
  "vcpu_units": 256,
  "memory_mib": 512
}
```

</details>

{% hint style="warning" %}
**Вебхуки не повторяются**, поэтому если ваш backend не обработает запрос из-за ограничения частоты или ошибки, вебхук может быть потерян. Используйте вебхуки только для **некритичных сценариев использования или целей отладки**.
{% endhint %}

{% hint style="info" %}
Вебхуки отслеживают жизненный цикл развертывания, но не знают о состоянии инициализации вашей сцены/уровня. Чтобы отслеживать прогресс загрузки вашей сцены/уровня, реализуйте пользовательский вебхук в вашем игровом сервере.
{% endhint %}

## 🚨 Устранение неполадок

При устранении неполадок развертываний:

1. убедитесь, что нет ошибок в вашем [#deployment-logs](#deployment-logs "mention") и [#container-logs](#container-logs "mention"),
2. запустите ваш сервер локально, чтобы исключить ошибки интеграции,
3. изучите шаги по устранению неполадок на этой странице,
4. свяжитесь с нами в [Discord сообщества](https://discord.gg/MmJf8fWjnt) и укажите ID вашего развертывания.

{% hint style="info" %}
Смотрите [#player-issue-resolution](#player-issue-resolution "mention") наши рекомендации по работе с отзывами сообщества игроков.
{% endhint %}

<details>

<summary>Не удаётся подключить клиентов к серверу - <code>Превышено время ожидания запроса.</code>, <code>请求超时</code> , <code>ConnectionFailed</code> , или <code>Проверка порта не удалась</code>.</summary>

* Сначала убедитесь, что развертывание в состоянии 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`) — отличный выбор, поскольку он глобально уникален и легко доступен клиенту через [Matchmaker](https://docs.edgegap.com/ru/learn/podbor-igrokov/matchmaker-in-depth) назначение и к [#injected-environment-variables](https://docs.edgegap.com/ru/podbor-igrokov/matchmaker-in-depth#injected-environment-variables "mention").
* Далее, пожалуйста, убедитесь, что настройка порта в 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)? Ваше соединение может блокироваться Великим китайским файрволом. Рассмотрите возможность добавить в ваш fleet сервер, расположенный в Китае, или использовать VPN для подключения.

</details>

<details>

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

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

</details>

<details>

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

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

</details>

<details>

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

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

</details>

<details>

<summary>Моё устройство Meta Quest выдаёт <code>HTTP 0: Не удаётся разрешить адрес назначения хоста</code> .</summary>

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

</details>

<details>

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

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

</details>

<details>

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

* Это может не быть проблемой, поскольку игровые движки обычно выполняют ресурсоёмкие операции CPU во время инициализации сервера. Если загрузка CPU не снижается через 2–3 минуты после запуска развертывания, вам может потребоваться оптимизировать сервер или увеличить ресурсы версии приложения.
* Снижение tick rate может повлиять на использование 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`, пересоберите, отправьте и заново разверните ваш сервер.
* В бесплатном тарифе вам доступно только 1.5 vCPU и 3 ГБ памяти (RAM).
* Вы можете увеличить выделенные ресурсы при создании новой версии приложения. Вы можете дублировать версию вашего приложения в нашей панели управления и при необходимости изменить эти значения без пересборки вашего сервера или образа.

</details>

<details>

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

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

</details>

<details>

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

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

</details>

<details>

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

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

</details>

[^1]: сессии могут длиться до 24 часов

[^2]: равно

[^3]: не равно

[^4]: request\_id (ID развертывания)

[^5]: in array

[^6]: not in array

[^7]: меньше или равно

[^8]: больше или равно

[^9]: &#x20;in array

[^10]: поиск по шаблону без учёта регистра:

    * используйте `%`  для любой последовательности
    * используйте `_`  для любого одного символа

[^11]: по возрастанию, сначала старые

[^12]: по убыванию, сначала новые

[^13]: по возрастанию, сначала заполненные

[^14]: по убыванию, сначала пустые
