> 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 게임 **서버 수명은 종종 개별 플레이어 세션보다 길다**.

세션은 일반적으로 [Server Browser](/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 주소를 제공하세요**. 이 접근 방식은 추가적인 클라이언트 측 지리 조회 구현이 필요하며, 개발자의 솔루션에 전적으로 의존합니다.

### 지역 잠금

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

## 🟢 연결 품질

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

일부 문제의 근본 원인은 플레이어에게 보이지 않을 수 있으므로, 스튜디오와 호스팅 제공업체의 협력이 매우 중요할 수 있습니다. **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") 최상의 결과를 얻으려면 서로 가까워야 합니다(같은 지역),
  * 다음을 참조하세요 [매치메이킹](/docs.edgegap.com-ko/learn/matchmaking.md) 및 [Ping Beacons](/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")).
* [Server Browser](/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="warning" %}
**요청이 너무 많음 429** - 안정성을 보장하고 예기치 않은 청구서를 방지하기 위해, 조직별 속도 제한은 **40 req/s**. [문의하기](mailto:info@edgegap.com) 출시를 계획하고, 출시 트래픽을 추정하며, 성공을 준비하세요.
{% endhint %}

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

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

{% hint style="success" %}
배포가 Ready 상태가 되면, **성공할 때까지 플레이어 연결을 재시도하세요**또는 사전 정의된 클라이언트 타임아웃까지.
{% 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="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) 와 함께 [Ping Beacons](/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") 및 [Ping Beacons](/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>

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


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
