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

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

### 매치 종속형

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

세션은 일반적으로 [매치메이킹](/docs.edgegap.com-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 게임 **서버 수명은 종종 개별 플레이어 세션보다 길다**.

세션은 일반적으로 [서버 브라우저](/docs.edgegap.com-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="/files/b3755099f7707f982fc5ece9f0b2b098079dc76f" alt=""><figcaption></figcaption></figure>

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

### 서버 점수

서버 점수 전략은 Edgegap의 특허받은 방법론을 사용하며, 이는 **각 매치마다 서버 배치를 개별적으로 최적화합니다**. 비침습적 원격 측정을 수행하여 각 플레이어의 네트워크 근접성을 서버 위치에 대략적으로 추정하고, 다음 기준에서 가장 우수한 서버를 선택합니다:

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

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

**반응 없는 배치** - 서버가 멀리 있어 모든 플레이어의 핑이 높습니다:

<figure><img src="/files/0760af1a7eae53e2f839bb2a73699052adf27c24" alt=""><figcaption></figcaption></figure>

**불공정한 배치** - 핑이 불균등하여 한 플레이어가 불리합니다:

<figure><img src="/files/7c745cd1000a1391c838467d640e0bb1b3576d02" alt=""><figcaption></figcaption></figure>

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

<figure><img src="/files/69e34415727bb308dbae6e877418cfa94bbc8ade" alt=""><figcaption></figcaption></figure>

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

### 지리적 위치

또는, **선호 지역의 핑 비콘에 대한 목표 위도 및 경도 좌표 또는 공개 IP 주소를 제공하세요**. 이 접근 방식은 추가적인 클라이언트 측 지리 조회 구현이 필요하며, 개발자의 솔루션에 전적으로 의존합니다.

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

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

### 지역 잠금

일부 설계나 대상은 규정 준수, 기술, 운영상의 이유로 인접 지역으로 확장되는 것을 의도하지 않습니다. 다음을 고려하세요 [서버 브라우저](/docs.edgegap.com-ko/learn/server-browser.md) 와 함께 [지역 확장 정책을](/docs.edgegap.com-ko/learn/server-browser.md#automated-scaling).

{% 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 요구사항** - 배포당 vCPU가 많을수록 특정 위치에 대한 전체 수요가 증가합니다,
* **제공업체 제공 여부** - 일부 원격 위치는 이용 가능한 제공업체 옵션이 더 적습니다,
* **기계 가용성** - 일부 위치는 4 vCPU 또는 8 vCPU 머신만 제공할 수 있습니다,
* **스튜디오 요청** 테스트, 품질 보증, 얼리 액세스, 클로즈드 베타 또는 토너먼트를 위한.

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

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

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

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

플레이어 보고나 사고를 조사할 때 다음 요소를 고려하세요:

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

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

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

## 🔄 배포 수명 주기

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

#### 1. 배포 시작

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

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

다음의 배포는 **라이브 프로덕션 환경** 은 다음으로 시작해야 합니다:

* [매치메이킹](/docs.edgegap.com-ko/learn/matchmaking.md) - 다른 플레이어를 찾아 필요에 따라 서버 시작([#match-bound](#match-bound "mention")).
* [서버 브라우저](/docs.edgegap.com-ko/learn/server-browser.md) - 긴 초기화가 있는 서버 사전 예열([#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. 배포 중

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

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

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

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

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

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

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

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

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

🟢 **캐시 적중**

캐싱이 활성화되어 있습니다. 이 머신에 미리 로드된 이미지를 재사용했기 때문에 배포가 더 빨라졌습니다.

🟡 **웜 스타트**

캐싱이 비활성화되어 있습니다. 동일한 머신의 이전 배포에 대해 다운로드된 이미지를 재사용했기 때문에 배포가 더 빨라졌습니다. 전 세계적으로 일관되게 빠른 배포를 위해 캐싱을 활성화하세요.

🔴 **캐시 미스**

캐싱이 활성화되어 있습니다. 캐시 전파가 완료되기 전에 갑작스러운 트래픽 급증이 발생해 배포가 더 느려졌습니다. 배포 요청에서 “캐시된 위치 필요”를 활성화하면 이를 방지할 수 있지만, 예기치 않은 트래픽 급증 시 처리 불가능한 배포가 더 많이 발생할 수 있습니다.

🔴 **콜드 스타트**

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

#### 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. 배포 중지됨

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

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

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

#### **Websocket(WS) 및 보안 Websocket(WSS)**

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

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

{% hint style="danger" %}
포착되지 않은 서버 예외는 배포의 컨테이너를 재시작시키고 TLS 보안을 무효화합니다. 이런 경우, [서버를 중지하세요](#id-5.-deployment-stopped) 및 [플레이어를 새 배포로 다시 매칭](/docs.edgegap.com-ko/learn/matchmaking.md#custom-lobby). [서버 상태가 손실될 수 있습니다](/docs.edgegap.com-ko/learn/orchestration/persistence.md#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" %}
참조 [앱 버전 변수](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md#injected-variables) 및 [매치메이커 변수](/docs.edgegap.com-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 [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md).

#### 리소스 사양

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

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

* **`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` (기본값). **각 포트는 정제된 추가 세트를** [앱 및 버전](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md#port-mapping) **변수:** `@슈퍼 포트!` ⇒ `ARBITRIUM_PORT_SUPER_PORT_INTERNAL` .
{% endhint %}

* **`ARBITRIUM_BEACON_ENABLED`**  - 예: `true`, 다음에 배포하는 경우 [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md) 와 함께 [핑 비콘](/docs.edgegap.com-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>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": "게임 포트",
      "internal": 7777,
      "external": 31504,
      "protocol": "UDP"
    },
    "webport": {
      "name": "웹 포트",
      "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="/files/91cb4cfc0c711215516b9ff39f2ae475c5a77685" alt=""><figcaption></figcaption></figure>

#### 배포 맵

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

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

<figure><img src="/files/2cccc5f3af7abf32c9a4f5814dcea8584d630cf1" alt=""><figcaption></figcaption></figure>

#### 배포 균형점

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

배포 균형점 히트맵을 미리 보고 다음으로 필터링하세요 [앱 및 버전](/docs.edgegap.com-ko/learn/orchestration/application-and-versions.md). 균형점은 주어진 배포에서 각 플레이어와 네트워크상 동일한 근접성을 가진 대략적인 위치입니다:

<figure><img src="/files/5b276ea54e520d84ee0ec83ed46ee44f59781eae" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
그린란드와 같은 이상한 위치의 균형점 핫스팟은 서로 멀리 떨어진 플레이어들이 매칭되었음을 나타냅니다. 다음에 대해 알아보세요 [#connection-quality](#connection-quality "mention") 및 [핑 비콘](/docs.edgegap.com-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="/files/1bbf4ba7bdea091d2dcc0bd97c587eb242e5b3ee" alt=""><figcaption></figcaption></figure>

#### 컨테이너 로그

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

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

<figure><img src="/files/2e1f54be877ed22422e7ac27f579d560b8b9635b" alt=""><figcaption></figcaption></figure>

{% hint style="warning" %}
**배포가 중지되면 컨테이너 로그는 삭제됩니다.** 설정 [타사 S3 로그 저장소](/docs.edgegap.com-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="/files/0a8fef92970c976f0311e4cbf9920ea2257e1af0" 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개 요청으로 속도 제한됩니다.**
{% endhint %}

{% hint style="success" %}
**사용하세요** [#webhooks](#webhooks "mention") **속도 제한을 피하고 확장성을 보장하기 위해 자동화(사용자 지정 매치메이킹)에 사용하세요.** 컨텍스트 및 상태 API는 개발, QA 및 문제 해결 목적으로만 사용됩니다.
{% endhint %}

### 배포 필터링

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

<figure><img src="/files/ab88afa4b180962bba15dbb3ae4a69197d7a15e2" alt=""><figcaption></figcaption></figure>

{% hint style="success" %}
또는 플레이어가 **지속적(항상 온라인) 서버를 선택하도록** 목록에서 [서버 브라우저](/docs.edgegap.com-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="/pages/1e75126474c80b6c476cbd5e97b171fce5779d47#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="/pages/6b26c7717f5dc353cdb58cd245bf06a9ee9d9622"><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="/pages/6b26c7717f5dc353cdb58cd245bf06a9ee9d9622"><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="/pages/f2259f448578565b0d2eb7339f553aa9d25eab28"><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="/pages/f2259f448578565b0d2eb7339f553aa9d25eab28"><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 참조](/docs.edgegap.com-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="/pages/9b10ade5b00c98930860db62005218f1d0bc81d1#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 요청에](/docs.edgegap.com-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") 그리고 게임 서버에 더 이상 연결할 수 없습니다.

준비 완료 및 오류 웹훅은 동일한 배포에 대해 결코 트리거되지 않습니다.

<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="success" %}
**웹훅은 사용자 정의 백엔드 배포 통합에 대해 가장 권장되는 기본 방법입니다.**
{% endhint %}

{% hint style="warning" %}
**웹훅은 재시도되지 않으며**, 속도 제한이나 오류 때문에 백엔드가 요청을 처리하지 못하면 손실될 수 있습니다. 예상 시간 내에 웹훅을 받지 못한 경우 상태 API로 대체하세요.
{% endhint %}

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

## 🚨 문제 해결

배포 문제를 해결할 때:

1. 오류가 없는지 확인하세요 [#deployment-logs](#deployment-logs "mention") 및 [#container-logs](#container-logs "mention"),
2. 통합 버그를 배제하기 위해 서버를 로컬에서 실행하고,
3. 이 페이지의 문제 해결 단계를 검토하고,
4. 저희에게 문의해 주세요 [커뮤니티 Discord](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 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` 를 서버에서 전달하고, 클라이언트에서도 동일한 room code를 [“NeworkRunner.StartGame”](https://doc.photonengine.com/fusion/current/manual/network-runner#creating-or-joining-a-room) 매개변수 `StartGameArgs`. 배포 ID(예: `b63e6003b19f`)은 전역적으로 고유하고, 클라이언트가 [매치메이커는](/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth.md) 할당으로 쉽게 접근할 수 있으며 또한 [심층 살펴보기](/docs.edgegap.com-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)? 연결이 만리방화벽에 의해 차단되었을 수 있습니다. 중국에 위치한 서버를 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시간이 지나면 종료됩니다. 장시간 실행되는 서버의 경우 다음을 사용하는 것을 고려해 보세요 [전용 플릿](/docs.edgegap.com-ko/learn/orchestration/private-fleets.md) 와 함께 [영속성](/docs.edgegap.com-ko/learn/orchestration/persistence.md).
* 참조 [#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 앱을 빌드할 때, Internet Access 권한이 출력 APK 클라이언트 빌드 아티팩트에서 자동으로 제거될 수 있습니다.
* 권한을 다시 추가하세요(이후 클라이언트를 다시 빌드해야 합니다):
  * Project Settings / OpenXR / :gear: Meta Quest Support / 인터넷 권한 강제 제거(체크 해제).
  * Player Settings / Internet Access(필수로 설정).

</details>

<details>

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

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

</details>

<details>

<summary>준비 완료가 된 후 서버 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`, 다시 빌드하고, 푸시한 뒤, 서버를 재배포하세요.
* 무료 요금제에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.
* 새 앱 버전을 만들 때 할당된 리소스를 늘릴 수 있습니다. 서버나 이미지를 다시 빌드하지 않고도 대시보드에서 앱 버전을 복제한 뒤 필요에 따라 이 값을 조정할 수 있습니다.

</details>

<details>

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

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

</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]: 내림차순, 빈 것 먼저
