7daysToDieのマルチサーバをバージョン指定で構築（Conoha for Games） 

# はじめに
友人と7dyas To DieをするためにHonoHa for GameのVSPを使ってマルチサーバを構築することになったのですが、一部ハマったところがあるので記事に残しておこうと思います。

# 環境
クライアント環境
+ PC（Steam）App Ver 1.0 → Ver Alpha 21.1
+ NVIDEA GeForce NOW(Steam) APP Ver Alpha 21.1
 
サーバ環境
+ マルチサーバ（ConoHa VSP)　APP Ver 1.0 → Ver Alpha 21.1

![マルチサーバ Ver 1.0 (5).png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955406/577e6443-c2c4-9122-2db2-7ed138b7cc54.png)


# バージョン指定の構築が必要になった経緯
HonoHa for GameのVSPでマニュアル通りに7dyas To Dieのサーバを構築したのですが、以下のエラーで接続できない事象が発生しました。
```
「予期せぬデータを受信しました、互換性のないバージョンの可能性があります」
```
原因を調べていると、クライアント環境とサーバ環境でバージョンが違うことでこのエラーが発生しているようでした。
本来であれば、クライアントであるSteam でバージョンを操作できるので、クライアント側でバージョンを合わる対応をすればいいのですが、今回クライアント環境に「NVIDEA GeForce NOW(Steam)」があり、「NVIDEA GeForce NOW(Steam)」はクライアントでバージョンを操作することができないので、やむを得なくサーバのバージョンをダウングレードすることで対応することにしました。

## 構築
1. ### テンプレートを指定してサーバを構築
    Conohaのポータルサイトより、7dyas To Dieのテンプレートを指定してサーバを構築します。特に特殊の手順はありません
    　

2. ### サーバを起動
    サーバの構築が完了したら、ポータルサイトよりサーバを起動します。
    　
3. ### SSH（もしくはコンソール）でサーバにログイン**
    SSH（もしくはコンソール）でサーバに接続し、ログインします。
    　
4. ### サービスを停止
    ダウングレード前に、7dyas To Dieのサービスを停止します。
    ```
    $ systemctl stop 7dtd
    ```
    　
5. ### コンフィグをバックアップ
    コンフィグを事前にバックアップしておきます。
    ```
    cp /opt/7dtd/7dtd_server/serverconfig.xml /opt/7dtd/serverconfig.xml.bk
    ```
    　

5.  ### 既存のフォルダをリネーム
    テンプレートを指定して構築すると、サーバ内に7dyas To Dieのデータが存在しています。
    このまま構築してしまうと既存のデータが悪さをするので、フォルダをリネームしておきます。（不要であれば削除でもOKです）
    ```bash
    $ mv /opt/7dtd/7dtd_server /opt/7dtd/7dtd_server_old
    ```
    　
6. ### インストールフォルダを作成
    リネーム前のフォルダと同じ名前でフォルダを作成します。
    この後このフォルダにバージョン指定したアプリケーションをインストールしていきます。
    ```
    $ mkdir /opt/7dtd/7dtd_server/
    ```
    　
7. ### steamcmdをインストール
    steamのアプリケーションをインストールために必要な「steamcmd」をインストールします。
    ```
    $ cd
    $ wget http://media.steampowered.com/client/steamcmd_linux.tar.gz
    $ tar zxvf steamcmd_linux.tar.gz
    $ chmod +x steamcmd.sh
    ```
    　
8. ### Steamにログイン
    下記のコマンドでSteamコンソールに接続します。
    ```
    $ ./steamcmd.sh
    　・
    　・
    -- type 'quit' to exit --
    Loading Steam API...OK
    
    Steam>
    ```
    プロンプトが「Steam>」に変わったらSteamへログインします。
    「password:」が表示されたらSteamのパスワードを入力します。
    ```
    Steam> login <Steamのユーザー名>
    Logging in user '*********' to Steam Public...
    password:
    ```
    Steam Guard Mobile Authenticatorが表示されたら、スマホアプリよりSteamガードのコードを表示し、入力します。 ※認証の内容は使用環境により異なります
    ```
    Enter the current code from your Steam Guard Mobile Authenticator app
    Two-factor code:<Steamガードのコード>
    ```
    以下のように表示されればログインはOKです。
    ```
    OK
    Waiting for client config...OK
    Waiting for user info...OK
    
    Steam>
    ```
    　
9. ### バージョンを指定してアプリケーションをインストール
    まず、インストールディレクトリを指定します。
    ```
    Steam> force_install_dir /opt/7dtd/7dtd_server
    Please use force_install_dir before logon!
    ```
    
    次に、バージョンを指定してアプリケーションをインストールします。
    以下のようにアプリケーションのバージョンを指定することでバージョン指定のアプリケーションをインストールすることができました。
    ```
    Steam> app_update 294420 -beta alpha21.2 validate
    　・
    　・
    　・
     Update state (0x101) committing, progress: 89.40 (14352971152 / 16054212508)
     Update state (0x101) committing, progress: 89.82 (14420545669 / 16054212508)
    Success! App '294420' fully installed.
    
    Steam>quit
    ```
    　
10. ### インストールディレクトリ・ファイルの権限と所有者を変更
    アプリケーションをインストールするだけでは、フォルダの所有者、権限の問題でsystemctlからサービスを起動できないので、以下のように変更します。
    ```
    $ chown -R sdtd:sdtd /opt/7dtd/7dtd_server/
    $ chmod 775 -R /opt/7dtd/7dtd_server/
    ```
    　
11. ### 必要なコンフィグを修正
    アプリケーションをインストールすると、コンフィグが初期化されています。
    事前にバックアップをとったコンフィグを参考に必要な個所を修正します。
    　
12. ### サービスを起動
    これで、準備が整ったので、サービスを起動します。
    ```
    $ systemctl start 7dtd
    ```
    
    サービスステータスを確認そ「Active: active (running)」であればOKです！
    ```
    $ systemctl status 7dtd
    ```
    　
13. ### 接続確認 
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955406/98361500-a792-40a4-cf1f-52b716a62d4a.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955406/82849894-89f7-9166-b8cb-cdcf2fc936a9.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955406/08ea6d03-5143-65a1-4368-484b02ad2e44.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1955406/187fb75f-e512-7e77-1f17-3f835548936e.png)

# ハマったポイント
+ 既存のフォルダーをリネームせずにアプリケーションをインストールすると以下のエラーが発生し、7 days To Dieの世界に入ることができませんでした。
    ```
    ArgumentException: Attempting to create a zero length compute buffer
    Parameter name: count
    ```

    試行錯誤の結果、既存のデータが悪さしているのだろうと考え、リネームしてからインストール（新規インストール扱い）したら上手くいきました。
    　
+ インストール後「systemctl start 7dtd」を実行しての以下のエラーが発生し、サービスが起動しない事象が発生しました。
    ```
    Unable to open log file, exiting.
    ```
    ログを見たところ、ログファイルの生成ができずエラーになっていたので、所有者、権限の問題と考えて、所有者、権限を変更したら問題なく起動することができるようになりました。

# 最後に
今回は下位バージョンを指定して構築しましたが、バージョンアップの場合はフォルダーのリネームや権限の変更も不要なんだろうと思うので、特にハマることもないんだろうなと思います。
初めてのマルチサーバ構築が思いのほか難易度が高かったので心折れかけましたが、無事構築できて良かったです。
これでやっとゾンビライフを楽しめます！

# 参考サイト
https://support.conoha.jp/v/7dtdverup/