Programming/Docker

Docker - Palworld Dedicated Server 올리기 (팰월드 전용 서버)

awesometic 2024. 2. 4. 15:33
반응형

틈틈히 글을 완성하고 있는데, 그 며칠 사이에도 Docker 이미지에 대한 Github 의 설명이 계속 업데이트 되네요. 이 글의 내용이 항상 최신이 아닐 수도 있습니다, 잘 안 된다면 공식 Github 저장소로 찾아가서 한 번 확인해주세요.

Palworld

오랜만에 재밌는 게임 찾았습니다.

와이프랑 같이 하고 싶어서 처음엔 초대코드 생성으로 같이 했었는데, 이건 호스트가 게임에서 나가면 다른 사람이 게임을 할 수가 없는 멀티플레이 방식이더라구요.

그래서 개인 서버도 있겠다, 최근에 Proxmox 로 바꾼 제 서버에 LXC 컨테이너 하나를 생성해 Palworld Dedicated Server를 올려봤습니다.

처음엔 직접 Steam 설치하고 올려봤으나, 찾아보니 너무 잘 정리되어 있는 Docker 이미지가 있길래 그걸 사용하기로 했습니다. 잘 되어 있는 걸 굳이 사용하지 않을 이유는 없죠 :)

사실 없으면 직접 만들어 배포하려 했습니다만 제가 이 게임을 너무 늦게 알았나 봐요, 너무 많은 이미지가 배포되어 있어요

제가 한 방법은 윈도우에서 스팀을 통해 서버를 여는 방법이 아닌, 리눅스에서 Docker 를 통해 24시간 구동되는 서버를 여는 방법입니다.
간단한 네트워크 지식, 포트포워딩 (port forwarding) 등의 사전 지식이 있으셔야 합니다. 이미 서버를 돌리고 계시거나 관련 지식이 있으신 분들이 아닌 경우 먼저 관련 지식을 파악하신 후 시도해주세요 :)

Dedicated Server

제가 사용한 전용 서버 이미지는 아래 링크에 있습니다.

권장 사양

두 가지를 참고하시면 좋습니다.

  1. 공식 Palworld 추천 사양

Palworld tech guide 에 쓰여 있는 사양은 아래와 같습니다.

  1. Docker 이미지 제작자의 추천 사양

Github 저장소에 있는 최소 권장 사양은 아래와 같습니다.

즉, 대체로 최소 4 코어, 16 GB 램, 30 GB 이상의 스토리지를 사용하면 됩니다.

Docker Compose 로 설치

Docker compose 를 사용하지 않고 명령어로 실행하게 되면 여러 가지 단점이 있는데, 가장 큰 단점은 시스템이 어떤 이유로 재부팅될 때 자동으로 실행되지 않는단 점입니다.

물론 커맨드 자체를 Cron, Service 등 여러 가지 방법을 사용하여 재시작할 수는 있겠으나 조금 번거롭죠.

Docker Compose 를 사용해 설치하면 쉽게 여러 가지 문제가 해결됩니다.

파일/디렉토리 준비

docker-compose.yml 이 놓일 디렉토리를 준비해주세요. 여기 예시에선 /opt/docker/palworld 라고 하겠습니다.

sudo mkdir -p /opt/docker/palworld

그리고 아래에 game 디렉토리도 생성하고 Docker 제작자가 설명하는 대로 적절한 권한을 줍니다. 여기에 게임 진행 사항이 저장됩니다.

sudo mkdir /opt/docker/palworld/game
sudo chown -R 1000:1000 /opt/docker/palworld/game

docker-compose.yml 파일을 생성하고 아래 내용을 넣습니다. 텍스트 에디터는 편한 걸 사용하세요.

vi /opt/docker/palworld/docker-compose.yml
version: '3.9'
services:
  palworld-dedicated-server:
    #build: .
    container_name: palworld-dedicated-server
    image: jammsen/palworld-dedicated-server:latest
    restart: unless-stopped
    ports:
      - target: 8211 # Gamerserver port inside of the container
        published: 8211 # Gamerserver port on your host
        protocol: udp
        mode: host
      - target: 25575 # RCON port inside of the container
        published: 25575 # RCON port on your host
        protocol: tcp
        mode: host
    env_file:
      - ./default.env
    volumes:
      - ./game:/palworld

