> 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/learn/orkestraciya/application-and-versions.md).

# Приложения и версии

Как работают приложения и версии Edgegap, а также лучшие практики для версионирования сборок игровых серверов и разделения сред.

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

## 📦 Приложения

Приложения объединяют серверные проекты. Такое разделение контекста особенно полезно, если вы:

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

Вы можете управлять своими Приложениями в Edgegap с помощью наших плагинов [dashboard](https://app.edgegap.com/application-management/applications/list) или нашего API.

{% hint style="success" %}
Ознакомьтесь с нашим [справочником по API Приложений](https://docs.edgegap.com/api/#tag/Applications)или узнайте больше о нашем [API управления](https://docs.edgegap.com/api/).
{% endhint %}

## 🏷️ Версии приложения

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

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

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

Вы можете управлять версиями вашего приложения в Edgegap с помощью нашего [dashboard](https://app.edgegap.com/application-management/applications/list) или нашего API.

{% hint style="success" %}
Ознакомьтесь с нашим [справочника API версий приложения](https://docs.edgegap.com/api/#tag/Applications/operation/app-version-post)или узнать больше о [API](https://docs.edgegap.com/api/).
{% endhint %}

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

* `2024.01.30-16.23.00-UTC` - временные метки прозрачны для хранения множества прошлых версий,
* `1.1.0` - [семантическое версионирование](https://semver.org/) — отличный выбор для передачи масштаба изменений,
* `разработка` , `стейджинг`, `QA`, `продакшн` - хранить только последнюю версию для каждой среды очень легко,
* `синий`, `зелёный` - версии можно использовать как псевдонимы для стратегии релиза с поэтапным обновлением.

{% hint style="success" %}
Вы можете изменить свой подход в любое время, пока сохраняете совместимость клиента и сервера.
{% endhint %}

{% hint style="info" %}
Вы можете отключить любое приложение или версию в нашем [dashboard](https://app.edgegap.com/application-management/applications/list) в **защита от человеческих (dev) ошибок**.
{% endhint %}

{% hint style="info" %}
Бесплатный тариф ограничен 2 приложениями, 2 версиями и 10 ГБ хранилища Container Registry.
{% endhint %}

### Комбинируйте стратегии версионирования

Часто лучшим решением является сочетание стратегий версионирования, например:

* использование временных меток или семантического версионирования для dev-сборок, для более детального отслеживания;
* хранение `стейджинг`, `QA` и `продакшн` версий с параметрами, зависящими от окружения;
* чередование `синий` и `зелёный` версий как псевдонимов для [обновлений без простоя матчмейкинга](https://docs.edgegap.com/docs/gen2-matchmaker#rolling-updates-ab-tests).

## 🧱 Обязательные параметры

Эти базовые параметры должны быть определены всегда.

### Требования к ресурсам

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

* **vCPU** - сколько виртуальных единиц CPU нужно вашему приложению для работы (1024 единицы = 1 vCPU),
  * **минимально допустимый объём vCPU — 0,25 vCPU (256 единиц),**

{% hint style="info" %}
Нужно меньше 0,25 vCPU на одно развертывание? [Свяжитесь с нами, чтобы изучить варианты оптимизации.](mailto:info@edgegap.com)
{% endhint %}

* **Память** - сколько мегабайт RAM нужно вашему приложению для работы (1024 МБ = 1 ГБ),
* **GPU** - сколько графических процессоров нужно вашему приложению для работы,
  * эта функция пока недоступна, пожалуйста, свяжитесь с нами, если вам это интересно.

{% hint style="success" %}
Версии автоматически включают RAM в соотношении 2:1 RAM:vCPU, **что даёт 512 МБ RAM при 0,25 vCPU**.
{% endhint %}

{% hint style="info" %}
Наши серверные машины используют процессоры AMD/Intel с тактовой частотой до 3,7 ГГц, которая зависит от локации. Чтобы убедиться, что вашему серверу доступно достаточно ресурсов, обратитесь через [Community Discord](https://discord.gg/MmJf8fWjnt).
{% endhint %}

### Сведения об образе

Эти параметры помогут нашей системе решить, какую сборку вашего сервера следует запустить позже:

* **Реестр** - `registry.edgegap.com` если вы используете наш [Container Registry](https://docs.edgegap.com/docs/container/edgegap-container-registry),
  * чтобы использовать сторонний реестр, введите свои Docker-учётные данные для стороннего реестра,
  * реестр служит общим хранилищем для ваших и чужих репозиториев.
* **Репозиторий образов** - это выделенный репозиторий вашего приложения,
  * найдите все свои репозитории на странице Container Registry в панели управления [панели управления](https://app.edgegap.com/registry-management/repositories/list),
  * каждый репозиторий может содержать несколько тегов образа вашего сервера.
* **Тег** - это конкретный артефакт сборки (версия) образа вашего сервера,
  * наши плагины по умолчанию копируют значения тегов из имён версий приложения,
  * вы можете просматривать локально сохранённые теги в Images Docker Desktop или с помощью Docker CLI.

{% hint style="danger" %}
:x: **НЕ - перезаписывайте существующие теги или используйте `последний` тег** - это приведёт к развёртыванию устаревшего кэша.\
:white\_check\_mark: **ДА - всегда увеличивайте тег версии** и разверните новую сборку.
{% endhint %}

* **Приватный реестр** - если доступ к вашему репозиторию защищён (приватный репозиторий), нам также понадобятся:
  * **Токен имени пользователя** - имя пользователя для программного доступа к вашему реестру,
  * **Токен пароля** - пароль для программного доступа к вашему реестру,
  * для Edgegap [Container Registry](https://docs.edgegap.com/docs/container/edgegap-container-registry), вы можете [скопировать эти значения из нашей панели управления](https://app.edgegap.com/registry-management/repositories/list),
  * они не требуются для общедоступных репозиториев.

<details>

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

Я получил ошибку `401 Неавторизован` при отправке образа моего сервера.

* Это означает, что вы не вошли в свой реестр контейнеров. См. Container Registry для [инструкций по Edgegap Container Registry](https://docs.edgegap.com/docs/container/edgegap-container-registry#getting-your-credentials)или эквивалент для вашего провайдера реестра. Повторение последней операции не устранит ошибку.

***

Я получил ошибку `403 Запрещено` при отправке образа моего сервера.

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

***

В чём разница между реестром, репозиторием и проектом?

* Представьте реестр как хранилище, репозиторий как отдельную ячейку, а проект как номер ячейки. Обычно каждый реестр включает множество репозиториев, некоторые общедоступные, некоторые приватные для организаций и пользователей.
* Пример реестра: `registry.edgegap.com` .
* Пример репозитория: `registry.edgegap.com/my-edgegap-org/my-game-server`.
* Пример имени проекта: `my-game-server` .

***

При отправке новых тегов образа / сборок мои изменения не перезагружаются корректно.

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

***

Могу ли я пометить один и тот же артефакт сборки несколькими тегами?

* Да, вы можете без проблем присвоить одному и тому же артефакту несколько тегов, которые будут служить разными псевдонимами одной и той же сборки. Читайте дальше, чтобы узнать, как потом удалить теги.

***

Что происходит, когда я удаляю тег? Почему я не могу удалить конкретный артефакт по хэшу?

* Чтобы освободить место в реестре, нужно удалить все теги, связанные с конкретным артефактом.
* Из-за стандартов Docker API и для обеспечения наилучшего пользовательского опыта мы предоставляем только интерфейс для удаления тегов. См. пункт выше относительно удаления артефактов сборки.

</details>

## ⚙️ Необязательные параметры

Эти параметры можно настроить для дальнейшей кастомизации ваших развертываний.

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

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

* частые примеры: аргументы движка, секреты сторонних сервисов и конечные точки,
* см. [Развертывания](/ru/learn/orkestraciya/deployments.md#injected-environment-variables) чтобы понять разные способы внедрения переменных окружения в зависимости от контекста развертывания, помимо переменных версии приложения,
* каждая переменная окружения может содержать до 4 КБ (килобайт) строковых данных.

{% hint style="warning" %}
Обязательно **помечайте конфиденциальные переменные (секреты, токены) как скрытые** для дополнительной безопасности!
{% endhint %}

### Активное кэширование

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

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

Кэширование начнёт действовать в полной мере, когда уровень кэширования вашей версии приложения достигнет 🟢 Good.

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

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

{% hint style="warning" %}
**Образы удаляются из кэша, если они не разворачиваются в течение 72 часов подряд.**
{% endhint %}

### Сопоставление портов

Каждому серверу требуется как минимум один порт для приема входящих подключений клиентов:

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

{% hint style="success" %}
Для большинства игр достаточно добавить одно сопоставление UDP-порта для порта `7777`.
{% endhint %}

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

<figure><img src="https://3845012722-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FXfDDoCk7J4O9qtkkjurh%2Fimage.png?alt=media&amp;token=a509cc92-a410-4658-9dcd-b032497debb5" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
Добавьте больше портов в сопоставление портов, если ваш сервер взаимодействует по нескольким протоколам.
{% endhint %}

### Меры безопасности

Эти параметры помогают в различных крайних случаях и при общей диагностике сервера:

* **Ограничения по времени** — эти функции помогут управлять жизненным циклом ресурсов развертываний:
  * **Максимальная длительность игры** можно настроить на корректное завершение работы серверов по истечении заданного времени, или установить `-1`  с [создание/редактирование через API версии приложения](/ru/docs/api/versionirovanie.md#post-v1-app-app_name-version) для [Постоянство](/ru/learn/orkestraciya/postoyanstvo.md) с [Частные флоты](/ru/learn/orkestraciya/chastnye-floty.md).
  * **Максимальное время развертывания** может помочь очищать развертывания, которые слишком долго запускаются.
* **Политика перезапуска процесса** — управляет поведением развертывания, когда процесс вашего сервера останавливается.
  * Всегда перезапускать (по умолчанию) — перезапуск при успешном коде выхода (0) и любом коде ошибки.
  * Никогда не перезапускать (рекомендуется) — развертывание останавливается при успешном и при ошибочном коде выхода.
  * Перезапуск при сбое — перезапуск только при ошибочных кодах выхода, полезно для постоянных серверов.

{% hint style="info" %}
Бесплатный тариф ограничен 2 приложениями, 2 версиями и 10 ГБ хранилища Container Registry.
{% endhint %}

### Хранение логов

Чтобы экспортировать логи сервера после остановки развертывания, настройте [Хранилище конечной точки](/ru/docs/endpoint-storage.md) с использованием S3-совместимого бакета.

{% hint style="warning" %}
Логи версий без внешнего хранилища будут удалены после завершения развертывания.
{% endhint %}

## ⏩ Согласованность обновлений

Чтобы убедиться, что ни один из параметров не изменится при создании новой версии приложения через наш [dashboard](https://app.edgegap.com/application-management/applications/list), мы рекомендуем использовать **Дублировать** в верхнем правом углу страницы панели управления предыдущей версии приложения. При дублировании вы можете изменить любые параметры перед сохранением.

{% hint style="success" %}
**Дублирование или редактирование версий приложения не требует пересборки образа сервера.**
{% endhint %}

{% hint style="info" %}
См. [Непрерывные обновления матчмейкера](https://docs.edgegap.com/docs/gen2-matchmaker#rolling-updates-ab-tests) для дальнейшей **автоматизации релизов**.
{% endhint %}
