Linux(Ubuntu)でSteamで買ったValheimの専用サーバーを立てる


Valheimは2021-02-08現在アーリーアクセスです。
この手順は将来的に使えなくなる可能性が高いです。

対象

  • 以下のすべてを満たす人
    • Linuxサーバーがある
    • 固定IPを持ってる
    • sudoができる
    • ポート開放ができる
    • ファイルアップロードができる(ローカルのワールドを移行したい場合)

エラーが出た場合の対処法はほぼ解説しません

※ サーバーなんて持ってないけど専用サーバー立てたいという方はG-Portalで借りることもできます。
ヴァルハイムサーバーホスティング | G-Portal
利用したことがないので通信速度や管理のしやすさ等は知りません。
ただ月あたりのコストはVPSやその他IaaSを自身で管理するより低い気がします。

三行で(拡張形式)

  1. Valheimが楽しげ。だけど誰かがホストとしてゲーム起動しっぱなしにしなきゃいけない。大変。
  2. 専用サーバーアプリが同梱されてるしValheimのゲームサーバー立てたい。ここではUbuntuを使う。
  3. やること
    [サーバーの設定]
    3a-1. VPSなりEC2なりGCEなりでサーバーを構築(書きません)
    3a-2. steamcmdをインストール
    3a-3. Valheim Dedicated Serverをインストール
    3a-4. ポート開放
    (option) ローカルのワールドデータを移行する
    3a-5. ゲームの設定
    3a-6. ゲームサーバーを起動

    [クライアントの設定]
    3b-1. steamクライアントにサーバーを登録
    3b-2. Valheimのゲーム参加メニューからサーバーに入る

やった時の環境

  • GCE (GCP側の設定方法は書きません)
  • ubuntu-1604-xenial-v20210203

サーバーの設定

(2021-02-16追記)
筆者が無知なのでこの記事で扱ってないんですが、
Valheimのサーバーを立てるのにはLinuxGSMっていうゲームサーバー用便利ツールが使えるみたいです。
Valheim | LinuxGSM_
こっちの方が絶対楽です。

LinuxGSMを使ったValheimサーバーの立て方を日本語で簡潔に解説されている記事があります(しかもGCEのインスタンス作成から教えてくれる!)。この記事より参考になると思います。
ValheimのサーバーをGoogleから借りて、LinuxGSMでかんたんに設定する方法:ぬどマガ:ぬャンネル(ぬどん)
(追記ここまで)

sudoができるユーザーでサーバーに接続してください

3a-2. steamcmdをインストール

steamcmdはSteamクライアントのコマンドラインツール版です
コマンドラインからSteamのゲームをインストールしたりできます

次のコマンドでインストールします

$ sudo apt install steamcmd 

最新のサーバーでデフォルトのままだとおそらくエラーになります
エラーを吐いた場合は次の通りにコマンドを実行してください

$ apt-get install software-properties-common
$ sudo add-apt-repository multiverse
$ sudo dpkg --add-architecture i386
$ sudo apt update
$ sudo apt install lib32gcc1 steamcmd

これでsteamcmdはインストール完了です
RedHatな方はyum install steamcmdでどうぞ
参考:公式のガイド

3a-3. Valheim Dedicated Serverをインストール

Valheimサーバーアプリをインストールするディレクトリを作成してそこに入ります

$ mkdir valheim_server(任意の名前)
$ cd valheim_server

次のコマンドでValheimのサーバーアプリをインストールします

$ steamcmd +login anonymous +force_install_dir ./  +app_update 896660 validate +exit

上記コマンドは"ログイン情報なし"で[+login anonymous] "Valheim Dedicated Server"[89660]を "現在のディレクトリにインストール"[+force_install_dir ./ ] 的な意味です

3a-4. ポート開放

外部のゲームクライアントとやり取りできるようポートを開放します

まずステータスを確認します

$ sudo ufw status

Statusがactiveでない場合は$ sudo ufw enableでファイアウォールを有効化してください
言うまでもありませんがsshやその他のサービスへ接続不能にならないよう注意してください

Valheimが使う2456-2458番ポートとssh接続用の22番ポートを開け、設定を再読み込みしてステータスを確認します

$ sudo ufw allow 22/tcp
$ sudo ufw allow 2456:2458/tcp
$ sudo ufw allow 2456:2458/udp
$ sudo ufw reload
$ sudo ufw status

