> ## 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.

# Depurar servidores de juegos en contenedores con LocalMultiplayerAgent

> Depure localmente un servidor de juegos multijugador de PlayFab empaquetándolo como contenedor de Linux o Windows y ejecutándolo con LocalMultiplayerAgent en modo de contenedor.

# Cómo ejecutar un servidor de juegos con LocalMultiplayerAgent en modo de contenedor

Este tutorial describe cómo:

* Crear una compilación de contenedor \[Linux/Windows] con el ejemplo Wrapper
* Configurar MultiplayerSettings.json
* Configurar Docker
* Ejecutar LocalMultiplayerAgent
* Probar la conexión con su juego

## Crear una compilación de contenedor \[Linux/Windows]

Si no está familiarizado con los contenedores, consulte [Introducción a los contenedores y Docker](https://learn.microsoft.com/en-us/dotnet/architecture/microservices/container-docker-introduction/).

Aprenderemos a empaquetar un ejemplo existente como contenedor de Windows o Linux. Deberá configurar opciones diferentes según la plataforma (contenedor basado en Windows/Linux). Aquí usaremos el ejemplo Wrapper y repasaremos los detalles.

### Compilación de contenedor de Linux

Puede ejecutar los ejecutables wrapper y fakegame en una compilación de Linux, mediante contenedores de Linux. En este caso, debe crear una compilación de Linux.
Para obtener información sobre cómo crear una compilación de Linux de Wrapper, consulte [cómo crear una imagen de contenedor de Linux](/services/playfab/multiplayer/servers/wrapper-sample#create-and-upload-linux-container-image-for-linux-servers-only)

### Compilación de contenedor de Windows

LMA creará una compilación de contenedor de Windows por usted. Solo necesita configurar las opciones correctamente (consulte más adelante cómo configurar las opciones para el contenedor de Windows)

## Configurar MultiplayerSettings.json

Vaya a la carpeta donde extrajo el conjunto de herramientas de LMA y abra el archivo MultiplayerSettings.json. Este archivo es un archivo ficticio de configuración de compilación que simula la compilación en MPS.

También puede rellenar un json con el [Generador de MultiplayerSettings.json de LMA](https://github.com/PlayFab/MpsAgent/tree/main/LocalMultiplayerAgent/SettingsJsonGenerator). El Generador es una página web sencilla que crea un json basado en sus opciones. Puede encontrar el Generador en LocalMultiplayerAgent/SettingsJsonGenerator.

Este es el ejemplo de MultiplayerSettings.Json para ejecutar el ejemplo Wrapper como `Linux Container`.

```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"
                }
            }
        ]
    ],
}
```

Para `Windows Container`, no es necesario compilar el contenedor. LMA empaquetará su servidor de juegos como contenedor de Windows. Solo necesita especificar la imagen base del contenedor de Windows en el campo `ImageDetails` y establecer `LocalFilePath` en la ubicación donde se encuentra su recurso de juego en su estación de trabajo.

```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.
 }

```

Asegúrese de actualizar correctamente los campos siguientes en el archivo MultiplayerSettings.json para ejecutar LMA en modo de contenedor.

* `LocalFilePath`: ruta local completa (en su estación de trabajo) al archivo zip del recurso del servidor de juegos creado anteriormente, por ejemplo: D:\gameassets.zip (tenga en cuenta que las barras diagonales inversas deben escaparse para el formato JSON). Este campo es obligatorio para el contenedor de Windows, ya que LMA necesita localizar su recurso de juego y luego empaquetarlo en un contenedor.

* `PortMappingsList`: estos son los puertos que están disponibles para su juego mientras se ejecuta.

  * `NodePort` es el puerto que se abre en su estación de trabajo y se asignará al GamePort.
  * `GamePort.Number` es el puerto al que su servidor de juegos debe enlazarse cuando se ejecuta en un contenedor. Por ejemplo, aquí establecemos el número de puerto en 80, que es el que escuchará fakegame.exe.
  * Establezca `GamePort.Name` en el mismo valor definido en su servidor de juegos. Puede comprobar la configuración del GSDK en tiempo de ejecución para obtener el valor con la clave GamePort.Name.
  * `GamePort.Protocol`: especifique el tipo de protocolo: TCP o UDP

  Actualice la sección GamePort para que coincida con el protocolo y el puerto en los que su servidor de juegos escucha a los clientes. Puede agregar varios puertos.

* `ForcePullFromAcrOnLinuxContainersOnWindows`: establézcalo en true cuando quiera extraer la imagen de contenedor de Linux desde el registro de Docker y evitar la extracción desde el registro local. En la mayoría de los casos, querrá establecerlo en false.

* `ContainerStartParameters.ImageDetails`: la imagen de su servidor de juegos puede publicarse en un registro de contenedores o compilarse localmente. Si desea extraer la imagen de contenedor de Linux desde el registro de Docker (por ejemplo, Azure Registry), debe establecer el valor de nombre de usuario y contraseña, y establecer `ForcePullFromAcrOnLinuxContainersOnWindows` en true. Para el contenedor de Windows, el nombre de usuario y la contraseña no son necesarios.

* `OutputFolder`: ruta a una unidad o carpeta donde se generan las salidas y los archivos de configuración. Asegúrese de que haya suficiente espacio disponible, ya que el servidor de juegos se extraerá en esta ruta. Si no se especifica, se usa la carpeta del agente.

* `AgentListeningPort`: este es el puerto que usa LMA para comunicarse con el servidor de juegos. Cualquier puerto abierto funcionará; 56001 es el valor predeterminado. Si tiene otro proceso enlazado al puerto 56001, debe cambiar este valor o finalizar el otro proceso en el puerto 56001.

* `ResourceLimits` (opcional): si se especifica, Docker limita el uso de CPU/memoria. Advertencia: si su servidor supera la memoria permitida, se finaliza. ResourceLimits solo puede especificarse en modo de contenedor.

* `SessionCookie` (opcional): cualquier cookie de sesión que se pasa a su servidor de juegos como parte de la llamada a la API RequestMultiplayerServer. En el escenario real en MPS, después de establecer la conexión, el servidor notificará al cliente que cargue los recursos correspondientes desde SessionCookie.

## Configuración de Docker

Ejecute los scripts de PowerShell para configurar las redes de Docker denominadas "PlayFab" y agregar reglas de firewall para comunicarse con LocalMultiplayerAgent.

* Para el contenedor de Linux, ejecute `SetupLinuxContainersOnWindows.ps1`.\
  Para el contenedor de Windows, ejecute `Setup.ps1`. Descargará la imagen de Docker de PlayFab desde Microsoft/PlayFab-Multiplayer.\
  Tenga en cuenta que la primera vez que se ejecuta el script, la descarga de la imagen de contenedor puede tardar unos minutos.
  > Para ejecutar esta configuración correctamente, es posible que tenga que configurar el firewall de cualquier programa antivirus de terceros que tenga instalado.

Para obtener información sobre cómo dirigirse al demonio de Docker correcto entre contenedores de Windows y Linux, consulte [Cómo cambiar Docker para usar contenedores de Windows/Linux](https://docs.docker.com/desktop/windows/#switch-between-windows-and-linux-containers)

## Ejecutar LocalMultiplayerAgent

* En una ventana de PowerShell:\
  Vaya al directorio de LMA que contiene LocalMultiplayerAgent.exe.

* Ejecute `LocalMultiplayerAgent.exe` para el contenedor de Windows.\
  Ejecute `LocalMultiplayerAgent.exe -lcow` para el contenedor de Linux.\
  (lcow significa Linux Containers On Windows)

  En este punto, LMA configura el agente de escucha http y ejecuta un contenedor.
  Puede ejecutar el comando `docker ps` para ver los contenedores en ejecución en su máquina.

LMA esperará los latidos del GSDK integrado con su servidor de juegos.
Si el GSDK está integrado correctamente, LMA imprime las salidas en el orden siguiente:

1. `CurrentGameState - Initializing`\
   (Es posible que esto no aparezca si su servidor de juegos llama directamente a GSDK::ReadyForPlayers y no llama a GSDK::Start)
2. `CurrentGameState - StandingBy`
3. `CurrentGameState - Active`
4. `CurrentGameState - Terminating`

Para obtener más información sobre los estados de un servidor de juegos, consulte [¿Qué es el ciclo de vida del servidor de juegos de PlayFab Multiplayer Server?](/services/playfab/multiplayer/servers/multiplayer-game-server-lifecycle).

Si las devoluciones de llamada de apagado están configuradas correctamente, su servidor de juegos se cerrará poco después de que el estado se establezca en terminating.
Es importante verificar que el servidor de juegos se cierra para evitar apagados incorrectos en la plataforma de PlayFab.

LMA también debería terminar junto con el juego.

## Probar la conexión con su juego

Una vez que LMA imprime **CurrentGameState - Active**, puede conectarse a su servidor de juegos mediante la dirección IP 127.0.0.1 y el puerto NodePort en el que su servidor de juegos está escuchando.

Si usa el ejemplo Wrapper, puede probar una solicitud GET introduciendo la dirección [http://127.0.0.1:56100/Hello](http://127.0.0.1:56100/Hello) en su explorador.
Para obtener más detalles, consulte el ejemplo Wrapper.

También puede actualizar los valores de **NumHeartBeatsForActivateResponse** y **NumHeartBeatsForTerminateResponse** en MultiplayerSettings.json para ajustar la duración del estado standing-by/active.

### Solución de problemas

* En modo de contenedor, si su servidor de juegos se cierra inmediatamente con un error similar a "Container ... exited with exit code 1", pero funciona bien en modo de proceso, asegúrese de que ha incluido todas las [DLL del sistema](/services/playfab/multiplayer/servers/determining-required-dlls) necesarias en su paquete de recursos.
* Todos los registros se encuentran en la carpeta `OutputFolder` especificada en el archivo *MultiplayerSettings.json*. **LocalMultiplayerAgent** crea una carpeta nueva cada vez que se inicia, con la marca de tiempo como nombre de carpeta. Todos los registros del servidor de juegos emitidos mediante el GSDK se encuentran dentro de la carpeta GameLogs.\
  Si el servidor de juegos se ejecuta en un contenedor, es posible que haya un nivel adicional de jerarquía de directorios por recorrer.
* El GSDK escribe registros de depuración en la carpeta GameLogs dentro de `OutputFolder`.
  Estos registros se encuentran dentro de la carpeta GameLogs junto con los registros generados por el servidor de juegos.
* Asegúrese de que los firewalls (de Windows y otros antivirus) estén configurados para permitir el tráfico a través de los puertos.
* Si recibe un error similar a: `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.` Esto puede ocurrir si **LocalMultiplayerAgent** se cierra prematuramente. Use el comando `docker ps` para encontrar el contenedor que se está ejecutando y luego elimínelo mediante `docker kill <container_name>`.
* Si recibe un error que contiene `Failed to find network 'playfab'`, intente volver a ejecutar *Setup.ps1*

### Limitaciones conocidas

1. Es posible que los contenedores no terminen al final de la depuración. Si esto ocurre, ejecute los siguientes comandos de PowerShell como administrador. Estos comandos detienen y quitan todos los contenedores, incluidos los que no fueron iniciados por **LocalMultiplayerAgent**.

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


## Related topics

- [Depurar servidores de juegos basados en procesos con LocalMultiplayerAgent](/es/services/playfab/multiplayer/servers/LocalMultiplayerAgent/run-process-based-gameserver.md)
- [Depuración local de servidores de juego e integración con PlayFab](/es/services/playfab/multiplayer/servers/locally-debugging-game-servers-and-integration-with-playfab.md)
- [Conexión directa para depurar servidores de juegos](/es/services/playfab/multiplayer/servers/directly-debugging-game-servers.md)
- [Información general de LocalMultiplayerAgent](/es/services/playfab/multiplayer/servers/LocalMultiplayerAgent/local-multiplayer-agent-overview.md)
- [Ejemplo de Wrapper](/es/services/playfab/multiplayer/servers/wrapper-sample.md)
