팰월드 데디케이티드 서버 설치 방법 (오라클 클라우드)

팰월드 데디케이티드 서버 오라클 클라우드 인스턴스 설치 방법

오라클 클라우드에서 상시 무료 프리티어로 4코어 + 24GB ARM 서버를 제공해서 게임 서버를 무난하게 돌릴 수 있다

이번 글에서는 오라클 클라우드에서 팰월드(Palworld) 데디케이티드(dedicated, 전용) 멀티 서버를 여는 법을 알아본다

✔️
데디케이트 서버라고 부르는 사람이 많은데, 정확한 명칭은 데디케이티드(dedicated) 서버이다.
게임 이름도 팰월드로 불러주자 (팔월드 아님)

유의사항

리눅스, 도커 기초 지식이 필요하다

Dedicated 서버 0.1.4.1 버전 기준으로 작성되었고, 향후 변경사항이 생길 수 있다.

1) 오라클 클라우드 가입 및 vm 인스턴스 생성

먼저 오라클 클라우드를 가입하고 Ampere A1 인스턴스를 생성한다. (VM.Standard.A1.Flex)

알아둬야 할 점은 ARM 아키텍처 CPU를 사용하기 때문에 일반적인 바이너리나 도커 이미지가 안될 수 있다.

아래는 내가 만든 인스턴스의 정보이다. 그대로 따라할 필요는 없지만, 리전은 춘천으로 설정하는 것이 좋다. 홈 리전을 한번 설정하면 바꾸는 것이 거의 불가능하다고 하는데, 서울 리전은 사실상 무료 인스턴스 생성 불가 상태라, 춘천 리전을 선택하는 것이 좋다.

  • 리전: ap-chuncheon-1 (춘천)
  • OS 이미지: Rockylinux 9

오라클 클라우드 가입, 인스턴스 생성 등의 방법은 정리된 자료가 많기 때문에 자세한 과정은 생략한다.

Ampere 인스턴스의 Quota가 있기 때문에 인스턴스 생성 시도를 계속 해줘야 하는데, 나는 github actions를 활용했다.

2) 인스턴스 세팅

2-1) 네트워크 방화벽

VM 인스턴스는 기본적으로 모든 포트의 접근이 차단되어 있어 네트워크에서 게임에 사용되는 포트의 접근을 허용해줘야 한다.

아래 포트 인그레스 룰(Ingress Rule)을 추가한다

  • 8211 UDP
  • 27015 UDP

Virtual Cloud Networks - (vcn 이름) - Public Subnet - Security List - Ingress Rules에 추가하면 된다.

인그레스 룰 추가시 아래 사진처럼 입력한다.

oracle cloud ingress rule 추가 예시
8211 포트 인그레스 룰 추가 예시

3) 팰월드 서버 설치

팰월드 데디케이티드 서버 실행 방법은 여러가지가 있는데, 가장 간단한건 도커를 이용해 실행하는 것이다. 도커 이미지 내부에서 steamCMD를 이용해서 서버 실행, 중단 등 처리를 대신 해주기 때문에 사용하기 편리하다.

먼저 서버에 도커를 설치한다. dnf라는 패키지 매니저를 사용한다,

$ sudo dnf config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
$ sudo dnf -y install docker-ce docker-ce-cli containerd.io docker-compose-plugin
$ sudo systemctl --now enable docker
$ sudo usermod -aG docker $USER

도커 설치가 완료되었으면 이제 팰월드 서버를 설치해보자.

팰월드 서버 도커 이미지는 여러가지가 있는데, 나는 아래 이미지를 이용했다.

rocky linux의 홈 디렉토리는 /home/rocky이고, 홈 아래 폴더를 하나 만든다

# 도커 설정 등 저장용 디렉토리
/home/rocky$ mkdir pal
/home/rocky$ cd pal

# 데이터 저장용 서브디렉토리
/home/rocky/pal$ mkdir palworld

다음, 도커 이미지를 실행하기 위해 compose.yaml 파일을 작성한다

# /home/rocky/pal/compose.yaml
services:
  palworld-server:
    image: 'nitrog0d/palworld-arm64:latest'
    container_name: 'palworld-server'
    ports:
      - '8211:8211/udp'
      - '27015:27015/udp'
    environment:
      - ALWAYS_UPDATE_ON_START=true
      - MULTITHREAD_ENABLED=true
      - COMMUNITY_SERVER=false
    restart: 'unless-stopped'
    volumes:
      - './palworld:/palworld'

이제 pal 폴더에서 docker compose up -d을 입력하면 서버가 실행된다

docker compose ps로 컨테이너 상태를 확인할 수 있다. 아래는 내 서버의 예시다. 포트 몇개가 추가로 열린 것 외에는 동일하게 나올 것이다. 혹시 아래처럼 나오지 않으면 docker compose logs로 로그를 확인해보자.

/home/rocky/pal$ docker compose ps
NAME                IMAGE                            COMMAND                  SERVICE             CREATED        STATUS       PORTS
palworld-server     nitrog0d/palworld-arm64:latest   "/bin/sh -c /home/st…"   palworld-server     24 hours ago   Up 3 hours   0.0.0.0:8211->8211/udp, :::8211->8211/udp, 0.0.0.0:27015->27015/udp, :::27015->27015/udp, 0.0.0.0:25575->25575/tcp, :::25575->25575/tcp

서버가 실행되었다면 이제 팰월드에서 서버IP:8211로 접속할 수 있다. 서버 IP는 인스턴스의 퍼블릭 IP(Public IP, =공인 IP) 항목에서 확인할 수 있다.