だいたいこんな感じになると思います

To                         Action      From
--                         ------      ----
22/tcp                  ALLOW       Anywhere
2456:2458/tcp              ALLOW       Anywhere
2456:2458/udp              ALLOW       Anywhere
22/tcp (v6)             ALLOW       Anywhere (v6)
2456:2458/tcp (v6)         ALLOW       Anywhere (v6)
2456:2458/udp (v6)         ALLOW       Anywhere (v6)

RedHatな方はfirewalldでどうぞ

(option) ローカルのワールドデータを移行する

Windowsでプレイしていた場合、おそらくワールドのデータはC:\Users\[ユーザー名]\AppData\LocalLow\IronGate\Valheim の中にあります
中身をまるっと移行先のサーバーにアップロードしてください

移行先のワールドデータはおそらく ~/.config/unity3d/IronGate/Valheim になりますので、アップロードしたデータをまるっとコピーしてください

3a-5. ゲームの設定

ゲームの起動スクリプトを編集してワールドやパスワードを設定します

お好みのエディタ ~/.steam/steamapps/common/Valheim\ dedicated\ server/start_server.sh
export templdpath=$LD_LIBRARY_PATH
export LD_LIBRARY_PATH=./linux64:$LD_LIBRARY_PATH
export SteamAppId=892970

# Tip: Make a local copy of this script to avoid it being overwritten by steam.
# NOTE: Minimum password length is 5 characters & Password cant be in the server name.
# NOTE: You need to make sure the ports 2456-2458 is being forwarded to your server through your local router & firewall.
./valheim_server.x86_64 -name "MyServer(サーバーリストでの表示名)" -port 2456 -world "Dedicated(使用するワールド)" -password "hogehoge(6文字以上らしい)" -public 1 > /dev/null &

export LD_LIBRARY_PATH=$templdpath

echo "Server started"
echo ""
read -p "Press RETURN to stop server"
echo 1 > server_exit.drp

echo "Server exit signal set"
echo "You can now close this terminal"

8行目の""で囲っている部分をご自身の環境に合わせて変更してください
(コメント訳)

  • サーバーアプリを更新する際にスクリプトファイルが上書きされる可能性があるので、余所にコピーをとっておきましょう
  • パスワードは5文字以上でサーバー名と同じにはできません
  • 2456-2458ポート開けといてね

3a-6. ゲームサーバーを起動

起動スクリプトのあるディレクトリへ移動します

cd ~/.steam/steamapps/common/Valheim\ dedicated\ server/

ゲームサーバーを起動します

$ ./start_server.sh

↓こんな感じのログが出ていればゲームサーバーは起動できています

Server started

Press RETURN to stop serverCAppInfoCacheReadFromDiskThread took 2 milliseconds to initialize
CApplicationManagerPopulateThread took 11 milliseconds to initialize (will have waited on CAppInfoCacheReadFromDiskThread)
RecordSteamInterfaceCreation (PID 13515): SteamGameServer012 / GameServer
RecordSteamInterfaceCreation (PID 13515): SteamUtils009 / Utils
Setting breakpad minidump AppID = 892970
RecordSteamInterfaceCreation (PID 13515): SteamGameServer012 / GameServer
RecordSteamInterfaceCreation (PID 13515): SteamUtils009 / Utils
RecordSteamInterfaceCreation (PID 13515): SteamNetworking005 / Networking
RecordSteamInterfaceCreation (PID 13515): SteamGameServerStats001 / GameServerStats
RecordSteamInterfaceCreation (PID 13515): STEAMHTTP_INTERFACE_VERSION002 / HTTP
RecordSteamInterfaceCreation (PID 13515): STEAMINVENTORY_INTERFACE_V002 / Inventory
RecordSteamInterfaceCreation (PID 13515): STEAMUGC_INTERFACE_VERSION010 / UGC
RecordSteamInterfaceCreation (PID 13515): STEAMAPPS_INTERFACE_VERSION008 / Apps

エラーが出ている場合もあるので、このあとのクライアントの設定で接続がうまくいかない場合はログを見返してみてください
この画面のままなにかキーを押すとゲームサーバーは終了します

sshを切断してもサーバーの実行を続けたい or バックグラウンドで実行したい場合は次のコマンドでゲームサーバーを起動します

nohup ./start_server.sh &

サーバーを停止したい場合はvalheim_server.プロセスをkillしてください

