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

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

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

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

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

Вы можете управлять своими приложениями в 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, 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) в **защитой от человеческих (разработческих) ошибок**.
{% 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 единиц),**
  * этот параметр нельзя редактировать у существующей версии приложения, нужно создать новую версию.
* **Память** - сколько мегабайт ОЗУ нужно вашему приложению для работы (1024MB = 1GB),
  * этот параметр нельзя редактировать у существующей версии приложения, нужно создать новую версию.
* **GPU** - сколько графических процессоров нужно вашему приложению для работы,
  * эта функция пока недоступна, пожалуйста, свяжитесь с нами, если вам это интересно.

{% hint style="success" %}
Версии автоматически включают RAM в соотношении 2:1 RAM-vCPU, **что позволяет до 512 МБ RAM на 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),
  * Устранение неполадок и FAQ

<details>

<summary>Я получил ошибку</summary>

401 Unauthorized `при отправке образа моего сервера.` Это означает, что вы не вошли в свой контейнерный реестр. См. Container Registry для

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

***

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

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

***

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

* Пример реестра:
* Пример репозитория: `registry.edgegap.com` .
* registry.edgegap.com/my-edgegap-org/my-game-server `Пример имени проекта:`.
* my-game-server `При отправке новых тегов образов / сборок мои изменения не перезагружаются корректно.` .

***

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

* ), новая сборка не будет обнаружена. `тег`Могу ли я пометить один и тот же артефакт сборки несколькими тегами?

***

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

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

***

Удаление тега также приведёт к удалению связанного артефакта сборки, если на момент

* 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 секунды по всему миру!**

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

Кэширование полностью начнёт действовать, когда уровень кэширования вашей версии приложения достигнет 🟢 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="/files/b6d4115d21081ed185e8471e97ecfa529be89aba" alt=""><figcaption></figcaption></figure>

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

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

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

* **Ограничения по времени** - эти функции помогут вам управлять жизненным циклом ресурсов развёртываний:
  * **Максимальная продолжительность игры** можно задать, чтобы корректно завершать работу ваших серверов по истечении заданного периода, или установить в `-1`  с [создание/редактирование API версии приложения](/ru/docs/api/upravlenie-versiyami.md#post-v1-app-app_name-version) для [Постоянство](/ru/learn/orkestraciya/postoyanstvo.md) с [Частные парки](/ru/learn/orkestraciya/chastnye-parki.md).
  * **Максимальное время на развёртывание** может помочь вам очистить развёртывания, которые слишком долго запускаются.
* **Политика перезапуска процесса** - управляет поведением развёртывания, когда процесс вашего сервера останавливается.
  * Всегда перезапускать (по умолчанию) — перезапустит при успешном коде выхода (0) и при любом аварийном завершении.
  * Никогда не перезапускать (рекомендуется) — развёртывание останавливается при кодах успешного и аварийного завершения.
  * Перезапускать при сбое — перезапускать только при кодах аварийного завершения, полезно для постоянных серверов.
* **Хранение логов контейнера** - чтобы экспортировать логи сервера после остановки развёртывания, укажите заранее настроенный бакет, совместимый с S3, для экспорта логов вашего контейнера,
  * см. [Endpoint Storage](https://docs.edgegap.com/docs/deployment/endpoint-storage) подробности о настройке и использовании.

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

{% hint style="info" %}
Бесплатный тариф ограничен 2 приложениями, 2 версиями и 5 ГБ хранилища Container 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 %}


---

# Agent Instructions: 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.
