> 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 с помощью наших плагинов, [панели управления](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 %}

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

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

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

{% 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) чтобы **защититься от человеческих ошибок (dev),**.
{% endhint %}

{% hint style="info" %}
Бесплатный тариф ограничен 2 приложениями, 2 версиями и 5 ГБ хранилища Container 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 единиц),**
  * этот параметр нельзя редактировать у существующей версии приложения, нужно создать новую версию.

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

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

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

{% hint style="info" %}
Наши серверные машины используют процессоры AMD/Intel с тактовой частотой 2,4–3,2 ГГц, в зависимости от локации. Чтобы убедиться, что у вашего сервера достаточно доступных ресурсов, свяжитесь с нами в [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),
  * каждый репозиторий может включать несколько тегов образа вашего сервера.
* **Тег** — относится к конкретному артефакту сборки (версии) образа вашего сервера,
  * наши плагины по умолчанию копируют значения тегов из имен версий приложения,
  * вы можете просматривать локально сохраненные теги в Docker Desktop Images или с помощью Docker CLI.

{% hint style="danger" %}
:x: **НЕ — перезаписывайте существующие теги или используйте `latest` тег** чтобы не развернуть устаревшие (кэшированные) сборки.\
: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 использует имена тегов, и если вы перезапишете значение тега (например, `latest`) она не распознает новую сборку.

***

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

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

***

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

* Удаление тега также приведет к удалению связанного артефакта сборки, если на момент [API-запроса](https://docs.edgegap.com/api/#tag/Container-Registry/operation/image-tag-delete).
* Из-за стандартов 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 секунды по всему миру!**

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

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

{% 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="/files/b6d4115d21081ed185e8471e97ecfa529be89aba" alt=""><figcaption></figcaption></figure>

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

### Предохранительные меры

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

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

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

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

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

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

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

Чтобы гарантировать, что никакие параметры не изменятся при создании новой версии приложения через наше [панели управления](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 %}