참고로 이는 Ephemeral Public IP인데, 일단 이런게 있다는 것만 알아두자. Terminate 시에도 변경되지 않는 것을 원한다면 Reserved Public IP를 발급해야 한다.

Instance의 공인 IP(Public IP)

실행한 서버는 기본적으로 패스워드 없이, 목록에 나오지 않게 실행된다.

4) 추가작업

4-1) 팰월드 서버 설정 변경

서버 이름을 바꾸거나, 어드민 패스워드 변경 등을 하려면 서버 설정을 변경해줘야 한다. 설정은 PalWorldSettings.ini 파일에 반영해야 하고, 서버를 끈 상태로 수정 후 서버를 다시 켜야 반영된다.

아래 사이트에서 ini 파일을 간편하게 생성, 수정할 수 있다.

설정을 복사한 뒤, 서버를 종료하고, vim으로 설정 파일을 수정한 뒤, 서버를 다시 시작하면 된다.

# 서버 종료
/home/rocky/pal$ docker compose down

# 설정 파일 수정 (vim)
# 만약 없으면 새로 만든다
/home/rocky/pal$ vi  palworld/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini

# 서버 시작
/home/rocky/pal$ docker compose up -d

4-2) 서버 성능 개선

Engine.ini 파일에 언리얼엔진 설정을 조금 추가하면 데디케이티드 서버의 성능이 개선된다고 한다. 경로는 아래와 같다

/home/rocky/pal$ vi palworld/Pal/Saved/Config/LinuxServer/Engine.ini

아래 내용을 추가한다. 참고로 파일 맨 밑Paths=../../../Pal/Plugins/Wwise/Content 줄 밑에 추가해야 한다.

; Online Subsystem Utils Configuration
; Adjusting tick rates for LAN and Internet servers to enhance the frequency of game state updates, 
; leading to smoother gameplay and less desynchronization between server and clients.
[/script/onlinesubsystemutils.ipnetdriver]
LanServerMaxTickRate=120  ; Sets maximum ticks per second for LAN servers, higher rates result in smoother gameplay.
NetServerMaxTickRate=120  ; Sets maximum ticks per second for Internet servers, similarly ensuring smoother online gameplay.

; Player Configuration
; These settings are crucial for optimizing the network bandwidth allocation per player, 
; allowing for more data to be sent and received without bottlenecking.
[/script/engine.player]
ConfiguredInternetSpeed=104857600  ; Sets the assumed player internet speed in bytes per second. High value reduces chances of bandwidth throttling.
ConfiguredLanSpeed=104857600       ; Sets the LAN speed, ensuring LAN players can utilize maximum network capacity.

; Socket Subsystem Epic Configuration
; Tailoring the max client rate for both local and internet clients, this optimizes data transfer rates, 
; ensuring that the server can handle high volumes of data without causing lag.
[/script/socketsubsystemepic.epicnetdriver]
MaxClientRate=104857600          ; Maximum data transfer rate per client for all connections, set to a high value to prevent data capping.
MaxInternetClientRate=104857600  ; Specifically targets internet clients, allowing for high-volume data transfer without restrictions.

; Engine Configuration
; These settings manage how the game's frame rate is handled, which can impact how smoothly the game runs.
; Smoother frame rates can lead to a better synchronization between client and server.
[/script/engine.engine]
bSmoothFrameRate=true    ; Enables the game engine to smooth out frame rate fluctuations for a more consistent visual experience.
bUseFixedFrameRate=false ; Disables the use of a fixed frame rate, allowing the game to dynamically adjust frame rate for optimal performance.
SmoothedFrameRateRange=(LowerBound=(Type=Inclusive,Value=30.000000),UpperBound=(Type=Exclusive,Value=120.000000)) ; Sets a target frame rate range for smoothing.
MinDesiredFrameRate=60.000000 ; Specifies a minimum acceptable frame rate, ensuring the game runs smoothly at least at this frame rate.
FixedFrameRate=120.000000     ; (Not active due to bUseFixedFrameRate set to false) Placeholder for a fixed frame rate if needed.
NetClientTicksPerSecond=120   ; Increases the update frequency for clients, enhancing responsiveness and reducing lag.

설정을 적용하면 서버 FPS가 꽤 개선된다고 한다.

4-3) 기타 설정

아래 내용을 추가로 설정해두면 안정적 서버 운영에 도움이 된다

  • rcon-cli 설치: showPlayers, broadcast 등의 명령어를 사용할 수 있다
  • 모니터링: Prometheus 기반 모니터링 툴을 설치해두면 메모리나 서버 인원 등 서버 상태를 편리하게 확인할 수 있고 텔레그램 알림 등도 연동할 수 있다.
  • 백업 및 재시작 스크립트
    • 현재 팰월드 데디케이티드 서버엔 메모리 누수가 있어 주기적으로 재시작을 해줘야 한다. 또한 서버 데이터가 손상되는 일이 꽤나 잦다고 하니, 주기적 백업을 하는 것을 권장한다.
    • crontab과 shell script를 활용해 구성하면 된다

아래는 내 서버의 모니터링 페이지 예시이다

도커 컨테이너 대시보드
palworld exporter 이용한 수집한 메트릭 모니터링 대시보드
uptime kuma를 이용해 만든 status page. 20초 주기로 서버상태를 확인하며, 상태 변동시 텔레그램으로 메시지를 보냄

참고자료, 링​크