> ## Documentation Index
> Fetch the complete documentation index at: https://devdocs.xbox.com/llms.txt
> Use this file to discover all available pages before exploring further.

# LocalMultiplayerAgent でコンテナー ゲーム サーバーをデバッグする

> PlayFab マルチプレイヤー ゲーム サーバーを Linux または Windows コンテナーとしてパッケージ化し、コンテナー モードの LocalMultiplayerAgent で実行して、ローカルでデバッグします。

# LocalMultiplayerAgent をコンテナー モードで使用してゲーム サーバーを実行する方法

このチュートリアルでは、次の手順について説明します。

* Wrapper サンプルを使用して \[Linux/Windows] コンテナー ビルドを作成する
* MultiplayerSettings.json を構成する
* Docker のセットアップ
* LocalMultiplayerAgent を実行する
* ゲーム接続をテストする

## \[Linux/Windows] コンテナー ビルドを作成する

コンテナーに詳しくない場合は、[Introduction to Container and Docker](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/container-docker-introduction/) を参照してください。

ここでは、既存のサンプルを Windows または Linux コンテナーとしてパッケージ化する方法について学習します。プラットフォーム (Windows/Linux ベースのコンテナー) ごとに異なる設定を構成する必要があります。ここでは Wrapper サンプルを使用して詳細を説明します。

### Linux コンテナー ビルド

