> 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/it/config/hosting/azure.md).

# Azure

Distribuisca PowerShell Universal in Azure utilizzando app web container o app web standard, configurando la persistenza, l'archiviazione SQL e gli header inoltrati.

PowerShell Universal è un'applicazione web ASP.NET Core e può essere ospitata in Windows Azure Web Apps.

## App web in container

Le app web in container consentono di utilizzare immagini Docker come app web in Azure. All'interno del portale di Azure, può creare un'app web Docker Container utilizzando la procedura guidata App Services \ Create Web App.

Dopo aver selezionato un gruppo di risorse, assegnato un nome e selezionato un piano di calcolo, potrà creare l'app web.

Successivamente, dovrà distribuire l'immagine nella sua app web. A tale scopo, selezioni il Deployment Center e configuri l'immagine da estrarre. Può estrarre una versione con tag statico (come 2.7.3) oppure estrarre la versione latest, in modo che la sua app web rimanga automaticamente aggiornata con le nuove release di PowerShell Universal. Utilizzi il tag con il suffisso `azure`. È preconfigurato per l'esecuzione in Azure.

{% hint style="info" %}
Per gli ambienti di produzione, suggeriamo di impostare una versione con tag per evitare aggiornamenti involontari del container al riavvio. Per impostazione predefinita, Azure aggiorna automaticamente i container quando un tag, come latest, viene aggiornato. Questo le permetterà di controllare gli aggiornamenti della sua versione di PowerShell Universal.
{% endhint %}

### Persistenza locale

Per impostazione predefinita, il container scriverà nella directory `/home`.

Dovrà assicurarsi che la variabile d'ambiente `WEBSITES_ENABLE_APP_SERVICE_STORAGE` sia impostata su true. Questo configura il container per rendere persistente la cartella `/home`, dove vengono archiviati i dati di configurazione di PowerShell Universal.

### Git e SQL

Se scegli di utilizzare l'integrazione git in PowerShell Universal, consigliamo di configurare un server e un database SQL per l'archiviazione. Git verrà utilizzato per sincronizzare i file di configurazione all'avvio del container. SQL archivierà le impostazioni di configurazione di git insieme a risorse come processi, token di app e identità.

Per iniziare, le servirà un database Azure SQL. Dopo aver creato la risorsa, dovrà copiare la stringa di connessione del database da fornire a PowerShell Universal.

Si assicuri di aver consentito ai servizi Azure di accedere al database.

Per abilitare il supporto SQL, deve impostare i plugin all'interno di PowerShell Universal in modo da utilizzare il plugin SQL nella Configurazione dell'applicazione della sua app web.

Crei un'impostazione `Plugins__0` con il valore `SQL`. Successivamente, imposti il valore `Data__ConnectionString` sul database del suo server SQL.

Dopo aver configurato SQL, può avviare il container. Lo schema del database verrà creato all'avvio del container. Successivamente, dovrà configurare git all'interno di PowerShell Universal facendo clic su Controllo del codice sorgente > Git > Impostazioni. Inserisca il remote, il branch, il nome utente, la password o il token di accesso personale e la modalità di sincronizzazione. La modalità Push-only non è consigliata in questa configurazione perché lo stato del container viene perso tra i riavvii. Si assicuri che la modalità di inizializzazione sia impostata su Clone.

{% hint style="info" %}
Le impostazioni di git sono archiviate nel suo database SQL e verranno recuperate a ogni avvio del container.
{% endhint %}

### Header inoltrati

I container sono in genere ospitati dietro un proxy inverso e non saranno a conoscenza dell'URL esterno effettivo senza una configurazione aggiuntiva. Per garantire che i sistemi che richiedono l'URL esterno, come OpenID Connect, ricevano le informazioni corrette, dovrà impostare la variabile d'ambiente `ASPNETCORE_FORWARDEDHEADERS_ENABLED` su `true`.

Per maggiori informazioni, può leggere questo articolo del blog di [Microsoft](https://devblogs.microsoft.com/dotnet/forwarded-headers-middleware-updates-in-net-core-3-0-preview-6/).

### Bicep

Può utilizzare il seguente template Bicep per distribuire un'app web in container con archiviazione 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 %}

### Container sidecar

Le app web in container supportano anche i [container sidecar](https://learn.microsoft.com/en-us/azure/app-service/overview-sidecar), che le permettono di eseguire container aggiuntivi insieme al container di PowerShell Universal. Questo è utile per supportare servizi come proxy, agenti, collector o altri processi complementari. Quando ospita PowerShell Universal in questa configurazione, si assicuri che il container web esponga la porta HTTP corretta. Per impostazione predefinita, PowerShell Universal è in ascolto sulla porta `5000`.

## App web standard

### Creazione manuale di un'app web

All'interno del portale di Azure, dovrà creare una nuova risorsa App Web. PowerShell Universal richiede attualmente lo stack di runtime .NET 10. Può utilizzare Linux o Windows.

{% hint style="info" %}
Se durante la configurazione della sua WebApp scegli un piano di hosting Windows anziché un piano di hosting Linux in Azure, deve scegliere un piano Basic (B1) o superiore per poter utilizzare app a 64 bit. Deve inoltre andare in Impostazioni > Configurazione > Impostazioni generali > Piattaforma e selezionare 64-bit prima di eseguire il comando `Publish-AzWebApp`, altrimenti l'installazione non andrà a buon fine.
{% endhint %}

**Comando di avvio (solo Linux)**

Quando ospita in un ambiente Linux, dovrà impostare il comando di avvio in Impostazioni \ Configurazione \ Impostazioni generali \ Comando di avvio con il valore seguente.

{% code collapsedlinecount="10" %}

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

{% endcode %}

Nell'esempio seguente, utilizzeremo il modulo Azure PowerShell per distribuire manualmente l'app web.

Per prima cosa dovrà installare Azure PowerShell.

{% code collapsedlinecount="10" %}

```powershell
Install-Module Az
```

{% endcode %}

Una volta installato, dovrà connettersi alla sua sottoscrizione.

{% code collapsedlinecount="10" %}

```powershell
Connect-AzAccount
```

{% endcode %}

### Distribuzione dei file Windows

Se utilizza Windows, dovrà scaricare il file ZIP per Windows. Questo esempio scarica 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 %}

### Distribuzione dei file Linux

Se utilizza Linux, dovrà scaricare il file ZIP per Linux. Questo esempio scarica 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 %}

