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


---

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