> 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/docs.edgegap.com-ko/learn/orchestration/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 %}

## 🏷️ 앱 버전

애플리케이션을 개발하고 새로운 빌드를 지속적으로 생성하면, 각 빌드를 별도의 버전으로 저장해야 합니다. 그 이유는 다음과 같습니다:

* **호환성 유지** 클라이언트와 서버 간에,
* 다양한 측면을 비교하기 위해 **점진적 출시의** (성능, 사용자 반응),
* 테스트 **여러 앱 버전을 동시에** (개발, 품질 보증, 스테이징, 베타).

{% 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개, 그리고 Container Registry 저장소 5GB로 제한됩니다.
{% 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단위)입니다.**
  * 이 설정은 기존 앱 버전에서는 수정할 수 없으며, 새 버전을 만들어야 합니다.
* **메모리** - 앱이 실행되는 데 필요한 RAM 메가바이트 수(1024MB = 1GB),
  * 이 설정은 기존 앱 버전에서는 수정할 수 없으며, 새 버전을 만들어야 합니다.
* **GPU** - 앱이 실행되는 데 필요한 그래픽 처리 장치 수,
  * 아직 이 기능은 사용할 수 없습니다. 관심이 있으시면 문의해 주세요.

{% hint style="success" %}
버전에는 RAM-vCPU 비율 2:1로 RAM이 자동 포함되며, **0.25 vCPU당 최대 512MB RAM까지 허용됩니다.**.
{% endhint %}

{% hint style="info" %}
당사의 서버 머신은 위치에 따라 2.4 - 3.2 GHz 클럭 속도의 AMD/Intel CPU를 사용합니다. 서버에 충분한 리소스가 확보되도록 하려면 다음에서 문의하세요. [커뮤니티 디스코드](https://discord.gg/MmJf8fWjnt).
{% endhint %}

### 이미지 세부 정보

이 매개변수들은 나중에 어떤 서버 빌드를 시작할지 시스템이 결정하는 데 도움이 됩니다:

* **레지스트리** - `registry.edgegap.com` 당사의 [컨테이너 레지스트리](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의 경우 [컨테이너 레지스트리](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`) 새 빌드를 인식하지 못합니다.

***

같은 빌드 아티팩트에 여러 번 태그를 붙일 수 있나요?

* 네, 같은 아티팩트에 여러 번 태그를 붙여도 문제 없으며, 동일한 빌드의 여러 별칭처럼 사용할 수 있습니다. 나중에 태그를 제거하는 방법은 계속 읽어보세요.

***

태그를 삭제하면 어떻게 되나요? 해시를 사용해 특정 아티팩트를 삭제할 수 없는 이유는 무엇인가요?

* 태그를 삭제하면, 삭제 시점에 해당 아티팩트와 연결된 다른 태그가 없다면 연관된 빌드 아티팩트도 함께 삭제됩니다. [API 요청](https://docs.edgegap.com/api/#tag/Container-Registry/operation/image-tag-delete).
* Docker API 표준과 가능한 최고의 사용자 경험을 보장하기 위해, 우리는 태그 삭제를 위한 인터페이스만 제공합니다. 빌드 아티팩트 삭제에 대해서는 위의 항목을 참조하세요.

</details>

## ⚙️ 선택적 매개변수

이 매개변수들은 배포를 더 세부적으로 맞춤 설정하도록 구성할 수 있습니다.

### 주입되는 변수

이 버전의 모든 배포에는 사용자 정의 환경 변수가 주입됩니다:

* 일반적인 예로는 엔진 인수, 타사 비밀 값, 엔드포인트 등이 있습니다.
* 참조하세요 [배포](/docs.edgegap.com-ko/learn/orchestration/deployments.md#injected-environment-variables) 앱 버전 변수 외에도, 배포의 문맥에 따라 환경 변수를 주입하는 다양한 방법을 이해하려면 다음을 참조하세요.
* 각 환경 변수에는 최대 4KB(킬로바이트)의 문자열 데이터를 넣을 수 있습니다.

{% hint style="warning" %}
반드시 **민감한 변수(비밀 값, 토큰)는 숨김으로 설정하세요** 추가 보안을 위해!
{% endhint %}

### 활성 캐싱

:star2: [**종량제 요금제로 업그레이드**](https://app.edgegap.com/user-settings?tab=memberships) **전 세계 0.5초 배포 시간을 활용하세요!**

**배포 속도를 높이고 몇 초 만에 서버를 시작하세요. 대기 서버는 필요 없습니다.** 이 앱 버전에 연결된 서버 이미지는 전 세계 모든 위치에 자동으로 사전 로드됩니다.

캐싱은 앱 버전의 캐싱 수준이 🟢 좋음에 도달하면 완전히 적용됩니다.

{% hint style="success" %}
여러 앱 버전이 동일한 이미지 태그를 재사용할 수 있습니다. **한 버전에 캐시를 활성화하면 동일한 이미지 태그에 연결된 모든 버전에 자동으로 활성화됩니다**이를 통해 매개변수화된 배포가 쉬워집니다.
{% endhint %}

{% hint style="info" %}
이미지는 배포 시에도 수동으로 캐시되며, 배포된 호스트 머신에서만 적용됩니다.
{% endhint %}

{% hint style="warning" %}
**이미지는 72시간 연속으로 배포되지 않으면 캐시에서 제거됩니다.**
{% endhint %}

### 포트 매핑

각 서버는 클라이언트의 인바운드 연결을 수락하기 위해 최소 하나의 포트가 필요합니다:

* **포트** 값은 **내부 포트** 값을 의미하며, 보통 네트코드 통합에서 옵니다.
* **프로토콜** 은 네트코드 통합의 전송 방식에 따라 달라집니다.
* **이름** 은 사용 목적에 맞는 사람이 읽을 수 있는 식별자이며, 포트와 같을 수도 있습니다.
* **검증** 를 활성화하면 컨테이너가 READY로 표시되기 전에 초기화되었는지 확인할 수 있습니다.

{% hint style="success" %}
대부분의 게임은 포트용 UDP 포트 매핑 하나만 추가하면 됩니다. `7777`.
{% endhint %}

서버 프로세스의 내부 포트는 앱 버전의 일부로 정의되지만, **외부 포트는 배포가 생성될 때 무작위로 할당됩니다**그래서 잠재적인 악의적 행위자(해커)가 피해를 입히기 전에 속도가 늦춰지고 탐지될 수 있습니다.

<figure><img src="/files/4ba971ec5dc2edf09fe8eb3467658441fa65db04" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
서버가 여러 프로토콜로 통신한다면 포트 매핑에 포트를 더 추가하세요.
{% endhint %}

### 안전 가드레일

이 매개변수들은 다양한 엣지 케이스와 일반적인 서버 문제 해결에 도움이 됩니다:

* **시간 제약** - 이 기능들은 배포의 리소스 수명 주기를 관리하는 데 도움이 됩니다:
  * **게임 최대 지속 시간** 를 설정해 일정 시간이 지나면 서버를 정상 종료하거나, 다음으로 설정할 수 있습니다. `-1`  과 [앱 버전 API 생성/편집](/docs.edgegap.com-ko/docs/api/versioning.md#post-v1-app-app_name-version) 에 대해 [지속성](/docs.edgegap.com-ko/learn/orchestration/persistence.md) 과 [프라이빗 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md).
  * **배포 최대 시간** 는 시작이 너무 오래 걸리는 배포를 정리하는 데 도움이 됩니다.
* **프로세스 재시작 정책** - 서버 프로세스가 중지될 때 배포 동작을 제어합니다.
  * 항상 재시작(기본값) - 성공 종료 코드(0)와 모든 오류 종료 시 재시작합니다.
  * 재시작 안 함(권장) - 성공 및 오류 종료 코드 모두에서 배포가 중지됩니다.
  * 충돌 시 재시작 - 오류 종료 코드에서만 재시작하며, 지속형 서버에 유용합니다.

{% hint style="info" %}
무료 티어는 애플리케이션 2개, 버전 2개, 그리고 Container Registry 저장소 5GB로 제한됩니다.
{% endhint %}

### 로그 저장

배포가 중지된 후 서버 로그를 내보내려면 다음을 구성하세요. [엔드포인트 저장소](/docs.edgegap.com-ko/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 %}
