> 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/ko/learn/orchestration/deployments.md).

# 배포

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

## 🗺️ 오케스트레이션

클라우드 네이티브 엣지 컴퓨팅 접근 방식을 통해 용량 수요를 충족하기 위해 몇 초 만에 새 서버를 시작합니다. 우리는 서버를 [애완동물보다 가축으로](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 %}

모든 장단점을 완전히 이해하기 위해 다양한 오케스트레이션 방식을 비교해 봅시다. 일부 게임은 게임 루프 설계에 따라 여러 오케스트레이션 방식을 사용할 것입니다.

### 매치 종속

수명이 짧은(시간 제한) 서버는 매치 종료 시 축소되어 **최고의 비용 대비 성능 비율**.

세션은 일반적으로 다음을 통해 자동화됩니다: [매치메이킹](/ko/unity/matchmaking.md) 엄격한 규칙을 사용해 필요한 시점에 서버를 배포하며, 선택적으로 진행 중인 서버를 채워 [매치 충원율을 높입니다](https://edgegap.com/blog/how-session-fill-rate-affects-your-multiplayer-hosting-costs).

👍 **장점**

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

👎 **단점**

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

🧩 **가장 적합한 대상**

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

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

### 지역 대기

지속형 월드 및 소셜 MMO 게임 **서버 수명은 종종 개별 플레이어 세션보다 깁니다**.

세션은 보통 다음을 통해 배정됩니다: [서버 브라우저](/ko/learn/server-browser.md) 플레이어 선호에 따라(지역 또는 사용자 지정 검색으로 자동화), 지역 용량에 기반한 수평 배포 사전 확장과 함께.

👍 **장점**

* 익숙하고 이해하기 쉬운, 백전노장에게는 구식의 접근 방식입니다.
* 가장 높은 수준의 보안과 플레이어 치팅 방지(서버 권한)를 제공합니다.
* 월간 약정에 기반해 쉽게 예측 가능한 비용.

👎 **단점**

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

🧩 **가장 적합한 대상**

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

### 피어 투 피어

개발 노력을 다음에서 전환하세요 ~~전용 서버~~ 에서 **비경쟁 게임용 릴레이 넷코드**.

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

👍 **장점**

* NAT 펀치스루 해결을 위해 릴레이 서버만 필요하므로 호스팅 비용이 가장 낮습니다.
* DevOps 비용이 가장 낮음 - 클라이언트 빌드와 배포 채널에 대해서만 유지보수가 필요합니다.
* 예기치 않은 서버 충돌이 플레이어에게 미치는 영향이 최소이며, 단일 매치에만 영향을 줍니다.
* 구현이 쉽고 프로토타입 제작이 빠르며, 백엔드 개발이 전혀 필요하지 않습니다.

👎 **단점**

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

🧩 **가장 적합한 대상**

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

{% 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&amp;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" %}
우리의 [매치메이커](/ko/learn/matchmaking.md) 는 **가능한 최상의 경험을 보장하기 위해 기본적으로 서버 점수 전략을 사용합니다**. 이 전략을 다음과 함께 사용하려면 [배포 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&amp;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&amp;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&amp;token=8d3cd64b-9527-48fe-886b-96393c15449d" alt=""><figcaption></figcaption></figure>

{% hint style="info" %}
이 전략은 **서로 멀리 떨어진 플레이어 그룹을 호스팅하는 데 특히 효과적입니다** (북미 대 남미, 또는 서해안 대 동해안), 플레이어 기반이 작은 경우에 흔한 사례입니다.
{% endhint %}

### 지리 위치

대신, **원하는 서버 위치의 위도 및 경도 좌표를 제공하세요:**

⭐ **권장:** 가장 빠른 핑 비콘을 찾아 해당 좌표 또는 IP를 사용자 필드에 보내세요.

⚙️ **사용자 지정**: 게임 백엔드에서 지역(좌표 포함)을 정의하고, 사용자 지정 API로 가져옵니다.

👉 **테스트에 가장 간단한 방법:** 지역(좌표 포함)을 게임 클라이언트 개발 빌드에 하드코딩하여 정의합니다.

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

{% hint style="success" %}
또는 플레이어가 **지속적(항상 온라인) 서버를 선택하도록** 목록에서 [서버 브라우저](/ko/learn/server-browser.md).
{% endhint %}

### 지역 고정

일부 스튜디오는 안정적이고 예측 가능한 위치를 고정하는 것을 선호합니다(예: 다음과 같은 MMO [영속성](/ko/learn/orchestration/persistence.md)). 고려해 보세요 [서버 브라우저](/ko/learn/server-browser.md) 과 [지역별 확장 정책](/ko/learn/server-browser.md#automated-scaling) 및 [자동 할당 예약](/ko/learn/server-browser.md#auto-assigned-reservation).

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

## 🟢 연결 품질

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

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

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

{% hint style="info" %}
도움이 필요하시면 [디스코드를 통해 문의해 주세요](https://discord.gg/MmJf8fWjnt). 실시간 게임 지원은 저희의 [티켓 시스템](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

#### 저지연

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

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

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

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

* **인프라 가용성** - 특정 지역의 인터넷 연결 품질이 충분하지 않을 수 있습니다.
* **자연적 요인** - 서버에는 민감한 구성 요소가 포함되어 있어 안정성이 필요합니다(지진 없음).

#### 고가용성

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

* **버스트 트래픽** - 15분 이내에 이루어진 배포는 확장 추세에 반영됩니다.
* **자원 요구 사항** - 각 위치의 총 vCPU 수요가 확장 속도를 결정합니다.
* **제공업체 대안** - 일부 원격 위치는 이용 가능한 제공업체 옵션이 더 적습니다.
* **제공업체 용량** - 일부 위치는 4 vCPU 또는 8 vCPU 머신만 제공할 수 있습니다.
* **서비스 품질** - 일부 제공업체는 같은 지역의 ISP 전반에서 더 나은 네트워크 품질을 제공합니다.
* **스튜디오 일정** - 테스트 및 QA, 비공개 베타 또는 토너먼트에 대한 특별 요청.

모든 애플리케이션의 배포 요청은 각 위치의 수요를 평가하기 위해 통합됩니다. 모든 조직은 기본적으로 동일한 할당 우선순위를 가집니다. **스튜디오는 사용자 지정을 추가할 수 있습니다** [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md).

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

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

플레이어 문제는 때때로 서버나 호스팅 버그로 인해 발생할 수 있지만, 종종 무관합니다 - 케이블/와이파이 연결, 인터넷 서비스 제공업체, 백엔드 서비스, 또는 클라이언트/서버 저수준 라이브러리의 버그도 고려하세요.

플레이어 보고나 사건을 문제 해결할 때는 다음 요소를 고려하세요:

* **매치메이킹 품질** - 가능하면 항상 같은 지역 매치를 최적화하세요:
  * [매치메이킹](/ko/learn/matchmaking.md) 및 [핑 비컨](/ko/learn/orchestration/ping-beacons.md) 권장 사항은
  * [심층 살펴보기](/ko/learn/matchmaking/matchmaker-in-depth.md#player-tracing) 플레이어 보고와 관련된 서버 로그를 찾으세요.
* **지역별 네트워킹 및 ISP 문제:**
  * 지역 인터넷 서비스 제공업체(ISP)가 일시적으로 사건을 해결하고 있을 수 있으며,
  * 일부 지역(예: 중국, 러시아)은 지역 제재로 인해 제한될 수 있습니다.
* **캐싱 수준** - 캐싱이 없으면 더 느린 배포로 인해 세션이 시간 초과될 수 있습니다:
  * [서버를 몇 초 만에 배포할 수 있도록 캐싱을 활성화하세요](/ko/learn/orchestration/application-and-versions.md#other-parameters-optional).
* **배포 최대 시간** - 느리고 무거운 초기화 과정 때문에 배포가 실패할 수 있습니다:
  * 다음을 보세요 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md#safety-guardrails) 타임아웃 시간을 늘리려면.
* **서버 이미지 또는 통합 문제** 사용자 지정 빌드 파이프라인의 초기 반복에서.

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

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

## 🔄 배포 생명주기

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

#### 1. 배포 시작

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

* [Unreal Engine](/ko/unreal-engine.md) - Unreal Engine 프로젝트용 Docker Extension 또는 EGIK 플러그인.
* [Unity](/ko/unity.md) - Unity 프로젝트용 호스팅 퀵스타트 플러그인.
* [Godot](/ko/godot.md) - Godot 프로젝트용 호스팅 퀵스타트 플러그인.
* [대시보드 웹 UI](https://app.edgegap.com/deployment-management/deployments/list) - 빠른 서버 테스트와 반복을 위한 쉬운 웹 인터페이스.

{% hint style="warning" %}
**배포를 수동으로 시작하고 URL과 포트를 붙여넣는 것만으로는 라이브 게임에 충분하지 않습니다.**
{% endhint %}

다음 중 하나를 사용해 세션 관리 및 필요에 따른 확장을 위한 인기 게임 흐름을 자동화하세요:

{% columns %}
{% column width="33.33333333333333%" %}
[매치메이킹](/ko/learn/matchmaking.md):

* 짧은 라운드
* 온디맨드 매치
* 실력 등급 및/또는\
  사용자 지정 규칙
  {% endcolumn %}

{% column width="33.33333333333333%" %}
[서버 브라우저](/ko/learn/server-browser.md):

* 지속형 또는 라운드
* 소셜 지역 허브
* 자동 할당 및/또는\
  사용자 지정 검색
  {% endcolumn %}

{% column width="33.33333333333333%" %}
사용자 지정 백엔드:

* 라이브 게임 마이그레이션
* [v2 API로 배포](/ko/docs/api/dedicated-servers.md)
* [웹훅 관찰](/ko/learn/orchestration/deployments.md#webhooks)
  {% endcolumn %}
  {% endcolumns %}

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

#### 2. 배포 중

배포가 시작되면 시스템은 여러 단계를 빠르게 순차적으로 수행합니다:

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

{% hint style="success" %}
활성화 [앱 버전에서 활성 캐싱](/ko/learn/orchestration/application-and-versions.md#active-caching) 몇 초 안에 서버를 배포하려면.
{% endhint %}

{% hint style="warning" %}
**요청이 너무 많음 429** - 안정성을 보장하고 예상치 못한 청구를 방지하기 위해, 귀 조직에 다음의 속도 제한을 적용합니다 **40 req/s**. [문의하기](mailto:info@edgegap.com) 출시를 계획하고, 런치 트래픽을 추정하며, 성공을 준비하세요.
{% endhint %}

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

배포가 Ready 상태가 되어도 엔진은 아직 할 일이 남아 있습니다. 엔진은 서브시스템과 프레임워크를 부트스트랩한 다음, 맵을 포함한 에셋을 메모리에 로드합니다. 이는 배포가 Ready가 된 후에 발생하며, 보통 최적화 수준에 따라 최대 1분이 걸립니다.

{% hint style="success" %}
**플레이어 연결을 몇 번 다시 시도하세요**미리 정의된 타임아웃 기간이 끝날 때까지, 그 후 중단하고 새 세션을 시작합니다. 서버는 일반적으로 완전히 초기화되기 전까지 새 플레이어 연결을 स्वीकार하지 않습니다.
{% endhint %}

{% hint style="danger" %}
**서버 충돌 처리는 사용자의** [**프로세스 재시작 정책**](/ko/learn/orchestration/application-and-versions.md#safety-guardrails)**.** [서버 상태가 손실될 수 있습니다](/ko/learn/orchestration/persistence.md#state-management).
{% endhint %}

버전의 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md#active-caching) 상태에 따라 다음을 받을 수 있습니다:

🟢 **캐시 적중**

캐싱이 활성화되어 있습니다. 이 머신에 미리 로드된 이미지를 재사용하여 배포가 더 빨랐습니다.

🟡 **웜 스타트**

캐싱이 비활성화되어 있습니다. 동일한 머신에서 이전 배포를 위해 다운로드한 이미지를 재사용하여 배포가 더 빨랐습니다. 전 세계에서 일관되게 빠른 배포를 위해 캐싱을 활성화하세요.

🔴 **캐시 미스**

캐싱이 활성화되어 있습니다. 캐시 전파가 완료되기 전에 갑작스러운 트래픽 급증이 발생하여 배포가 더 느렸습니다. 배포 요청에서 “require cached locations”를 활성화하면 이를 방지할 수 있지만, 예상치 못한 트래픽 급증 시 더 많은 Unprocessable 배포가 발생할 수 있습니다.

🔴 **콜드 스타트**

캐싱이 비활성화되어 있습니다. 배포가 더 느렸고, 이미지는 배포 시점에 다운로드되었습니다. 더 빠른 배포를 위해 캐싱을 활성화하세요.

#### 4. 배포 오류

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

**오류 배포에는 요금이 부과되지 않으며, 24시간 후 자동으로 중지됩니다.**

문제 해결 단계:

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

{% hint style="info" %}
도움이 필요하시면 [디스코드를 통해 문의해 주세요](https://discord.gg/MmJf8fWjnt). 실시간 게임 지원은 저희의 [티켓 시스템](https://edgegap.atlassian.net/servicedesk/customer/portal/3).
{% endhint %}

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

#### 5. 배포 중지

**클라우드 배포는 24시간 실행 후 종료됩니다** 인프라 유지보수를 위한 서버 정리 정책을 따르며, 예기치 않은 버그로 인해 배포가 제대로 종료되지 않았을 때 예상치 못한 비용이 누적되는 것을 방지하기 위해서입니다.

24시간 이상 장시간 실행되는 서버의 경우 다음 사용을 고려하세요 [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md) 과 [영속성](/ko/learn/orchestration/persistence.md).

다음 방법으로 비용을 최적화하고 유휴 배포를 조기에 중지하세요:

* **앱 버전** [**재시작 정책**](/ko/learn/orchestration/application-and-versions.md#safety-guardrails) - 종료나 충돌 시 자동 재시작을 방지합니다.
* **게임 최대 지속 시간** - 다음에서 할당된 시간 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md#safety-guardrails) 만료되었습니다.
* **다음을 통한 자동 중지** [**DELETE\_URL**](/ko/learn/orchestration/deployments.md#injected-environment-variables) - 플레이어가 떠나고 매치가 종료된 후 배포가 스스로 중지되었습니다.
  * 다음을 보세요 [Unreal Engine](/ko/unreal-engine.md#stop-deployments) 및 [Unity](/ko/unity.md#stop-deployments) SDK 유틸리티와 쉬운 통합을 위한 가이드 또는 API를 사용하세요.
* **사용자 지정 백엔드에서 중지** - 사용자 지정 세션 오케스트레이션은 다음을 사용할 수 있습니다 [배포 API](https://docs.edgegap.com/api/#tag/Deployments/operation/deployment-delete).
* [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md) 배포를 실행 중인 호스트가 예약된 작업을 통해 삭제되었습니다.

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

## 👀 관찰 가능성

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

{% hint style="info" %}
**예상치 못한 클라우드 비용이 걱정되시나요?** [클라우드 알람을 설정하세요](https://app.edgegap.com/notifications?notification-table-limit=10\&notification-table-page=1#alarms) 사용자 지정 청구 기준에 도달하면 알림을 받으세요, 또는 [문의해 주세요](https://discord.com/invite/NgCnkHbsGp) 자동 보안 조치에 대해.
{% endhint %}

### 발견 가능성

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

{% hint style="success" %}
사용하세요 **배포 태그(최대 40자)를 사용해 배포를 쉽게 표시하고** 나중에 찾을 수 있습니다.
{% endhint %}

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

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

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

* **관리형 인증서**, 코드를 작성하지 않고 1분 만에 설정 가능:
  * 다음을 구성하세요 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md) 에서 **Websocket(WS) 사용 및 TLS 업그레이드 활성화,**
  * 클라이언트를 연결하는 데 Edgegap URL을 사용합니다(예: `https://5fa53fa00a57.pr.edgegap.net/`)
* **자체 관리 인증서**, 사용자 지정 도메인을 사용하려면:
  * 다음을 구성하세요 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md) 에서 **보안 웹소켓(WSS) 사용**,
  * 사용자 지정 DNS 레코드(예: [Cloudflare](https://www.cloudflare.com/application-services/products/ssl/)).

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

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

게임 서버는 종종 서버 IP, 내부 포트 값 등 추가 정보가 필요합니다. 읽기 전용 환경 변수를 삽입하는 것은 파라미터를 전달하는 안정적이고 클라우드에 구애받지 않는 방법입니다.

{% hint style="success" %}
다음으로 변수 값을 가져오세요 [Unity SDK](/ko/unity/developer-tools.md#software-development-kit), [Unreal EGIK](/ko/unreal-engine/developer-tools.md#integration-kit), 또는 런타임의 환경 변수 메서드를 사용합니다.
{% endhint %}

{% hint style="info" %}
다음을 보세요 [앱 버전 변수](/ko/learn/orchestration/application-and-versions.md#injected-variables) 및 [매치메이커 변수](/ko/learn/matchmaking/matchmaker-in-depth.md#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 [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md).

#### 리소스 사양

* **`ARBITRIUM_HOST_IN_PRIVATE_FLEET`** - 예: `false` , 다음에서 호스팅되는지 여부를 나타냅니다 [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md).
* **`ARBITRIUM_HOST_BASE_CLOCK_FREQUENCY`**  - 예: `2300` , 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` (기본값). **각 포트는 추가로 정리된** [앱 및 버전](/ko/learn/orchestration/application-and-versions.md#port-mapping) **변수:** `@슈퍼 포트!` ⇒ `ARBITRIUM_PORT_SUPER_PORT_INTERNAL` .
{% endhint %}

* **`ARBITRIUM_BEACON_ENABLED`**  - 예: `true`, 다음에 배포하는 경우 [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md) 과 [핑 비컨](/ko/learn/orchestration/ping-beacons.md).
* **`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><code>ARBITRIUM_DEPLOYMENT_LOCATION</code></strong></summary>

```json
ARBITRIUM_DEPLOYMENT_LOCATION="{
  "city": "Montreal",
  "country": "Canada",
  "continent": "North America",
  "administrative_division": "Quebec",
  "timezone": "Eastern Time",
  "latitude": 45.513707,
  "longitude": -73.619073
}"
```

</details>

<details>

<summary><strong><code>ARBITRIUM_PORTS_MAPPING</code></strong></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) 서버 호스팅 및 오케스트레이션 카테고리 아래에서.
{% endhint %}

:star2: [**Pay as You Go 요금제로 업그레이드**](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&amp;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&amp;token=98028901-9a40-4a2d-969e-db5f990e334f" alt=""><figcaption></figcaption></figure>

#### 배포 밸런스 포인트

{% hint style="success" %}
다음에서 배포 밸런스 포인트 히트맵을 찾으세요 [대시보드의 애플리케이션 상세 페이지](https://app.edgegap.com/application-management/applications/list).
{% endhint %}

배포 밸런스 포인트 히트맵을 미리 보고 다음으로 필터링하세요 [앱 및 버전](/ko/learn/orchestration/application-and-versions.md). 밸런스 포인트는 주어진 배포에서 각 플레이어까지의 네트워크 근접도가 동일한 대략적 위치입니다:

<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&amp;token=94e730ad-3907-486b-8a06-0f469acd19ea" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
그린란드처럼 이상한 위치의 밸런스 포인트 핫스팟은 서로 멀리 떨어진 플레이어들의 매칭을 나타냅니다. 다음에 대해 알아보세요 [#connection-quality](#connection-quality "mention") 및 [핑 비컨](/ko/learn/orchestration/ping-beacons.md) 매치메이킹을 최적화하세요.
{% 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&amp;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&amp;token=7eb49138-954d-44a1-a025-1f88ed855366" alt=""><figcaption></figcaption></figure>

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

#### 컨테이너 지표

{% hint style="success" %}
다음에서 컨테이너 지표를 찾으세요 [대시보드의 배포 상세 페이지](https://app.edgegap.com/deployment-management/deployments/list).
{% endhint %}

컨테이너 지표(프로세서, 메모리, 네트워킹)를 검토하여 다음을 수행합니다:

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

기록 지표는 1분 간격의 평균 값을 표시하며, Free 요금제에서 사용할 수 있습니다.

:star2: [**Pay as You Go 요금제로 업그레이드**](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&amp;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="danger" %}
**요청이 너무 많음 429 - 컨텍스트 및 상태 API는 조직당 초당 20회 요청으로 제한됩니다.** 이 API는 자동화된 세션 오케스트레이션이 아니라 특수 작업 중 사용하도록 설계되었습니다.
{% endhint %}

{% hint style="success" %}
**사용하세요** [#webhooks](#webhooks "mention") **속도 제한을 피하고 확장성을 보장하기 위해 사용자 지정 세션 오케스트레이션을 사용하세요.**
{% 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&amp;token=6aba8781-13c9-4c0f-87e9-2d9612a57342" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
또는 플레이어가 **지속적(항상 온라인) 서버를 선택하도록** 목록에서 [서버 브라우저](/ko/learn/server-browser.md).
{% endhint %}

[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="/ko/learn/orchestration/deployments.md#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="/ko/learn/orchestration/application-and-versions.md"><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="/ko/learn/orchestration/application-and-versions.md"><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="/ko/learn/orchestration/private-fleets.md"><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="/ko/learn/orchestration/private-fleets.md"><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 참조](/ko/docs/api.md) 를 참조하세요.
{% endhint %}

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

| 배포 속성                                                                                  | 순서                                                                      |
| -------------------------------------------------------------------------------------- | ----------------------------------------------------------------------- |
| [`created_at`](#id-1.-start-a-deployment)                                              | [`asc`](#user-content-fn-11)[^11] 또는 [`desc`](#user-content-fn-12)[^12] |
| [`available_session_sockets`](broken://pages/dc32cf21321a2483f0676d9a0e212db5162597cf) | [`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="/ko/learn/matchmaking/matchmaker-in-depth.md#rolling-updates-and-ab-tests">오래된 앱 버전의 배포</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 요청](/ko/docs/api/dedicated-servers.md#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": "Montreal",
    "country": "Canada",
    "continent": "North America",
    "administrative_division": "Quebec",
    "timezone": "Eastern Time",
    "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="success" %}
**웹훅은 사용자 지정 백엔드 배포 통합을 위한 기본 권장 방법입니다.**
{% endhint %}

{% hint style="warning" %}
**웹훅은 재시도되지 않으며**속도 제한이나 오류로 인해 백엔드가 요청을 처리하지 못하면 손실될 수 있습니다. 예상 시간 내에 웹훅을 받지 못한 경우 Status API로 대체하세요.
{% 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>연결 실패</code> 또는 <code>포트 확인 실패</code>.</summary>

* 먼저, 배포가 Ready 상태인지, 그리고 배포 로그에 런타임 예외나 오류가 없는지 확인하세요. 배포가 중지되었다면, 우리의 로그를 확인하세요 [대시보드](https://app.edgegap.com/deployment-management/deployments/list).
* Mirror netcode를 사용 중이라면 [“Auto Start Server”](https://mirror-networking.gitbook.io/docs/hosting/edgegap-hosting-plugin-guide#build-and-push) 다음에서 선택되어 있어야 합니다 `NetworkManager` 를 선택해야 합니다. 그런 다음 다시 빌드하고, 푸시한 후 서버를 재배포하세요.
* FishNet netcode를 사용 중이라면 [“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 netcode를 사용 중이라면, 서버가 배포의 공용 IP, 외부 포트 및 `roomCode` 를 서버에서 전달하고 있으며, 클라이언트에서도 동일한 roomCode를 [“NeworkRunner.StartGame”](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) 매개변수 `StartGameArgs`. 배포 ID(예: `b63e6003b19f`)는 전역적으로 고유하고 클라이언트가 할당을 통해 쉽게 접근할 수 있어 훌륭한 선택입니다 [매치메이커](/ko/learn/matchmaking/matchmaker-in-depth.md) 할당 및 [심층 살펴보기](/ko/learn/matchmaking/matchmaker-in-depth.md#injected-environment-variables).
* 다음으로, 서버 빌드의 netcode 설정에 있는 포트 설정이 다음의 내부 포트와 일치하는지 확인해 주세요 [앱 버전](https://app.edgegap.com/application-management/applications/list)를 편집하여 포트 매핑을 변경할 수 있습니다 [앱 버전](https://app.edgegap.com/application-management/applications/list) 다시 빌드하지 않고. netcode 통합에서 프로토콜을 찾으세요.
* 게임 클라이언트가 다음에 연결 중인지 확인해 주세요 **외부 포트** 배포 세부정보 페이지에 표시된 이 값은 보안상의 이유로 항상 무작위로 지정됩니다.
* netcode 통합에서 Secure Websocket(WSS) 프로토콜을 사용 중이라면, 다음 사항을 확인해 주세요 [앱 버전](https://app.edgegap.com/application-management/applications/list) WSS 포트의 포트 설정에 TLS 업그레이드가 활성화되어 있는지 확인하세요.
* 중국에 계시고 [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)를 사용 중이신가요? Great Firewall 때문에 연결이 차단되었을 수 있습니다. 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>

* Free Tier 배포는 60분 시간 제한이 있으므로, 계정 업그레이드를 고려해 주세요.
* Cloud 배포는 서버 정리 정책에 따라, 인프라 유지보수 및 배포가 제대로 종료되지 않아 예상치 못한 비용이 누적되는 것을 방지하기 위해 실행 24시간 후 종료됩니다. 24시간을 초과하는 장기 실행 서버의 경우 다음을 사용하는 것을 고려해 보세요 [프라이빗 플릿](/ko/learn/orchestration/private-fleets.md) 과 [영속성](/ko/learn/orchestration/persistence.md).
* 다음을 보세요 [#id-5.-deployment-stopped](#id-5.-deployment-stopped "mention") 배포 중지의 모든 원인을 찾아내기 위해.

</details>

<details>

<summary>배포는 Ready 상태이지만, 그 후 몇 분 동안 연결할 수 없습니다.</summary>

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

</details>

<details>

<summary>내 Meta Quest 기기에서 다음이 발생합니다 <code>HTTP 0: 대상 호스트를 확인할 수 없습니다</code> .</summary>

* Android 대상을 위해 Unity 앱을 빌드할 때, Internet Access 권한이 출력 APK 클라이언트 빌드 산출물에서 자동으로 제거될 수 있습니다.
* 다음에서 권한을 다시 추가하세요(이후 클라이언트를 다시 빌드해야 함):
  * Project Settings / OpenXR / :gear: Meta Quest Support / Force Remove Internet Permissions(체크 해제).
  * Player Settings / Internet Access(필수로 설정).

</details>

<details>

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

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

</details>

<details>

<summary>서버가 Ready 상태가 된 후 CPU 사용률이 100%로 표시됩니다.</summary>

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

</details>

<details>

<summary>배포가 반복해서 재시작되며 `OOM kill` 오류가 표시됩니다.</summary>

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

</details>

<details>

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

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

</details>

<details>

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

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

</details>

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

[^2]: 같음

[^3]: 같지 않음

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

[^5]: 배열에 포함

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

[^7]: 이하

[^8]: 이상

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

[^10]: 대소문자를 구분하지 않는 패턴 일치:

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

[^11]: 오름차순, 오래된 항목 우선

[^12]: 내림차순, 최신 항목 우선

[^13]: 오름차순, 가득 찬 항목 우선

[^14]: 내림차순, 빈 항목 우선
