# 应用和版本

了解版本管理和应用程序——概念和最佳实践以加深理解。

## 📦 应用程序

应用程序封装服务器项目。如果您这样分离上下文会特别有用：

* 同时开发多个游戏或非游戏项目（合并计费），
* 作为共同开发者参与外部项目（稍后转移所有权），
* 依赖多种松耦合且具有不同扩展模式或需求的服务器类型。

您可以使用我们的插件在 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 %}

## 🏷️ 应用版本

随着您开发应用并持续产出新构建，您需要将每个构建存储为单独的版本，以便：

* **保持兼容性** 在您的客户端和服务器之间，
* 比较您的各种 **增量发布** （性能、用户反馈），
* 测试 **同时运行多个应用版本** （开发、质量保证、预发布、测试版）。

{% hint style="info" %}
每个应用版本指向您选择的一个构建工件。多个版本可以指向相同的构建。
{% endhint %}

您可以使用我们的 [仪表板](https://app.edgegap.com/application-management/applications/list)，或使用我们的 API。

{% hint style="success" %}
探索我们的 [应用版本 API 参考](https://docs.edgegap.com/api/#tag/Applications/operation/app-version-post)在 Edgegap 上管理您的应用版本，或阅读更多关于 [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 GB 的容器注册表存储。
{% endhint %}

### 结合版本管理策略

通常，最佳解决方案是多种版本策略的组合，例如：

* 对开发构建使用时间戳或语义化版本以便更细粒度的跟踪；
* 保留 `预发布（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" %}
版本会自动以 2:1 的 RAM-vCPU 比例包含内存， **允许每 0.25 vCPU 最多 512MB 内存**.
{% endhint %}

{% hint style="info" %}
我们的服务器使用 AMD/Intel CPU，时钟频率在 2.4 - 3.2 GHz 之间，因地区而异。为确保您的服务器有足够资源可用，请通过 [社区 Discord](https://discord.gg/MmJf8fWjnt).
{% endhint %}

### 镜像详情

这些参数将帮助我们的系统决定稍后应启动哪个版本的服务器构建：

* **注册表** - `registry.edgegap.com` 如果您正在使用我们的 [容器注册表](https://docs.edgegap.com/docs/container/edgegap-container-registry),
  * 若要使用第三方注册表，请输入您的第三方注册表的 Docker 凭据，
  * 注册表作为您和其他用户的仓库的共享存储服务。
* **镜像仓库** - 指的是您应用的专用仓库，
  * 在我们的 [仪表板的容器注册表页面](https://app.edgegap.com/registry-management/repositories/list),
  * 中查找您所有的仓库，
* **每个仓库可能包含您服务器镜像的多个标签。** 标签
  * \- 指的是服务器镜像的特定构建工件（版本），
  * 我们的插件默认会将标签值从应用版本名称复制，

{% hint style="danger" %}
:x: **您可以在 Docker Desktop 的镜像或使用 docker CLI 查看本地存储的标签。 `切勿 - 覆盖现有标签或使用` latest（最新）** 标签\
:white\_check\_mark: **以避免部署过期（缓存）构建。** 应该 - 始终增加您的版本标签
{% endhint %}

* **以部署预期的构建并防止发布问题。** 私有注册表
  * **- 如果您的仓库访问受保护（私有仓库），我们还需要：** 用户名令牌
  * **- 您的注册表的程序化访问用户名，** 密码令牌
  * \- 您的注册表的程序化访问密码， [容器注册表](https://docs.edgegap.com/docs/container/edgegap-container-registry)对于 Edgegap [，您可以](https://app.edgegap.com/registry-management/repositories/list),
  * 从我们的仪表板复制这些值

<details>

<summary>公共仓库则不需要这些。</summary>

故障排除与常见问题 `我在推送服务器镜像时收到错误` 401 未授权

* 这意味着您尚未登录到您的容器注册表。请参阅容器注册表中的 [Edgegap 容器注册表说明](https://docs.edgegap.com/docs/container/edgegap-container-registry#getting-your-credentials)或您注册表提供商的等效说明。重复您上一次的操作不会解决此错误。

***

故障排除与常见问题 `403 禁止访问` 401 未授权

* 这意味着当前登录的注册表用户可能没有足够的权限（通常是推送新镜像的权限），或者您登录的是错误的注册表提供商。尝试退出并以具有足够权限的正确提供商和用户重新登录。重复您上一次的操作不会解决此错误。

***

注册表、仓库和项目之间有什么区别？

* 可以把注册表想象为存储设施，仓库是存储单元，项目是存储单元编号。每个注册表通常包含许多仓库，有些是公开的，有些对组织和用户是私有的。
* 示例注册表： `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).
* 时没有其他与该工件关联的标签。

</details>

## 根据 Docker API 标准并为了确保最佳用户体验，我们仅提供删除标签的接口。有关删除构建工件，请参阅上文相关说明。

⚙️ 可选参数

### 未捕获的服务器异常会导致部署的容器重启并使 TLS 安全失效。在这种情况下，

这些参数可配置以进一步自定义您的部署。

* 自定义环境变量将被注入到此版本的所有部署中：
* 参见 [#injected-environment-variables](https://docs.edgegap.com/zh/learn/deployments#injected-environment-variables "mention") 常见示例包括：引擎参数、第三方密钥和端点，
* 为了解部署上下文中环境变量注入的不同方式，除应用版本变量外，

{% hint style="warning" %}
每个环境变量可包含最多 4KB（千字节）的字符串数据。 **请务必** 将敏感变量（密钥、令牌）设置为隐藏
{% endhint %}

### 以增强安全性！

:star2: [**升级到按使用付费等级**](https://app.edgegap.com/user-settings?tab=memberships) **主动缓存**

**以解锁全球 0.5 秒部署时间！** 加速部署并在几秒内启动服务器，无需备用服务器。

与此应用版本关联的服务器镜像将自动在我们全球所有地点预加载。

{% hint style="success" %}
一旦您的应用版本的缓存级别达到 🟢 良好，缓存将全面生效。 **多个应用版本可以重用相同的镜像标签。**&#x4E3A;某个版本启用缓存将自动为所有与相同镜像标签关联的版本启用缓存，
{% endhint %}

{% hint style="info" %}
使参数化部署变得简单。
{% endhint %}

{% hint style="warning" %}
**镜像在部署时也会被被动缓存，但仅在部署它的宿主机上。**
{% endhint %}

### 如果镜像连续 72 小时未被部署，将从缓存中移除。

端口映射

* **每个服务器至少需要一个端口以接受传入客户端连接：** 端口 **值指的是** 内部端口
* **值，通常来自您的网络代码集成，** 协议
* **将取决于您的网络代码集成传输，** 名称
* **是供您使用的人类可读标识符，可以与端口相同，** 验证

{% hint style="success" %}
可以启用以确保容器在标记为 READY 之前已初始化。 `7777`.
{% endhint %}

大多数游戏只需为端口添加单个 UDP 端口映射即可， **虽然服务器进程的内部端口作为应用版本的一部分进行定义，**&#x5916;部端口在创建部署后会被随机分配

<figure><img src="https://3334189208-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`  可以设置为在给定时间后优雅地关闭您的服务器，或设置为 [与](https://docs.edgegap.com/zh/docs/api/ban-ben-kong-zhi#post-v1-app-app_name-version) 用于 [chi-jiu-hua](https://docs.edgegap.com/zh/learn/bian-pai/chi-jiu-hua "mention") 可以设置为在给定时间后优雅地关闭您的服务器，或设置为 [si-you-ji-qun](https://docs.edgegap.com/zh/learn/bian-pai/si-you-ji-qun "mention").
  * **应用版本 API 创建/编辑** 最大部署时间
* **可以帮助您清理启动时间过长的部署。** 容器日志存储
  * 参见 [- 要在部署停止后导出服务器日志，请指定预配置的兼容 S3 的存储桶以导出您的容器日志，](https://docs.edgegap.com/docs/deployment/endpoint-storage) 端点存储

{% hint style="warning" %}
有关配置和使用的详细信息。
{% endhint %}

{% hint style="info" %}
免费套餐限制为 2 个应用、2 个版本和 5 GB 的容器注册表存储。
{% 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 %}