Linux コンテナーを使用して、Linux ビルド上で Wrapper と fakegame の実行可能ファイルを実行できます。この場合、Linux ビルドを作成する必要があります。
Wrapper の Linux ビルドを作成する方法については、[Linux コンテナー イメージの作成方法](/services/playfab/multiplayer/servers/wrapper-sample#create-and-upload-linux-container-image-for-linux-servers-only) を参照してください。

### Windows コンテナー ビルド

LMA が Windows コンテナー ビルドを作成します。設定を正しく構成するだけで済みます (Windows コンテナー用の設定方法については後述します)。

## MultiplayerSettings.json を構成する

LMA ツールセットを展開したフォルダーに移動し、MultiplayerSettings.json ファイルを開きます。このファイルは、MPS 上のビルドをシミュレートするためのビルド構成モック ファイルです。

[LMA MultiplayerSettings.json Generator](https://github.com/PlayFab/MpsAgent/tree/main/LocalMultiplayerAgent/SettingsJsonGenerator) を使用して JSON を作成することもできます。Generator は、オプションに基づいて JSON を作成するシンプルな Web ページです。Generator は LocalMultiplayerAgent/SettingsJsonGenerator の下にあります。

以下は、Wrapper サンプルを `Linux コンテナー` として実行する MultiplayerSettings.Json の例です。

```json theme={null}
{
    "RunContainer": true, // Set RunContainer to true if you are running LMA in Container mode.
    "OutputFolder": "C:\\output\\LMAContainer", // Path where config files and logs will be generated from LMA at each run
    "NumHeartBeatsForActivateResponse": 10,
    "NumHeartBeatsForTerminateResponse": 60,
    "TitleId": "", // default value
    "BuildId": "00000000-0000-0000-0000-000000000000", // default value
    "Region": "59F84", // default value
    "AgentListeningPort": 56001, // default value
    "ContainerStartParameters": {
        /// replace ImageDetails fields to your own images saved on ACR.
        "ImageDetails": {
            "Registry": "mydockerregistry.io",
            "ImageName": "wrapper",
            "ImageTag": "0.1",
            "Username": "",
            "Password": ""
        }
    },
    "PortMappingsList": [
        [
            {
                "NodePort": 56100,
                "GamePort": {
                    "Name": "game_port", 
                    // The same value of GamePort Name should be also defined in the Wrapper so Wrapper can get a port information while it's running.
                    "Number": 80,
                    "Protocol": "TCP"
                }
            }
        ]
    ],
}
```

`Windows コンテナー` の場合、コンテナーをビルドする必要はありません。LMA がゲーム サーバーを Windows コンテナーとしてパッケージ化します。`ImageDetails` フィールドに Windows コンテナー ベース イメージを指定し、`LocalFilePath` にワークステーション上のゲーム アセットの場所を設定するだけで済みます。

```json theme={null}
"AssetDetails": [
    {
      "MountPath": "C:\\Assets",  
      // Mount Path should be "C:\\Assets" for Windows Container. 
      "LocalFilePath": "D:\\gameassets.zip" 
      // where your game server is located as an archive format.
    }
  ]

 "ContainerStartParameters": {
    "StartGameCommand": "C:\\Assets\\wrapper.exe -g C:\\Assets\\fakegame.exe arg1 arg2", 
    // Your game assets will be extracted under C:\\Assets (default mount path for Windows Container) and LMA will run your game server with StartGameCommand argument. 
     // Make sure the StartGameCommand provided above is an example of the Wrapper sample. 
    "ImageDetails": {
      "Registry": "mcr.microsoft.com",
      "ImageName": "playfab/multiplayer",
      "ImageTag": "wsc-10.0.17763.973.1",
      "Username": "", 
      "Password": ""
      // username and password are not required to use MCR image.
    }
    // LMA will package an existing game sample (path defined in LocalFilePath) as a Windows container.
 }

```

コンテナー モードで LMA を実行するには、MultiplayerSettings.json 内の以下のフィールドを必ず正しく更新してください。

* `LocalFilePath` - 事前に作成したゲーム サーバーのアセット zip ファイルへのローカル (ワークステーション上) のフル パスです (例: D:\gameassets.zip、JSON フォーマットのためバックスラッシュはエスケープが必要です)。このフィールドは Windows コンテナーで必須です。LMA がゲーム アセットを検索してコンテナーにパッケージ化するために必要となります。

* `PortMappingsList` - これらは実行中にゲームで利用可能なポートです。

  * `NodePort` はワークステーション上で開かれるポートで、GamePort にマッピングされます。
  * `GamePort.Number` はコンテナーで実行時にゲーム サーバーがバインドする必要のあるポートです。たとえば、ここでは fakegame.exe がリッスンするポート番号として 80 を設定しています。
  * `GamePort.Name` はゲーム サーバーで定義されている値と同じ値を設定してください。実行時に GSDK config を確認して GamePort.Name キーの値を確認できます。
  * `GamePort.Protocol` - プロトコル タイプを指定します: TCP または UDP。

  GamePort セクションを、ゲーム サーバーがクライアントに対してリッスンするプロトコルとポートに合わせて更新してください。複数のポートを追加することもできます。

* `ForcePullFromAcrOnLinuxContainersOnWindows` - Docker レジストリから Linux コンテナー イメージをプルし、ローカル レジストリからのプルを回避したい場合は true に設定します。ほとんどの場合、これは false に設定します。

* `ContainerStartParameters.ImageDetails` - ゲーム サーバー イメージは、コンテナー レジストリで公開することも、ローカルでビルドすることもできます。Docker レジストリ (例: Azure レジストリ) から Linux コンテナー イメージをプルしたい場合は、ユーザー名とパスワードの値を設定し、`ForcePullFromAcrOnLinuxContainersOnWindows` を true に設定する必要があります。Windows コンテナーの場合、ユーザー名とパスワードは不要です。

* `OutputFolder` - 出力および構成ファイルが生成されるドライブまたはフォルダーへのパスです。ゲーム サーバーはこのパスの下に展開されるため、十分な空き容量があることを確認してください。指定しない場合、エージェント フォルダーが使用されます。

* `AgentListeningPort` - LMA がゲーム サーバーと通信するためのポートです。任意の空きポートで動作します。既定値は 56001 です。56001 にバインドされている別のプロセスがある場合は、この値を変更するか、ポート 56001 上の他のプロセスを終了する必要があります。

* `ResourceLimits` (省略可能) - 指定した場合、Docker が CPU/メモリ使用量を制限します。警告: サーバーが許可されたメモリを超えると、強制終了されます。ResourceLimits はコンテナー モードでのみ指定可能です。

* `SessionCookie` (省略可能) - RequestMultiplayerServer API 呼び出しの一部としてゲーム サーバーに渡される任意のセッション Cookie です。MPS 上の実際のシナリオでは、接続確立後、サーバーは SessionCookie から対応するリソースを読み込むようクライアントに通知します。

## Docker のセットアップ

「PlayFab」という名前の Docker ネットワークを作成し、LocalMultiplayerAgent と通信するためのファイアウォール ルールを追加する PowerShell スクリプトを実行します。

* Linux コンテナーの場合は `SetupLinuxContainersOnWindows.ps1` を実行します。\
  Windows コンテナーの場合は `Setup.ps1` を実行します。これにより、Microsoft/PlayFab-Multiplayer から PlayFab Docker イメージがプルされます。\
  スクリプトの初回実行時は、コンテナー イメージのダウンロードに数分かかる場合があります。
  > このセットアップを正常に実行するには、インストールされているサードパーティ製アンチウイルス プログラムのファイアウォールを構成する必要がある場合があります。

Windows コンテナーと Linux コンテナー間で正しい Docker デーモンを対象にする方法については、[Docker で Windows/Linux コンテナーを使用するように切り替える方法](https://docs.docker.com/desktop/windows/#switch-between-windows-and-linux-containers) を参照してください。

## LocalMultiplayerAgent を実行する

* PowerShell ウィンドウで:\
  LocalMultiplayerAgent.exe が含まれる LMA のディレクトリに移動します。

* Windows コンテナーの場合は `LocalMultiplayerAgent.exe` を実行します。\
  Linux コンテナーの場合は `LocalMultiplayerAgent.exe -lcow` を実行します。\
  (lcow は Linux Containers On Windows の略です。)

  この時点で LMA は HTTP リスナーをセットアップし、コンテナーを実行します。\
  `docker ps` コマンドを実行すると、マシン上で実行中のコンテナーを確認できます。

LMA は、ゲーム サーバーに統合された GSDK からのハートビートを待機します。
GSDK が正しく統合されていれば、LMA は以下の順序で出力を表示します。

1. `CurrentGameState - Initializing`\
   (ゲーム サーバーが直接 GSDK::ReadyForPlayers を呼び出し、GSDK::Start を呼び出さない場合、これは表示されない場合があります。)
2. `CurrentGameState - StandingBy`
3. `CurrentGameState - Active`
4. `CurrentGameState - Terminating`

ゲーム サーバーの状態の詳細については、[PlayFab Multiplayer Server のゲーム サーバー ライフサイクルとは](/services/playfab/multiplayer/servers/multiplayer-game-server-lifecycle) を参照してください。

シャットダウン コールバックが正しく設定されている場合、状態が terminating に設定された直後にゲーム サーバーが終了します。
PlayFab プラットフォームでの異常なシャットダウンを避けるため、ゲーム サーバーが確実に終了することを確認することが重要です。

LMA もゲームとともに終了するはずです。

## ゲームへの接続をテストする

LMA が **CurrentGameState - Active** を表示したら、IP アドレス 127.0.0.1 と、ゲーム サーバーがリッスンしている NodePort を使用してゲーム サーバーに接続できます。

Wrapper サンプルを使用している場合は、ブラウザーに `http://127.0.0.1:56100/Hello` というアドレスを入力して GET リクエストをテストできます。詳細については Wrapper サンプルを参照してください。

MultiplayerSettings.json の **NumHeartBeatsForActivateResponse** および **NumHeartBeatsForTerminateResponse** の値を更新することで、standing-by/active 状態の期間を調整することもできます。

### トラブルシューティング

* コンテナー モードでゲーム サーバーが「Container ... exited with exit code 1」などのエラーで即座に終了するが、プロセス モードでは問題なく動作する場合は、必要なすべての [システム DLL](/services/playfab/multiplayer/servers/determining-required-dlls) がアセット パッケージに含まれていることを確認してください。
* すべてのログは、*MultiplayerSettings.json* ファイルで指定された `OutputFolder` 下に配置されます。**LocalMultiplayerAgent** は起動のたびに、タイムスタンプをフォルダー名とする新しいフォルダーを作成します。GSDK を通じて出力されたすべてのゲーム サーバー ログは GameLogs フォルダー内に配置されます。\
  ゲーム サーバーがコンテナー内で実行されている場合、追加のディレクトリ階層をたどる必要がある場合があります。
* GSDK はデバッグ ログを `OutputFolder` 下の GameLogs フォルダーに書き込みます。
  これらのログは、ゲーム サーバーが出力するログと共に GameLogs フォルダー内に配置されます。
* ファイアウォール (Windows のものおよびその他のアンチウイルス) が、対象ポート上でのトラフィックを許可するように構成されていることを確認してください。
* 次のようなエラーが表示される場合: `Docker API responded with status code=InternalServerError, response={"message":"failed to create endpoint <container_name> on network playfab: hnsCall failed in Win32: The specified port already exists". It is likely there is already a container running on the specified port.` これは、**LocalMultiplayerAgent** が予期せず終了した場合に発生する可能性があります。`docker ps` コマンドで実行中のコンテナーを確認し、`docker kill <container_name>` で削除してください。
* `Failed to find network 'playfab'` を含むエラーが表示される場合は、*Setup.ps1* を再実行してみてください。

### 既知の制限事項

1. デバッグ終了時にコンテナーが終了しない場合があります。この場合、管理者として次の PowerShell コマンドを実行してください。これらのコマンドは、**LocalMultiplayerAgent** によって起動されていないものを含め、すべてのコンテナーを停止して削除します。

```powershell theme={null}
docker stop $(docker ps -aq)
docker rm $(docker ps -aq)  
```


## Related topics

- [ゲーム サーバーをデバッグするための直接接続](/ja-jp/services/playfab/multiplayer/servers/directly-debugging-game-servers.md)
- [ゲーム サーバーのローカル デバッグと PlayFab との統合](/ja-jp/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab.md)
- [LocalMultiplayerAgent を使用したプロセスベースのゲームサーバーのデバッグ](/ja-jp/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
- [LocalMultiplayerAgent の概要](/ja-jp/services/playfab/multiplayer/servers/LocalMultiplayerAgent/local-multiplayer-agent-overview.md)
- [GSDK プロジェクトのテストとデバッグ](/ja-jp/services/playfab/multiplayer/servers/server-sdks/unreal-gsdk/third-person-mp-example-project-local-deployment-and-debugging.md)
