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

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

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

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

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

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

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

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

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

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

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

Вы можете управлять версиями приложения на Edgegap, используя наш [панель управления](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/) — отличный выбор для передачи объёма изменений,
* `dev` , `staging`, `qa`, `prod` - хранение только последней версии для каждой среды очень просто,
* `blue`, `green` - версии могут использоваться как алиасы для стратегии развёртывания с поэтапным обновлением.

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

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

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

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

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

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

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

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

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

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

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

{% hint style="success" %}
Версии автоматически включают ОЗУ в соотношении 2:1 ОЗУ-vCPU, **позволяя до 512 МБ ОЗУ на каждые 0,25 vCPU**.
{% endhint %}

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

### Детали образа

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

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

{% hint style="danger" %}
:x: **НЕ НАДО — перезаписывать существующие теги или использовать `latest` тег** чтобы избежать развёртывания устаревших (кешированных) сборок.\
:white\_check\_mark: **ДЕЛАЙТЕ — всегда увеличивайте тег версии** чтобы развернуть нужную сборку и предотвратить проблемы с релизом.
{% endhint %}

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

<details>

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

Я получил ошибку `401 Unauthorized` при отправке (push) образа сервера.

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

***

Я получил ошибку `403 Forbidden` при отправке (push) образа сервера.

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

***

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

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

***

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

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

***

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

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

***

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

* Удаление тега также приведёт к удалению связанного артефакта сборки, если в момент [API-запроса](https://docs.edgegap.com/api/#tag/Container-Registry/operation/image-tag-delete).
* у артефакта не осталось других связанных тегов. В соответствии со стандартами Docker API и для обеспечения наилучшего пользовательского опыта мы предоставляем интерфейс только для удаления тегов. См. пункт выше относительно удаления артефактов сборки.

</details>

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

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

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

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

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

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

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

:star2: [**Обновитесь до тарифа «Плати по мере использования»**](https://app.edgegap.com/user-settings?tab=memberships) **чтобы разблокировать 0.5-секундное время развёртывания по всему миру!**

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

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

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

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

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

### Проброс портов

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

* **Порт** значение относится к **внутреннему порту** обычно используемому вашей интеграцией сетевого кода,
* **Протокол** будет зависеть от транспорта вашей интеграции сетевого кода,
* **Имя** является человекочитаемым идентификатором для ваших нужд, может совпадать с Портом,
* **Проверки** могут быть включены, чтобы убедиться, что ваш контейнер инициализирован перед пометкой 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&#x26;token=a509cc92-a410-4658-9dcd-b032497debb5" alt=""><figcaption></figcaption></figure>

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

### Защитные ограждения

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

* **Ограничения по времени** - эти функции могут помочь вам управлять жизненным циклом ресурсов развёртываний:
  * **Макс. длительность игры** можно настроить для корректного завершения работы серверов через заданный период, или настроить `-1`  с помощью [create/edit API версии приложения](https://docs.edgegap.com/ru/docs/api/versionirovanie#post-v1-app-app_name-version) для [postoyanstvo](https://docs.edgegap.com/ru/learn/orkestraciya/postoyanstvo "mention") с помощью [private-fleets](https://docs.edgegap.com/ru/learn/orkestraciya/private-fleets "mention").
  * **Максимальное время на развёртывание** может помочь очистить развёртывания, которые занимают слишком много времени для запуска.
* **Хранение логов контейнера** - чтобы экспортировать логи сервера после остановки развёртывания, укажите заранее настроенное S3-совместимое хранилище для экспорта логов контейнера,
  * см. [Хранилище конечных точек](https://docs.edgegap.com/docs/deployment/endpoint-storage) для деталей по настройке и использованию.

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

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

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

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

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

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