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

# Azure

Stellen Sie PowerShell Universal in Azure mit Container-Web-Apps oder Standard-Web-Apps bereit und konfigurieren Sie Persistenz, SQL-Speicher und weitergeleitete Header.

PowerShell Universal ist eine ASP.NET Core-Webanwendung und kann in Windows Azure Web Apps gehostet werden.

## Container-Web-App

Container-Web-Apps ermöglichen die Verwendung von Docker-Images als Web-Apps in Azure. Im Azure-Portal können Sie eine Docker-Container-Web-App über den Assistenten App Services \ Create Web App erstellen.

Sobald Sie eine Ressourcengruppe ausgewählt, einen Namen zugewiesen und einen Compute-Plan gewählt haben, können Sie die Web-App erstellen.

Als Nächstes müssen Sie das Image in Ihrer Web-App bereitstellen. Wählen Sie dazu das Deployment Center und konfigurieren Sie das abzurufende Image. Sie können entweder eine statische getaggte Version (wie 2.7.3) abrufen oder die neueste Version abrufen, wodurch Ihre Web-App automatisch mit neuen PowerShell Universal-Releases aktuell bleibt. Verwenden Sie das Tag mit dem Suffix `azure`. Es ist für die Ausführung in Azure vorkonfiguriert.

{% hint style="info" %}
Für Produktionsumgebungen empfehlen wir, eine getaggte Version festzulegen, um unbeabsichtigte Aktualisierungen Ihres Containers beim Neustart zu vermeiden. Standardmäßig aktualisiert Azure Container automatisch, wenn ein Tag, wie latest, aktualisiert wird. Dies ermöglicht Ihnen, die Aktualisierungen Ihrer PowerShell Universal-Version zu steuern.
{% endhint %}

### Lokale Persistenz

Standardmäßig schreibt der Container in das Verzeichnis `/home`.

Sie müssen sicherstellen, dass die Umgebungsvariable `WEBSITES_ENABLE_APP_SERVICE_STORAGE` auf true gesetzt ist. Damit wird der Container so konfiguriert, dass der Ordner `/home` persistent ist, und dort werden die Konfigurationsdaten für PowerShell Universal gespeichert.

### Git und SQL

Wenn Sie die Git-Integration in PowerShell Universal verwenden möchten, empfehlen wir, einen SQL-Server und eine Datenbank für die Speicherung einzurichten. Git wird verwendet, um Konfigurationsdateien beim Start des Containers zu synchronisieren. SQL speichert die Git-Konfigurationseinstellungen zusammen mit Ressourcen wie Jobs, App-Tokens und Identitäten.

Für den Anfang benötigen Sie eine Azure SQL-Datenbank. Nachdem Sie die Ressource erstellt haben, müssen Sie die Verbindungszeichenfolge aus der Datenbank kopieren, um sie PowerShell Universal bereitzustellen.

Stellen Sie sicher, dass Sie Azure-Diensten den Zugriff auf die Datenbank erlaubt haben.

Um die SQL-Unterstützung zu aktivieren, sollten Sie die Plugins in PowerShell Universal so einstellen, dass das SQL-Plugin in der Anwendungskonfiguration Ihrer Web-App verwendet wird.

Erstellen Sie eine Einstellung `Plugins__0` mit dem Wert `SQL`. Setzen Sie anschließend den Wert `Data__ConnectionString` auf Ihre SQL-Server-Datenbank.

Sobald SQL konfiguriert ist, können Sie Ihren Container starten. Das Datenbankschema wird beim Start des Containers erstellt. Als Nächstes müssen Sie Git in PowerShell Universal konfigurieren, indem Sie auf Source Control > Git > Settings klicken. Geben Sie Ihr Remote, den Branch, den Benutzernamen, das Passwort oder das persönliche Zugriffstoken sowie den Synchronisierungsmodus ein. Push-only wird in dieser Konfiguration nicht empfohlen, da der Containerzustand zwischen Neustarts verloren geht. Stellen Sie sicher, dass der Initialisierungsmodus auf Clone gesetzt ist.

{% hint style="info" %}
Die Git-Einstellungen werden in Ihrer SQL-Datenbank gespeichert und bei jedem Start des Containers abgerufen.
{% endhint %}

### Weitergeleitete Header

