# 배포

배포와 그 수명 주기에 대해 알아보세요 - 더 깊이 이해하기 위한 개념과 모범 사례.

## 🗺️ 오케스트레이션

클라우드 네이티브 엣지 컴퓨팅 접근 방식을 통해 용량 수요를 충족하기 위해 몇 초 만에 새 서버를 시작하세요. 우리는 서버를 [반려동물보다는 가축처럼](https://cloudscaling.com/blog/cloud-computing/the-history-of-pets-vs-cattle/) - 각 인스턴스를 일일이 수동으로 돌보는 대신 고장 난 인스턴스를 완전히 교체합니다.

{% hint style="info" %}
선택한 오케스트레이션 방식은 **귀하의 DevOps 비용, 서버 비용, 확장성에 영향을 미칩니다**.
{% endhint %}

{% hint style="success" %}
[Discord에서 문의하세요](https://discord.gg/MmJf8fWjnt) 하이브리드 오케스트레이션 옵션과 호스팅 비용 최적화에 대해 알아보세요.
{% endhint %}

모든 장단점을 완전히 이해하기 위해 다양한 오케스트레이션 방법을 비교해 보겠습니다.

### 매치-바운드

현대적인 스튜디오를 위한 황금 표준으로, **가장 쉬운 통합과 최고의 비용 효율성**.

👍 **장점**

* 최고의 비용 효율성 - 플레이어 수요에 맞춰 분 단위로 실시간 확장.
* 지역 제약 없는 호스팅 덕분에 DevOps 비용이 가장 낮으며, Edgegap이 작업의 99%를 자동화합니다.
* Edgegap의 퍼블릭 클라우드 인프라에 615개 이상의 사이트가 있어 핑이 가장 낮습니다.
* 예상치 못한 트래픽 급증 시 가장 빠른 확장 속도(버스트 가능성).
* 가장 높은 수준의 보안과 플레이어 치팅 방지(서버 권한).
* 예상치 못한 서버 충돌이 플레이어에게 미치는 영향이 최소화되며, 단일 매치에만 영향을 줍니다.

👎 **단점**

* 새로운 오케스트레이션 사고방식을 채택하려면 초기에는 어느 정도의 적응 시간이 필요합니다.
* 24시간보다 더 오래 실행되는 서버는 자동으로 종료됩니다.

🧩 **가장 적합한 경우**

* 지연 시간에 민감한 게임 - **넷코드 최적화로 높은 핑을 극복할 수 없을 때:**
  * 1인칭 슈팅, 격투 게임, VR 및 XR(가상 및 확장 현실), …
* 설계상 **매치 지속 시간에 상한이 있는 게임**,
  * 배틀로얄, PvPvE[^1], 협동 슈팅, MOBA, 스포츠 게임, ARPG 및 던전 크롤러, …

🔎 **발견 가능성**

* 충분한 플레이어가 참여하면 새 게임 시작 [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention").
  * 플레이어를 [백필로 기존 매치의 이탈자를 대체](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#backfill).
* 플레이어가 서버를 탐색하고 목록에서 선택할 수 있도록 [server-browser](https://docs.edgegap.com/docs.edgegap.com-ko/learn/server-browser "mention").
* [서버를 검색하기 위한 자체 또는 타사 게임 백엔드 구현](https://docs.edgegap.com/docs.edgegap.com-ko/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="info" %}
Edgegap은 각 지역의 플레이어 활동을 기준으로 615개 이상의 모든 서버 위치를 자동으로 확장/축소합니다. 성공을 준비하세요 - 매끄럽게 [60분 안에 동시 사용자 1,400만 명으로 확장](https://edgegap.com/resources/performance-benchmark).
{% endhint %}

### 지역 대기

전통적인 모델로 **사용자 생성 콘텐츠와 소셜 MMO 게임이 있는 지속 세계**.

👍 **장점**

* 익숙하고 이해하기 쉬운, 전투에 지친 베테랑들을 위한 구식 접근 방식.
* 가장 높은 수준의 보안과 플레이어 치팅 방지(서버 권한).
* 월별 약정에 기반해 쉽게 예측 가능한 비용.

👎 **단점**

* 호스팅 비용 증가 - 각 지역마다 하나 이상의 유휴 대기 서버(버스트 용량)가 필요합니다.
* DevOps 비용 증가 - 지역별로 확장, 운영, 유지보수가 중복됩니다.
* 플레이어 기반이 작은 지역은 멀리 있는 서버에 접속하므로 높은 핑을 경험합니다.

🧩 **가장 적합한 경우**

* 플레이어가 오프라인일 때도 서버에 저장되는 사용자 생성 콘텐츠가 있는 지속 세계.
  * MMO, 기지 건설 또는 오브젝트 배치가 있는 샌드박스, 익스트랙션 슈터, ...
* 지연 시간에 관대한 게임 - **서버 권한의 실시간 물리 연산이 필요하지 않을 때**:
  * 모바일 게임, 협동 게임, TCG/CCG, 턴제 전략, …
* 비동기 멀티플레이어, **서버 충돌이 플레이어 경험에 미치는 영향이 최소화되는 경우:**
  * 유령과 경쟁하기, 적 기지 약탈, 타이머 기반 건설/농사 게임, …
* 초기화 과정이 무거운 애플리케이션 - 서버 준비에 몇 분이 걸릴 때.

🔎 **발견 가능성**

* 플레이어가 서버를 탐색하고 목록에서 선택할 수 있도록 [server-browser](https://docs.edgegap.com/docs.edgegap.com-ko/learn/server-browser "mention").
* [서버를 검색하기 위한 자체 또는 타사 게임 백엔드 구현](https://docs.edgegap.com/docs.edgegap.com-ko/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="info" %}
참조 [managed-clusters](https://docs.edgegap.com/docs.edgegap.com-ko/learn/advanced-features/managed-clusters "mention") 용 **마이크로서비스와 백엔드 서비스를 자체 호스팅하는** Edgegap에서.
{% endhint %}

### 피어 투 피어

개발 노력을 ~~전용 서버~~ 에서 **경쟁이 아닌 게임을 위한 릴레이 넷코드로**.

관련 주제: 리슨 서버, 플레이어 호스트 권한, NAT 펀치스루.

👍 **장점**

* 가장 낮은 호스팅 비용, NAT 펀치스루 해결을 위한 릴레이 서버만 필요.
* 가장 낮은 DevOps 비용 - 클라이언트 빌드와 배포 채널에 대해서만 유지보수가 필요합니다.
* 예상치 못한 서버 충돌이 플레이어에게 미치는 영향이 최소화되며, 단일 매치에만 영향을 줍니다.
* 구현이 쉽고, 백엔드 개발 없이도 프로토타입까지의 시간이 빠릅니다.

👎 **단점**

* 동시 프로그래밍 기술이 필요하여 피어 투 피어 넷코드 개발 노력이 증가합니다.
* 가장 나쁜 핑 시간과 불리한 네트워크 조건(예: 모바일 인터넷)에 가장 민감함.
* 가장 약한 보안, 중간자 공격과 세션 하이재킹에 취약함.
* 사용자 지정 호스트 이전을 구현하지 않으면 호스트가 나갈 때 세션이 종료될 위험이 있습니다.

🧩 **가장 적합한 경우**

* 협동 및 캐주얼 게임 - **치팅이 재미를 해치거나 게임을 망치지 않을 때**,
  * 어린이 게임, 탐험 게임, 어드벤처, …

🔎 **발견 가능성**

* [서버를 검색하기 위한 자체 또는 타사 게임 백엔드 구현](https://docs.edgegap.com/docs.edgegap.com-ko/advanced-features/managed-clusters#nakama-by-heroic-labs).

{% hint style="success" %}
다음을 참조하세요 [분산 릴레이](https://docs.edgegap.com/docs/distributed-relay-manager) 최고 수준의 지연 시간과 보안을 제공하며 피어 투 피어를 가능하게 하는 서비스입니다.
{% endhint %}

## 📍 서버 배치

어떤 오케스트레이션 방법을 선택하든, 플레이어 그룹에 적합한 서버 위치를 고르는 것은 가능한 최상의 핑과 최적의 플레이어 경험을 보장하는 데 중요합니다. 서버 배치 전략과 그것이 플레이어에게 미치는 영향에 대해 알아보세요.

{% hint style="info" %}
귀하의 서버 배치 전략은 **플레이어 경험, 유지율, 그리고 게임 리뷰에 영향을 미칩니다**.
{% endhint %}

{% hint style="success" %}
**Edgegap은** [**최상의 위치에**](#server-score) **가용 용량이 있는 곳에**신속하고 낮은 지연 시간의 매치를 위해 배포합니다.
{% endhint %}

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FjiPRa6gGEku2oGm3qW5s%2Fimage.png?alt=media&#x26;token=306897d4-8ab1-4766-bc90-5d02882b573c" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
참조 [#deployment-balance-points](#deployment-balance-points "mention") 에서 **서버 배치를 실시간으로 분석**대규모로.
{% endhint %}

### 서버 점수

서버 점수 전략은 Edgegap의 특허 방법론을 사용하며, 이는 **각 매치마다 서버 배치를 개별적으로 최적화합니다**. 비침습적 텔레메트리를 수행하여 각 플레이어의 네트워크 상 근접성을 서버 위치에 근사하고 다음을 가장 잘 제공하는 서버를 선택합니다:

* **응답성** - 모든 플레이어에게 평균적으로 가장 낮은 핑을 제공합니다,
* **공정성** - 모든 플레이어에게 균형 잡히고 공정한 핑을 제공합니다.

{% hint style="success" %}
우리의 [매치메이커](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking) 는 **가장 좋은 가능한 경험을 보장하기 위해 기본적으로 서버 점수 전략을 사용합니다**. 이 전략을 [배포 API와 함께 사용하려면](https://docs.edgegap.com/api/#tag/Deployments), 배포 요청에 플레이어의 공인 IP 또는 지리 좌표를 입력하세요.
{% endhint %}

**응답성 낮은 배치** - 서버가 너무 멀리 있어 모든 플레이어의 핑이 높음:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FNszxk3uRY78L7V6nLPlp%2Fimage.png?alt=media&#x26;token=904b9b3d-7499-45d3-81c6-cc2b5cb6dd32" alt=""><figcaption></figcaption></figure>

**불공정한 배치** - 핑이 고르지 않아 한 플레이어가 불리함:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FxjsD6ijYWHljBAVuV57w%2Fimage.png?alt=media&#x26;token=ab477e89-4afe-4203-9b7f-b85b035dc9eb" alt=""><figcaption></figcaption></figure>

**좋은 배치 예시** - 모든 플레이어에게 응답성 높고 공정한 핑:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FQfSd4uo9twyxEWCkPLqu%2Fimage.png?alt=media&#x26;token=8d3cd64b-9527-48fe-886b-96393c15449d" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
이 전략은 **서로 멀리 떨어진 플레이어 그룹을 호스팅할 때 특히 효과적입니다** (북미 대 유럽, 또는 서해안 대 동해안), 사전 구성된 로비에서 자주 발생합니다.
{% endhint %}

### 지리 위치

대안으로, **자동 텔레메트리를 활용하는 대신 플레이어의 위도 및 경도 좌표 또는 선호 서버 위치의 좌표를 제공하세요** . 이 접근 방식은 추가적인 클라이언트 측 지리 조회 구현이 필요하며, 게임 개발자의 솔루션에 전적으로 의존합니다.

{% hint style="warning" %}
지리 위치 전략은 [#match-bound](#match-bound "mention") 오케스트레이션에는 권장되지 않으며, 지역 간 데이터 전송에 대한 엄격한 규제 요구사항이 있는 애플리케이션이나 플레이어 IP를 사용할 수 없는 경우에만 예외입니다.
{% endhint %}

{% hint style="success" %}
이 전략을 [배포 API와 함께 사용하려면](https://docs.edgegap.com/api/#tag/Deployments)와 함께 사용하려면, 배포 요청에 플레이어의 공인 IP 또는 지리 좌표를 나열하세요.
{% endhint %}

### 지역 잠금

서버는 대략적으로 일반화된 지역 매개변수를 사용해 다음과 같이 배치될 수 있습니다:

* 플레이어의 메타데이터(플레이어 계정 데이터베이스)를 기반으로 자동 선택되거나,
* 매치메이킹 중 플레이어가 선택하여 높은 클라이언트-서버 지연 시간의 배치를 허용하는 경우.

{% hint style="danger" %}
**이 전략만 사용하는 것은 네트워크 성능 저하를 초래할 수 있으므로 권장되지 않습니다.**
{% endhint %}

{% hint style="success" %}
다음을 사용 **하여 지역 선택을 사전 필터로 사용하고 다른 전략과 결합하는 것** 이 더 나은 대안입니다.
{% endhint %}

## 🟢 연결 품질

일부 게임(그리고 일부 플레이어)은 다른 게임보다 지연 시간이나 랙에 더 민감합니다. 플레이어 보고서는 대규모에서 발생한 사고나 회귀 버그의 훌륭한 지표이지만, **플레이어는 네트워킹 개념에 대한 깊은 이해가 부족할 수 있으며** 문제를 스튜디오, 넷코드 또는 서버 탓으로 빠르게 돌리곤 합니다.

일부 문제의 근본 원인은 플레이어에게 숨겨져 있을 수 있으므로, 스튜디오와 호스팅 제공업체의 협력이 매우 중요할 수 있습니다. **Edgegap의 우선순위는 항상 최고의 서비스를 제공하는 것입니다.**

많은 플레이어 보고서를 받고 있거나, 광범위한 장애 또는 반복적인 문제가 발생하고 있다면, 플랫폼의 지원 티켓을 통해 즉시 문의해 주세요.

#### 낮은 지연 시간

플레이어 지연 시간은 다음 간 데이터 전송에서 발생하는 지연 시간의 조합입니다:

* **물리적 장치 -** 물리적 신호가 가로질러 이동하는 [인터넷 네트워킹 토폴로지](https://en.wikipedia.org/wiki/Internet#Routing),
* **호스트 간** - 프로토콜, 전송, 보안 조치로 인해 발생하며,
* **프로세스 간** - 클라이언트/서버에서의 데이터 (언)패킹 및 처리로 인해 발생합니다.

Edgegap은 서버를 플레이어에 더 가깝게 배치하여 더 짧은 응답 시간과 더 적은 네트워크 홉으로 물리적 지연 시간을 줄입니다. 17개 클라우드 및 베어메탈 제공업체 전반의 위치를 통해, **전 세계 어디서나 플레이어를 위한 최고 수준의 핑**.

전 세계의 서버 및 인터넷 커버리지는(Edgegap뿐 아니라) 다음과 같은 요인으로 인해 제한됩니다:

* **인프라 가용성** - 특정 지역의 인터넷 연결 품질이 충분하지 않을 수 있으며,
* **자연적 요인** - 매우 복잡한 서버 랙은 대부분 안정적인 환경이 필요합니다.

#### 고가용성

전 세계 여러 위치의 서버 가용성은 시간이 지남에 따라 달라지며 하루 동안 여러 번 변합니다. Edgegap은 자동으로 **확장/축소** 위치들을 **수요에 따라**, 다음을 고려합니다:

* **버스트 트래픽** - 15분 기간 내에 이루어진 배포,
* **vCPU 요구사항** - 배포당 vCPU가 많을수록 특정 위치에 대한 전체 수요가 증가합니다,
* **제공업체 제공 사항** - 일부 원격 위치는 사용 가능한 제공업체 옵션이 더 적습니다,
* **머신 가용성** - 일부 위치는 4 vCPU 또는 8 vCPU 머신만 제공할 수 있습니다,
* **스튜디오 요청** 테스트, 품질 보증, 얼리 액세스, 클로즈드 베타 또는 토너먼트용.

모든 애플리케이션의 배포 요청을 결합하여 위치 수요를 평가합니다. 모든 조직은 기본적으로 동일한 할당 우선순위를 가지며, **특정 하드웨어나 위치를 필요로 하는 엔터프라이즈 고객을 위해 프라이빗 서버 풀을 추가할 수 있는 가능성**.

{% hint style="success" %}
부디 **출시 계획을 위해 저희에게 연락해 주세요**, 또는 위치 가용성에 관한 요청이 있다면 문의해 주세요.
{% endhint %}

#### 플레이어 문제 해결

플레이어 문제는 서버 버그나 제공업체 사고에서 비롯될 수 있지만, 로컬 ISP, 게임 서비스, 저수준 라이브러리의 버그, 인프라 제공업체 또는 기타 원인과 같은 제3자에게서도 발생할 수 있습니다.

플레이어 보고서나 사고를 트러블슈팅할 때 다음 요소를 고려하세요:

* **매치메이킹 품질** - 최상의 결과를 얻으려면 플레이어들이 서로 가까워야 합니다(같은 지역): [#server-placement](#server-placement "mention") 가 가장 좋은 결과를 내도록:
  * 참조 [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention") 및 [ping-beacons](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/ping-beacons "mention") 를 통해 권장 사항을 확인하세요,
  * 참조 [#player-tracing](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#player-tracing "mention") 플레이어 보고서와 관련된 서버 로그를 찾는 방법을 알아보려면
* **지역적 문제:**
  * 지역화된 인터넷 서비스 제공업체(ISP)가 일시적으로 사고를 해결 중일 수 있습니다,
  * 일부 지역(예: 중국, 러시아)은 지역별 제재로 인해 제한될 수 있습니다,
* **캐싱 수준** - Edgegap은 캐시된 위치에서 빠른 배포를 우선시합니다:
  * [캐싱을 활성화하여 서버를 몇 초 내에 배포하세요](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#other-parameters-optional),
* **최대 배포 시간** - 느리고 무거운 초기화 과정으로 인해 배포가 실패할 수 있습니다:
  * 참조 [#safety-guardrails](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#safety-guardrails "mention") 시간 초과 기간을 늘리려면,
  * 정말 필요한 때까지 초기화 단계를 지연하세요,
* **서버 이미지 또는 통합 문제**.

{% hint style="success" %}
**클라이언트 매치 기록 UI에 배포 ID를 표시하세요** 문제 해결 시 플레이어 보고서를 추적하기 위해.
{% endhint %}

{% hint style="info" %}
광범위한 버그, 일시적인 문제, 장애에 대해 사용자에게 알려 부정적인 여론을 완화하세요.
{% endhint %}

## 🔄 배포 수명 주기

Edgegap 배포는 배포 상태로 표시되는 여러 수명 주기 단계를 거칩니다.

#### 1. 배포 시작

배포는 **테스트 목적으로** 다음으로 시작할 수 있습니다:

* [unreal-engine](https://docs.edgegap.com/docs.edgegap.com-ko/unreal-engine "mention") - Unreal Engine 프로젝트용 Docker 확장 또는 플러그인,
* [unity](https://docs.edgegap.com/docs.edgegap.com-ko/unity "mention") - Unity 프로젝트용 플러그인,
* [대시보드 웹 UI](https://app.edgegap.com/deployment-management/deployments/list) - 서버 통합 테스트를 위한 사용하기 쉬운 웹 인터페이스.

배포는 **실제 운영 환경** 은 다음으로 시작해야 합니다:

* [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention") - 다른 플레이어를 찾아 필요 시 서버 시작([#match-bound](#match-bound "mention")).
* [server-browser](https://docs.edgegap.com/docs.edgegap.com-ko/learn/server-browser "mention") - 긴 초기화가 필요한 서버 사전 예열([#regional-standby](#regional-standby "mention")).
* [배포 API](https://docs.edgegap.com/api/#tag/Deployments/operation/deploy) - 서버 간 맞춤 통합(커스텀 스케일링).

{% hint style="success" %}
**저장** `request_id`  **(배포 ID) 및 배포에 태그 지정** 하여 나중에 문제를 식별하고 해결합니다.
{% endhint %}

{% hint style="info" %}
다음을 사용해 테스트할 때 [배포 API](https://docs.edgegap.com/api/#tag/Deployments/operation/deploy), 기본 Dockerfile을 재정의할 수 있습니다 `CMD` 를 사용자 지정 명령으로.
{% endhint %}

#### 2. 배포 중

배포가 시작되면, 우리 시스템은 빠르게 여러 단계를 연속해서 수행합니다:

* 텔레메트리 - 사용 가능한 데이터 센터에서 각 플레이어까지의 네트워크 응답성을 측정합니다,
* 배포 - 용량을 예약하고 서버 컨테이너를 시작할 준비를 합니다,
* 컨테이너 부팅 - 컨테이너를 시작하고, 종속성을 설치하고, 초기화합니다,
* 후처리 - 로그 저장, 모니터링을 추가하고 배포를 마무리합니다.

{% hint style="warning" %}
**요청 과다 429** - 안정성을 보장하고 예상치 못한 청구서를 방지하기 위해, 조직당 제한 속도는 **40 req/s**. [문의하기](mailto:info@edgegap.com) 출시를 계획하고, 론칭 트래픽을 추정하며, 성공을 준비하세요.
{% endhint %}

#### 3. 배포 준비 완료

컨테이너가 완전히 초기화되었고 서버가 지금 시작 중입니다. 몇 초에서 1분 동안 서버는 여전히 초기화 중일 수 있으며, 게임 엔진(또는 사용자 지정 런타임)이 플레이어 연결을 받을 준비가 완전히 될 때까지 플레이어 요청에 응답하지 않을 수 있습니다.

{% hint style="success" %}
배포가 Ready 상태가 되면, **플레이어 연결을 성공할 때까지 재시도하세요**또는 미리 정의된 클라이언트 타임아웃까지.
{% endhint %}

#### 4. 배포 오류

예상치 못한 이유로 배포가 언제든지 Error 상태가 될 수 있습니다. 이는 통합을 테스트하거나 새 서버 빌드를 테스트할 때 더 자주 발생합니다.

**Error 상태의 배포에는 요금이 청구되지 않으며, 24시간 후 자동으로 중지됩니다.**

문제 해결 단계:

* 다음을 통해 Edgegap 서비스 상태를 확인하세요 [가동 시간 모니터링 페이지](https://status.edgegap.com/).
* Edgegap 문제를 배제하기 위해 Docker Desktop을 사용하여 서버 컨테이너를 로컬에서 테스트해 보세요.

{% hint style="success" %}
**도움을 요청할 때는** **배포 ID와 유용한 세부 정보를 포함하세요** 그래야 신속하게 조사할 수 있습니다!
{% endhint %}

#### 5. 배포 중지됨

**당사는 귀하의 지시 없이 절대 서버를 중지하지 않습니다**- 플레이어 경험에 부정적인 영향을 주지 않기 위해서입니다. 다음 이유로 배포가 중지될 수 있습니다:

* **자체 중지 via** [**DELETE\_URL**](#injected-environment-variables) - 플레이어가 떠나고 매치가 종료된 후 배포가 스스로 중지됨,
  * 참조 [Unreal Engine](https://docs.edgegap.com/docs.edgegap.com-ko/unreal-engine#stop-deployments) 및 [Unity](https://docs.edgegap.com/docs.edgegap.com-ko/unity#stop-deployments) 배포를 올바르게 중지하는 가이드,
* **백엔드에서 중지** - 백엔드가 [배포 API를 사용하여 이 배포를 중지함](https://docs.edgegap.com/api/#tag/Deployments/operation/deployment-delete),
* **게임 최대 지속 시간** - 귀하의 [#safety-guardrails](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#safety-guardrails "mention") 에 할당된 시간이 만료됨,
* [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention") 배포를 실행하던 호스트가 예약된 작업을 통해 삭제되었습니다.

{% hint style="info" %}
배포가 중지되면, **우리는 우아한 종료를 트리거합니다** 다음을 보내서 `SIGTERM` 신호를 주 프로세스에 보내 짧은 종료 시간을 허용합니다. 시간이 지나면 `SIGKILL` 신호가 전송되어 배포를 중지합니다.
{% endhint %}

## 👀 관측 가능성

게임 서버가 제3자와 상호 운용하고 운영 인사이트를 얻을 수 있도록 합니다.

### 발견 가능성

Ready 상태가 되면 배포에 URL([fqdn](https://en.wikipedia.org/wiki/Fully_qualified_domain_name))와 각 내부 포트에 대한 외부 포트가 할당됩니다.

{% hint style="success" %}
사용 **배포 태그(최대 40자)로 배포를 쉽게 표시하세요** 및 [#filter-deployments](#filter-deployments "mention").
{% endhint %}

{% hint style="info" %}
**게임 서버의 아웃바운드 트래픽(클라이언트 또는 백엔드로 향하는)은 절대 차단되지** 않거나 필터링되지 않습니다.
{% endhint %}

#### **웹소켓(WS) 및 보안 웹소켓(WSS)**

Edgegap과 웹소켓 기반 넷코드를 사용하려면 두 가지 옵션이 있습니다:

* **관리형 인증서**, 코드를 작성하지 않고 1분 만에 설정:
  * 구성하세요 [application-and-versions](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions "mention") 에서 **웹소켓(WS)을 사용하고 TLS 업그레이드를 활성화하세요,**
  * 클라이언트를 연결하기 위해 Edgegap URL을 사용하세요(예: `https://5fa53fa00a57.pr.edgegap.net/`)
* **자가 관리 인증서**, 자체 사용자 지정 도메인을 사용하려는 경우:
  * 구성하세요 [application-and-versions](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions "mention") 에서 **보안 웹소켓(WSS) 사용**,
  * 사용자 지정 DNS 레코드로 자체 TLS 인증서 흐름을 구성하세요(예: [Cloudflare](https://www.cloudflare.com/application-services/products/ssl/)).

{% hint style="danger" %}
포착되지 않은 서버 예외가 발생하면 배포의 컨테이너가 재시작되고 TLS 보안이 무효화됩니다. 이 경우, [서버를 중지하고](#id-5.-deployment-stopped) 및 [플레이어를 새 배포로 재매치하세요](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking#custom-lobby). [서버 상태가 손실될 수 있습니다](https://docs.edgegap.com/docs.edgegap.com-ko/learn/persistence#state-management).
{% endhint %}

### 주입된 변수 <a href="#injected-environment-variables" id="injected-environment-variables"></a>

게임 서버는 종종 서버 IP, 내부 포트 값 등 추가 정보가 필요합니다. 읽기 전용 환경 변수를 주입하는 것은 매개변수를 전달하는 신뢰할 수 있고 클라우드에 구애받지 않는 방법입니다.

{% hint style="success" %}
다음을 사용해 변수 값을 가져오세요 [C#의 GetEnvironmentVariable](https://learn.microsoft.com/en-us/dotnet/api/system.environment.getenvironmentvariable?view=net-8.0) 또는 [C++의 GetEnvironmentVariable](https://dev.epicgames.com/documentation/en-us/unreal-engine/API/Runtime/Core/GenericPlatform/FGenericPlatformMisc/GetEnvironmentVariable).
{% endhint %}

{% hint style="info" %}
참조 [앱 버전 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#injected-variables) 및 [매치메이커 변수](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#injected-variables) 아래의 배포 변수 외에도.
{% endhint %}

#### **사용자 지정 변수**

각 배포에 대해 최대 20개의 사용자 지정 변수를 정의할 수 있으며, 각 변수는 최대 4KB의 문자열 데이터를 포함할 수 있습니다.

{% hint style="warning" %}
**예약된 이름(아래)을 사용하지 마세요. 그렇지 않으면 사용자 지정 변수가 덮어써집니다!**
{% endhint %}

Edgegap이 서버에 주입한 변수를 읽어 중요한 정보에 접근하세요:

#### **식별자**

* **`ARBITRIUM_REQUEST_ID`**  - 예: `f68e011bfb01` .
  * 고유한 배포 ID로, 요청 ID라고도 합니다. 더 많은 정보를 가져오는 데 사용됩니다.
  * 배포 URL은 항상 다음 형식을 가집니다 `{ARBITRIUM_REQUEST_ID}.pr.edgegap.net`.
* **`ARBITRIUM_PUBLIC_IP`**  - 예: `162.254.141.66` .
  * 이 호스트의 공인 IP 주소로, URL 대신 연결하는 데 사용할 수 있습니다.
* **`ARBITRIUM_HOST_ID`**  - 예: `alpha-north-america-70364ef8` .
  * 배포를 호스팅하는 머신의 고유 식별자이며, 다른 배포와 공유됩니다.
* **`ARBITRIUM_DEPLOYMENT_TAGS`**  - 예: `tag1,tag2` .
  * 쉼표로 구분된 사용자 정의 배포 태그, [손쉬운 검색 및 필터링에 유용함](#filter-deployments).
* **`ARBITRIUM_PRIVATE_FLEET_ID`** - 예: `PUBLIC_CLOUD` , 또는 다음에서 호스팅되는 경우의 플릿 ID [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention").

#### 리소스 사양

* **`ARBITRIUM_HOST_IN_PRIVATE_FLEET`** - 예: `false` , 다음에서 호스팅되는지 여부를 나타냄 [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention").
* **`ARBITRIUM_HOST_BASE_CLOCK_FREQUENCY`**  - 예: `2000` , 프로세서 주파수(MHz).
* **`ARBITRIUM_DEPLOYMENT_VCPU_UNITS`**  - 예: `256`, 할당된 vCPU 단위(1024 = 1 vCPU).
* **`ARBITRIUM_DEPLOYMENT_MEMORY_MB`**  - 예: `512`, 할당된 RAM(MB 단위, 1024 = 1 GB).

#### **수명 주기 관리**

* **`ARBITRIUM_DELETE_URL`**  - 예: `https://api.edgegap.com/v1/self/stop/9f511e17/660`.
  * 배포에서 호출 가능하며, [배포는 우아하게 중지됩니다](#id-5.-deployment-stopped).
  * 고유한 일회성 `ARBITRIUM_DELETE_TOKEN` 의 `Authorization` 헤더.
* **`ARBITRIUM_DELETE_TOKEN`**  - 예: `7df4cd933df87084b34ae80d8abde293`.
* **`ARBITRIUM_CONTEXT_URL`**  - 예: `https://api.edgegap.com/v1/context/9170f5211e17/17`.
  * 배포에서만 호출 가능하며, 더 많은 배포 세부 정보를 반환합니다.
  * 고유한 `ARBITRIUM_CONTEXT_TOKEN` 의 `Authorization` 헤더.
* **`ARBITRIUM_CONTEXT_TOKEN`**  - 예: `dfaf50b9333b9ee07b22ed247e4a17e6`.

#### **발견 가능성**

* **`ARBITRIUM_PORT_GAMEPORT_INTERNAL`**  - 예: `7777` , 서버 리스너용 내부 포트.
* **`ARBITRIUM_PORT_GAMEPORT_EXTERNAL`**  - 예: `31504` , 클라이언트 연결용 외부 포트.
  * 외부 포트 값은 보안상의 이유로 각 배포마다 무작위로 지정됩니다.
* **`ARBITRIUM_PORT_GAMEPORT_PROTOCOL`**  - 예: `UDP` , 넷코드 전송의 프로토콜.

{% hint style="success" %}
예시에서는 포트 이름을 `gameport` (기본값)으로 지정했다고 가정합니다. **각 포트는 추가로 정제된** [#port-mapping](https://docs.edgegap.com/docs.edgegap.com-ko/learn/application-and-versions#port-mapping "mention") **변수 집합을 추가합니다:** `@Super Port!` ⇒ `ARBITRIUM_PORT_SUPER_PORT_INTERNAL` .
{% endhint %}

* **`ARBITRIUM_BEACON_ENABLED`**  - 예: `true`다음에 배포하는 경우 [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention") 와 함께 [ping-beacons](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/ping-beacons "mention").
* **`ARBITRIUM_HOST_BEACON_PUBLIC_IP`**  - 예: `139.177.198.69` , 가장 가까운 비콘의 공인 IP.
* **`ARBITRIUM_HOST_BEACON_PORT_UDP_EXTERNAL`**  - 예: `30199`, UDP를 통한 핑 측정용.
* **`ARBITRIUM_HOST_BEACON_PORT_TCP_EXTERNAL`**  - 예: `30456`, TCP를 통한 핑 측정용.

#### **구조화된 정보(문자열 형태의 JSON)**

{% hint style="info" %}
환경 변수는 **문자열화된 JSON으로 저장됩니다**, SDK 또는 사용자 지정 방법으로 파싱하세요.
{% endhint %}

<details>

<summary><strong>ARBITRIUM_DEPLOYMENT_LOCATION</strong>:<br>- 배포 위치에 대한 상세 정보.</summary>

```json
ARBITRIUM_DEPLOYMENT_LOCATION="{
  "city": "몬트리올",
  "country": "캐나다",
  "continent": "북아메리카",
  "administrative_division": "퀘벡",
  "timezone": "동부 시간",
  "latitude": 45.513707,
  "longitude": -73.619073
}"
```

</details>

<details>

<summary><strong>ARBITRIUM_PORTS_MAPPING</strong>:<br>- 내부 및 외부 포트에 대한 자세한 정보.</summary>

```json
ARBITRIUM_PORTS_MAPPING="{
  "ports": {
    "gameport": {
      "name": "Game Port",
      "internal": 7777,
      "external": 31504,
      "protocol": "UDP"
    },
    "webport": {
      "name": "Web Port",
      "internal": 8888,
      "external": 31553,
      "protocol": "TCP"
    }
  }
}"
```

</details>

### 대시보드 모니터링

우리의 [대시보드](https://app.edgegap.com/) 서버 확장성을 모니터링하고 운영을 지원하는 유틸리티를 제공합니다.

#### 분석

{% hint style="success" %}
찾기 [사이드바 메뉴에서 분석 대시보드를](https://app.edgegap.com/analytics/dashboards/list) Server Hosting & Orchestration 카테고리 아래에서 찾으세요.
{% endhint %}

:star2: [**종량제 요금제로 업그레이드하여**](https://app.edgegap.com/user-settings?tab=memberships) **자세한 서버 성능 지표와 인사이트를 잠금 해제하세요:**

* **일반 인사이트:** 버전별 실시간 서버 수 + 리소스 사용량 개요로 릴리스를 모니터링,
* **CPU 인사이트**: 프로세서 집약적인 작업으로 인해 지연이 발생하는 서버를 문제 해결,
* **메모리 인사이트**: 할당된 메모리 초과로 인한 서버 재시작을 완화,
* **네트워킹 인사이트:** 비효율적인 네트워킹 패턴을 감지하고 넷코드를 최적화합니다.

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FLxDp1yFvkj5kB6AC4xVb%2Fimage.png?alt=media&#x26;token=c0eff5f1-a374-41e0-a49a-9b3ecf0bfd1b" alt=""><figcaption></figcaption></figure>

#### 배포 맵

{% hint style="success" %}
배포 맵은 [대시보드의 배포 세부 정보 페이지에서 찾을 수 있습니다](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

맵에서 배포 위치, 사용 가능한 위치, 예상 플레이어 위치를 미리 확인하세요:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FM4h0itPU5ntPaV5N5ZlW%2Fimage.png?alt=media&#x26;token=98028901-9a40-4a2d-969e-db5f990e334f" alt=""><figcaption></figcaption></figure>

#### 배포 균형 포인트

{% hint style="success" %}
배포 균형 포인트 히트맵은 [대시보드의 애플리케이션 세부 정보 페이지에서 찾을 수 있습니다](https://app.edgegap.com/application-management/applications/list).
{% endhint %}

배포 균형 포인트 히트맵을 미리 보고 다음 기준으로 필터링하세요 [application-and-versions](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions "mention"). 균형 포인트는 특정 배포에서 각 플레이어와 네트워크적으로 동일한 거리에 있는 대략적인 위치입니다:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FfDpIQxoFUJZNE77LJIwZ%2Fimage.png?alt=media&#x26;token=94e730ad-3907-486b-8a06-0f469acd19ea" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
이상한 위치(예: 그린란드)에 있는 균형 포인트 핫스팟은 서로 멀리 떨어진 플레이어들의 매치메이킹을 나타냅니다. 최적화 방법을 알아보세요 [#connection-quality](#connection-quality "mention") 및 [ping-beacons](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/ping-beacons "mention") 매치메이킹을 최적화하기 위해.
{% endhint %}

#### 배포 로그

{% hint style="success" %}
배포 로그는 [대시보드의 배포 세부 정보 페이지에서 찾을 수 있습니다](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

배포 로그에는 다음에 대한 정보가 표시됩니다 [#deployment-lifecycle](#deployment-lifecycle "mention"):

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FfkyAYtylnOFmSp3yyiId%2Fimage.png?alt=media&#x26;token=6a4f6ac4-5780-46a7-bcdd-1d8829c4abd7" alt=""><figcaption></figcaption></figure>

#### 컨테이너 로그

{% hint style="success" %}
컨테이너 로그는 [대시보드의 배포 세부 정보 페이지에서 찾을 수 있습니다](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

문제가 발생하거나 디버깅할 때 게임 서버의 로그를 확인하세요:

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FTiaARmb6aAZfm0rjQmiT%2Fimage.png?alt=media&#x26;token=7eb49138-954d-44a1-a025-1f88ed855366" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**배포가 중지되면 컨테이너 로그는 삭제됩니다.** 설정하세요 [타사 S3 로그 저장소](https://docs.edgegap.com/docs.edgegap.com-ko/docs/endpoint-storage) 로그를 저장하기 위해.
{% endhint %}

#### 컨테이너 메트릭

{% hint style="success" %}
컨테이너 메트릭은 [대시보드의 배포 세부 정보 페이지에서 찾을 수 있습니다](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

다음을 위해 컨테이너 메트릭(프로세서, 메모리, 네트워킹)을 검토하세요:

* 다음과 같은 일반적인 연결 문제를 식별 [#troubleshooting](#troubleshooting "mention"),
* 리소스 사용량 급증을 유발하는 비효율적인 구현 패턴 감지,
* 특정 시나리오에서 비효율적인 리소스 사용량을 정확히 파악,
* 최적화 중 서버의 리소스 사용량 변화를 검증,
* 서버 초기화 시 리소스 소비와 지속 시간을 벤치마크.

히스토리 메트릭은 1분 간격의 평균 값을 표시하며, 무료 티어에서 이용할 수 있습니다.

:star2: [**종량제 요금제로 업그레이드하여**](https://app.edgegap.com/user-settings?tab=memberships) **정밀한 메트릭을 1초 간격으로 잠금 해제하려면.**

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FoIpCR3x9ibiXMEIWFgKG%2Fimage.png?alt=media&#x26;token=86dcd914-db9f-4e81-8444-6c83805be9b6" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
[문의하기](mailto:info@edgegap.com) 대규모 릴리스를 위한 라이브 호스팅 지원을 요청하려면 릴리스 전에.
{% endhint %}

### 컨텍스트 및 상태

추가 배포 정보는 JSON 형식으로 가져올 수 있습니다:

* 배포 내부(게임 서버)에서 다음을 사용하여 [배포 컨텍스트 API](https://docs.edgegap.com/api/#tag/Context/operation/context-get),
* 배포 외부(백엔드 / 타사)에서 다음을 사용하여 [배포 상태 API](https://docs.edgegap.com/api/#tag/Deployments/operation/deployment-status-get).

{% hint style="info" %}
컨텍스트 API(배포 내부)는 컨텍스트 API 토큰이 필요하며, 상태 API는 Edgegap 토큰을 사용합니다.
{% endhint %}

{% hint style="warning" %}
**요청 과다 429** - 우리는 귀하의 조직에 대해 다음 속도로 레이트 리밋을 적용합니다 **20 req/s** 컨텍스트 및 상태 API 엔드포인트에 대해. 다음을 사용하세요 [#injected-environment-variables](#injected-environment-variables "mention") 및 [웹훅](https://docs.edgegap.com/docs/deployment/arbitrium-deploy-webhook) 확장 가능한 솔루션을 위해.
{% endhint %}

### 배포 필터링

모든 배포를 빠르게 검색하려면 [대시보드를 사용하거나](https://app.edgegap.com/deployment-management/deployments/list):

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2F42IaKG0pFQXSkvPCRH1T%2Fimage.png?alt=media&#x26;token=6aba8781-13c9-4c0f-87e9-2d9612a57342" alt=""><figcaption></figcaption></figure>

[API로 배포를 나열하고](https://docs.edgegap.com/api/#tag/Deployments/operation/deployments-get) 백엔드 통합으로 필터를 적용할 수 있습니다:

<table><thead><tr><th width="237">배포 속성</th><th width="193">연산자</th><th>예시 값</th></tr></thead><tbody><tr><td><a href="#deployment-lifecycle"><code>status</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"ready"</code> 또는 <code>"error"</code></td></tr><tr><td><a href="#observability"><code>request_id</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a> </td><td><a data-footnote-ref href="#user-content-fn-4"><code>"7e709a0d8efd"</code></a></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><a data-footnote-ref href="#user-content-fn-4"><code>[ "7e709a0d8efd", "4ba353100b4b" ]</code></a></td></tr><tr><td><a href="#discoverability"><code>tags</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"tagA"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "tagA", "tagB" ]</code></td></tr><tr><td><a href="#id-1.-start-a-deployment"><code>created_at</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-7"><code>lte</code></a>  또는 <a data-footnote-ref href="#user-content-fn-8"><code>gte</code></a></td><td><a href="https://en.wikipedia.org/wiki/ISO_8601"><code>2025-05-12T20:03:20Z</code></a></td></tr><tr><td><a href="application-and-versions"><code>application</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"my-app"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "my-app", "my-other-app" ]</code></td></tr><tr><td><a href="application-and-versions"><code>version</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"1.0.0"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-9"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "1.0.0", "prod" ]</code></td></tr><tr><td><a href="private-fleets"><code>fleet_name</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"my-app-fleet-europe"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "fleet-eu", "fleet-us" ]</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-10"><code>ilike</code></a></td><td><code>"%-eu%"</code></td></tr><tr><td><a href="private-fleets"><code>host_name</code></a></td><td><a data-footnote-ref href="#user-content-fn-2"><code>eq</code></a>  또는 <a data-footnote-ref href="#user-content-fn-3"><code>neq</code></a></td><td><code>"alpha-north-america-95fab093"</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-5"><code>의</code></a>  또는 <a data-footnote-ref href="#user-content-fn-6"><code>nin</code></a></td><td><code>[ "alpha-north-america-95fab093" ]</code></td></tr><tr><td></td><td><a data-footnote-ref href="#user-content-fn-10"><code>ilike</code></a></td><td><code>"%north-america%"</code></td></tr></tbody></table>

{% hint style="info" %}
각 속성은 단일 요청에서 최대 1개의 필터 연산자만 가질 수 있습니다. 자세한 내용은 [api](https://docs.edgegap.com/docs.edgegap.com-ko/docs/api "mention") 를 참조하세요.
{% endhint %}

요청에 나타나는 순서대로 여러 필드로 결과를 정렬합니다:

| 배포 속성                                                                                    | 순서                                                                      |
| ---------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [`created_at`](#id-1.-start-a-deployment)                                                | [`asc`](#user-content-fn-11)[^11] 또는 [`desc`](#user-content-fn-12)[^12] |
| [`available_session_sockets`](https://docs.edgegap.com/docs.edgegap.com-ko/docs/session) | [`asc`](#user-content-fn-13)[^13] 또는 [`desc`](#user-content-fn-14)[^14] |

예시 필터 쿼리:

<details>

<summary>나열 <a href="#id-4.-deployment-error">오류 상태의 배포</a> 문제 해결 및 제거를 위해.</summary>

인코딩된 URL:

```
https://api.edgegap.com/v1/deployments?query={"filters":[{"field":"status","operator":"eq","value":"error"},{"field":"application","operator":"eq","value":"my-app"},{"field":"version","operator":"eq","value":"green"}],"order_by":[{"field":"created_at","order":"desc"}]}
```

형식화된 JSON 쿼리:

```json
{
  "filters": [
    {
      "field": "status",
      "operator": "eq",
      "value": "error"
    },
    {
      "field": "application",
      "operator": "eq",
      "value": "my-app"
    },
    {
      "field": "version",
      "operator": "eq",
      "value": "green"
    }
  ],
  "order_by": [
    {
      "field": "created_at",
      "order": "desc"
    }
  ]
}
```

</details>

<details>

<summary>나열 <a href="../../matchmaking/matchmaker-in-depth#rolling-updates-and-ab-tests">오래된 App 버전이 있는 배포</a> 릴리스가 완료되었는지 확인하기 위해.</summary>

인코딩된 URL:

```
https://api.edgegap.com/v1/deployments?query={"filters":[{"field":"status","operator":"eq","value":"ready"},{"field":"application","operator":"eq","value":"my-app"},{"field":"version","operator":"eq","value":"blue"}],"order_by":[{"field":"created_at","order":"desc"}]}
```

형식화된 JSON 쿼리:

```json
{
  "filters": [
    {
      "field": "status",
      "operator": "eq",
      "value": "ready"
    },
    {
      "field": "application",
      "operator": "eq",
      "value": "my-app"
    },
    {
      "field": "version",
      "operator": "eq",
      "value": "blue"
    }
  ],
  "order_by": [
    {
      "field": "created_at",
      "order": "desc"
    }
  ]
}
```

</details>

{% hint style="success" %}
다음을 추가하는 것을 잊지 마세요 `Authorization` 요청에 Edgegap API 토큰이 포함된 헤더를.
{% endhint %}

### 웹훅 및 포스트백

다음 항목의 변경 사항에 대해 게임 백엔드로 간단한 HTTP 알림을 받으세요 [#deployment-lifecycle](#deployment-lifecycle "mention") 웹훅 URL을 지정하여 [배포 API 요청](https://docs.edgegap.com/docs.edgegap.com-ko/docs/api/dedicated-servers#post-deployments). 다음에 사용할 수 있습니다:

* 준비됨 상태에서: 배포 컨테이너가 [성공적으로 시작됨](#id-1.-start-a-deployment) (이후 서버 초기화가 시작됩니다),
* 오류 시: 배포를 시작할 수 없었고 [#id-4.-deployment-error](#id-4.-deployment-error "mention") 오류가 발생했습니다,
* 종료 시: [#id-5.-deployment-stopped](#id-5.-deployment-stopped "mention") 그리고 게임 서버는 더 이상 도달할 수 없습니다.

Ready 및 Error 웹훅은 동일한 배포에서 절대 모두 트리거되지 않습니다.

<details>

<summary>웹훅 페이로드 예시</summary>

```json
{
  "request_id": "f68e011bfb01",
  "application": "my-game-server",
  "version": "2024.01.30-16.23.00-UTC",
  "fqdn": "f68e011bfb01.pr.edgegap.net",
  "public_ip": "162.254.141.66",
  "deployed_at": "2026-02-10T20:35:48Z",
  "termination_scheduled_at": "2026-02-10T21:35:48Z",
  "ports": {
    "gameport": {
      "external": 31504,
      "internal": 7777,
      "protocol": "UDP",
      "name": "gameport",
      "tls_upgrade": false,
      "link": "f68e011bfb01.pr.edgegap.net:31504",
      "proxy": null
    }
  },
  "location": {
    "city": "몬트리올",
    "country": "캐나다",
    "continent": "북아메리카",
    "administrative_division": "퀘벡",
    "timezone": "동부 시간",
    "latitude": 45.513707,
    "longitude": -73.619073
  },
  "tags": [
    "tag1",
    "tag2"
  ],
  "host_id": "alpha-north-america-70364ef8",
  "host_in_private_fleet": false,
  "private_fleet_id": "PUBLIC_CLOUD",
  "vcpu_units": 256,
  "memory_mib": 512
}
```

</details>

{% hint style="warning" %}
**웹훅은 재시도되지 않으므로**, 따라서 백엔드가 레이트 리밋이나 오류로 인해 요청을 처리하지 못하면 웹훅이 손실될 수 있습니다. 웹훅은 다음 용도로만 사용하세요 **비중요 사용 사례 또는 디버깅 목적**.
{% endhint %}

{% hint style="info" %}
웹훅은 배포 수명주기를 관찰하지만, 씬/레벨 초기화 상태는 인식하지 못합니다. 씬/레벨의 로딩 진행 상황을 관찰하려면 게임 서버에 사용자 지정 웹훅을 구현하세요.
{% endhint %}

## 🚨 문제 해결

배포 문제를 해결할 때:

1. 다음에 오류가 없는지 확인하세요 [#deployment-logs](#deployment-logs "mention") 및 [#container-logs](#container-logs "mention"),
2. 통합 버그를 배제하기 위해 서버를 로컬에서 실행하세요,
3. 이 페이지의 문제 해결 단계를 검토하세요,
4. 다음에서 저희에게 문의하세요 [커뮤니티 디스코드](https://discord.gg/MmJf8fWjnt) 그리고 배포 ID를 포함하세요.

{% hint style="info" %}
참조 [#player-issue-resolution](#player-issue-resolution "mention") 플레이어 커뮤니티 피드백을 다루는 방법에 대한 권장 사항은
{% endhint %}

<details>

<summary>클라이언트를 서버에 연결할 수 없음 - <code>요청 시간이 초과되었습니다.</code>, <code>请求超时</code> , <code>ConnectionFailed</code> , 또는 <code>포트 검증 실패</code>.</summary>

* 먼저, 배포가 Ready 상태인지, 그리고 배포 로그에 런타임 예외나 오류가 없는지 확인하세요. 배포가 중지되었다면, 다음에서 로그를 검사하세요 [대시보드](https://app.edgegap.com/deployment-management/deployments/list).
* Mirror 넷코드를 사용 중이라면 ["Auto Start Server”](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) 다음에서 선택해야 합니다 `NetworkManager` 그런 다음 서버를 다시 빌드, 푸시 및 재배포하세요.
* FishNet 넷코드를 사용 중이라면 [“Start on Headless”](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) 다음을 활성화해야 합니다 `ServerManager`그런 다음 서버를 다시 빌드, 푸시 및 재배포하세요.
* Photon Fusion 2 넷코드를 사용 중이라면, 서버가 배포 공용 IP, 외부 포트 및 `roomCode` 를 서버에서 전달하고, 클라이언트에서도 동일한 룸 코드를 [“NeworkRunner.StartGame”](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) 매개변수 `StartGameArgs`. 배포 ID(예: `b63e6003b19f`)는 전 세계적으로 고유하고 클라이언트가 [매치메이커](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth) 할당으로 쉽게 접근할 수 있으며, [#injected-environment-variables](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#injected-environment-variables "mention").
* 다음으로, 서버 빌드의 넷코드 설정에서 포트 설정이 [App version](https://app.edgegap.com/application-management/applications/list). 다시 빌드하지 않고 포트 매핑을 변경하려면 [App version](https://app.edgegap.com/application-management/applications/list) 를 편집하세요. 넷코드 통합에서 프로토콜을 찾으세요.
* 게임 클라이언트가 다음에 연결하는지 확인하세요 **외부 포트** 배포 세부 정보 페이지에 표시된 값은 보안상의 이유로 항상 무작위화됩니다.
* 넷코드 통합에서 Secure Websocket(WSS) 프로토콜을 사용하는 경우, [App version](https://app.edgegap.com/application-management/applications/list) WSS 포트의 포트 구성에서 TLS Upgrade가 활성화되어 있는지 확인하세요.
* 중국에 거주하고 있으며 [스마트 플릿](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)을 사용 중인가요? 귀하의 연결이 중국의 방화벽에 의해 차단될 수 있습니다. 플릿에 중국에 위치한 서버를 추가하거나 VPN을 사용해 연결하는 것을 고려하세요.

</details>

<details>

<summary>내 배포가 중지/재시작되어 더 이상 로그에 접근할 수 없습니다.</summary>

* 예외로 인해 서버 프로세스가 충돌하는 경우, 시스템은 자동으로 서버를 재시작하려고 시도합니다. 근본 원인을 찾기 위해 서버를 로컬에서 테스트해 보세요.
* 저희는 배포 기간 동안에만 로그를 보관합니다. 배포 중지 후 로그를 확인하고 싶다면 [타사 로그 저장소를 통합하세요](https://docs.edgegap.com/docs/deployment/endpoint-storage).
* 참조 [#id-5.-deployment-stopped](#id-5.-deployment-stopped "mention") 배포 중지를 유발하는 모든 원인을 확인하기 위해.

</details>

<details>

<summary>내 배포가 X분 후 자동으로 중지되었습니다.</summary>

* 무료 티어 배포는 60분 시간 제한이 있습니다. 계정 업그레이드를 고려해 주세요.
* 모든 배포는 서버 정리 정책, 인프라 유지보수, 그리고 배포가 제대로 종료되지 않아 예상치 못한 비용이 발생하는 것을 방지하기 위해 실행 후 24시간이 지나면 종료됩니다. 장시간 실행되는 서버의 경우 다음을 사용하는 것을 고려하세요 [private-fleets](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/private-fleets "mention") 와 함께 [persistence](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/persistence "mention").
* 참조 [#id-5.-deployment-stopped](#id-5.-deployment-stopped "mention") 배포 중지를 유발하는 모든 원인을 확인하기 위해.

</details>

<details>

<summary>내 배포는 준비되었지만 그 이후 몇 분 동안 연결할 수 없습니다.</summary>

* 배포가 Ready 상태가 되면 게임 엔진 초기화가 시작됩니다. 이 과정은 수초에서 수분까지 걸릴 수 있으며, 이 기간 동안 서버는 플레이어 연결을 받지 않습니다.
* 이 시간을 줄이기 위해 서버 초기화를 최적화하는 것을 고려하세요.
* 게임 클라이언트는 제한된 시간 동안 1초 간격으로 연결 재시도를 해야 하며(초기화 시간에 따라 다름), 이후 매치메이킹으로 돌아가야 합니다.
* 로딩 씬을 추가하여 서버가 클라이언트와 동시에 초기화(및 Unreal Engine의 경우 이동)를 수행하면서 양쪽 상태를 동기화할 수 있도록 하는 것을 고려하세요.

</details>

<details>

<summary>내 Meta Quest 기기에서 <code>HTTP 0: 대상 호스트를 확인할 수 없음</code> .</summary>

* Android 대상으로 Unity 앱을 빌드할 때, 인터넷 액세스 권한이 출력 APK 클라이언트 빌드 아티팩트에서 자동으로 제거될 수 있습니다.
* 다음에서 권한을 다시 추가하세요(이후 클라이언트를 다시 빌드해야 함):
  * 프로젝트 설정 / OpenXR / :gear: Meta Quest 지원 / 인터넷 권한 강제 제거(체크 해제).
  * 플레이어 설정 / 인터넷 액세스(필수로 설정).

</details>

<details>

<summary>플레이어가 내 배포를 떠나면 어떻게 되나요?</summary>

* 기본적으로 서버는 플레이어 연결을 거부하지 않습니다. 다양한 인증 방법과 플레이어 인증 제공자를 사용할 수 있으므로, 플레이어 인증은 개발자에게 달려 있습니다.
* 게임 클라이언트는 예기치 않은 클라이언트 충돌 시 재연결을 시도하기 위해 연결 정보를 로컬에 저장할 수 있습니다.
* 플레이어가 진행 중인 게임에 참가할 수 있도록 하려면 다음 사용을 고려하세요 [#backfill](https://docs.edgegap.com/docs.edgegap.com-ko/matchmaking/matchmaker-in-depth#backfill "mention") 또는 [세션](https://docs.edgegap.com/docs/deployment/session).

</details>

<details>

<summary>내 서버가 준비된 후 CPU 사용률 100%를 표시합니다.</summary>

* 게임 엔진은 서버 초기화 중 CPU 집약적인 작업을 수행하는 경향이 있으므로, 이것은 문제가 아닐 수 있습니다. 배포 시작 후 2\~3분이 지나도 CPU 사용량이 감소하지 않으면 서버를 최적화하거나 앱 버전 리소스를 늘려야 할 수 있습니다.
* 틱 레이트를 줄이면 서버가 수행하는 메시징 작업이 줄어들어 CPU 사용량에 영향을 줄 수 있습니다.
* Mirror 넷코드를 사용 중이라면 ["Auto Start Server”](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) 다음에서 선택해야 합니다 `NetworkManager` 그런 다음 서버를 다시 빌드, 푸시 및 재배포하세요.
* FishNet 넷코드를 사용 중이라면 [“Start on Headless”](https://fish-networking.gitbook.io/docs/manual/components/managers/server-manager#settings-are-general-settings-related-to-the-servermanager) 다음을 활성화해야 합니다 `ServerManager`그런 다음 서버를 다시 빌드, 푸시 및 재배포하세요.
* 무료 티어에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.
* 새 앱 버전을 생성할 때 할당된 리소스를 늘릴 수 있습니다. 대시보드에서 App version을 복제하고, 서버나 이미지를 다시 빌드하지 않고도 필요에 따라 이 값을 조정할 수 있습니다.

</details>

<details>

<summary>내 배포가 반복적으로 재시작되며 오류 `OOM kill` 이 표시됩니다.</summary>

* 이 동작은 할당된 메모리 양을 초과하여 발생합니다. 오브젝트 풀링, 압축 또는 씬에서 불필요한 객체 제거를 통해 메모리 사용량을 최적화하는 것을 고려하세요.
* 프로젝트가 기본 씬을 로드하고 있는지 확인하세요. 그 씬에는 `NetworkManager` 가 포함되어 있으며, 해당 씬이 Unity의 Build Settings에 포함되어 있어야 합니다.
* 무료 티어에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.
* 새 앱 버전을 생성할 때 할당된 리소스를 늘릴 수 있습니다. 대시보드에서 App version을 복제하고, 서버나 이미지를 다시 빌드하지 않고도 필요에 따라 이 값을 조정할 수 있습니다.

</details>

<details>

<summary>때때로 서버의 메모리(RAM) 사용량이 높은 값으로 급증하는데, 이것이 문제인가요?</summary>

* 할당된 앱 버전 메모리 양을 유지하는 한, 이것은 문제가 아닙니다.&#x20;
* 할당된 앱 버전 메모리 양을 초과하면 \`OOM kill\` 이 발생합니다(위 참조).

</details>

<details>

<summary>같은 머신에서 실행 중인 다른 서버가 내 서버 성능에 영향을 미치나요?</summary>

* 아니요, 저희 플랫폼은 할당된 리소스가 다른 스튜디오나 공유 인프라의 다른 서버에 의해 사용되지 않도록 보장합니다. Edgegap에서는 시끄러운 이웃이 없습니다.

</details>

[^1]: 세션은 최대 24시간까지 지속될 수 있음

[^2]: 같음

[^3]: 같지 않음

[^4]: request\_id (배포 ID)

[^5]: 배열에 포함

[^6]: 배열에 포함되지 않음

[^7]: 보다 작거나 같음

[^8]: 보다 크거나 같음

[^9]: &#x20;배열에 포함

[^10]: 대소문자 구분 없는 패턴 매칭:

    * 사용하세요 `%`  임의의 시퀀스에 대해
    * 사용하세요 `_`  임의의 한 문자에 대해

[^11]: 오름차순, 오래된 항목 먼저

[^12]: 내림차순, 최신 항목 먼저

[^13]: 오름차순, 가득 찬 항목 먼저

[^14]: 내림차순, 비어 있는 항목 먼저
