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

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

![20210208142358_1.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/697530f7-0e54-6561-a739-5ce2c1b5d339.jpeg)


## 対象

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

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

※ サーバーなんて持ってないけど専用サーバー立てたいという方はG-Portalで借りることもできます。
[ヴァルハイムサーバーホスティング | G-Portal](https://www.g-portal.com/jp/gameserver/valheim-server-hosting)
利用したことがないので通信速度や管理のしやすさ等は知りません。
ただ月あたりのコストは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. ゲームサーバーを起動<br>    
  [クライアントの設定]  
  3b-1. steamクライアントにサーバーを登録  
  3b-2. Valheimのゲーム参加メニューからサーバーに入る  
  <br>

## やった時の環境

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

## サーバーの設定

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

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


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`でどうぞ
[参考:公式のガイド](https://developer.valvesoftware.com/wiki/SteamCMD#Linux)

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

![serveradd.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/379ac0b5-e4a8-32f1-13c3-128a5c8647d5.png)

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

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

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

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

![serversearch.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/7fb07568-3c90-68ff-185f-54d25e3b9a96.png)

[コミュニティ]にチェックを入れ、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)までの中間報告

![billing.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/d1908061-de35-b5b1-dc4e-fca2ad70aea0.png)

え…高…

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

*1 メモリ,CPU,外部IP料金の合算
*2 ゲーム鯖用インスタンスのネットワークティアは2/14にプレミアムに変更した([1GBあたり$0.01高くなる](https://cloud.google.com/vpc/network-pricing?hl=ja#internet_egress))

#### 対策できそうなところ

* SSD
  現状のディスク使用量が約3.5GB(うちワールドデータが100MB)なので20GBくらいに落としていいかも
  
* ゲーム鯖用GCEインスタンス
  ~~Valheim Dedicated ServerはプレイヤーがいなくてもCPUがぶん回っているので遊んでいないときはプロセスを止める(本末転倒では？)~~
  → 2021-02-17のアプデでだいぶ軽量化されました(うちのインスタンスでは待機時のCPU使用率が80% → 20%まで改善しました)
  ![cpuusage.PNG](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/2d741cf5-fbb6-b221-bf1b-48716e188847.png)
  この辺がdiscordボットで管理できるとよいけどまだできてない
  ちなみにインスタンスごと止めてしまうと静的IP料金が割高になる

* 静的IP料金
  気持ち的に一番つらいけどどうにもならない
  エフェメラルIPにして適当なドメイン+自分でDNSを立てれば安くなる気もするけど絶対にやりたくない
  
最適化すれば2000円/月くらいになりますかね？わからんけど  
ゲームデータを自由にいじれるメリットを除けばG-Portalで借りた方がいい気がしてきました
打開策をお持ちの方は助けてください


#### 2021-03-11料金最終報告

![fe2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/557296/b5b8e72e-11d1-f31f-6c07-57c0944c9ae5.png)


1日あたりの料金

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

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


# 終わり