パルワールドのサーバをConoHa VPSで建てたので備忘録

## 概要
最近何かと話題になっているパルワールド（英語:Palworld）の専用マルチサーバーをConoHa VPS上で構築する方法を詳しく解説します。

:::note warn
現在はSteam版のみ専用サーバに接続できます。
:::
:::note warn
この記事は中級者以上向けです。
ConoHaのレンタルサーバを用いる場合、ConoHa for GAMEを用いることでより簡単に専門サーバを建てられる可能性があります。
:::
:::note
[公式ガイド](https://tech.palworldgame.com/dedicated-server-guide)や[日本語版Q&A](https://docs.google.com/document/d/e/2PACX-1vTm43IoZ--_EGVCd2_tZGJNf7HzjgJmYTRkfNk8rpKWxDQgMY5Cq8_w5x6xJBpx-c7_7TIqDYSw6WRp/pub)も同時に参照してください。
:::



## サーバーの基本構成
| -       | スペック       | 解説                            |
|:-------:|:------------:|:------------------------------:|
| OS      | Ubuntu 22.04 | 好きなものを選んでください           |
| CPU     | 6コア         | 公式推奨は4コア以上です            |
| メモリ    | 8GB          | 4人以上のプレイなら最低でも8GBは必要  |
| ストレージ | SSD 100GB    | 30GBもあれば問題ないと思います       |

## 構築方法
### アカウントの追加
まずはパルワールド用にアカウントを作ります。

:::note warn
パルワールドのサーバはrootユーザだと起動できません。
:::

```bash
# アカウントの追加
$ sudo useradd -m palworld
```
パスワードも作っておきます。
```bash
# アカウントにパスワードを設定
$ sudo passwd palworld
```
なお、パスワードを入力するときはターミナル上には何も表示されません。
### sudoの付与
ここで追加したユーザーをsudoできるようにしておきます。
```bash
# sudo権限の付与
$ sudo usermod --append --groups sudo palworld
```
アカウント切り替えを行なっておきます。
```bash
# アカウントの切り替え
$ su - palworld
```

## SteamCMDの導入
### SteamCMDのインストール
規約への同意を求められるので、確認しつつ[OK], [Agree]を順番に押していきます。
```bash
# リポジトリの追加
$ sudo add-apt-repository multiverse

# i386アーキテクチャのパッケージを追加
$ sudo dpkg --add-architecture i386

# インストール可能なパッケージの一覧を更新
$ sudo apt update

# SteamCMDをインストール
$ sudo apt install steamcmd
```
SteamCMDは``/usr/games/``にインストールされます。
### SteamCMDを起動する
SteamCMDのインストール先に移動します。
```bash
# ディレクトリの移動
$ cd /usr/games/
```
SteamCMDを起動します。
```bash
# SteamCMDを起動
$ steamcmd
```
初回起動でアップデートを自動インストールするはずなので待ちます。
``Steam>``となれば大丈夫です。

### パルワールドサーバのインストール
実際にパルワールドのサーバをインストールしていきます。

```bash
# anonymousユーザでログイン
Steam> login anonymous 

# パルワールドをインストール
Steam> app_update 2394010 validate 

# SteamCMDを終了
Steam> quit
```

なお、```2394010```はパルワールドのSteam内番号です。

### サーバーの確認
Steamworks SDK Redist をダウンロードしてコピーします。
```bash
# ディレクトリの作成
$ mkdir -p /home/palworld/.steam/sdk64/

# ディレクトリの移動
$ cd /usr/games/

# Steamworks SDK Redistをダウンロード
$ steamcmd +login anonymous +app_update 1007 +quit

# Steamworks SDK Redistをコピー
$ cp /home/palworld/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so /home/palworld/.steam/sdk64/
```

サーバが起動するか確認
```bash
# ディレクトリの移動
$ cd /home/palworld/Steam/steamapps/common/PalServer/

# サーバの起動
$ ./PalServer.sh
```

以下のような画面になれば完了。```Ctrl(⌘)+C```で一旦終了しましょう。
```
Shutdown handler: initalize.
Increasing per-process limit of core file size to infinity.
dlopen failed trying to load:
steamclient.so

with error: steamclient.so: cannot open shared object file: No such file or directory
[S_API] SteamAPI_Init(): Loaded '/home/palworld/.steam/sdk64/steamclient.so' OK.  (First tried local 'steamclient.so')
CAppInfoCacheReadFromDiskThread took 3 milliseconds to initialize
dlmopen steamservice.so failed: steamservice.so: cannot open shared object file: No such file or directory
Setting breakpad minidump AppID = 2394010
    
[S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
[S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.
```

## ポート解放を行う
サーバを建ててもポート解放をしないと誰も参加できません。
パルワールドはUDPプロトコルで8211番のポートを使用します。
<details><summary>ConoHa VPS以外の方はこちら</summary>

```bash
# ファイアウォールの有効化
$ sudo ufw enable
```
8211/udpを許可してあげます。
```bash
# 8211/udpへの通信を許可
$ sudo ufw allow 8211/udp

# ファイアウォールのリロード
$ sudo ufw reload
```


</details>

### ConoHa VPSの場合

ConoHaのVPSサービスを使っている方は、セキュリティグループ機能を使えば簡単にポート解放できます。
まずはUbuntu側のファイアウォールを切ります。
```bash
# ファイアウォールの無効化
$ sudo ufw disable
```
パルワールドのサーバで使うポートを許可するセキュリティグループを作ります。

![1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/f8544a0f-12a2-9eb0-3a62-39054cf10930.png)

![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/27bc9bf4-0ec3-f644-bbed-64e95be2d411.png)

![3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/abb5bcc0-ac27-efbc-1d51-dca05499b668.png)

セキュリティグループの名前は自分のわかりやすいもので大丈夫です。

![4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/45f7e278-fdd1-3d5b-4f6e-1114c7cae853.png)

通信方向はInでIPv4, IPv6の両方のUDPプロトコル8211番を開放してあげます。

![5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/c9564867-37ab-330b-d7e7-d64403f1ba60.png)

サーバの設定画面のネットワーク情報タブからセキュリティグループを変更します。

![6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/743add28-01bf-ae89-e38f-c7a6fcbec9fc.png)

![7.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/538390/624af359-b1ce-9c4e-3813-b0f4d1214630.png)
これでサーバに接続することができるようになりました。
初期設定では```IPアドレス:8211```に接続し、サーバに接続するためのパスワードは作っていないので```パスワードを使用```のチェック欄のマークは外しておきましょう。
## サービスに登録して自動起動するようにする
ここからは追加の設定です。必要ならば設定してください。
systemdにサービスを登録して、OS起動時に自動でサーバが立ち上がるようにします。
viなどで適宜作成してください。
```bash
$ sudo vi /etc/systemd/system/palworld-dedicated.service
```
``iキー``（もしくは``aキー``）で編集モードに入れますので、以下を打ち込んでください。
```ini
[Unit]
Description=Palworld Dedicated Server
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target

[Service]
ExecStart=/home/palworld/Steam/palworld/PalServer.sh port=8211 players=32 -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS
LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
Restart=always
User=palworld
Group=palworld
TimeoutStartSec=10

[Install]
WantedBy=multi-user.target
```
``escキー``を押して編集モードから離脱し、``:wq``と打ち込んで保存してください。
デーモンをリロードして再起動させます。
```bash
# デーモンのリロード
$ sudo systemctl daemon-reload

# サービスの自動起動を有効化
$ sudo systemctl enable palworld-dedicated.service

# サービスの起動
$ sudo systemctl start palworld-dedicated.service
```
サービスを起動することでサーバも起動されるようになります。
なお、必要に応じて以下のコマンドも使用してください。
```bash
# サーバを停止させる
$ sudo systemctl stop palworld-dedicated.service

# サーバのステータスを確認
$ systemctl status palworld-dedicated.service

# サーバのログを確認
$ sudo journalctl -u palworld-dedicated.service
```

## サーバの設定を変更する。
まずはデフォルトで用意されている設定ファイルをコピーし、設定ファイルを新しく作成します。

```bash
# ディレクトリの移動
cd /home/palworld/Steam/steamapps/common/palworld

# デフォルト設定ファイルをコピー
cp DefaultPalWorldSettings.ini Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
```
ここで一旦サーバを停止させ、設定ファイルの変更を行います。
```bash
# サーバを停止
sudo systemctl stop palworld-dedicated.service
```
:::note warn
サーバを一旦停止させないと値が上書きされます。
停止してから編集を行って下さい。
:::

```bash
# 任意の値を変更
vi Pal/Saved/Config/LinuxServer/PalWorldSettings.ini
```

以下の表を参考に設定してください。

| 項目名                               | デフォルトの値     | 解説                                              |
|:---------------------------------:|:------------------:|:-------------------------------------------------:|
| Difficulty                           | None        | ゲームの難易度|
| DayTimeSpeedRate             | 1.000000           | 昼の経過速度倍率                                   |
| NightTimeSpeedRate            | 1.000000           | 夜の経過速度倍率                                   |
| ExpRate                              | 1.000000           | 経験値の入手倍率                                   |
| PalCaptureRate                  | 1.000000           | 捕獲確率の倍率                                     |
| PalSpawnNumRate            | 1.000000           | パル出現倍率    |
| PalDamageRateAttack   | 1.000000           | パルの与えるダメージ倍率                           |
| PalDamageRateDefense | 1.000000           | パルの受けるダメージ倍率                           |
| PlayerDamageRateAttack | 1.000000      | プレイヤーの与えるダメージ倍率                     |
| PlayerDamageRateDefense | 1.000000    | プレイヤーの受けるダメージ倍率                     |
| PlayerStomachDecreaseRate | 1.000000   | プレイヤーの満腹度減少倍率                         |
| PlayerStaminaDecreaseRate | 1.000000   | プレイヤーのスタミナ減少倍率                       |
| PlayerAutoHPRegenRate    | 1.000000    | プレイヤーのHP自然回復倍率                         |
| PlayerAutoHpRegeneRateInSleep | 1.000000 | プレイヤーの睡眠時HP回復倍率                      |
| PalStomachDecreaseRate  | 1.000000    | パルの満腹度現象倍率                               |
| PalStaminaDecreaseRate | 1.000000    | パルのスタミナ減少倍率                             |
| PalAutoHPRegeneRate        | 1.000000    | パルのHP自然回復倍率                               |
| PalAutoHpRegeneRateInSleep | 1.000000 | パルの睡眠時HP回復倍率(パルボックス内)             |
| BuildObjectDamageRate    | 1.000000    | 建築物に対するダメージ倍率                         |
| BuildObjectDeteriorationDamageRate | 1.000000 | 建築物の劣化速度倍率                           |
| CollectionDropRate          | 1.000000    | 採集アイテムの入手量倍率                           |
| CollectionObjectHpRate    | 1.000000    | 採集オブジェクトのHP倍率                          |
| CollectionObjectRespawnSpeedRate | 1.000000 | 採集オブジェクトのリスポーン間隔倍率             |
| EnemyDropItemRate         | 1.000000    | ドロップアイテム量の倍率                           |
| DeathPenalty                  | All                 | デスペナルティ設定(None, Item, ItemAndEquipment, All)                      |
| GuildPlayerMaxNum      | 20          | ギルドの最大人数                                   |
| PalEggDefaultHatchingTime | 72.000000 | キョダイタマゴの孵化にかかる時間(hour)                |
|bActiveUNKO|False|アクティブなうんこ|
|bEnableAimAssistPad|True|ゲームパッドのエイムアシスト|
|bEnableAimAssistKeyboard|False|キーボードのエイムアシスト|
| ServerPlayerMaxNum   | 32          | サーバーに参加できる最大人数                       |
| ServerName                 | "Default Palworld Server" | サーバー名                                    |
| ServerDescription       |            | サーバー説明                                      |
| AdminPassword        |  | AdminPassword                                |
| ServerPassword        |            | サーバーパスワード                                |
| PublicPort                | 8211       | 外部公開ポート                                     |
| PublicIP                   |            | 外部公開IP                                        |
| RCONEnabled            | False     | RCONの有効化                                      |
| RCONPort                 | 25575   | RCONで使用するポート                              |
| Region                      |            | 地域                                                |
| bUseAuth                | True      | 認証を使用する                                   |
| BanListURL            | "<foo>https:</foo>//api.palworldgame.com/api/banlist.txt" | BAN一覧のURL |

また、[公式のガイド](https://tech.palworldgame.com/optimize-game-balance)も参考にしてください。
```PalWorldSettings.ini```は改行なしの設定ファイルです。改行を挟むと設定が初期値に戻ってしまうので改行はしないようにしましょう。
```bash
# サーバの起動
sudo systemctl start palworld-dedicated.service
```

## 参考文献

**1\. [最大32人 パルワールド Linux 専用サーバの建て方](https://qiita.com/naoya-i/items/e907a6b949e5da36d532)**

**2\. [PalworldのDedicated ServerをConoHa VPSで建てた](https://blog.arthur1.dev/entry/2024/01/20/040351)**

**3\. [パルワールドサーバーの構築とデーモン化](https://qiita.com/teityura/items/48a39c4f584fbe3dc419)**