njo

Valheim専用サーバのセーブデータについて

自分が立てた専用サーバで、お友達がみんな楽しく遊んでいる!そんな中で、サーバ管理者の自分だけが、いつこのセーブデータが吹っ飛ぶのか戦々恐々。そんなことにはなりたくない。

Valheimの専用サーバを運用する上で、どこのディレクトリに、どのようなファイルとしてセーブデータが保存されるのか、いつのタイミングで保存されるのか、何が起きると保存が正しく行われずサーバのセーブデータがロールバックしてしまうのか、それを知っておくと安心してサーバの運用ができます。
ちなみに専用サーバを立てずとも、普通にプレイヤーがホストとして起動してゲームを開始した時も、挙動としては同じことになります。

ここで取り上げるセーブデータというのは、ワールドのセーブデータです。Valheimにはキャラクターとワールドのセーブデータの2種類があり分離しています。
キャラクターのセーブデータは、キャラ名、容姿、スキルレベルやかばんの中身などが保存され、ワールドのセーブデータはマップ自体、どこの木を切って、どこに家を立てたか、というようなマップの状況すべてが保存されています。
キャラクターのセーブデータは、各プレイヤーのローカルPCに保存されますので、サーバの管理者が気にするのはワールドのセーブデータのみということになります。

セーブデータの保存場所

セーブデータは、この配下に生成されます。

# Linux
~/.config/unity3d/IronGate/Valheim/worlds/
# Windows
C:\Users\ユーザ名\AppData\LocalLow\IronGate\Valheim\worlds\

セーブデータは、設定ファイルに記載した gameworld の名前でそれぞれファイルが生成されます。例えば gameworld=test001 とした場合は、下記のようなファイルとなります。
タイミングによっては *.new というファイルが存在する場合もあります。

test001.db
test001.db.old
test001.fwl
test001.fwl.old

このファイルさえバックアップしておけば、何が起きても大丈夫。

セーブデータの切替方法

そのサーバが使うセーブデータは、 gameworld= で指定したものが使われます。そして、セーブデータが依存しているファイルは ~/.config/unity3d/IronGate/Valheim/worlds 配下の *.db*.fwl だけです。
そのため、簡単にセーブデータを切り替える事ができます。
例えば、下記のような設定でサーバを起動し、ゲームを進めたとします。

servername="testserver"
serverpassword="testpass"
gameworld="test001"

そのあと、このサーバをstopして、 gameworld="test002" と変更して立ち上げると、サーバ名は同じままで中身はまっさらな状態で立ち上がります。

servername="testserver"
serverpassword="testpass"
gameworld="test002"

そしてこれをまた、 gameworld="test001" に戻してやると、最初のtest001で進めた状態のセーブを使う事ができます。

WindowsのゲームPCで進めたセーブデータを、専用サーバに移行する方法

上記のことを知っていれば、ゲームPCで進めていたセーブデータを専用サーバに移行して動かすことも簡単です。
WindowsC:\Users\ユーザ名\AppData\LocalLow\IronGate\Valheim\worlds\ 配下にあるファイルをサーバに転送し、 ~/.config/unity3d/IronGate/Valheim/worlds/ 配下に配置します。
gameworld= を転送したファイル名と同じにして、サーバを起動するだけです。

セーブデータが保存されるタイミング

まず第一に、ゲームを終了したタイミングでセーブが走ります。
専用サーバを使わずに普通に遊んでいる場合、それはホストとなったプレイヤーがゲームを終了したタイミングです。
専用サーバの場合、Valheimサーバをstopしたタイミングです。とはいえ、専用サーバの場合そもそも24時間稼働させる事が主な目的である事が多いので、基本的にサーバをstopで終了させることも少ないでしょう。

次に、数十分間隔での自動セーブも走っています。
専用サーバの場合は、前述の通り終了したタイミングでのセーブというのはあまり起こりませんから、基本的にはこれ頼りです。

もう一つは、コンソールを使った save コマンド実行による手動セーブもあります。
F5キーをクリックするとコンソールが表示され、 save コマンドを実行するとそのタイミングでセーブがファイルに吐き出されます。

f:id:njo:20210223100844p:plain:h440

セーブがロールバックするパターン

上記の通り、セーブデータは常に最新の状態が書き込まれているわけではありません。最新の状態はメモリ上にしか存在しないため、サーバやゲームが異常終了した場合、数十分間隔でのオートセーブで最後に保存したタイミングまで、データは巻き戻ります。
サーバの異常終了なんて滅多にないと思いますが、ここぞというタイミングではコンソールを使った手動セーブをするのが良いかもしれないですね。

