Docker Composeを使ってPalWorldのサーバを建てる

最近はPalWorldにどっぷりハマっています。
マルチプレイをする場合は、24時間起動し続けたいわけでなければ無理してサーバを建てるメリットはないんですが、 それでも建てたいかつ、比較的環境を汚したくない人向けの簡単な記事です。

ポート開放や正式な建て方に関しては公式や他のブログを参考にしてください。
あくまで弊宅ではKubernetesクラスタ上でPalWorldを動作させているため、 このやり方はデータのチェックや動作確認で利用していることが多いです。

TL;DR

  • PalWorldSettings.iniとGameUserSettings.iniを用意する
  • 記事のDockerfileとcompose.yamlを参考にして用意する

ディレクトリ構造

最終的なディレクトリ構造は以下のような形になります。

.
├── compose.yaml
├── Dockerfile
├── GameUserSettings.ini
├── PalWorldSettings.ini
└── SaveGames

【任意】SaveGamesを用意する

既にあるセーブデータがあり再利用したい場合は、どうにかしてSaveGamesに以下のような構造でデータを持ってきます。

SaveGames
└── 0
    └── A091215A35CD4039A7860DEE387F2838
        ├── LevelMeta.sav
        ├── Level.sav
        └── Players
            ├── abcedf00000000000.sav
            └── fdecba00000000000.sav

PalWorldSettings.iniを用意する

PalWorldSettings.iniはジェネレーターなどが有志で公開されているので、それを参考に用意してください。

補足

ジェネレーターや他のブログを見ればわかりますが、現状反映されない項目が多くあります。
ですが、誰かがホストとしてゲームを実行している場合はより多くの設定が反映されるため、 現時点ではサーバを用意するメリットは基本的に薄いケースがあります。

GameUserSettings.iniを用意する

こちらは他のやり方だとあまり用意するケースはないかと思いますが、 このファイルには起動時に利用するセーブデータの指定を行うことができます。

コンテナの再作成や既にあるサーバのデータを再利用したいケースのために用意しています。

[/Script/Pal.PalGameLocalSettings]
AudioSettings=(Master=0.500000,BGM=1.000000,SE=1.000000,PalVoice=1.000000,HumanVoice=1.000000,Ambient=1.000000,UI=1.000000)
GraphicsLevel=None
DefaultGraphicsLevel=None
bRunedBenchMark=False
bHasAppliedUserSetting=False
DedicatedServerName=A091215A35CD4039A7860DEE387F2838
AntiAliasingType=AAM_TSR
DLSSMode=Performance
GraphicsCommonQuality=0

A091215A35CD4039A7860DEE387F2838 に関しては文字列に書き換えます。
デフォルトでは16進数で命名されていますが、正直なんでも良いです。
既にあるセーブデータを流用する場合は、SaveGames/0配下のディレクトリ名に合わせて指定してください。

SaveGames
└── 0
    └── B091215A35CD4039A7860DEE387F2121

この場合A091215A35CD4039A7860DEE387F2838B091215A35CD4039A7860DEE387F2121に書き換えます。

Dockerfileを用意する

以下を参考にDockerfileを作成します。

FROM ubuntu:22.04

RUN apt update -qq \
    && apt install -y vim ca-certificates curl lib32gcc-s1 xdg-user-dirs \
    && apt clean \
    && rm -rf /var/lib/apt/lists/*

RUN useradd -m steam
USER steam

# FYI: https://developer.valvesoftware.com/wiki/SteamCMD#Linux
ENV STEAM_ROOT_PATH /home/steam/Steam
ENV STEAMCMD /home/steam/Steam/steamcmd.sh
RUN mkdir -p $STEAM_ROOT_PATH
WORKDIR $STEAM_ROOT_PATH
RUN curl -sqL "https://steamcdn-a.akamaihd.net/client/installer/steamcmd_linux.tar.gz" | tar zxvf - \
    && $STEAMCMD +quit
RUN mkdir -p $HOME/.steam/sdk64/ \
    && $STEAMCMD +login anonymous +app_update 1007 +quit \
    && cp $STEAM_ROOT_PATH/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so $HOME/.steam/sdk64/

# # FYI: https://tech.palworldgame.com/dedicated-server-guide#linux
RUN $STEAMCMD +login anonymous +app_update 2394010 validate +quit
WORKDIR $STEAM_ROOT_PATH/steamapps/common/PalServer
RUN mkdir -p Pal/Saved/SaveGames
CMD ["./PalServer.sh"]

copmose.yamlを用意する

以下を参考にcompose.yamlを作成します。

services:
  palworld:
    build: .
    image: palworld
    restart: always
    ports:
      - 32111:8211/udp
    volumes:
      - ./PalWorldSettings.ini:/home/steam/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
      - ./GameUserSettings.ini:/home/steam/Steam/steamapps/common/PalServer/Pal/Saved/Config/LinuxServer/GameUserSettings.ini
      - ./SaveGames:/home/steam/Steam/steamapps/common/PalServer/Pal/Saved/SaveGames

ちょっと長いですが、PalWorldSettings.ini、GameUserSettings.ini、SaveGamesをコンテナにマウントしています。

コンテナを起動する

ここまでくれば後は起動は簡単です。

docker compose up -d

と実行し、しばらく待てば接続できるようになります。
停止させたい場合は、

docker compose stop

と入力するだけです。

おまけ

WSL 2で動かしてるけど接続できない

Docker Desktop for Windowsではなく、WSL 2に直接インストールしたDocker Engineの場合、 WSL 2がUDPのポートフォワードに対応していないためアクセスすることができません。

大人しくDocker Desktop for Windowsをインストールしておきましょう。

サーバのアップデートが必要

コンテナを停止した後にコンテナイメージを再作成すればOKです。

# 停止
docker compose stop

# イメージの再作成
docker compose build --no-cache

# 起動
docker compose up -d