Container werden typischerweise hinter einem Reverse-Proxy gehostet und kennen die tatsächliche externe URL ohne zusätzliche Konfiguration nicht. Um sicherzustellen, dass Systeme, die die externe URL benötigen, wie OpenID Connect, die richtigen Informationen erhalten, müssen Sie die Umgebungsvariable `ASPNETCORE_FORWARDEDHEADERS_ENABLED` auf `true` setzen.

Weitere Informationen finden Sie in diesem Blogbeitrag von [Microsoft](https://devblogs.microsoft.com/dotnet/forwarded-headers-middleware-updates-in-net-core-3-0-preview-6/).

### Bicep

Sie können die folgende Bicep-Vorlage verwenden, um eine Container-Web-App mit persistentem Speicher bereitzustellen.

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

Container-Web-Apps unterstützen außerdem [Sidecar-Container](https://learn.microsoft.com/en-us/azure/app-service/overview-sidecar), mit denen Sie zusätzliche Container neben dem PowerShell Universal-Container ausführen können. Dies ist hilfreich für unterstützende Dienste wie Proxys, Agents, Collectors oder andere Begleitprozesse. Wenn Sie PowerShell Universal in dieser Konfiguration hosten, stellen Sie sicher, dass der Web-Container den richtigen HTTP-Port bereitstellt. Standardmäßig lauscht PowerShell Universal auf Port `5000`.

## Standard-Web-App

### Manuelles Erstellen einer Web-App

Im Azure-Portal müssen Sie eine neue Web App-Ressource erstellen. PowerShell Universal erfordert derzeit den .NET 10-Runtimestack. Sie können entweder Linux oder Windows verwenden.

{% hint style="info" %}
Wenn Sie bei der Konfiguration Ihrer WebApp in Azure einen Windows-Hostingplan anstelle eines Linux-Hostingplans wählen, müssen Sie einen Basic Plan (B1) oder höher wählen, um 64-Bit-Anwendungen verwenden zu können. Sie müssen außerdem zu Settings > Configuration > General setting > Platform gehen und 64-Bit auswählen, bevor Sie den Befehl `Publish-AzWebApp` ausführen, andernfalls schlägt die Installation fehl.
{% endhint %}

**Startbefehl (nur Linux)**

Beim Hosting in einer Linux-Umgebung müssen Sie den Startbefehl unter Settings \ Configuration \ General Settings \ Startup Command auf Folgendes setzen.

{% code collapsedlinecount="10" %}

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

{% endcode %}

Im folgenden Beispiel verwenden wir das Azure PowerShell-Modul, um die Web-App manuell bereitzustellen.

Zunächst müssen Sie Azure PowerShell installieren.

{% code collapsedlinecount="10" %}

```powershell
Install-Module Az
```

{% endcode %}

Nach der Installation müssen Sie sich mit Ihrem Abonnement verbinden.

{% code collapsedlinecount="10" %}

```powershell
Connect-AzAccount
```

{% endcode %}

### Windows-Dateien bereitstellen

Wenn Sie Windows verwenden, müssen Sie die Windows-ZIP-Datei herunterladen. In diesem Beispiel wird PowerShell Universal 2026.3.0.0 heruntergeladen.

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

### Linux-Dateien bereitstellen

Wenn Sie Linux verwenden, müssen Sie die Linux-ZIP-Datei herunterladen. In diesem Beispiel wird PowerShell Universal 2026.3.0.0 heruntergeladen.

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

Nachdem wir nun das Az-Modul konfiguriert und die Universal-ZIP-Datei heruntergeladen haben, können wir die Web-App bereitstellen.

{% code collapsedlinecount="10" %}

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

{% endcode %}

{% hint style="info" %}
Sie können in Azure unter Deployment Center > Logs nach dem Status Success (Active) sehen, um sicherzustellen, dass die Dateien erfolgreich bereitgestellt/installiert wurden.
{% endhint %}

### Erforderliche Anpassungen der Einstellungen

Diese Einstellungen können auf der Registerkarte Configuration innerhalb der Application settings festgelegt werden.

#### JWT-Signaturschlüssel

Der standardmäßige JWT-Signaturschlüssel hat keine ausreichende Länge und muss aktualisiert werden. Dies kann in `appsettings.json` oder über Umgebungsvariablen erfolgen.

#### appsettings.json

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### Umgebungsvariable

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### API-URL

Azure Web Apps verwenden einen Reverse-Proxy und PowerShell Universal erkennt die externe URL nicht angemessen. Bei der Ausführung von Jobs verwendet Universal die Management-API, um automatisch Job-, Skript- und Zeitplaninformationen abzurufen. Das bedeutet, dass dies fehlschlägt, wenn die externe API-URL nicht korrekt adressiert werden kann.

Die API-URL sollte die externe HTTP-Adresse Ihrer Web-App sein. Sie können diese in `appsettings.json` oder über eine Umgebungsvariable aktualisieren.

#### appsettings.json

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### Umgebungsvariable

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### NodeName

Sie können den Namen der PowerShell Universal-Instanz festlegen, indem Sie den NodeName angeben. Dadurch wird sichergestellt, dass Neustarts die PowerShell Universal-Datenbank nicht beeinträchtigen. Für LiteDB-Installationen ist dies nicht erforderlich.

{% code collapsedlinecount="10" %}

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

{% endcode %}

#### PORT und WEBSITES\_PORT (nur Linux)

Um den Standardport in einer Linux-Web-App zu überschreiben, müssen Sie die Einstellungen PORT und WEBSITES\_PORT auf 5000 setzen.

Nach der Veröffentlichung der Web-App können Sie Ihre PowerShell Universal-Instanz anzeigen, indem Sie zur URL der Web-App navigieren.

#### Persistenter Speicher

Die standardmäßige Datei `appsettings.json` speichert die Datenbank- und Konfigurationsdateien an einem nicht persistenten Ort. Sie können Umgebungsvariablen hinzufügen, um sie in den persistenten Speicher Ihrer Web-App zu verschieben.

**Data\_\_RepositoryPath**

Die Umgebungsvariable `Data__RepositoryPath` legt den Speicherort der Konfigurationsdateien für Universal fest. Setzen Sie den Wert auf Folgendes.

{% code collapsedlinecount="10" %}

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

{% endcode %}

### Aktualisieren Ihrer Web-App

Wenn eine neue Version von PowerShell Universal veröffentlicht wird, müssen Sie die Anwendungsdateien für Ihre Web-App aktualisieren. Wir empfehlen, das Anwendungsverzeichnis zu entfernen und die Dateien erneut bereitzustellen. Die Datenbank- und Konfigurationsdateien werden nicht im Anwendungsverzeichnis gespeichert.

Sie können die Dateien für Ihre Web-App mithilfe der Kudu-Befehls-API löschen. Ihre Kudu-Anmeldeinformationen verwenden Basic-Authentifizierung und sind identisch mit Ihren [Bereitstellungsanmeldeinformationen](https://github.com/projectkudu/kudu/wiki/Deployment-credentials).

Um alle Dateien in Ihrer Web-App zu löschen, führen Sie den folgenden Befehl aus.

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

Nachdem Sie die Anwendungsdateien gelöscht haben, können Sie sie erneut bereitstellen, indem Sie die Schritte zur manuellen Erstellung erneut ausführen.

## Application Gateway

Sie können PowerShell Universal so konfigurieren, dass es hinter einem Application Gateway in Azure ausgeführt wird. Dies ist hilfreich, um Lastverteilung und Hochverfügbarkeit für mehrere PowerShell Universal-Instanzen bereitzustellen.

Konfigurieren Sie zunächst einen Backend-Pool, der auf eine oder mehrere Azure Web Apps mit PowerShell Universal ausgerichtet ist.

Für die Backend-Einstellungen sollten Sie sicherstellen, dass Sie HTTPS mit einem Zertifikat einer bekannten Zertifizierungsstelle verwenden. Cookie-basierte Affinität ist erforderlich, um sicherzustellen, dass Sitzungen an einen einzelnen Knoten gebunden sind.

Damit Azure die richtige Web-App bereitstellen kann, müssen Sie sicherstellen, dass die Einstellung Override with new host name konfiguriert ist. Verwenden Sie den Hostnamen für das Backend-Ziel.

Stellen Sie sicher, dass die Backend-Pool-Regel als Ziel konfiguriert ist und nicht als Weiterleitung.

Konfigurieren Sie eine Header-Rewrite-Regel, um den öffentlich zugänglichen Hostnamen als Header `X-Forwarded-Host` weiterzugeben. PowerShell Universal verwendet diesen, um intern URLs zu erstellen.

Die obige Rewrite-Regel ist eine Voraussetzung für die Authentifizierungsmethoden OpenID Connect und SAML2.

Schließlich können Sie die öffentliche IP-Adresse Ihres Application Gateway über einen DNS-Anbieter einem benutzerdefinierten Hostnamen zuordnen. Erstellen Sie einen A-Eintrag in Ihrer DNS-Verwaltung.


---

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