自分はマシン内にValheimサーバを複数立ち上げすぎて、メモリ不足でサーバ死亡、セーブ巻き戻りを経験しました!

Valheimの専用サーバ(LinuxGSM)で複数インスタンスを生成する

LinuxGSMを使って立ち上げたValheimのサーバは、インスタンスという単位でプロセスが立ち上がります。このインスタンスは複数立ち上げる事が可能です。
複数のValheimサーバを立てたい場合、強いスペックのマシンを用意すればそのマシン内にいくつものValheimサーバを立てられます。
サーバの検証をする時にも便利かと思います。メインで友達と遊ぶためのインスタンスを常時起動しつつ、もう一つ別の検証用のインスタンスを立ち上げて色々試したり。 LinuxGSMは、そのような複数インスタンスを立ち上げる簡単で管理しやすい方法を提供しているので、おすすめです。

njo.hatenablog.com

複数インスタンスを立ち上げる方法の公式ドキュメントはこちら。

docs.linuxgsm.com

公式ドキュメントにも書かれているように、複数のインスタンスを立ち上げる方法は、2種類あります。
一つは、各インスタンスごとに完全に別のファイルを用意してディレクトリや実行ユーザを分けてしまう方法です。各インスタンスごとにバリバリにMODなどでカスタマイズしたい場合はこちらを選びます。
Valheimは今のところそこまでサーバをカスタマイズする事はないと思うので、もう一つの方法、ファイル群を共有しつつ最小限のコンフィグファイルの分割のみで複数インスタンスを立ち上げる方法を選ぶのが良いと思います。これが「Single Installation with Multiple Instances」です。

手順

前提として、~/vhserver ですでに一つサーバが起動している状態とします。この最初のインスタンスは、 ~/vhserverスクリプトファイルを利用して、 ~/lgsm/config-lgsm/vhserver 配下のコンフィグを読み込んで起動しています。
追加でもう一つのインスタンスを作ってみましょう。

2個目のインスタンス用のファイルを生成する

~/linuxgsm.sh は簡単にもう一つのインスタンスを生成できるようになっています。下記のコマンドを実行します。

./linuxgsm.sh vhserver

実行すると Installed Valheim server as vhserver-2 と表示されます。すでに一つのインスタンスが作成されていることを認識して、 -2 とインクリメントした数字を自動的に付与して別のインスタンスを良い感じに生成してくれます。
これにより、 ~/vhserver とは別に ~/vhserver-2 が作成されたので、 ~/vhserver-2 details で様子を見てみましょう。 また、このvhserver-2インスタンス用の設定ファイル ~/lgsm/config-lgsm/vhserver/vhserver-2.cfg も生成されました。

2個目のインスタンス用の設定ファイルを編集する

一つのマシン内で複数のサーバを立ち上げるので、最初のインスタンスと2個目のインスタンスはポートが被っては当然起動できません。ポートをデフォルトから変更しつつ、必要な項目も編集しましょう。
例えばこんな感じ。

~/lgsm/config-lgsm/vhserver/vhserver-2.cfg

##################################
####### Instance Settings ########
##################################
# PLACE INSTANCE SETTINGS HERE
## These settings will apply to a specific instance.
servername="test002"
serverpassword="testpass"
gameworld="test002"
port="2458"

最初のインスタンスはデフォルトで、2456, 2457で立ち上がっていると思います。適当に2458とかにしておきましょう。
VPSクラウドサービスやLinuxファイアウォールで、UDP2458, 2459を開放するのを忘れずに!

2個目のインスタンスを立ち上げる

インスタンスを立ち上げてみます。

./vhserver-2 start

問題なく立ち上がってるか確認してみましょう。

./vhserver-2 details
./vhserver-2 monitor

あとは、crontabに設定したジョブがあると思いますが、あれにもvhserver-2用の設定追加をしましょう。

おまけ

4GBだと2つ立ち上げるだけでメモリカツカツ。

f:id:njo:20210221222719p:plain

Valheimの専用サーバ(LinuxGSM)のアラートをDiscordに通知する

Valheimの専用サーバを作ってお友達と一緒に遊ぶ場合、Discordを使うことが多いと思います。そのDiscordのチャンネルにサーバのアラートが飛んできたらとても便利。サーバから切断された時、プレイヤーが悪いのか、サーバが死んだのか、わかるとよい。

これはLinuxGSMを使って立ち上げたValheimサーバの手順です。LinuxGSMを使わずに生で立てたValheimサーバは対象外です。VPSを使ってLinuxGSMでサーバを立ち上げる方法はこちら。

njo.hatenablog.com

LinuxGSMでDiscordにアラートを飛ばす公式のドキュメントはこちら。

docs.linuxgsm.com