以上でゲームサーバーの準備は完了です

クライアントの設定

ゲームをプレイする側の設定です
一緒に遊ぶお友達には以下の設定をしてもらってください

3b-1. steamクライアントにサーバーを登録

外部に立てたValheimサーバーは、Steamクライアントのサーバーリストに登録しないとゲーム内のコミュニティサーバー一覧に表示されません

Steamクライアントを起動し、左上の[表示] > [サーバー] でサーバーリストを開き、[お気に入り]タブへ移動します

IPアドレス欄に [サーバーのIPアドレス]:2457(起動スクリプトで設定したポート+1) を入力します

入力できたら[このアドレス内でゲームを検索]ボタンをクリックします
うまくゲームが起動できていれば起動スクリプトで設定したサーバー名が表示されるので、
サーバー名をクリックして[選択したゲームをお気に入りに追加]ボタンをクリックします

3b-2. Valheimのゲーム参加メニューからサーバーに入る

Valheimを起動して、[ゲームスター] > [キャラ選択 > スタート] > [ゲーム参加] と進みます

[コミュニティ]にチェックを入れ、Filterに立てたサーバー名を入力してください
サーバーが表示されたら後は通常通り接続してプレイできます

2021-02-11追記:サーバー側のアプリアップデートについて

クライアントとサーバーでアプリケーションのバージョンが異なるとゲームにログインすることができません。
サーバー側でのアプリアップデートには、インストールを実行したディレクトリで次のコマンドを実行します。
※ アップデートを実行すると既存のstart_server.shなどが上書きされるため事前にバックアップをとっておきましょう。

$ steamcmd +login anonymous +app_update 896660 validate +exit

おまけ

GCEインスタンス

マシンタイプ e2-medium(vCPU x 2、メモリ 4 GB)
ゾーン asia-northeast1-b
ディスクタイプ SSD 永続ディスク 50GB
プリエンプティブ オン

4人で遊んでみましたがとりあえず超序盤では特に問題なさそうでした
CPU使用率はプレイヤーのあるなしにかかわらず常時80%くらい
クラフトが増えると重くなったりするかも?

GCP料金について

2/7~2/14(GMT)までの中間報告

え…高…

サービス 24hあたり 30日換算
GCEインスタンス*1
(ゲーム鯖用・プリエンプティブ)
高くて35円 1050円
GCEインスタンス
(鯖管理discordボット用 f1-micro 2/14~)
たぶん安い 未定
SSD 50GB 41円 1230円
静的IP(JP) 37円 1110円
ネットワーク転送量*2 平均20円くらい
(標準ティア)
600円
その他 - -
合計 130円くらい? 4000円くらい?

*1 メモリ,CPU,外部IP料金の合算
*2 ゲーム鯖用インスタンスのネットワークティアは2/14にプレミアムに変更した(1GBあたり$0.01高くなる)

対策できそうなところ

  • SSD
    現状のディスク使用量が約3.5GB(うちワールドデータが100MB)なので20GBくらいに落としていいかも

  • ゲーム鯖用GCEインスタンス
    Valheim Dedicated ServerはプレイヤーがいなくてもCPUがぶん回っているので遊んでいないときはプロセスを止める(本末転倒では?)
    → 2021-02-17のアプデでだいぶ軽量化されました(うちのインスタンスでは待機時のCPU使用率が80% → 20%まで改善しました)

    この辺がdiscordボットで管理できるとよいけどまだできてない
    ちなみにインスタンスごと止めてしまうと静的IP料金が割高になる

  • 静的IP料金
    気持ち的に一番つらいけどどうにもならない
    エフェメラルIPにして適当なドメイン+自分でDNSを立てれば安くなる気もするけど絶対にやりたくない

最適化すれば2000円/月くらいになりますかね?わからんけど

ゲームデータを自由にいじれるメリットを除けばG-Portalで借りた方がいい気がしてきました
打開策をお持ちの方は助けてください

2021-03-11料金最終報告

1日あたりの料金

ゲーム起動日 ゲーム未起動日
SSD50GBの場合 100円程度 60円程度
SSD20GBの場合(予測) 75円程度 35円程度

忙しくてなかなか手が着かないんですがはやくSSDのサイズちっちゃくしてインスタンス作り直したい…
皆様はプレイ頻度等に併せてGCEにするかVPSにするか決めたらよいかと思います。

終わり