PALWORLD VPSで専用サーバー構築
お友達とPALWORLDの専用サーバー作って遊ぶか!となったので、ひとまず自分がやったこととか調べ物のURLなどを共有したいと思います。画像とか殆どないのであしからず。
PALWORLD買う
ゲームはこちら。いろんな観点で盛り上がってますが、自分はサーバーを立て終わったのでこれからちゃんと遊ぶところです。楽しみ!
サーバー選定
必要スペック
公式では以下の通り掲載がありました。
サーバー検討
今回は友達のVtuber4人+知り合い1人の最高6名でのプレイを予定しているので、最高スペックまでは必要ないだろうと判断しました。
また、ネットで漁ると既に構築済みテンプレートを含むサーバーが複数リリースされていて、ちょっとググれば面倒事なしでもすぐ始められるかなと思います。
ConoHa for GAME
8コアCPU / メモリ16GB / SSD100GB / NW不明
時間貸しで15730円 / 月、長期割で最安4890円 / 月(3年契約)
Gportal
https://www.g-portal.com/en/gameserver/palworld-server-hosting
詳細不明ですがマネージドのようです。慣れない人向けかと。
その上でサーバーをどうするか検討したのですが、自分がLinuxに抵抗ないのと、価格面で圧倒的に強いので今回はWebARENA indigoの16GBプランで構築しました。実際ヤスイ!
長期で借りる場合はConoHa for GAMEの長期割引パスに軍配が上がりますが、ストレージの多さと回線が1Gbpsなのは強すぎました。スペック厨です。
WebARENA Indigo
6コアCPU / メモリ16GB / SSD320GB / NW共有1Gbps
11.24円 / h 最大税込7150円 / 月
先に動作からいいますが、今のところ最大4人でログインしていて何の問題もないです。カタログスペックが良いのでサーバーのアップデートとかも早くて助かりました。
ただしIndigoはサポート無しのプランなのと、障害の通知とかにはちょっと不安のあるところなので自己責任・自己解決能力が無い場合は他のサポートがしっかりしたサーバーをおすすめします。
サーバー契約~インスタンス取得
WebARENAのアカウントを最初に作成します。
トップページの「お申し込み」からアカウントを作成しますが、自分は既にアカウントを持っていたので特にこの辺どうだったか覚えていません。
アカウント作成後にインスタンスを建ててそこから課金になるため、アカウントを作った時点では特に費用は発生しませんので安心を。
契約できたらトップページの「コントロールパネル」からアカウント情報を入力してログインすれば、Indigoの管理画面です。
SSH鍵登録
サーバーインスタンスを立てる前にSSH用の鍵を登録しておきましょう。
「インスタンス管理」→「SSH鍵」→「SSH鍵の作成」
で作成が可能です。識別できるように適当な名前をつけましょう。
既にSSH鍵を持っている方は「SSH鍵のインポート」で公開鍵が貼り付けられます。既にターミナルが手に馴染んでる人などはこちらから普段遣いの鍵を登録しても良いでしょう。
インスタンス作成
SSH鍵の登録ができたら
Indigo管理画面の「インスタンス管理」→「インスタンス」→「インスタンスの作成」をクリック。
作成画面は以下の通り選択しました。
イメージ:Ubuntu 22.04
サイズ: 6vCPU 16GBRAM 320GB SSD 1000Mbps
右から2番めのクリックできるものですね
SSH鍵:今作ったやつ
リージョン:日本
インスタンス名:適当に
最後に右下の「インスタンスの作成」をクリックするとインスタンスが作成され、課金が始まります。
インスタンス管理のインスタンスに契約インスタンスの一覧が表示されますが、最初はOSの構築とIPの取得で時間がかかるので何分か待ちましょう。
stoppingとなったら、とりあえずそのまま「インスタンスの起動」で大丈夫です。
少し待ってから、SSHでインスタンス一覧に書いてあるIPに繋いでみましょう。初期設定ままなのでポートは22です。sshできたら成功です。
SSHの初期ユーザー
Ubuntuを契約した場合のIndigoのインスタンス初期ユーザー名は「ubuntu」です。毎回忘れて探してしまうので共有しておきます。root……はアレにしても、adminとかじゃだめだったんですかね。
サーバー設定
一般的な設定
Indigoのインスタンスにログインできたら、あとは普通のサーバーを設定するのとだいたい一緒です。
定番設定のハッピーセット済ませていきましょう。しかし簡単になったなあ……いい時代です。
# まずOSのパッケージを更新
# upgrade時に再起動するサービスの指定とかなんかでますがデフォルトでOKして良いです
sudo apt update
sudo upgrade
sudo apt upgrade
# ホスト名変更(しなくてもいい。serverは適当に書き換えます)
sudo hostnamectl set-hostname server
# palworld動かす用ユーザー作成
sudo adduser steam
# 鍵はそのまま使うのでauthorized_keysをコピー
sudo cp -r .ssh /home/steam/
sudo chown -R steam:steam /home/steam/.ssh
# sshポート(Portの値)を適当に変更
vi /etc/ssh/sshd_config
sudo systemctl restart sshd
# 自分はsteamユーザーで色々したのでsudo権限つけました。良くないね!
usermod -aG sudo steam
# エディタはvim.basicがいいので変更
update-alternatives --config editor
# UTCをJSTに
sudo timedatectl set-timezone Asia/Tokyo
# カーネルのバージョンとか上がってるのでrebootしときましょう
sudo reboot
# 再起動後はsshd_configで指定したポートで接続しましょう
なおサーバーを動かすユーザーを分けなかったのでsshで入れたりsudoできたり色々アレです。palworldサーバーを起動するユーザーは分けるとか適宜行ってください。
ネットワークセキュリティ
本来だとnftablesなどでUbuntu内で設定するほうが絶対良いのですが、正直ちょっとめんどくさかったのと、インスタンスの外で弾いてほしいなという思いがあったので、Indigo管理画面側のファイアウォールを使っています。
nftablesユーザーは多分こんな記事なくても設定できると思うので、ここではIndigo側での設定を紹介します。
Indigo管理画面の「インスタンス管理」→「インスタンス」→「操作」から「ネットワーク」を選択します。
「ファイアウォール一覧」の「ファイアウォールの作成」をクリックします。
作成画面が出るので、設定します。
インスタンスへの適用でゲームサーバーを指定して作成します。
FWの設定内容は以下のとおりです。
インバウンドルール
SSH用
タイプ:Custom
プロトコール:TCP
ポート:SSHの指定したポート
IPアドレス:自宅のIPもしくは0.0.0.0/0
PalWorld用
タイプ:Custom
プロトコール:UDP
ポート:8211
IPアドレス:運用で異なります。
コミュニティサーバーの場合:0.0.0.0/0
身内向けの場合: 0.0.0.0/0もしくは遊ぶ人のIP
IP制限する場合、人数分設定します
PING用(サーバー一覧で見る)
タイプ:Custom
プロトコール:ICMP
ポート:設定不可
IPアドレス:0.0.0.0/0
画像にするとこんな感じです。(IPは省略しています)
8211がいっぱいあるのは遊ぶユーザー分設定しているためです。
これで他のポートにアクセスすることはできなくなります。
SSHのポート設定に失敗している場合などはここでポートを開けましょう。
やっとSteamCMD
長かったですが、ここまでやったらあとはテックガイドに従って設定するだけです。
Palworldのテックガイド
SteamCMDのインストール手順は別リンクが貼ってありますが、とりあえず自分が作業した時の実行履歴を貼っておきます。
# steamユーザーで実施
# SteamCMDインストール
sudo add-apt-repository multiverse; sudo dpkg --add-architecture i386; sudo apt update
sudo apt list --upgradable
sudo apt install steamcmd
# steamcmdを実行
steamcmd
# 入力待ちになるので以下の通りコマンドを入力(公式の+が改行)
# ちなみにサーバーアップデートも同様の手順で可能です
login anonymous
app_update 2394010 validate
quit
# quit後はbashに戻ります
cd /home/steam/Steam/steamapps/common/PalServer
# とりあえず立ち上げてみる(エラーが出るのでctrl+cで落とす)
./PalServer.sh
# エラーが出るので公式案内の通りで対処
mkdir -p ~/.steam/sdk64/
steamcmd +login anonymous +app_update 1007 +quit
cp ~/Steam/steamapps/common/Steamworks\ SDK\ Redist/linux64/steamclient.so ~/.steam/sdk64/
# エラーが出なくなる(ログの出力はある)ので、起動すれば一応遊べます
cd /home/steam/Steam/steamapps/common/PalServer/
./PalServer.sh
ここまでやれば、手動でPalServer.shを叩けば動きます。やったぜ。
サービス化
ですがコマンドで叩かないと起動しないのもアレですし、できればサーバー起動時に実行してほしいですよね。
なので以下サイトを参考にサービス化しました。
触る時にsystemdに潜るのがめんどくさかったので、/home/steam/serviceフォルダを作ってその中にpalserver.serviceを作り、シンボリックリンクで/etc/systemd/system/に貼っています。当然ですが直で置いても問題ないです。中身は以下です。
[Unit]
Description=Palworld Dedicated Server
Wants=network-online.target
After=syslog.target network.target nss-lookup.target network-online.target
[Service]
ExecStart=/home/steam/Steam/steamapps/common/PalServer/PalServer.sh port=8211 players=32 -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS
LimitNOFILE=100000
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s INT $MAINPID
Restart=no
User=steam
Group=steam
TimeoutStartSec=300
[Install]
WantedBy=multi-user.target
置いたら、サービスとして登録して起動してみます。
# /etc/systemd/system/にpalworld.serviceを置いてから実施
# 起動時に一緒に立ち上がるようにする
sudo systemctl enable palworld.service
# とりあえずsystemd経由で立ち上げる
sudo systemctl start palworld.service
# 手動で実行したときと同じログが出ていればオッケー
sudo systemctl status palworld.service
あとはPalworldをローカルで起動し、
「マルチプレイに参加する(専用サーバー)」
でサーバー選択画面に入り、画面下の入力欄に
サーバーIP:8211
を入力してアクセスして、キャラメイク等開始すれば完了です!
お疲れ様でした!
その他
アップデート
早速バージョンアップがあったのですが、バージョン不整合で繋がらなくなるのでサーバー側もアップデートが必要です。palworldを落とさないといけないので注意してください。
# サービスを落とす
sudo systemctl stop palworld.service
# steamcmdを実行
steamcmd
# 入力待ちになるので以下の通りコマンドを入力(公式の+が改行)
login anonymous
app_update 2394010 validate
quit
# bashに戻ったらサービスを起動
sudo systemctl start palworld.service
設定ファイル
とりあえず動かす分にはこれで何の問題もないのですが、何の設定もしていない場合は接続履歴の名前が「Default Palworld Server」になっていて分かりづらいです。
初回接続前に、可能であれば以下の通り「DefaultPalWorldSettings.ini」を変更しておくことをおすすめします。サーバー名や管理者パスワードの設定を変更しておくと良いでしょう。
参考
設定ファイルの生成サイトもあるので、ここで作成して上書きが確実かもしれません。
なお、このファイルは/home/steam/Steam/steamapps/common/PalServer/
以下に保存されています。
雑感
・遊ぶPCと同じPCでサーバー建てないと設定できない、という書き込みを見かけましたが、steamcmd利用時に遊ぶ用のsteamIDを入れていると思われます。サーバーファイルはanonymousユーザーで落とせるので大丈夫です。
・まだやってないですが、本当はpalworldの待ち受けポートは8211から変えたほうが良いと思います。8211のままで運用する場合はIP制限などをかけましょう。(早くパスワード実装してほしいですね)
・趣味の遊び用のサーバーなので、設定等甘い部分が多い可能性は高いです。あくまで参考程度にお読みください。
・Linuxさわれない人がこの内容を真似してIndigoでサーバーを立てることは可能ではあると思いますが、建てた後の面倒を見る必要があるので何もわからない人が真似をするのはおすすめできません。構築してみて不具合があっても責任は持てませんのでご了承ください。
ふえーメモなのにすごい頑張って書いちゃいました!
ほぼほぼ引用ばかりで、先んじて構築された方々に感謝するばかりです。
まだ本格的な利用も初めていないので、使ってみて何かあれば追記したいと思います。
今からVPSに構築しようとしている方の参考になれば幸いです。
おっしゃー週末は遊ぶぞ~~~~!!!
2024/01/27追記:メモリ足りない
早速ですがサーバー落ちました。ふええ……
systemdさんに聞いてみる
root@server:/home/steam/Steam/steamapps/common/PalServer# sudo systemctl status palworld.service
× palworld.service - Palworld Dedicated Server
Loaded: loaded (/etc/systemd/system/palworld.service; enabled; vendor preset: enabled)
Active: failed (Result: oom-kill) since Sat 2024-01-27 03:24:57 JST; 5h 4min ago
Process: 1359 ExecStart=/home/steam/Steam/steamapps/common/PalServer/PalServer.sh port=8211 players=32 -useperfthreads -NoAsyncLoadingThread -UseMultithreadForDS (code=killed, signal=T> Process: 4342 ExecStop=/bin/kill -s INT $MAINPID (code=exited, status=0/SUCCESS)
Main PID: 1359 (code=killed, signal=TERM)
CPU: 20h 20min 58.275s
Jan 26 01:06:46 server PalServer.sh[1366]: CAppInfoCacheReadFromDiskThread took 7 milliseconds to initialize
Jan 26 01:06:46 server PalServer.sh[1366]: Setting breakpad minidump AppID = 2394010
Jan 26 01:06:46 server PalServer.sh[1366]: [S_API FAIL] Tried to access Steam interface SteamUser021 before SteamAPI_Init succeeded.
Jan 26 01:06:46 server PalServer.sh[1366]: [S_API FAIL] Tried to access Steam interface SteamFriends017 before SteamAPI_Init succeeded.
Jan 26 01:06:47 server PalServer.sh[1366]: [S_API FAIL] Tried to access Steam interface STEAMAPPS_INTERFACE_VERSION008 before SteamAPI_Init succeeded.
Jan 26 01:06:47 server PalServer.sh[1366]: [S_API FAIL] Tried to access Steam interface SteamNetworkingUtils004 before SteamAPI_Init succeeded.
Jan 27 03:24:56 server systemd[1]: palworld.service: A process of this unit has been killed by the OOM killer.
Jan 27 03:24:56 server systemd[1]: palworld.service: Killing process 1386 (CHTTPClientThre) with signal SIGKILL.
Jan 27 03:24:57 server systemd[1]: palworld.service: Failed with result 'oom-kill'.
Jan 27 03:24:57 server systemd[1]: palworld.service: Consumed 20h 20min 58.275s CPU time.
ちゃんと見てませんが、ログ見るとoom_killerが走ってたのでメモリ不足でしょう。公式推奨が32GBとはいえ、現状4人が最大プレイ人数なのに16GBでも足りないのか……という気持ちです。
利用状況としては、26日1時頃にバージョンアップで再起動。その後ちょっとテストで触って、あとは20~21時くらいから再度本格利用といった感じです。ファストトラベルを活用して遠方に行ったりしたので、キャッシュが溜まったとかそんな感じでしょうか。
swap足そう
その後一回再起動した上でtopを眺めてて思ったのですが、そういえばindigoはインスタンス作成時はswapがありませんでした。
$ top
top - 08:31:02 up 1 min, 1 user, load average: 0.94, 0.43, 0.16
Tasks: 139 total, 2 running, 137 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.3 us, 0.7 sy, 6.8 ni, 89.1 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 15989.1 total, 13540.6 free, 1828.7 used, 619.9 buff/cache
MiB Swap: 0.0 total, 0.0 free, 0.0 used. 13890.3 avail Mem
よくないですね。swapを足しましょう。とりあえず16GB足しました。
以下サイトを参考に実施しました。
#swap用の空ファイルを追加
steam@server:~$ sudo fallocate -l 16G /swapfile
steam@server:~$ cd /
#swap用のファイルはroot以外読み書きできないようにする
steam@server:/$ sudo chmod 600 swapfile
#swapに設定
steam@server:/$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 16 GiB (17179865088 bytes)
no label, UUID=1e61306d-202f-4d95-98a7-376287c7aec6
#swapを有効化
steam@server:/$ sudo swapon /swapfile
#fstabに書いて永続化させにいく
steam@server:/$ cd /etc/
#fstabバックアップ
steam@server:/etc$ sudo cp fstab fstab.bk
#swapの記述を追加
steam@server:/etc$ sudo vi fstab
#記述内容は最後の/swapfileの行
steam@server:~$ cat /etc/fstab
LABEL=cloudimg-rootfs / ext4 discard,errors=remount-ro 0 1
LABEL=UEFI /boot/efi vfat umask=0077 0 1
/swapfile none swap sw 0 0
#再起動してswapがついているか確認
steam@server:/etc$ sudo reboot
topでswapがついていることを確認して作業終了です。
$ top
top - 08:57:59 up 22 min, 1 user, load average: 0.61, 0.72, 0.59
Tasks: 130 total, 1 running, 129 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.5 us, 0.6 sy, 6.0 ni, 90.0 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 15989.1 total, 12785.4 free, 2618.6 used, 585.2 buff/cache
MiB Swap: 16384.0 total, 16384.0 free, 0.0 used. 13100.2 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
693 steam 20 0 6700280 2.5g 152236 S 61.1 16.1 17:46.58 PalServer-Linux
swap追加してどうなるかはまた経過を見たいと思います。
とりあえず起動直後のメモリ使用量的には8GBあればこまめに再起動すれば動くんでない? ぐらいの雰囲気です。32GB推奨は流石にハードですよね。
自鯖で動かすよりはマネージドサービスを使う方が楽だと思います。一緒に遊ぶ人も理解がないときついかも。
こういうのいじるのが好きな人向けの遊び方ですね! 自分は好きです!
2024/01/28追記:メモリメモ
27日の話になりますが、フルメンバー(5人)で14:30~18:30くらい、後は各自散発的に遊んだ状態にて、翌28日深夜3時頃の稼働状況をtopで覗いてみましたが、ほぼメモリを食いつぶしていました。
$ top
top - 02:55:38 up 18:20, 1 user, load average: 1.42, 1.19, 1.19
Tasks: 132 total, 1 running, 131 sleeping, 0 stopped, 0 zombie
%Cpu(s): 7.8 us, 0.6 sy, 13.2 ni, 78.4 id, 0.0 wa, 0.0 hi, 0.0 si, 0.1 st
MiB Mem : 15989.1 total, 999.0 free, 14649.8 used, 340.3 buff/cache
MiB Swap: 16384.0 total, 16382.7 free, 1.3 used. 1067.4 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2011 steam 20 0 21.5g 14.2g 139284 S 127.8 91.0 1362:36 /home/steam/Steam/steamapps/common/P+
swapに侵食してないのが救いですが、このペースでメモリを食うのであれば定期的な再起動は避けられないかなと思います。
サービスの再起動を行うスクリプトを組んで実行してみました。
#再起動スクリプト
$ cat /usr/local/bin/restartpalworld.sh
#!/bin/sh
systemctl stop palworld.service
sleep 5
systemctl start palworld.service
#実行してtop確認
$ top
top - 03:06:42 up 18:31, 1 user, load average: 1.38, 1.24, 1.26
Tasks: 135 total, 1 running, 134 sleeping, 0 stopped, 0 zombie
%Cpu(s): 3.5 us, 0.4 sy, 9.5 ni, 86.5 id, 0.0 wa, 0.0 hi, 0.1 si, 0.0 st
MiB Mem : 15989.1 total, 13295.7 free, 2165.5 used, 527.9 buff/cache
MiB Swap: 16384.0 total, 16382.7 free, 1.3 used. 13551.7 avail Mem
PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND
2675 steam 20 0 5708092 2.1g 152128 S 81.1 13.3 4:28.02 /home/steam/Steam/steamapps/common/P+
上記は手動で実施した後の状況ですが、人がアクセスしなければかなり軽いですね。アクセス後もメモリを開放しないのが悩みどころなのかも?
当座の対応として、毎朝5時にcronでサービスの再起動を行うようにしました。運用で躓くようであれば更に追記したいと思います!