그리고 default.env 파일을 만들어 아래 내용을 넣습니다.

vi /opt/docker/palworld/default.env
# Change this for logging and backup, see "Environment variables" in the README.md
TZ=Europe/Berlin  
ALWAYS_UPDATE_ON_START=true
MULTITHREAD_ENABLED=true
COMMUNITY_SERVER=true
BACKUP_ENABLED=true
BACKUP_CRON_EXPRESSION=0 * * * *
BACKUP_RETENTION_POLICY=false
BACKUP_RETENTION_AMOUNT_TO_KEEP=30
STEAMCMD_VALIDATE_FILES=true
# Change this to manual if you want to edit your configs yourself
SERVER_SETTINGS_MODE=auto 
WEBHOOK_ENABLED=false
WEBHOOK_URL="YOUR-URL-IN-HERE"
WEBHOOK_START_TITLE="Server is starting"
WEBHOOK_START_DESCRIPTION="The gameserver is starting"
WEBHOOK_START_COLOR="2328576"
WEBHOOK_STOP_TITLE="Server has been stopped"
WEBHOOK_STOP_DESCRIPTION="The gameserver has been stopped"
WEBHOOK_STOP_COLOR="7413016"
WEBHOOK_INFO_TITLE="Info"
WEBHOOK_INFO_DESCRIPTION="This is an info from the server"
WEBHOOK_INFO_COLOR="2849520"
NETSERVERMAXTICKRATE=120
DIFFICULTY=None
DAYTIME_SPEEDRATE=1.000000
NIGHTTIME_SPEEDRATE=1.000000
EXP_RATE=1.000000
PAL_CAPTURE_RATE=1.000000
PAL_SPAWN_NUM_RATE=1.000000
PAL_DAMAGE_RATE_ATTACK=1.000000
PAL_DAMAGE_RATE_DEFENSE=1.000000
PLAYER_DAMAGE_RATE_ATTACK=1.000000
PLAYER_DAMAGE_RATE_DEFENSE=1.000000
PLAYER_STOMACH_DECREASE_RATE=1.000000
PLAYER_STAMINA_DECREACE_RATE=1.000000
PLAYER_AUTO_HP_REGENE_RATE=1.000000
PLAYER_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000
PAL_STOMACH_DECREACE_RATE=1.000000
PAL_STAMINA_DECREACE_RATE=1.000000
PAL_AUTO_HP_REGENE_RATE=1.000000
PAL_AUTO_HP_REGENE_RATE_IN_SLEEP=1.000000
BUILD_OBJECT_DAMAGE_RATE=1.000000
BUILD_OBJECT_DETERIORATION_DAMAGE_RATE=1.000000
COLLECTION_DROP_RATE=1.000000
COLLECTION_OBJECT_HP_RATE=1.000000
COLLECTION_OBJECT_RESPAWN_SPEED_RATE=1.000000
ENEMY_DROP_ITEM_RATE=1.000000
DEATH_PENALTY=All
ENABLE_PLAYER_TO_PLAYER_DAMAGE=false
ENABLE_FRIENDLY_FIRE=false
ENABLE_INVADER_ENEMY=true
ACTIVE_UNKO=false
ENABLE_AIM_ASSIST_PAD=true
ENABLE_AIM_ASSIST_KEYBOARD=false
DROP_ITEM_MAX_NUM=3000
DROP_ITEM_MAX_NUM_UNKO=100
BASE_CAMP_MAX_NUM=128
BASE_CAMP_WORKER_MAXNUM=15
DROP_ITEM_ALIVE_MAX_HOURS=1.000000
AUTO_RESET_GUILD_NO_ONLINE_PLAYERS=false
AUTO_RESET_GUILD_TIME_NO_ONLINE_PLAYERS=72.000000
GUILD_PLAYER_MAX_NUM=20
PAL_EGG_DEFAULT_HATCHING_TIME=72.000000
WORK_SPEED_RATE=1.000000
IS_MULTIPLAY=false
IS_PVP=false
CAN_PICKUP_OTHER_GUILD_DEATH_PENALTY_DROP=false
ENABLE_NON_LOGIN_PENALTY=true
ENABLE_FAST_TRAVEL=true
IS_START_LOCATION_SELECT_BY_MAP=true
EXIST_PLAYER_AFTER_LOGOUT=false
ENABLE_DEFENSE_OTHER_GUILD_PLAYER=false
COOP_PLAYER_MAX_NUM=4
MAX_PLAYERS=32
SERVER_NAME=jammsen-docker-generated-###RANDOM###
SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen
ADMIN_PASSWORD=adminPasswordHere
SERVER_PASSWORD=serverPasswordHere
PUBLIC_PORT=8211
PUBLIC_IP=
RCON_ENABLED=true
RCON_PORT=25575
REGION=
USEAUTH=true
BAN_LIST_URL=https://api.palworldgame.com/api/banlist.txt