手順

  1. Discordで通知先にしたいテキストチャンネルの編集画面を開く

  2. 「連携サービス」の「ウェブフックを作成」をクリックする

    f:id:njo:20210221114032p:plain

  3. お名前に LinuxGSM 、アイコンを適当に設定して変更を保存する

  4. 「ウェブフックURLをコピー」をクリックする

    f:id:njo:20210221114958p:plain

  5. ~/lgsm/config-lgsm/vhserver/common.cfg に下記の行を追加する

# Discord Alerts | https://github.com/GameServerManagers/LinuxGSM/wiki/Discord
discordalert="on"
discordwebhook="ウェブフックURL"

アラートの確認

設定反映に再起動は必要ありません。テストアラートを送信するコマンドがあるのでやってみましょう。

./vhserver test-alert

Discordのチャンネルに下記のようなメッセージが飛んできます。

f:id:njo:20210221120758p:plain:w350

アラート詳細情報の追加

テストアラートのメッセージ「More info: not enabled」の通り、設定でonにすると詳細情報を飛ばすこともできます。

やり方は、 ~/lgsm/config-lgsm/vhserver/common.cfgpostalert="on" を追加します。公式ドキュメントはここ Alerts - LinuxGSM_

これを有効にすると termbin.com - terminal pastebin というところに詳細情報がアップロードされ、Discordのアラートにそこへのリンクが追加されます。注意点としては、 ./vhserver details と似たようなサーバの詳細情報も記載されるので、それが他のプレイヤーに見られたくない場合は、有効化してはいけません。

Valheimの専用サーバ(LinuxGSM)でサーバの自動起動を有効にする

LinuxGSMで立ち上げたValhemilサーバのプロセスは、スクリプトで立ち上げているだけなのでサーバ再起動時には毎回手動で ./vhserver start させる必要があります。systemdを使ってサーバ起動時に、vhserverを自動起動させるようにしましょう。

VPSにLinuxGSMを使ったValheimサーバを立ち上げる方法などは、こちらの記事を参照してください。

njo.hatenablog.com

systemdでの自動起動を行うための、公式のドキュメントはこれです。

docs.linuxgsm.com

手順

1 /etc/systemd/system 配下に、 vhserver.service ファイルを作成します。

2 中身に下記の設定を書きます。User= やパスなどは適宜変更してください。

[Unit]
Description=LinuxGSM Valheim Server
After=network-online.target
Wants=network-online.target

[Service]
Type=forking
User=vhserver
WorkingDirectory=/home/vhserver
RemainAfterExit=yes
ExecStart=/home/vhserver/vhserver start
ExecStop=/home/vhserver/vhserver stop
Restart=no

[Install]
WantedBy=multi-user.target

3 systemdに新たに作成したサービスファイルを読み込ませます。

systemctl daemon-reload

4 すでに手動でvhserverを立ち上げいる場合は、一旦落とした方がいいと思います。

./vhserver stop

5 systemdでvhserverを起動します.

systemctl start vhserver.service

6 statusでsystemdの状態を確認したり、vhserverの状態も確認してみましょう。

systemctl status vhserver.service
./vhserver details

その他

  • start、stopの他に systemctl restart vhserver.service で再起動もできます
  • systemctl enable vhserver.service自動起動を有効化
  • systemctl disable vhserver.service自動起動を無効化
  • systemdのログは journalctl コマンドで確認できます。正常に起動できない場合などは、 journalctl -u vhserver.service を確認してみましょう

Valheimの専用サーバの作り方(Amazon Lightsail + Linux + LinuxGSM)

Valheimは通常であれば、ホストとなったプレイヤーのローカルのPCがサーバとして起動し、マルチプレイで参加した他のプレイヤーはそのホストのPCと通信することになります。お手軽ですがこの場合、ホストとなったプレイヤーがValheimを起動していないと他のプレイヤーはそのサーバで遊ぶことができません。

Valheimは、他のゲームと同様に専用サーバ(Dedicated Server)を構築する手段を提供しているので、自分でサーバを運用することで24時間お友達がいつでも入れるサーバを作れます。ここでは、Amazon LightsailでVPSを立てて、そこにLinuxGSMを使ってValheimのサーバを立てる手順を書きます。

他の手段としては、Valheimの公式も推奨している G-Portal というゲームサーバ自体を運用していくれるホスティングサービスがあります。Valheimの人気のせいなのか、2021/02/20時点では日本サーバが時々売り切れになっていたりします。G-Portalを利用したことがないので、どのくらいのパフォーマンスが出るのかなどはよく知りませんが、自前でホストを運用する手間もないのでお手軽だと思います。

AWS Lightsailのインスタンス作成

