Profile picture

[Docker] 팰월드(Palworld) 게임 서버 구축하기

JaehyoJJAng2024년 02월 01일

◾️ Palworld

image
2024년 1월 18일에 스팀에서 출시한 팰월드(Palworld)란 게임이며, 현재 동접자 200만을 넘길 정도로 초대박을 치고 있는 아주 재미있는 게임이다.

현재 인게임내 초대 코드로 방을 만들면 최대 4인까지 같이 플레이가 가능하다.

더 많은 인원끼리 플레이 하고싶다면 데디케이트 서버를 구축하여 최대 32명까지 동시에 플레이가 가능하다.

하지만 서버 사양에 따라 게임 플레이에 지장이 갈 수 있으니 최대한 좋은 사양으로 서버를 구축해야 할 것이다.


◾️ 설치 환경

  • OS: Ubuntu 22.04
  • CPU: AMD Ryzen 5 5600x 6-Core
  • Memory: 32GB
  • Disk: 1TB

◾️ 디렉토리 구조

tree -L 2 .

image


◾️ 사전 준비

팰월드 게임 서버를 구축하는 방법들은 여러가지가 존재한다.

  • 클라우드 플랫폼 (GCP,NCP,AWS ..)
  • 로컬 PC
  • VMware
  • ...

그 외에 여러 방법이 있을 수 있겠지만 나는 집에 있는 미니 데스크탑에 Proxmox를 네이티브로 설치하고

Ubuntu 22.04 이미지를 가상 머신으로 실행하여 팰 월드 게임 서버를 구축해 볼 것이다.


그러기 위해서는 아래와 같은 사전지식 및 파일이 필요하다.


◾️ 서버 구축

  • Proxmox 네이티브 설치 및 VM 설치 과정은 생략

▪️ VM 생성

image


▪️ 도커 설치

아래 게시글을 참고하여 도커를 설치
👉 도커 쉽게 설치하기! - WTT Devlog


▪️ 볼륨 디렉토리 생성

Palworld 및 게임 데이터를 위한 디렉토리 생성

mkdir ~/palworld

게임 데이터 동기화를 위한 볼륨 폴더 생성

mkdir ~/palworld/game

# 권한 설정 (모든 권한 허용)
chmod 777 ~/palworld/game
chown -R 1000:1000 ~/palworld/game

💥 참고사항

서버 세이브 경로 : ~/palworld/game/Pal/Saved/SaveGames/O/
서버 설장 파일 경로 : ~/palworld/game/Pal/Saved/Config/LinuxServer/
서버 세이브 파일 교체 시 GameUserSettings.ini 파일에서
DedicatedServerName의 값을 기존 세이브 폴더명으로 수정하고 기존 세이브를 세이브 경로에 복사해야함.

작업 완료 후, 반드시 game 폴더 하위까지 파일 권한 변경
(다음 명령어 실행 👉 chmod -R 777~/palworld/game && chown -R 1000:1000 ~/palworld/game)


▪️ Docker Compose


~/palworld/docker-compose.yaml

version: "3.9"
services:
  palworld:
    image: thijsvanloef/palworld-server-docker:latest
    restart: always
    container_name: palworld-server
    stop_grace_period: 30s # Set to however long you are willing to wait for the container to gracefully stop
    ports:
      - 8211:8211/udp
      - 27015:27015/udp
    environment:
      - PUID=1000
      - PGID=1000
      - PORT=8211 # Optional but recommended
      - PLAYERS=10 # Optional but recommended
      - SERVER_PASSWORD="" # Optional but recommended
      - MULTITHREADING=true
      - RCON_ENABLED=true
      - RCON_PORT=25575
      - TZ=Asia/Seoul
      - ADMIN_PASSWORD="adminPasswordHere"
      - COMMUNITY=false  # Enable this if you want your server to show up in the community servers tab, USE WITH SERVER_PASSWORD!
      - SERVER_NAME="Pal World"
      - SERVER_DESCRIPTION=""
    volumes:
      - ./game:/palworld/

