> For the complete documentation index, see [llms.txt](https://docs.devolutions.net/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.devolutions.net/powershell-universal/es/config/hosting/azure.md).

# Azure

Despliegue PowerShell Universal en Azure usando aplicaciones web en contenedor o aplicaciones web estándar, configurando la persistencia, el almacenamiento SQL y las cabeceras reenviadas.

PowerShell Universal es una aplicación web ASP.NET Core y puede alojarse en Windows Azure Web Apps.

## Aplicación web en contenedor

Las aplicaciones web en contenedor permiten usar imágenes de Docker como aplicaciones web en Azure. Dentro del portal de Azure, puede crear una aplicación web de contenedor Docker mediante el asistente App Services \ Create Web App.

Una vez que haya seleccionado un grupo de recursos, asignado un nombre y seleccionado un plan de proceso, podrá crear la aplicación web.

A continuación, deberá desplegar la imagen en su aplicación web. Para ello, seleccione el Deployment Center y configure la imagen que se va a extraer. Puede extraer una versión etiquetada estática (como 2.7.3) o extraer la última y su aplicación web se mantendrá automáticamente actualizada con las nuevas versiones de PowerShell Universal. Utilice la etiqueta con el sufijo `azure`. Está preconfigurada para ejecutarse en Azure.

{% hint style="info" %}
Para entornos de producción, sugerimos establecer una versión etiquetada para evitar actualizaciones no intencionadas de su contenedor cuando se reinicie. De forma predeterminada, Azure actualizará automáticamente los contenedores cuando se actualice una etiqueta, como latest. Esto le permitirá controlar las actualizaciones de su versión de PowerShell Universal.
{% endhint %}

### Persistencia local

De forma predeterminada, el contenedor escribirá en el directorio `/home`.

Deberá asegurarse de que la variable de entorno `WEBSITES_ENABLE_APP_SERVICE_STORAGE` esté establecida en true. Esto configura el contenedor para que la carpeta `/home` sea persistente, que es donde se almacenan los datos de configuración de PowerShell Universal.

### Git y SQL

Si opta por usar la integración con git en PowerShell Universal, recomendamos configurar un servidor y una base de datos SQL para el almacenamiento. Git se utilizará para sincronizar los ficheros de configuración cuando se inicie el contenedor. SQL almacenará la configuración de git junto con recursos como trabajos, tokens de aplicación e identidades.

Necesitará una base de datos de Azure SQL para empezar. Una vez que cree el recurso, deberá copiar la cadena de conexión de la base de datos para proporcionársela a PowerShell Universal.

Asegúrese de haber permitido que los servicios de Azure accedan a la base de datos.

Para habilitar la compatibilidad con SQL, debe configurar los plugins dentro de PowerShell Universal para que usen el plugin SQL en la configuración de la aplicación de su aplicación web.

Cree un ajuste `Plugins__0` con el valor `SQL`. A continuación, establezca el valor `Data__ConnectionString` en la base de datos de su servidor SQL.

Una vez que tenga SQL configurado, puede iniciar su contenedor. El esquema de la base de datos se creará al iniciarse el contenedor. A continuación, deberá configurar git dentro de PowerShell Universal haciendo clic en Source Control > Git > Settings. Introduzca su remoto, rama, nombre de usuario, contraseña o token de acceso personal y el modo de sincronización. No se recomienda Push-only en esta configuración porque el estado del contenedor se pierde entre reinicios. Asegúrese de que el modo de inicialización esté establecido en Clone.

{% hint style="info" %}
La configuración de git se almacena en su base de datos SQL y se recuperará cada vez que se inicie el contenedor.
{% endhint %}

### Cabeceras reenviadas

Los contenedores suelen alojarse detrás de un proxy inverso y no conocerán la URL externa real sin una configuración adicional. Para asegurarse de que los sistemas que requieren la URL externa, como OpenID Connect, reciban la información correcta, deberá establecer la variable de entorno `ASPNETCORE_FORWARDEDHEADERS_ENABLED` en `true`.

Para más información, puede leer esta entrada de blog de [Microsoft](https://devblogs.microsoft.com/dotnet/forwarded-headers-middleware-updates-in-net-core-3-0-preview-6/).

### Bicep

Puede utilizar la siguiente plantilla de Bicep para desplegar una aplicación web en contenedor con almacenamiento persistente.

{% code collapsedlinecount="10" %}

```bicep
@description('Name of Azure Web App')
param siteName string = 'psu-${uniqueString(resourceGroup().id)}'

@description('The version of PowerShell Universal')
param version string = '5.4.4'

@description('App Service Plan Pricing Tier')
@allowed([
  'B1'
  'B2'
  'B3'
  'S1'
  'S2'
  'S3'
  'P1V2'
  'P2V2'
  'P2V3'
])
param servicePlanPricingTier string = 'S2'
var servicePlanName = '${siteName}-asp'

@description('Location for all the resources.')
param location string = resourceGroup().location

var servicePlanPricingTiers = {
  F1: {
    tier: 'Free'
  }
  B1: {
    tier: 'Basic'
  }
  B2: {
    tier: 'Basic'
  }
  B3: {
    tier: 'Basic'
  }
  S1: {
    tier: 'Standard'
  }
  S2: {
    tier: 'Standard'
  }
  S3: {
    tier: 'Standard'
  }
  P1V2: {
    tier: 'Standard'
  }
  P2V2: {
    tier: 'Standard'
  }
  P2V3: {
    tier: 'Standard'
  }
}

resource planResource 'Microsoft.Web/serverfarms@2024-04-01' = {
  name: servicePlanName
  location: location
  sku: {
    name: servicePlanPricingTier
    tier: servicePlanPricingTiers[servicePlanPricingTier].tier
    capacity: 1
  }
  kind: 'linux'
  properties: {
    reserved: true
  }
}

resource siteResource 'Microsoft.Web/sites@2024-04-01' = {
  name: siteName
  location: location
  properties: {
    serverFarmId: planResource.id
    siteConfig: {
      linuxFxVersion: 'DOCKER|devolutions/powershell-universal:${version}-azure'
    }
  }
}

resource siteWebAppsettingsResource 'Microsoft.Web/sites/config@2024-04-01' = {
  parent: siteResource
  name: 'appsettings'
  properties: {
    WEBSITES_ENABLE_APP_SERVICE_STORAGE: 'true'
  }
}

```

{% endcode %}

### Sidecars de contenedor

Las aplicaciones web en contenedor también admiten [contenedores sidecar](https://learn.microsoft.com/en-us/azure/app-service/overview-sidecar), que le permiten ejecutar contenedores adicionales junto al contenedor de PowerShell Universal. Esto resulta útil para dar soporte a servicios como proxies, agentes, recolectores u otros procesos complementarios. Al alojar PowerShell Universal en esta configuración, asegúrese de que el contenedor web expone el puerto HTTP correcto. De forma predeterminada, PowerShell Universal escucha en el puerto `5000`.

## Aplicación web estándar

### Crear manualmente una aplicación web

Dentro del portal de Azure, deberá crear un nuevo recurso de aplicación web. Actualmente, PowerShell Universal requiere la pila de tiempo de ejecución .NET 10. Puede usar Linux o Windows.

{% hint style="info" %}
Si elige un plan de hospedaje de Windows en lugar de un plan de hospedaje de Linux en Azure al configurar su WebApp, deberá elegir un plan Basic (B1) o superior para poder usar aplicaciones de 64 bits. También tendrá que ir a Settings > Configuration > General setting > Platform y seleccionar 64-bit antes de ejecutar el comando `Publish-AzWebApp`, o la instalación fallará.
{% endhint %}

**Comando de inicio (solo Linux)**

Al alojar en un entorno Linux, deberá establecer el comando de inicio en Settings \ Configuration \ General Settings \ Startup Command con el siguiente valor.

{% code collapsedlinecount="10" %}

```
dotnet Universal.Server.dll
```

{% endcode %}

En el siguiente ejemplo, usaremos el módulo Azure PowerShell para desplegar manualmente la aplicación web.

Primero deberá instalar Azure PowerShell.

{% code collapsedlinecount="10" %}

```powershell
Install-Module Az
```

{% endcode %}

Una vez instalado, deberá conectarse a su suscripción.

{% code collapsedlinecount="10" %}

```powershell
Connect-AzAccount
```

{% endcode %}

### Desplegar ficheros de Windows

Si utiliza Windows, deberá descargar el fichero ZIP de Windows. Este ejemplo descarga PowerShell Universal 2026.3.0.0.

{% code collapsedlinecount="10" %}

```powershell
$Version = '2026.3.0.0'
Invoke-WebRequest "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.win-x64.$Version.zip" -OutFile .\Universal.zip
```

{% endcode %}

### Desplegar ficheros de Linux

Si utiliza Linux, deberá descargar el fichero ZIP de Linux. Este ejemplo descarga PowerShell Universal 2026.3.0.0.

{% code collapsedlinecount="10" %}

```powershell
$Version = '2026.3.0.0'
Invoke-WebRequest "https://cdn.devolutions.net/download/Devolutions.PowerShellUniversal.linux-x64.$Version.zip" -OutFile .\Universal.zip
```

{% endcode %}

Ahora que tenemos el módulo Az configurado y el ZIP de Universal descargado, podemos desplegar la aplicación web.

{% code collapsedlinecount="10" %}

```powershell
$Parameters = @{
    Force = $true
    ResourceGroupName = 'psudemo2_group'
    Name = 'psudemo2'
    ArchivePath = '.\Universal.zip'
}
Publish-AzWebApp @Parameters
```

{% endcode %}

{% hint style="info" %}
Puede comprobar en Azure, en Deployment Center > Logs, el estado Success (Active) para asegurarse de que los ficheros se desplegaron / instalaron correctamente.
{% endhint %}

### Ajustes de configuración necesarios

Estos ajustes pueden establecerse en la pestaña Configuration, dentro de Application settings.

#### Clave de firma JWT

La clave de firma JWT predeterminada no tiene la longitud suficiente y deberá actualizarse. Esto puede hacerse en `appsettings.json` o mediante variables de entorno.

#### appsettings.json

{% code collapsedlinecount="10" %}

```
  "Jwt": {
    "SigningKey": "xXyt9UpJKB4Pb*4$hprd!JJoyOcK4ZOV**O7Hug9&@gYHc$",
    "Issuer": "IronmanSoftware",
    "Audience": "PowerShellUniversal"
  },
```

{% endcode %}

#### Variable de entorno

{% code collapsedlinecount="10" %}

```
$Env:Jwt__SigningKey = 'xXyt9UpJKB4Pb*4$hprd!JJoyOcK4ZOV**O7Hug9&@gYHc$'
```

{% endcode %}

#### URL de la API

Las Azure Web Apps usan un proxy inverso y PowerShell Universal no detecta la URL externa adecuadamente. Al ejecutar trabajos, Universal utiliza la Management API para buscar automáticamente información de trabajos, scripts y programaciones. Esto significa que fallará si no puede direccionar correctamente la URL externa de la API.

La URL de la API debe ser la dirección HTTP externa de su aplicación web. Puede actualizarla en `appsettings.json` o mediante una variable de entorno.

#### appsettings.json

{% code collapsedlinecount="10" %}

```
"Api": {
 "Url": "https://psudemo.azurewebsites.net"
 },
```

{% endcode %}

#### Variable de entorno

{% code collapsedlinecount="10" %}

```
$Env:Api__Url = "https://psudemo.azurewebsites.net"
```

{% endcode %}

#### NodeName

Puede establecer el nombre de la instancia de PowerShell Universal especificando NodeName. Esto garantizará que los reinicios no afecten a la base de datos de PowerShell Universal. No es necesario para instalaciones con LiteDB.

{% code collapsedlinecount="10" %}

```
$Env:NodeName = "psuazure"
```

{% endcode %}

#### PORT y WEBSITES\_PORT (solo Linux)

Para anular el puerto predeterminado en una aplicación web de Linux, debe establecer los ajustes PORT y WEBSITES\_PORT en 5000.

Después de publicar la aplicación web, vea su instancia de PowerShell Universal navegando a la URL de la aplicación web.

#### Almacenamiento persistente

El fichero `appsettings.json` predeterminado almacenará la base de datos y los ficheros de configuración en una ubicación no persistente. Puede añadir variables de entorno para moverlos a un almacenamiento persistente dentro de su aplicación web.

**Data\_\_RepositoryPath**

La variable de entorno `Data__RepositoryPath` establece la ubicación de los ficheros de configuración de Universal. Establezca el valor en el siguiente.

{% code collapsedlinecount="10" %}

```
D:\home\Data\PowerShellUniversal\Repository
```

{% endcode %}

### Actualizar su aplicación web

Cuando se publique una nueva versión de PowerShell Universal, deberá actualizar los ficheros de la aplicación de su aplicación web. Recomendamos eliminar el directorio de la aplicación y volver a desplegar los ficheros. La base de datos y los ficheros de configuración no se almacenan en el directorio de la aplicación.

Puede eliminar los ficheros de su aplicación web mediante la API de comandos de Kudu. Sus credenciales de Kudu usan autenticación básica y son las mismas que sus [credenciales de despliegue](https://github.com/projectkudu/kudu/wiki/Deployment-credentials).

Para eliminar todos los ficheros de su aplicación web, ejecute el siguiente comando.

{% code collapsedlinecount="10" %}

```powershell
$Parameters = @{
   Uri = "https://psudemo2.scm.azurewebsites.net/api/command"
   Credential = (Get-Credential)
   Body = (@{
      command = "rd /s /q D:\home\site\wwwroot"
      dir = "D:\home\site\wwwroot"
   } | ConvertTo-Json)
}

Invoke-RestMethod @Parameters
```

{% endcode %}

Una vez que haya eliminado los ficheros de la aplicación, puede volver a desplegarlos ejecutando de nuevo los pasos de creación manual.

## Application Gateway

Puede configurar PowerShell Universal para que se ejecute detrás de un Application Gateway dentro de Azure. Esto resulta útil para proporcionar equilibrio de carga y alta disponibilidad a varias instancias de PowerShell Universal.

Primero, configure un grupo de backend que apunte a una o varias Azure Web Apps que ejecuten PowerShell Universal.

Para la configuración del backend, deberá asegurarse de que está usando HTTPS con un certificado de una CA conocida. La afinidad basada en cookies es necesaria para garantizar que las sesiones sean persistentes en un nodo individual.

Para permitir que Azure sirva la aplicación web correcta, deberá asegurarse de que el ajuste Override with new host name esté configurado. Utilice el nombre de host del destino del backend.

Asegúrese de que la regla del grupo de backend esté configurada como destino y no como redirección.

Configure una regla de reescritura de cabeceras para pasar el nombre de host público como la cabecera `X-Forwarded-Host`. PowerShell Universal la usará para construir URLs internamente.

La regla de reescritura anterior es un requisito de los métodos de autenticación OpenID Connect y SAML2.

Por último, puede configurar la IP pública de su Application Gateway usando un proveedor de DNS con un nombre de host personalizado. Cree un registro A en su gestión de DNS.


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.devolutions.net/powershell-universal/es/config/hosting/azure.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