今回は、AmazonVPSサービスであるLightsailで作りました。ここは別に、他のVPSサービスでも、AWSのEC2でもGCPのCompute Engineでもいいです。EC2やGCEよりも割安なのでLighsailを選びましたが、平日の昼間は誰もログインしないとかであれば、スケジューリングシャットダウンの仕組み作ったりして稼働時間を下げれば、まあまあ安くはできそうです。 今回は面倒なので自分が慣れているLightsailで。

考慮するポイント

インスタンスのスペックについては、Lightsailでは$20で提供されている2vCPU、4GBメモリが良さそうです。Valheim公式でサーバの要件を書いてくれていない(?)ので、だいたいみんなこの辺で作ってるなというスペックです。10人ぐらいまでなら、これでいけるのではないかと思います。CPUはマルチコアで処理できない(?)ので増やす必要なしです。メモリは初回起動時では1.9GBぐらいの使用量でした。

OSですが、LinuxGSMでは、ValheimをホストするOSの最小要件は、Ubuntu 16.04 LTS、Debian 9、CentOS 7でした。自分が好きなOSを選びましょう。自分はDebian10で行きました。

やること

LinuxGSMでvhserverをインストールする

LinuxGSMは、色々なゲームの専用サーバ構築をラップして簡単に扱いやすくしたツールです。各ゲームサーバを、このツールを通して起動・停止・更新などの管理ができます。ディレクトリ構成などが統一されるのでわかりやすい。ドキュメントもわかりやすい。

linuxgsm.com

  1. Valheim | LinuxGSM_ のDependenciesタブに記載された依存パッケージを入れておきます。権限などをいい感じしたらLinuxGSMが自動でパッケージのインストールもしてくれるらしいですが、面倒なので予め入れておいた方がいいかも。
  2. installタブに書かれている通りコマンドを実行する。豪華な出力がされてvhserver(Valheimのサーバ)がインストールされます。
    • ここで表示されるパスとかをメモっておくと、後々運用していく中で便利そうです。ディレクトリを探検して目当てのものを探す手間が省けます。
  3. Basic Usageタブに書かれているcronの設定を入れましょう。
  4. ./vhserver start で試しに起動してみましょう。プロセスが立ち上がります。 ./vhserver details で現在の立ち上がっているサーバの情報が確認できます。

vhserverの設定をして起動

LinuxGSMは、複数のインスタンスを作成できるようになっています。 _default.cfg を読み込んだ後に、それぞれのインスタンスの固有の設定ファイルを読み込みます。パスは設定などを変えていなければ /home/vhserver/lgsm/config-lgsm/vhserver こういう所にあります。とりあえず今回編集するのは、vhserver.cfg です。下記の項目を中身は各々編集して、 vhserver.cfg に追記しましょう。 servername はサーバ一覧に表示される名前、 serverpassword はそのまま接続する時に要求されるパスワード、 gameworld は読み込む・書き込みセーブファイルの名前です。セーブファイルは ~/.config/unity3d/IronGate/Valheim/worlds/ 配下に生成され、この場合は test001.db test001.fwl ファイルが生成されます。

servername="test001"
serverpassword="testpass"
gameworld="test001"

./vhserver restart で反映して、 ./vhserver details で確認してみましょう。設定された名前やパスワードで起動しているか、IPアドレスは何か、Portは何で立ち上がっているかなどが見えます。

接続テスト

サーバが起動していることを確認したら、実際に自分で接続してみましょう。このままでも、基本的にはゲーム内のサーバ一覧に表示されるので、単にそこに接続したら遊べるんですが、サーバ一覧は表示数の限界があり、運が悪いとサーバ一覧に自分の立てたサーバが表示されません。ゲーム内ではなく、Steam自体にお気に入りのサーバを設定する機能があるので、そこに追加をしましょう。

  1. Steamを開く
  2. メニューからサーバを選択する

    f:id:njo:20210220171335p:plain:h280

  3. お気に入りタブで追加を行う。入力するのは、 グローバルIP:QueryPort です。分からない場合は、 ./vhserver detailsInternet IPPortsQuery の部分を確認しましょう。

    f:id:njo:20210220171554p:plain:h280

  4. お気に入りに追加したサーバを右クリックして、「サーバーに接続」を選ぶ。パスワードを入力して、接続する。

    f:id:njo:20210220171621p:plain:h280

  5. Valheimが起動して、キャラクター選択画面が開く、キャラクターを選ぶとサーバー一覧画面をスキップして、先ほど入力したサーバに直接接続がされる。

  6. F2キーで接続情報を確認してみたり。

    f:id:njo:20210220172040p:plain:h280

参考にしたページ