• 컨테이너 실행

컨테이너 실행

docker-compose up -d --build

컨테이너 상태 체크

docker-compose ps

• rcon commands

RCON is enabled by default for the palworld-server-docker image. Opening the RCON CLI is quite easy:

docker exec -it palworld-server rcon-cli

# Brodcast
docker exec -it palworld-server rcon-cli "Broadcast Hello everyone!"

List of server commands

Command Info
Shutdown {Seconds} {MessageText} The server is shut down after the number of Seconds
DoExit Force stop the server.
Broadcast Send message to all player in the server
KickPlayer {SteamID} Kick player from the server..
BanPlayer {SteamID} BAN player from the server.
TeleportToPlayer {SteamID} Teleport to current location of target player.
TeleportToMe {SteamID} Target player teleport to your current location
ShowPlayers Show information on all connected players.
Info Show server information.
Save Save the world data.

▪️ 방화벽 설정

포트 설명
8211/udp 팰월드 접속 포트
25575/tcp RCON 접속 포트
15636/tcp 팰월드 서버<->스팀API 포트
15636/udp 팰월드 서버<->스팀API 포트
15637/tcp 팰월드 서버<->스팀API 포트
15637/udp 팰월드 서버<->스팀API 포트

방화벽 포트 허용
(firewall 기준)

sudo firewall-cmd --permanent --zone=public --add-port=8211/udp
sudo firewall-cmd --permanent --zone=public --add-port=15636/tcp
sudo firewall-cmd --permanent --zone=public --add-port=15636/udp
sudo firewall-cmd --permanent --zone=public --add-port=15637/tcp
sudo firewall-cmd --permanent --zone=public --add-port=15637/udp
sudo firewall-cmd --permanent --zone=public --add-port=25575/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-port

▪️ 공유기 설정

게이트웨이 확인

# 리눅스의 경우
sudo netstat -nr | grep "^0.0.0.0"

image