Ora che abbiamo configurato il modulo Az e scaricato lo ZIP di Universal, possiamo distribuire l'app web.

{% code collapsedlinecount="10" %}

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

{% endcode %}

{% hint style="info" %}
Può verificare in Azure in Deployment Center > Logs che lo stato sia Success (Active) per assicurarsi che i file siano stati distribuiti/installati correttamente.
{% endhint %}

### Modifiche alle impostazioni richieste

Queste impostazioni possono essere configurate nella scheda Configurazione, all'interno delle impostazioni dell'applicazione.

#### Chiave di firma JWT

La chiave di firma JWT predefinita non ha una lunghezza sufficiente e dovrà essere aggiornata. Può farlo in `appsettings.json` o utilizzando le variabili d'ambiente.

#### appsettings.json

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### Variabile d'ambiente

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### URL dell'API

Le app web di Azure utilizzano un proxy inverso e PowerShell Universal non rileva correttamente l'URL esterno. Durante l'esecuzione dei processi, Universal utilizza l'API di gestione per recuperare automaticamente le informazioni su processi, script e pianificazioni. Ciò significa che l'operazione non andrà a buon fine se non è in grado di indirizzare correttamente l'URL esterno dell'API.

L'URL dell'API deve corrispondere all'indirizzo HTTP esterno della sua app web. Può aggiornarlo in `appsettings.json` o utilizzando una variabile d'ambiente.

#### appsettings.json

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### Variabile d'ambiente

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### NodeName

Può impostare il nome dell'istanza di PowerShell Universal specificando NodeName. In questo modo i riavvii non influiranno sul database di PowerShell Universal. Questo non è necessario per le installazioni LiteDB.

{% code collapsedlinecount="10" %}

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

{% endcode %}

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

Per sovrascrivere la porta predefinita in un'app web Linux, deve impostare le impostazioni PORT e WEBSITES\_PORT su 5000.

Dopo aver pubblicato l'app web, visualizzi la sua istanza di PowerShell Universal accedendo all'URL dell'app web.

#### Archiviazione persistente

Il file `appsettings.json` predefinito archivierà il database e i file di configurazione in una posizione non persistente. Può aggiungere variabili d'ambiente per spostarli in un'archiviazione persistente all'interno della sua app web.

**Data\_\_RepositoryPath**

La variabile d'ambiente `Data__RepositoryPath` imposta la posizione dei file di configurazione di Universal. Imposti il valore seguente.

{% code collapsedlinecount="10" %}

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

{% endcode %}

### Aggiornamento dell'app web

Quando viene rilasciata una nuova versione di PowerShell Universal, dovrà aggiornare i file dell'applicazione della sua app web. Consigliamo di rimuovere la directory dell'applicazione e di ridistribuire i file. Il database e i file di configurazione non sono archiviati nella directory dell'applicazione.

Può eliminare i file della sua app web utilizzando l'API dei comandi di Kudu. Le sue credenziali Kudu utilizzano l'autenticazione Basic e sono le stesse delle sue [credenziali di distribuzione](https://github.com/projectkudu/kudu/wiki/Deployment-credentials).

Per eliminare tutti i file della sua app web, esegua il comando seguente.

{% 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 %}

Dopo aver eliminato i file dell'applicazione, può ridistribuirli eseguendo di nuovo i passaggi di creazione manuale.

## Application Gateway

Può configurare PowerShell Universal per l'esecuzione dietro un Application Gateway in Azure. Questo è utile per fornire bilanciamento del carico e alta disponibilità a più istanze di PowerShell Universal.

Per prima cosa, configuri un pool di backend che abbia come destinazione una o più app web di Azure che eseguono PowerShell Universal.

Per le impostazioni di backend, dovrà assicurarsi di utilizzare HTTPS con un certificato di una CA nota. L'affinità basata sui cookie è necessaria per garantire che le sessioni rimangano associate a un singolo nodo.

Per consentire ad Azure di servire l'app web corretta, dovrà assicurarsi che l'impostazione Override with new host name sia configurata. Utilizzi il nome host della destinazione di backend.

Si assicuri che la regola del pool di backend sia configurata come destinazione e non come reindirizzamento.

Configuri una regola di riscrittura degli header per trasmettere il nome host pubblico come header `X-Forwarded-Host`. PowerShell Universal lo utilizzerà per costruire internamente gli URL.

La regola di riscrittura di cui sopra è un requisito dei metodi di autenticazione OpenID Connect e SAML2.

Infine, può configurare l'IP pubblico del suo Application Gateway utilizzando un provider DNS per un nome host personalizzato. Crei un record A nella sua gestione 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/it/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.
