こんにちは。今回はRTS「Wargame: Red Dragon」のサーバーの建て方を書いていこうと思います。
この記事では,Debian7とWindows10それぞれで,Dockerを使い身内用のWG:RDサーバーを構築します。Debian7はOracle VirtualBoxを使っています。
なお,後術の理由により,ローカル及び外部双方からの接続を行うために,Hamachiを使用しています。ヘアピンNAT機能のあるルーターを使用している場合,hamachi等のVPNの使用は不要です。また,ローカルからの接続が不要である場合,もしくはローカルからの接続のみでいい場合も,hamachi等の使用は不要です。
また,仮想マシンを利用する場合,外部との送受信のために仮想マシンのポートフォワーディング設定をする必要がある場合があります。別途確認してください。
今回は特に紹介記事というわけでもないので,WG:RDが何かというようなことに関しては飛場します。
1. WGRDのサーバーとはどういうものか
この記事を読んでいる方は理解しているとは思いますが,マルチを選択した時にズラッと出てくる20人部屋のことです。
おそらく,一般的にWG:RDでマルチプレイをする際は,クライアントから毎回部屋を立てていると思います。これは8枠しかなく,9人以上や一部の10vs10マップで遊ぶことはできませんが,非常に簡単ですぐに始めることができます。
その点サーバーは,とにかく面倒です(でした)。
というのも2021年になってEugenがサーバーの提供方法を変えたらしく,今まで公開されていた有志のサーバー構築に関するノートがほぼほぼ役に立たなくなってしまったんですね。合計約15時間,あれを使おうどれを使おうと右往左往しましたが,今回書く最後にやった方法では1時間ほどで終わるでしょう。
ここからが重要ですが,サーバーは建てるのに1時間も使う(初回のみ)わけです。これで得られるクライアントから建てる部屋との違いは何があるんでしょうか。
やはりメインは枠が20人になることでしょう。比較的レアケースではありますが,8人という数字だと人の多いコミュニティの場合,意外とすぐ枠が埋まってしまいます。10人とかだと。空き枠を実質気にしなくて済むようになるのは結構大きいですね。
他には最初のポイントっが自由に増やせることや,10vs10マップが増えること,常に部屋を開けること,自動で回ってくれることですね。まあ後半はあまり必要でもないですが。
ポイント自由はかなり素晴らしいです。114514ポイントとかにできます。
2. Eugenにサーバーリクエストを送る
多分,みんなここから読み始めてると思います。
Eugenにサーバーリクエストってどういうこと?という人のために説明しますと,サーバーには専用のdedicated keyが必要なので,eugenのサポートにメールしてこれを貰う必要があります。
ここの「You and Eugen」の項目を参考に,Eugenにメールを送ります。
基本的に本文はコピペし,[YOUR LOGIN HERE]を自分のEugenアカウントのユーザー名(ニックネームではない)に置き換えましょう。件名は何でもいいと思います。英語でRD鯖建てたいみたいな内容なら。メールアドレスは間違えないように。
メールは平日なら24時間も経たずに返ってきます。およそ丸一日ぴったり。
送ったメールへReする形で,自分のユーザー名・dedicated key・サーバーダウンロードリンクが送られてきます。スターを付けとくなどして忘れぬよう。
メールはこのような形です。LoginはあなたがWG:RDにログインするとき使っているもの(メール送信時に書いたと思います)。Dedicated keyがサーバー構築に必要になります。URLは後ほど使います。
3. Dockerのインストール
Linux(ここではdebian7)とWindowsで方法が異なります。
ここからは実際にサーバーを動かしていく筐体となる,Dockerをインストールしていきます
Linux(Debian7)の場合
3-1. DockerEngineのインストール
こちらのURLを開き,順番にコマンドを実行していきます。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/debian/#install-using-the-repository
筆者はすでにDockerをインストール済みなため余計な表示が出ていますが,基本的にこれらの表示はインストール済みのパッケージによって左右されるため,「完了」と出れば一言一句同じである必要はありません。
ユーザー名@デバイス名:~$ sudo apt-get update
ユーザー名@デバイス名:~$ sudo apt-get install \
ca-certificates \
curl \
gnupg \
lsb-release
順番に実行していきます。
ユーザー名@デバイス名:~$ curl -fsSL https://download.docker.com/linux/debian/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
ユーザー名@デバイス名:~$ echo
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
「Docker Engine のインストール」項については,最新版をインストールすればいいので,2のコマンドを実行する必要はありません。
※実際に実行されているコマンド数が多く見えますが,タイプミスです。
ユーザー名@デバイス名:~$ sudo apt-get update
ユーザー名@デバイス名:~$ sudo apt-get install docker-ce docker-ce-cli containerd.io docker-compose-plugin
終わりました。3のコマンドを実行して,インストールされているか確認します。
ユーザー名@デバイス名:~$ sudo docker run hello-world
これでDockerEngineのインストールが完了しました。これでWG:RDのサーバーをセットアップする準備ができました。
3-2. Dockerコマンドの権限設定
これは任意の作業になります。
今の状態だと,Dockerのコマンドを実行するには sudo コマンドを付け,毎回rootパスワードを入力する必要があります。
これは,セキュリティ上は望ましい手間ですが,実際に使う上では少々面倒です。
そのため,基本的に事実上セキュリティ上のリスクに遭いにくい個人利用においては,ログイン中の一般ユーザーに対してdockerコマンドを許可することにより,上記の手間をスキップすることも選択肢のうちにあります。
ただし,dockerコマンドはroot権限と同等のリスクを持つことに留意しなければなりません。
こちらのURLを開き,同じように順番に実行していきます。
https://matsuand.github.io/docs.docker.jp.onthefly/engine/install/linux-postinstall/
場合によっては,dockerインストール時に自動でユーザーグループdockerが追加されているかもしれません。その場合,このように「既に存在します」と出ますがそのまま続けます。
適宜gamesukimanirsの箇所をあなたのユーザー名に置き換えてください。
また,今回はusermodを使うため,3の手順を実行する必要はありません。
sudo usermodのコマンドを実行したら,id <ユーザー名>と入力し,末尾にdockerが追加されていることを確認します。
ユーザー名@デバイス名:~$ sudo groupadd docker
ユーザー名@デバイス名:~$ sudo usermod -aG docker <ユーザー名>
ユーザー名@デバイス名:~$ id <ユーザー名>
筆者の場合,既に設定済みなためそのまま権限の確認をしていますが,通常は仮想マシンを再起動(仮想マシンでない場合はログアウト)しないと反映されませんので,仮想マシンを再起動してから確認してください。
ユーザー名@デバイス名:~$ docker run hello-world
上記のような表示になれば完了です。
Windowsの場合
3-1. Docker for Windowsのインストール
まずこちらからDockerの公式サイトを開き,Download Docker Desktopからインストーラーをダウンロードします。
WSL2(Windows上のLinux互換環境)の使用にチェックを入れ,デスクトップにショートカットを追加する場合は2つ目もチェックし,OKを押します。
Unpacking files…と出るのでそのまま待ちます。
Installation succeededと出たらパソコンを再起動します。
Close and restartを押すと,そのままWindowsの再起動が始まります。
Dockerの利用規約及び商用利用規定に従う場合,Acceptをクリックします。
※従業員数250人未満かつ収益年間1000万ドル未満の商用利用か,個人,教育,非商用オープンライセンス利用の場合のみ無償でDockerを使うことができます。
一瞬デスクトップに戻り,その後Dockerが起動します。起動しない場合,手動でDocker Desktopを起動してください。
正しく起動すれば以下のような画面になります。筆者の場合,すでにいくつかコンテナを作成済みなため,その一覧が表示されています。
この際,左下のバーが緑色になっていない場合,Dockerのバックエンドが正しく起動していませんので,何度か再起動してみてください。
続いて,きちんとDockerが動くか確認します。
コマンドプロンプト(PowerShellでも可)を開き,CLIでdockerを実行可能か確認します。
C:\Users\ユーザー名> docker run hello-world
上記のような表示になれば完了です。
4. WG:RDサーバーのセットアップ
続いて,本題であるDockerを使ったWG:RDサーバーの構築に入っていきます。
メールに記載されていたURLを参考に進めていきます。
https://hub.docker.com/r/eugensystems/wargame3
その前に,WG:RDのサーバーのIPに関して,Hamachi等の利用が必要になる理由を解説します。
ここは少し複雑です。
まず,WG:RDのサーバーは
1. マルチプレイサーバーが起動
2. マルチプレイサーバーがEugenのマッチメイキングサーバーに接続
3. ユーザーがEugenのマッチメイキングサーバーに接続
4. ユーザーがEugenサーバーからマルチサーバーのIP及びポートを取得
5. ユーザーが取得したIP及びポートに接続
6. ユーザーがサーバーに参加
という過程をとります。
サーバーはDockerコンテナで起動されますが,起動する際,マッチメイキングサーバーに提供するIP及びパスワードを引数に含める必要があります。
ユーザーが接続に使用する関係上,このIPはグローバルIPないし外部から接続可能である必要があります。
そのような対策を取らない場合,HamachiやRadminなどのVPNを用いて,擬似的に相手方までローカルネットワークを構築することなどが必要です。 つまり,サーバーとWG:RDクライアントのネットワークが同じ場合,ループバックに対応する手段が必要です。
以降,マッチングメイカーに提供するIPを「サーバーIP」,同ポートを「サーバーポート」と表記します。なお,サーバーポートは1024以上である必要があります。
また,WG:RDサーバーは基本的にrconを使ってのみ起動中の操作が可能です。rcon用のポートを別途設定する必要があります。サーバー+1とするのでも問題ありません。以下,rconに使用するポートを「rconポート」と表記します。
4-1. サーバーイメージのダウンロード
はじめに,サーバーの元となるファイルをダウンロードします。docker pull eugengames/wargame3
既にダウンロード済ですとこのようになりますが,初回だとダウンロードが始まります。
4-2. サーバー構成ファイルの作成
2で出てきたEugenユーザー名とDedicated keyを使います。
まず,サーバー設定ファイル用のディレクトリ serversettings を作成します。
コマンドも一応置いておきますが,GUIで行っても問題ありません。mkdir serversettings
このとき,フォルダーの絶対パスがわかるようにしてください。後ほど必要です。
手順の通りCLIで進めた場合,下記になると思います。
Linux: /home/ユーザー名/serversettings
Windows: C:\Users\ユーザー名\serversettings
GUIでフォルダーを作成した場合,Windowsであれば,選択した状態で上部の「パスをコピー」より絶対パスをコピーできます。
次に,設定ファイルlogin.iniとvariables.iniを作成します。
Linuxの方で,CLIの場合は下記を利用してください。
ユーザー名@デバイス名:~$ cat <<EOF> serversettings/login.ini
> login="Eugenユーザー名"
> dedicated_key="先ほどのDedicated key"
> EOF
ユーザー名@デバイス名:~$ cat <<EOF> serversettings/variables.ini
> ServerName="サーバー名"
> EOF
GUIを使って作成する場合,serversettingsフォルダの中に作成し,またファイルの中身は下記のとおりにしてください。
login.ini
login="Eugenユーザー名"
dedicated_key="先ほどのDedicated key"
variables.ini
ServerName="サーバー名"
variables.iniには,サーバーの初期設定に関して後述の様々なことを設定することができます。
4-3. サーバー起動の変数設定
サーバー起動に使う引数に含めるための変数に代入していきます。
4冒頭のサーバーIP,サーバーポート,rconポート,4-2の絶対パスを使います。
Linux:
ユーザー名@デバイス名:~$ export EXPOSEDIP=サーバーIP
ユーザー名@デバイス名:~$ export EXPOSEDPORT=サーバーポート
ユーザー名@デバイス名:~$ export RCONPORT=rconポート
ユーザー名@デバイス名:~$ export FOLDERPATH=絶対パス
入力が完了したら,代入ができているか確認してください。
ユーザー名@デバイス名:~$ $EXPOSEDIP
ユーザー名@デバイス名:~$ $EXPOSEDPORT
ユーザー名@デバイス名:~$ $RCONPORT
ユーザー名@デバイス名:~$ $FOLDERPATH
bash: サーバーIP: コマンドが見つかりません
bash: サーバーポート: コマンドが見つかりません
bash: rconポート: コマンドが見つかりません
bash: 絶対パス: コマンドが見つかりません
のように表示されれば問題ありません。
Windows:
C:\Users\ユーザー名> set EXPOSEDIP=サーバーIP
C:\Users\ユーザー名> set EXPOSEDPORT=サーバーポート
C:\Users\ユーザー名> set RCONPORT=rconポート
C:\Users\ユーザー名> set FOLDERPATH=絶対パス
入力が完了したら,代入ができているか確認してください。
C:\Users\ユーザー名> %EXPOSEDIP%
C:\Users\ユーザー名> %EXPOSEDPORT%
C:\Users\ユーザー名> %RCONPORT%
C:\Users\ユーザー名> %FOLDERPATH%
'サーバーIP' は,内部コマンドまたは外部コマンド...
'サーバーポート' は,内部コマンドまたは外部コマンド...
'rconポート' は,内部コマンドまたは外部コマンド...
'絶対パス' は,内部コマンドまたは外部コマンド...
のように表示されれば問題ありません。
4-4. サーバーの作成・起動
いよいよサーバーを作成します。コマンドの完成形は下記です。
Windows:
docker run -d --name <サーバーコンテナ名> -e EXPOSEDIP=%EXPOSEDIP% -e EXPOSEDPORT=%EXPOSEDPORT% --mount type=bind,src=%FOLDERPATH%,target=/server/settings -p %EXPOSEDPORT%:%EXPOSEDPORT%/udp -p %EXPOSEDPORT%:%EXPOSEDPORT% -p %RCONPORT%:%RCONPORT% eugensystems/wargame3 +rcon_password <rconパスワード> +rcon_port %RCONPORT%
Linux:
docker run -d --name <サーバーコンテナ名> -e EXPOSEDIP=$EXPOSEDIP -e EXPOSEDPORT=$EXPOSEDPORT --mount type=bind,src=$FOLDERPATH,target=/server/settings eugensystems/wargame3 +rcon_password <rconパスワード> +rcon_port $RCONPORT
このままでは書き換えるべき場所が多く,また複雑なため,順番に解説していきます。順番に入力しつつ書き換えて,コマンドを完成させてください。
基礎部分 Windows/Linuxdocker
:基礎コマンドですrun
:コンテナを作成・起動するサブコマンドです-d
:デバッグを有効化する引数です--name <サーバーコンテナ名>
:コンテナ名を設定する引数です。分かりやすい名前にしてください。
IP/ポート Windows-e EXPOSEDIP=%EXPOSEDIP%
:サーバーのIPを設定します。変数を使用しているため,ここで書き換える必要はありません。-e EXPOSEDPORT=%EXPOSEDPORT%
:サーバーのポートを設定します。変数を使用しているため,ここで書き換える必要はありません。
IP/ポート Linux-e EXPOSEDIP=$EXPOSEDIP
:サーバーのIPを設定します。変数を使用しているため,ここで書き換える必要はありません。-e EXPOSEDPORT=$EXPOSEDPORT
:サーバーのポートを設定します。変数を使用しているため,ここで書き換える必要はありません。
フォルダのバインド Windows--mount
:ローカルのフォルダとコンテナ内のフォルダに関する引数です。type=bind,src=%FOLDERPATH%,target=/server/settings
:
上記の操作を紐づけとします。ローカルのフォルダ,コンテナのフォルダを指定します。変数を使用しているため,ここで書き換える必要はありません。
フォルダのバインド Linux--mount
:ローカルのフォルダとコンテナ内のフォルダに関する引数です。type=bind,src=$FOLDERPATH,target=/server/settings
:
上記の操作を紐づけとします。ローカルのフォルダ,コンテナのフォルダを指定します。変数を使用しているため,ここで書き換える必要はありません。
コンテナのポート開放 Windows-p %EXPOSEDPORT%:
:Dockerコンテナの公開するサーバーポート(UDP)を指定します。変数を使用しているため,ここで書き換える必要はありません。%EXPOSEDPORT%
/udp
:Dockerコンテナの公開するサーバーポート(TCP)を指定します。変数を使用しているため,ここで書き換える必要はありません。-p %EXPOSEDPORT%:%EXPOSEDPORT%
-p %RCONPORT%:%RCONPORT%
:Dockerコンテナの公開するrconポート(TCP)を指定します。変数を使用しているため,ここで書き換える必要はありません。
イメージ指定とrcon Windows/Linuxeugensystems/wargame3
:コンテナ作成に使うイメージを指定します。今回はWG:RDのサーバーイメージを使います。+rcon_password <rconパスワード>
:rconパスワードを指定します。パスワードにおける通常の留意事項を遵守しましょう。
rconポート指定 Windows+rcon_port %RCONPORT%
:rconで使用するポートを指定します。変数を使用しているため,ここで書き換える必要はありません。
rconポート指定 Linux+rcon_port $RCONPORT
:rconで使用するポートを指定します。変数を使用しているため,ここで書き換える必要はありません。
完成したら実行します。このようにハッシュ値のようなものが出るか(Windows),コンテナ名が出れば(Linux)成功です。この場合では,コンテナ名をwar3-server,rconパスワードをpasswordとしています(例のため)。
4-5. サーバーログの確認
サーバーの起動ができたので,無事起動できたかログを確認します。WindowsとLinuxで同じ手順です。
docker logs <サーバーコンテナ名>
起動に成功している場合,このように長い表示が出ます。logsの後に-fとつけると,ログが常時更新モードになりコンソールっぽくなります。
なお,この画像でいえば真ん中らへんにrcon won’t be availableと記載されている場合,rconまわりの引数にタイプミスがある可能性があります。docker stop <サーバーコンテナ名>でサーバーを停止後,docker rm <サーバーコンテナ名>で削除し,5-4の手順をやり直してください。
Connected to match making serverと書かれていればEugenサーバーにも接続が完了しています。WG:RDのサーバーリストに見つかれば,参加できるはずです。
また,dedicated server can be usedの項に提供されたサーバーIPとポートが記載されています。クライアントはこれを使って接続します。このケースでは,127.0.0.1(ローカルホスト)のため,稼働中のパソコンからしか接続できません。
4-6. サーバーの停止と起動,Dockerの使い方
サーバーを使っていく準備がほとんど整いました。rconの設定の前に,サーバーの停止方法及び再起動方法を解説します。
Windows(GUI):
Docker desktopを開きます。
稼働中のコンテナはエメラルド色で光り,右側に停止ボタンが表示されます。
停止ボタンを押すと,1-2秒とした後に停止します。コンテナをクリックしてみます。
このようにログが表示されます。Server will exitと出ており,停止処理が行われたことが確認できます。
この状態で,左上のRunボタンを押します。すると,このように再び起動できます。Stopを押せば止まります。
このように,Windowsにおいては,Dockerコンテナの起動及び停止はDocker desktopから行うのが便利です。
コンテナの作成そのものについてはこちらからできることにはできるのですが,GUIでは一部の引数に対応しておらず,WG:RDのサーバーを作成することはできません。
また,コンテナの削除については,停止後にゴミ箱ボタンをクリックすることで可能です。サーバーのIPを変更するとき,バインドするフォルダを変更するときなどは,削除して作り直す必要があります。
Linux/Windows(CLI):
docker ps
と入力すると稼働中のコンテナが表示されます。-a
とつけると,停止中のコンテナを含めて表示されます。
コンテナを停止するには,docker stop <コンテナ名>
と入力します。コンテナ名が出れば成功です。
docker logs war3-server
と入力すると,末尾にサーバー停止を示すログを確認できます。
コンテナを再び起動するには,docker start <コンテナ名>
と入力します。コンテナ名が出れば成功です。
サーバーのIPを変更するとき,バインドするフォルダを変更するときなどは,コンテナの削除が必要です。
コンテナを削除するには,docker rm <コンテナ名>
と入力します。
コンテナが稼働中には削除できません。その場合,停止してから削除します。コンテナ名が出れば成功です。
5. RCONのセットアップ
4まででサーバーのセットアップが終了しました。続いて,サーバーを操作するためのrconをセットアップします。
【お詫び】
自分が現在使っているRacerRCONをご紹介したかったのですが,配布先であるEugenSystemForumが現在開けないため,steamの投稿を代わりに貼らせていただきます。
https://steamcommunity.com/app/251060/discussions/0/1480982971180977997/
【サーバーのセットアップに関して】
システム上は,上記手順まででサーバーの構築は完了しています。
ただし,現状自身の環境では,RacerRCONによる一括設定を行わないと,WG:RD内のサーバーリストに載らず,接続ができない状態です。
RacerRCON以外での試験を実施していないため,正しいことは分かりかねますが,おそらく何かしらのrconクライアントによってサーバー名設定等のコマンドを送信すれば,サーバーリストに載せることができるのではないかと推測します。もしくは,NationConstraintなどの上記リファレンスで初期値が-1などになっているものを,「Any」等の何かしらに設定すれば解決するかもしれません。
下記にいくつかRCONのURLを貼っておきますので,適宜お試しください。
rconコマンド
基本的にはこちらに全て書かれています。
https://hub.docker.com/r/eugensystems/wargame3
Rconで利用できるコマンドは以下などがあります。
display_all_clients -> 接続中のプレイヤーとそのIDの一覧を表示
kick <プレイヤーID> -> プレイヤーIDでプレイヤーをキック
ban <プレイヤーID> -> プレイヤーIDでプレイヤーをban
unban <プレイヤーID> -> プレイヤーIDのプレイヤーのban解除
setsvar <設定キー> <設定値> -> 設定キーの設定を設定値に変更
たとえば,setsvar ServerName WargameServer
とするとサーバー名をWargameServerに変更できます。また,setsvar Password pass
とすると部屋にパスワードをかけ,パスワードをpassとできます。
設定キーの一覧は上記のリファレンスを参照してください。基本的には,rconクライアントが使える限り,これらのコマンドを代理実行してもらえます。
6. 最後に
すべての作業が完了すると,WG:RD起動→マルチの際に出てくるサーバー一覧に表示され,入ることができます。もし出ない際は,5を確認するか,左上のフィルターの箇所が全てチェックになっているか確認してください。
入ってみますとこのようになります!サーバーはAIを追加することはできませんが,ポイント数は非常に多くできたりしますので,ぜひ楽しんでください!
以上でWargame: Red Dragonのサーバー構築は終了です。ここまでお疲れ様でした!
何かご質問があればコメント欄やTwitterのDMまでぜひお寄せください。