브라우저에 공유기 게이트웨이 주소 입력
👉 (http://게이트웨이주소)
image


포트포워딩에 아래 포트들 추가
8211 udp
25575 tcp
15636-15637 tcp/udp
image


◾️ 서버 접속 테스트

A. IP주소:8211로 접속 테스트
image


B. 게임 플레이
image
image


◾️ 백업 스크립트


▪️ 유저 데이터 찾기


게임 서버 운영을 하다보면 이상한 사람들이 많아서
쾌적한 서버 운영을 위해 게임 분위기를 흐리는 사람들(핵)을 주기적으로 밴 시켜주어야 한다.

그렇게 되면 밴 당한 유저의 세이브데이터도 지워줘야 하는데 플레이어의 세이브 데이터 파일 이름이 16진수로 변환되어 있어서 처음 보면 이 파일이 어떤 유저의 데이터인지 분간이 안간다.

잘못해서 다른 선량한 유저의 세이브 데이터라도 지우는 날에는 대참사가 일어나는 것이다.


먼저, 유저들의 세이브 데이터는 어떤 파일인지 살펴볼까?

ls -lh game/Pal/Saved/SaveGames/0/4D308CFCDF584AFCAB7E66F8BB5A881D/Players/

image
누구의 데이터인지 알아보기 힘들게 되어있지만, 우리는 저 박스친 부분만 체크하고 있으면 된다.


자, rcon 컨테이너에 아래 명령어를 치면 현재 내 서버에 접속 중인 유저들의 playeruid를 아래처럼 볼 수가 있다.
image
저 값을 16진수로 변환한 결과가 해당 유저의 세이브 데이터 파일이름이 된다.


예시로 'MUSIN' 이라는 유저의 playeruid는 '1951978129' 이다.
저 값을 16진수로 변환하면 어떻게 될까?

아래 페이지에 들어가 '1951978129' 이 값을 Convert 해보자.
https://www.binaryhexconverter.com/decimal-to-hex-converter
image
'7458D291' 라는 16진수 값으로 변환되었다.


눈치를 챘겠지만 '7458D291' 라는 파일 이름은 위에 플레이어들의 세이브 데이터 파일들 중에 하나였다.
image
이런식으로 밴 당한 유저의 세이브 데이터를 찾아보면 될 것 같다!


✏️ 배율표

설정 기본값 내용 가변값 기타
Difficulty None 팔월드 난이도 None
Casual
Normal
Hard
DayTimeSpeedRate 1 낮 경과 속도 0.1 ~ 5
NightTimeSpeedRate 1 밤 경과 속도 0.1 ~ 5
ExpRate 1 경험치 획득 배율 0.1 ~ 20
PalCaptureRate 1 PAL 포획 확률 배율 0.5 ~ 2
PalSpawnNumRate 1 PAL 출현 배율 0.5 ~ 3 게임 성능에 영향 끼침
PalDamageRateAttack 1 PAL이 주는 피해 배율 0.1 ~ 5
PalDamageRateDefense 1 PAL이 받는 피해 배율 0.1 ~ 5
PalStomachDecreaceRate 1 PAL 포만도 감소 배율 0.1 ~ 5
PalStaminaDecreaceRate 1 PAL 기력 감소 배율 0.1 ~ 5
PalAutoHPRegeneRate 1 PAL HP 자연 회복 배율 0.1 ~ 5
PalAutoHPRegeneRateInSleep 1 PAL 수면 시 HP 회복 배율 0.1 ~ 5 상자 내 HP 회복 배율
PlayerDamageRateAttack 1 플레이어가 주는 피해 배율 0.1 ~ 5
PlayerDamageRateDefense 1 플레이어가 받는 피해 배율 0.1 ~ 5
PlayerStomachDecreaceRate 1 플레이어 포만도 감소 배율 0.1 ~ 5
PlayerStaminaDecreaceRate 1 플레이어 기력 감소 배율 0.1 ~ 5
PlayerAutoHPRegeneRate 1 플레이어 HP 자연 회복 배율 0.1 ~ 5
PlayerAutoHPRegeneRateInSleep 1 플레이어 수면 시 HP 회복 배율 0.1 ~ 5
BuildObjectDamageRate 1 건축물 상대 피해 배율 0.1 ~ 3
BuildObjectDeteriorationDamageRate 1 건축물의 노화 속도 배율 0 ~ 10
DropItemMaxNum 3000 월드 내의 드롭 아이템 최대 수 0 ~ 5000
CollectionDropRate 1 채집 아이템 획득량 배율 0.5 ~ 3
CollectionObjectHpRate 1 채집 오브젝트 HP 배율 0.5 ~ 3
CollectionObjectRespawnSpeedRate 1 채집 오브젝트 생성 간격 0.5 ~ 3
EnemyDropItemRate 1 드롭 아이템 양 배율 0.5 ~ 3
PalEggDefaultHatchingTime 72 거대알 부화에 걸리는 시간(h) 0 ~ 240 다른 알도 상응하여 부화 시간 변경됨
bEnableInvaderEnemy True 습격 이벤트 발생 여부 True
False
DeathPenalty All 사망 패널티
None: 사망 패널티 없음
Item: 장비 이외의 아이템 드랍
ItemAndEquipment: 모든 아이템 드랍
All: 모든 Pal과 모든 아이템 드랍
None
Item
ItemAndEquipment
All
GuildPlayerMaxNum 20 길드 내 최대 인원 수 1 ~ 100
bEnablePlayerToPlayerDamange False 플레이어간 데미지 여부 True
False
bEnableFriendlyFire False 아군간 데미지 여부 True
False
BaseCampWorkerMaxNum 15 거점 작업 팰 최대 수 1~20
BaseCampMaxNum 128 거점 최대 수량
WorkSpeedRate 1 작업 속도 배율
blsPvP False PvP 활성화 여부 True
False
CoopPlayerMaxNum 4 협동던전 최대인원
ServerPlayerMaxNum 32 서버 최대 인원
ServerName 서버명
ServerDescription 서버 설명
PublicPort 8211 공용 포트
PublicIP 공용 IP

Loading script...