> 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, бета).

{% 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 Unauthorized` при отправке моего серверного образа.

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

***

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

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

***

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

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

***

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

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

***

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

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

***

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

* Чтобы освободить место в реестре, нужно удалить все теги, связанные с конкретным артефактом.
* Из-за стандартов 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/persistentnost.md) с [Частные парки серверов](/ru/learn/orkestraciya/chastnye-parki-serverov.md).
  * **Максимальное время развертывания** может помочь очищать развертывания, которые слишком долго запускаются.
* **Политика перезапуска процесса** - управляет поведением развертывания, когда процесс сервера останавливается.
  * Всегда перезапускать (по умолчанию) — перезапускать при успешном коде выхода (0) и при любом аварийном завершении.
  * Никогда не перезапускать (рекомендуется) — развертывание останавливается при успешном и аварийном кодах выхода.
  * Перезапускать при сбое — перезапускать только при кодах аварийного завершения, полезно для постоянных серверов.

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

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

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

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