설치 및 실행

설치 또한 Docker 실행 시 자동으로 진행됩니다. 아래 명령어로 간단히 설치/실행합니다.

docker-compose up -d && docker-compose logs -f

외부 연결 및 접속

게임은 UDP 8211 포트로 연결됩니다. 기존에 사용하시던 서버 셋팅에서 해당 Docker 이미지에 대한 호스트까지 8211/UDP 포트를 뚫어주세요.

그리고 자신의 외부 IP 를 통해 게임에 접속하실 수 있습니다.

멀티 플레이 참가하기 (전용 서버) 메뉴를 클릭하셔서,

맨 아래 주소를 적는 란에 적혀있는 포맷대로 IP와 포트를 적어 접속하면 게임을 하실 수 있습니다.

111.222.333.444:8211

월드 정보 변경하기

서버의 이름과 설명, 비밀번호 등을 변경해주는 것이 좋습니다. 특히 비밀번호가 없으면 IP와 포트 만으로 아무나 들어올 수 있어서 꼭 비밀번호는 꼭 설정해주세요.

default.env 파일에서 SERVER_PASSWORD 키에 대한 값을 바꿔주세요.

...
SERVER_NAME=jammsen-docker-generated-###RANDOM###
SERVER_DESCRIPTION=Palworld-Dedicated-Server running in Docker by jammsen
SERVER_PASSWORD=serverPasswordHere
...

Env 를 바꾸면 항상 Docker 컨테이너를 재시작해야 적용됩니다.

docker compose restart

도메인 연결

IP 를 곧바로 노출시키기 싫으시다면 도메인을 사용하는 방법이 있습니다.

기존에 사용하시던 도메인 프로바이더를 사용하셔도 되고, 따로 무료 도메인을 얻으셔도 됩니다.

전 개인적으로 예전에 주로 사용하던 내도메인.한국 도 괜찮다고 생각합니다. "kro.kr" 로 끝나서 도메인도 깔끔해요.

도메인 정보는 아래 사항을 참고하시면 됩니다.

  • 도메인을 연결하실 때 A 레코드 타입 으로 본인의 외부 IP 에 연결해주세요.
  • 서브 도메인 명을 적당히 적어주세요. 예를 들면, palworld.mydomain.compalworld 와 같이요.

A 레코드 타입은 간단하게 말하자면 도메인와 IP를 곧바로 매핑시키는 방법입니다. 따라서 해당 도메인 주소와 포트만 있으면 자택의 네트워크까지 곧바로 들어옵니다.

palworld.mydomain.com:8211

여담

서버 램을 꽤 많이 먹습니다. CPU와 스토리지는 상관 없는데, 여러 사람이 같이 플레이한다면 램은 충분히 할당해주세요.

와이프와 둘이 총 플레이 시간이 10 시간이 조금 넘고, 월드의 대부분을 아직 탐험하지 못했습니다. 근데 아무도 접속하지 않고 있어도 8 GB 가량을 먹고 있네요. :sweat_smile:

반응형