# 언리얼 엔진

직접 해보며 배우고 Edgegap에서 첫 전용 서버를 배포해 보세요. 이 가이드가 끝나면 비용 없이 Edgegap으로 전용 서버를 배포하게 됩니다.

Docker Desktop으로 빌드하는 것이 시작하는 가장 빠르고 쉽고 가장 신뢰할 수 있는 방법입니다.

{% embed url="<https://youtu.be/q7ljcr9rAWE>" %}

## ✔️ 준비

<details>

<summary><a href="https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension">Edgegap 퀵스타트 Docker 확장 프로그램 설치</a></summary>

* Docker Desktop / Extensions / Browse에서 설치하거나 [링크를 사용하세요](https://open.docker.com/extensions/marketplace?extensionId=edgegap/docker-extension).

<figure><img src="https://1562312210-files.gitbook.io/~/files/v0/b/gitbook-x-prod.appspot.com/o/spaces%2FsR0dHSFv9ymoC0DO5G8J%2Fuploads%2FraFWUCJWPZYvBMLieBUZ%2Fimage.png?alt=media&#x26;token=186886ac-accb-421d-b560-3ccefa7f29cb" alt=""><figcaption></figcaption></figure>

</details>

{% hint style="info" %}
**서버 빌드에 자신 있으신가요?** 다음으로 건너뛰기 [#customize-server-image](#customize-server-image "mention") 및 [advanced-features](https://docs.edgegap.com/docs.edgegap.com-ko/learn/advanced-features "mention").
{% endhint %}

## ⚙️ 1. 프로젝트 구성 <a href="#id-1-configure-project" id="id-1-configure-project"></a>

{% hint style="info" %}
이 방법은 Unreal Engine 소스 코드를 다운로드하거나 소스에서 빌드할 필요가 없습니다!
{% endhint %}

☑️ 먼저 **Unreal Engine 버전을 확인하는 것부터 시작하세요** - 프로젝트 파일의 값으로 미리 채워집니다.

☑️ **GitHub 사용자 이름과** [**PAT**](#user-content-fn-1)[^1] 을 [#preparation](#preparation "mention")에서 입력하여 GitHub에서 종속성을 다운로드하세요.

## 🔧 2. 게임 서버 빌드 <a href="#id-2-build-game-server" id="id-2-build-game-server"></a>

이제 프로젝트를 빌드하고 코팅하여 쉽게 재사용할 수 있는 Docker 이미지로 패키징하겠습니다.

☑️ 다음 옵션을 구성할 수 있습니다(또는 기본값 유지):

* **이미지 이름** 은 서버 빌드를 배포하기 전에 라벨링하는, 사용자가 정하는 고유 식별자입니다.
  * 보통 게임 이름이 포함되며, 예를 들어 “my-game-server”와 같습니다.
* **이미지 태그** 는 이미지의 특정 버전을 가리키는 식별자입니다.
  * “빌드 아티팩트”라는 용어는 이미지의 특정 버전을 가리킬 때도 사용됩니다.
  * 타임스탬프는 태그에 아주 좋은 옵션입니다. 예: `2024.01.30-16.23.00-UTC`  (기본값).

☑️ **프로젝트 빌드** 구성이 만족스러우면 실행하세요. 이 단계를 완료하면 로컬 Docker 클라이언트에 Linux 게임 서버 실행 파일이 포함된 새 이미지가 추가됩니다.

✅ 이제 다음 단계로 진행할 수 있습니다.

## 🧪 3. 서버를 로컬에서 테스트 <a href="#id-3-test-server-locally" id="id-3-test-server-locally"></a>

☑️ **로컬에서 실행할 이미지 태그를 선택하세요** (원격 이미지는 다운로드됩니다). 선택 사항으로, 추가 [docker run 인수](https://docs.docker.com/reference/cli/docker/image/build/#options) 를 제공하여 로컬 테스트를 사용자 지정할 수 있습니다:

* `-p 7777:7777/udp` - 이는 로컬 컨테이너의 [포트 매핑입니다](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions#port-mapping),
* `-e ARBITRIUM_PORT_GAMEPORT_INTERNAL=7777`  은 [환경 변수](#environment-variables) 입니다. 실제 Edgegap 배포를 모의하여, 게임 서버에 플레이어 연결을 수신할 내부 포트를 알려줍니다.

☑️ 구성이 마음에 들면 **Start Local Server**. 이 단계를 완료하면 **새 컨테이너가 시작되고** 개발 머신에서 실행됩니다.

☑️ 이제 Unreal Engine Editor(PIE) 게임 클라이언트를 로컬 서버 컨테이너에 연결할 차례입니다. Unreal PIE 콘솔을 `~`  (틸드)로 열고 다음 명령으로 연결하세요 `open <ip>:<port>`:

* `ip`  = `localhost`  또는 `127.0.0.1`  (대부분의 경우 동일),
* `port`  = Docker GUI에서 컨테이너의 무작위 외부 포트 값입니다.

✅ 이제 다음 단계로 진행할 수 있습니다.

<details>

<summary>문제 해결 및 FAQ</summary>

클라이언트를 서버에 연결할 수 없음 - `요청 시간이 초과되었습니다.` , `请求超时` , `ConnectionFailed` 또는 `포트 확인 실패`

* 먼저 컨테이너가 실행 중인지, 로그에 런타임 오류가 없는지 확인하세요.
* 다음 항목의 포트 값이 `docker run` 명령과 일치하는지 확인하세요.
* 게임 클라이언트가 컨테이너 세부 정보 페이지에 표시된 **외부 포트** 에 연결하고 있는지 확인하세요. 이 값은 보안상의 이유로 항상 무작위로 지정됩니다.
* 대상 파일 이름을 변경하고 게임 빌드를 1단계에서 설명한 대로 구성했는지 확인하세요 [#id-1-configure-project](#id-1-configure-project "mention").

***

컨테이너는 실행 중이지만 그 후 몇 분 동안 연결할 수 없습니다.

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

***

`경고: 바인드 주소에 대한 소켓을 만들 수 없습니다`

* Fab 에셋 스토어를 통해 Epic의 Steam Subsystem 플러그인을 설치하세요.
* GitHub에서 다운로드한 SteamCore 소스 버전과 함께 Edgegap Integration Kit(EGIK)를 사용할 때, Epic Games의 플러그인 배포 정책으로 인해 Epic의 Steam Subsystem 플러그인은 포함되지 않습니다.

***

연결은 되었지만 화면이 완전히 검게 보입니다.

* 올바른 **Game Default Map** 이 **Edit / Project Settings / Maps & Modes**.

</details>

## ☁️ 4. Edgegap에 게시 <a href="#id-4-publish-to-edgegap" id="id-4-publish-to-edgegap"></a>

☑️ **애플리케이션 이름을 선택하세요** Edgegap에서 유사한 이미지를 라벨링하고 그룹화하기 위해 사용합니다.

☑️ **게시할 이미지 태그를 선택하세요** 및 **이미지 업로드**. 이 단계를 완료하면 서버 이미지를 Edgegap Registry에 업로드하고 새 [애플리케이션 버전이 생성됩니다](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions) 웹 브라우저에서. **다음을 생성하도록 하세요** [**포트 매핑입니다**](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions#port-mapping) **프롬프트가 표시되면** 기본값으&#xB85C;**.**

{% hint style="success" %}
버그를 발견해서 다시 빌드/게시해야 하나요? **소스에서 다시 빌드** 를 사용하여 [#id-2.-build-game-server](#id-2.-build-game-server "mention") 및 [#id-4.-publish-to-edgegap](#id-4.-publish-to-edgegap "mention") **현재 확장 프로그램 입력 값으로 빠르게**
{% endhint %}

✅ 이제 다음 단계로 진행할 수 있습니다.

## 🚀 5. 클라우드에 배포 <a href="#id-5-deploy-to-cloud" id="id-5-deploy-to-cloud"></a>

☑️ 이제 최종 테스트를 수행하고 **Unreal Engine Editor를 클라우드 배포에 연결하겠습니다**. 당신의 **배포 호스트** 를 서버 IP 대신 사용하고 배포의 **외부 포트**를 사용하세요. 게임 클라이언트에서 Unreal 콘솔을 열고(틸드 `~`) 다음을 입력하세요 `open {host}:{port}` .

<details>

<summary>문제 해결 및 FAQ</summary>

클라이언트를 서버에 연결할 수 없음 - `요청 시간이 초과되었습니다.` , `请求超时` , `ConnectionFailed` 또는 `포트 확인 실패`

* 먼저 배포가 Ready 상태인지, 배포 로그에 런타임 예외나 오류가 없는지 확인하세요. 배포가 중지되었다면, 우리 [Dashboard](https://app.edgegap.com/deployment-management/deployments/list).
* 에서 로그를 확인하세요. [서버 빌드의 네트코드 설정에서 포트 설정이 귀하의](https://app.edgegap.com/application-management/applications/list)App version [서버 빌드의 네트코드 설정에서 포트 설정이 귀하의](https://app.edgegap.com/application-management/applications/list) 의 내부 포트와 일치하는지 확인하세요. 플러그인 빌드의 경우 포트는 자동으로 설정됩니다. 재빌드하지 않고도
* 게임 클라이언트가 컨테이너 세부 정보 페이지에 표시된 **외부 포트** 배포 세부 정보 페이지에 표시된 이 값은 보안상의 이유로 항상 무작위로 지정됩니다.
* 대상 파일 이름을 변경하고 게임 빌드를 1단계에서 설명한 대로 구성했는지 확인하세요 [#id-1.-configure-project](#id-1.-configure-project "mention").
* 중국에 거주하며 [Smart Fleets](https://docs.edgegap.com/docs/deployment/session/fleet-manager/fleet)를 사용 중인가요? 연결이 중국의 방화벽(Great Firewall) 때문에 차단될 수 있습니다. 중국에 위치한 서버를 플릿에 추가하거나 VPN을 사용하여 연결하는 것을 고려하세요.

***

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

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

***

`경고: 바인드 주소에 대한 소켓을 만들 수 없습니다`

* Fab 에셋 스토어를 통해 Epic의 Steam Subsystem 플러그인을 설치하세요.
* GitHub에서 다운로드한 SteamCore Integration Kit(SIK) 소스 버전과 함께 Edgegap Integration Kit(EGIK)를 사용할 때, Epic Games의 플러그인 배포 정책으로 인해 Epic의 Steam Subsystem 플러그인은 포함되지 않습니다.

***

연결은 되었지만 화면이 완전히 검게 보입니다.

* 올바른 **Game Default Map** 이 **Edit / Project Settings / Maps & Modes**.
* 다음 항목이 [Unreal Engine 버전 호환성 검사가 비활성화되었는지 확인하세요](#id-2.-configure-game-server-builds) 에서 `DefaultEngine.ini`.

***

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

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

***

배포가 X분 후 자동으로 중지되었습니다.

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

***

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

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

***

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

* 게임 엔진은 서버 초기화 중 CPU 집약적인 작업을 수행하는 경향이 있으므로 문제가 아닐 수 있습니다. 배포 시작 후 2\~3분이 지나도 CPU 사용량이 내려가지 않으면 서버를 최적화하거나 앱 버전 리소스를 늘려야 할 수 있습니다.
* 틱 속도를 줄이면 처리하는 메시지가 줄어 CPU 사용량을 제어하는 데 도움이 될 수 있습니다.
* 무료 등급에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.
* 새 앱 버전을 만들 때 할당된 리소스를 늘릴 수 있습니다. 서버나 이미지를 다시 빌드하지 않고도 Dashboard에서 앱 버전을 복제하고 필요에 따라 이 값을 조정할 수 있습니다.

***

배포가 반복적으로 재시작되며 오류가 표시됩니다 `OOM kill`

* 이는 할당된 메모리 양을 초과했기 때문입니다. 오브젝트 풀링, 압축, 또는 씬에서 불필요한 오브젝트 제거를 통해 메모리 사용량을 최적화하는 것을 고려하세요.
* 무료 등급에서는 1.5 vCPU와 3GB 메모리(RAM)로 제한됩니다.
* 새 앱 버전을 만들 때 할당된 리소스를 늘릴 수 있습니다. 서버나 이미지를 다시 빌드하지 않고도 Dashboard에서 앱 버전을 복제하고 필요에 따라 이 값을 조정할 수 있습니다.

***

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

* 할당된 앱 버전 메모리 양을 넘지 않는 한 문제되지 않습니다.
* 할당된 앱 버전 메모리 양을 초과하면 `OOM kill` 이 발생합니다(위 참조).

***

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

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

</details>

## 👉 다음 단계

### 배포 중지

다양한 방법으로 [배포를 중지하는 방법을 알아보세요](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#id-5.-deployment-stopped) 매치가 끝나고 플레이어가 떠난 후.

이 가이드를 따르고 Docker 확장 프로그램으로 빌드했다면, 그냥 메서드 `FGenericPlatformMisc::RequestExit` 를 호출하면 됩니다. 패키징된 이미지에는 서버 프로세스를 관리하는 스크립트를 추가했으며, 이는 원활한 배포 종료를 자동으로 수행합니다.

서버 수명 주기 관리를 사용자 지정하려면 우리의 [예제 `StartServer.sh`](https://github.com/edgegap/edgegap-unreal-buildutils/blob/main/StartServer.sh)  스크립트를 수정하세요.

{% hint style="info" %}
Unreal에서 수명 주기를 관리하고 싶으신가요? 다음을 참조하세요 [#integration-kit](https://docs.edgegap.com/docs.edgegap.com-ko/developer-tools#integration-kit "mention") 자체 중지 API 블루프린트를 위해.
{% endhint %}

{% hint style="warning" %}
배포 로그를 받으려면 [endpoint-storage](https://docs.edgegap.com/docs.edgegap.com-ko/docs/endpoint-storage "mention") 을 연결하세요. 그렇지 않으면 삭제됩니다!
{% endhint %}

### 주입된 변수

주입된 환경 변수에 접근하여 배포 ID, 서버 IP 주소, 서버 위치 등 유용한 정보를 읽을 수 있습니다. 각 배포에는 자동으로 다음이 포함됩니다:

* [배포 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#injected-environment-variables) - Edgegap에서 자동으로 제공됨,
* [매치메이킹 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking/matchmaker-in-depth#injected-environment-variables) - 사용할 때 Edgegap에서 자동으로 제공됨 [matchmaking](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking "mention"),
* [앱 버전 변수](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/application-and-versions#injected-variables) - 사용자가 구성할 수 있는 사용자 지정 키-값 쌍.

**현재 인스턴스가 게임 클라이언트인지 서버인지 확인하세요** Edgegap 변수가 설정되어 있는지 확인하여:

```cpp
if (
  FPlatformMisc::GetEnvironmentVariable(TEXT("ARBITRIUM_REQUEST_ID")).empty()
)
{
  // client code
} else {
  // server code
}
```

### 서버 프로파일링

Edgegap에서 서버 성능 문제를 이해하고 최적화하려면 [#container-logs](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#container-logs "mention"), [#container-metrics](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#container-metrics "mention")과 같은 더 많은 [#dashboard-monitoring](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#dashboard-monitoring "mention") 도구를 활용하세요.

또한 Edgegap과 함께 기존 Unreal Engine 프로파일링 도구를 사용할 수 있습니다:

* [Unreal Engine 서버에서 트레이싱을 구성하세요](https://dev.epicgames.com/documentation/en-us/unreal-engine/developer-guide-to-tracing-in-unreal-engine) (내장 및 사용자 지정 이벤트):
  * 서버 디스크에 트레이스를 저장하려면 `-tracefile`을 사용하고, 3rd party 저장소에 업로드하여 오프라인으로 분석하거나,
  * 또는 트레이스 데이터를 스트리밍하려면 [#port-mapping](https://docs.edgegap.com/docs.edgegap.com-ko/learn/orchestration/deployments#port-mapping "mention") 내부 포트용 `1981` UDP 프로토콜을 통해.
* 분석 [메모리 인사이트](https://dev.epicgames.com/documentation/en-us/unreal-engine/memory-insights-in-unreal-engine) 및 [네트워킹 인사이트](https://dev.epicgames.com/documentation/en-us/unreal-engine/networking-insights-in-unreal-engine) 및 [#optimize-server-builds](#optimize-server-builds "mention").

### 매치메이킹

배포를 수동으로 시작하고 URL과 포트를 붙여 넣는 것만으로는 라이브 게임에 충분하지 않습니다.

{% hint style="success" %}
[**매치메이킹에 대해 더 알아보기**](https://docs.edgegap.com/docs.edgegap.com-ko/learn/matchmaking) **자동으로, 제때 배포하려면**플레이어가 온라인에 접속할 때.
{% endhint %}

### 서버 빌드 최적화

**에셋 청킹을 구성하여 클라이언트 전용 에셋과 서버 에셋을 분리하세요.**

* 다음을 살펴보세요 [에픽의 에셋 청킹 기법과 권장 사항](https://dev.epicgames.com/documentation/en-us/unreal-engine/preparing-assets-for-chunking-in-unreal-engine) .

**클라이언트 전용이고 서버 실행에 필요하지 않은 에셋과 플러그인을 제외하세요.**

* 다음을 알아보세요 [빌드 시 에셋 및 플러그인 제외](https://dev.epicgames.com/community/learning/tutorials/Kp1k/unreal-engine-build-time-asset-and-plugin-exclusion).

**콘텐츠 코킹 전략을 검토하세요.**

* 다음을 고려하세요 [Cooking on the Fly (COTF)](https://dev.epicgames.com/documentation/en-us/unreal-engine/build-operations-cooking-packaging-deploying-and-running-projects-in-unreal-engine#cookonthefly) 를 사용하여 클라이언트 에셋 코킹을 지연시키고 서버 빌드 속도를 높이세요.

**런타임 메모리 부하를 줄이기 위해 레벨 스트리밍을 구현하세요.**

* 설계상 플레이어가 주로 같은 맵 영역에 함께 있게 된다면, [레벨 스트리밍은 서버의 메모리 사용량을](https://dev.epicgames.com/documentation/en-us/unreal-engine/level-streaming-in-unreal-engine) 60% 이상 줄이고, 클라이언트 성능을 향상시킬 수 있습니다!

**서버 실행에 절대적으로 필요한 것만 포함하세요.**

* 이미지에 사용하지 않는 파일을 복사하면 이미지 비대화, 더 긴 업로드 시간, 더 느린 캐싱 속도, 그리고 전반적으로 더 느린 서버 시작을 초래합니다. [Docker 이미지 최적화 제안을 검토하세요](https://docs.docker.com/build-cloud/optimization/#dockerignore-files).

<details>

<summary>예제 <code>.dockerignore</code> 파일로 추가 파일을 제거하세요.</summary>

```docker
# 컴파일된 오브젝트 파일
*.slo
*.lo
*.o
*.obj

# 사전 컴파일 헤더
*.gch
*.pch

# 컴파일된 동적 라이브러리
*.so
*.dylib
*.dll

# Fortran 모듈 파일
*.mod

# 컴파일된 정적 라이브러리
*.lai
*.la
*.a
*.lib

# 실행 파일
*.exe
*.out
*.app
*.ipa

# 이 프로젝트 파일들은 엔진에 의해 생성될 수 있습니다
*.xcodeproj
*.xcworkspace
*.sln
*.suo
*.opensdf
*.sdf
*.VC.db
*.VC.opendb

# 사전 컴파일된 에셋
**/SourceArt/**/*.png
**/SourceArt/**/*.tga

# 빌드
**/Build/*

# PakBlacklist-<BuildConfiguration>.txt 파일을 허용 목록에 추가
!**/Build/*/
**/Build/*/**
!**/Build/*/PakBlacklist*.txt

# Build의 아이콘 파일은 무시하지 않기
!**/Build/**/*.ico

# 에디터에서 생성된 구성 파일
**/Saved/*
**/Intermediate/*
**/DerivedDataCache/*
**/Binaries/*
**/Build/*
**/Releases/*
**/Packaged/*
```

</details>

**다음을 사용하는 것을 고려하세요** [**다단계 Docker 빌드(링크)**](https://docs.docker.com/build/building/multi-stage/)**.**

* 대용량 서버 종속성을 별도의 이미지로 분리하여 다단계 빌드에서 재사용하세요. Docker는 각 계층을 캐시하고 이전 버전을 그대로 재사용하며, 별도로 지시받지 않는 한 이 부분의 업로드를 건너뛰므로 대역폭과 업로드 완료를 기다리는 시간을 절약할 수 있습니다.
* Dockerfile 명령 중 하나가 오류를 발생시키는 이유를 잘 모르겠다면 로컬에서 디버깅해 보세요. 문제가 발생하기 직전에 새 스테이지를 만들고(두 번째 `FROM` 명령을 추가), `--target` 을 사용하여 빌드 프로세스가 문제의 스테이지에서 멈추도록 한 다음, `docker exec -it {container} /bin/bash` 를 사용하여 컨테이너 내부의 대화형 터미널에 들어가세요. 그런 다음 베이스 이미지에서 셸 명령을 사용해 더 자세히 조사할 수 있습니다(예: `top` 우분투에서).

### 서버 이미지 사용자 지정

또한 빌드 크기 최적화, 불필요한 종속성, 더 복잡한 시작 프로세스 때문에 이미지에 대해 더 많은 제어가 필요한 사용자를 위해 자체 Dockerfile 추가도 지원합니다. 이제 몇 가지 “직접 해보기” 팁과 모범 사례를 공유하겠습니다.

[^1]: Personal Access Token
