> 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 единиц),**
  * эту настройку нельзя изменить у существующей версии приложения, нужно создать новую версию.
* **Память** - сколько мегабайт ОЗУ нужно вашему приложению для работы (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 или с помощью CLI Docker.

{% 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>Поиск и часто задаваемые вопросы</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`) он не подхватит новую сборку.

***

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

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

***

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

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

</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/sokhranenie-sostoyaniya.md) с [Частные флоты](/ru/learn/orkestraciya/chastnye-floty.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), мы рекомендуем использовать **функцию Duplicate** в правом верхнем углу страницы панели управления вашей предыдущей версии приложения. При дублировании вы можете изменить любые параметры перед сохранением.

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

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/ru/learn/orkestraciya/application-and-versions.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
