1. Installation
Dieser Abschnitt beschreibt die Bereitstellung des DQE Unify Server auf Azure Container Instances (ACI). Der Anwendungsstack — Redis, RabbitMQ, Nginx, Unify Server und Queue Worker — läuft als eine einzige Azure Container Group. Alle Container teilen denselben Netzwerk-Namespace und kommunizieren über localhost.
1.1 Voraussetzungen
1.1.1 Ressourcenanforderungen
| Container | CPU (vCores) | Arbeitsspeicher |
|---|---|---|
| redis | 0.5 | 0.5 GB |
| rabbitmq | 0.5 | 1 GB |
| nginx | 0.5 | 0.5 GB |
| unify-server | 0.5 | 1 GB |
| queue-worker | 1.0 | 5 GB |
| Gesamt | 3.0 | 8 GB |
Hinweis: Die Schätzungen basieren auf 1 Million Datensätzen. Je nach Datenvolumen müssen Sie die Speicherzuweisung des queue-worker-Containers möglicherweise erhöhen.
1.1.2 Software-Anforderungen
| Software | Version / Hinweise |
|---|---|
| Azure CLI | Neueste stabile Version — Befehl az im Terminal verfügbar |
| Azure-Abonnement | Aktives Abonnement mit Berechtigungen zum Erstellen von Container Instances, Virtual Networks und Storage Accounts |
| Internetzugang | Erforderlich, um Images aus der DQE Container Registry abzurufen |
1.2 Anmeldung bei der DQE Container Registry
Alle Images (DQE Unify, Redis, RabbitMQ, Nginx) werden in einer privaten Azure Container Registry gehostet. Verwenden Sie die von DQE Software bereitgestellten Anmeldedaten, um sich von Ihrem lokalen Terminal aus anzumelden:
az login
docker login <registry-url> --username <Username provided by DQE> --password <Password provided by DQE>Eine erfolgreiche Anmeldung zeigt: Login Succeeded.
Hinweis: Die Registry-Anmeldedaten werden auch in der Container-Group-YAML-Datei (Abschnitt 1.7) benötigt, damit ACI die Images zum Zeitpunkt der Bereitstellung abrufen kann.
1.3 Azure Storage konfigurieren
Azure Container Instances unterstützen keine lokalen Bind Mounts. Persistente Daten für Redis und RabbitMQ müssen in Azure File Shares gespeichert werden. Die Nginx-Konfigurationsdatei wird ebenfalls in eine File Share hochgeladen, damit der Container sie zur Laufzeit einbinden kann.
-
Schritt 1 — Erstellen Sie ein Storage Account:
az storage account create \ --name dqeunifystorage \ --resource-group <resource-group> \ --location <location> \ --sku Standard_LRS -
Schritt 2 — Rufen Sie den Storage-Account-Schlüssel ab:
az storage account keys list \ --account-name dqeunifystorage \ --resource-group <resource-group> \ --query "[0].value" -o tsv -
Schritt 3 — Erstellen Sie die File Shares:
az storage share create --name redisvol --account-name dqeunifystorage az storage share create --name rabbitvol --account-name dqeunifystorage az storage share create --name nginxconf --account-name dqeunifystorage
1.4 Nginx konfigurieren
Nginx fungiert als Reverse Proxy und leitet eingehende HTTP-/HTTPS-Anfragen an den Unify Server weiter. In ACI teilen sich alle Container denselben Netzwerk-Namespace, daher lautet das Proxy-Ziel http://localhost:8000 und nicht ein Dienstname.
Erstellen Sie die Datei default.conf lokal und laden Sie sie anschließend in die Azure File Share hoch.
Die Datei default.conf muss folgenden Inhalt enthalten:
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
}
}Hochladen in die Azure File Share:
az storage file upload \
--account-name dqeunifystorage \
--share-name nginxconf \
--source ./default.conf \
--path default.confHTTPS
Fügen Sie einen zweiten Server-Block hinzu und laden Sie Ihr SSL-Zertifikat und den privaten Schlüssel in die nginxconf-File-Share hoch. Aktualisieren Sie die Container-Group-YAML, um Port 443 freizugeben.
server {
listen 443 ssl;
ssl_certificate /etc/nginx/ssl/cert.crt;
ssl_certificate_key /etc/nginx/ssl/cert.key;
location / {
proxy_pass http://localhost:8000;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_read_timeout 300s;
}
}Hinweis: Laden Sie die Zertifikatsdateien in die nginxconf-File-Share unter einem Unterverzeichnis ssl/ hoch und binden Sie die File Share in der Nginx-Container-Konfiguration unter /etc/nginx/ssl ein.
1.5 Log Analytics Workspace konfigurieren
Ein Log Analytics Workspace zentralisiert Container-Logs und ermöglicht die Überwachung über Azure Monitor. Die Workspace-ID und der Schlüssel werden in der Container-Group-YAML referenziert (Abschnitt 1.7).
-
Schritt 1 — Erstellen Sie einen Log Analytics Workspace:
az monitor log-analytics workspace create \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --location <location> -
Schritt 2 — Rufen Sie die Workspace-ID ab:
az monitor log-analytics workspace show \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --query customerId -o tsv -
Schritt 3 — Rufen Sie den Workspace Primary Key ab:
az monitor log-analytics workspace get-shared-keys \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --query primarySharedKey -o tsv
Hinweis: Halten Sie die Workspace-ID und den Primary Key bereit — sie werden als Platzhalter <workspace-id> und <workspace-key> in der Container-Group-YAML verwendet (Abschnitt 1.7).
1.6 Virtual Network (VNET) konfigurieren
Die Container Group muss in ein Azure Virtual Network bereitgestellt werden, damit sie eine private IP-Adresse erhält, die innerhalb Ihrer Azure-Umgebung erreichbar ist (Dynamics 365-Backend, internes DNS, Application Gateway). Das Subnetz muss explizit für Microsoft.ContainerInstance/containerGroups delegiert werden — dies ist eine zwingende Voraussetzung für die ACI-VNET-Integration.
-
Schritt 1 — Erstellen Sie ein Virtual Network:
az network vnet create \ --name dqe-unify-vnet \ --resource-group <resource-group> \ --location <location> \ --address-prefix 10.0.0.0/16 -
Schritt 2 — Erstellen Sie ein für ACI delegiertes Subnetz:
az network vnet subnet create \ --name dqe-unify-subnet \ --vnet-name dqe-unify-vnet \ --resource-group <resource-group> \ --address-prefix 10.0.0.0/24 \ --delegations Microsoft.ContainerInstance/containerGroups -
Schritt 3 — Rufen Sie die vollständige Subnetz-Ressourcen-ID ab:
az network vnet subnet show \ --name dqe-unify-subnet \ --vnet-name dqe-unify-vnet \ --resource-group <resource-group> \ --query id -o tsvDer zurückgegebene Wert hat die Form:
/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/dqe-unify-vnet/subnets/dqe-unify-subnetHalten Sie diesen Wert bereit — er wird als Platzhalter
subnetIds[0].idin der Container-Group-YAML verwendet (Abschnitt 1.7).
Hinweis: Ein für Microsoft.ContainerInstance/containerGroups delegiertes Subnetz kann keine anderen Ressourcentypen hosten. Verwenden Sie ein dediziertes Subnetz — ein /24-Block (256 Adressen) wird empfohlen. ACI verbraucht eine IP-Adresse pro Container-Group-Bereitstellung.
Hinweis: Wenn der Kunde bereits über ein bestehendes VNET verfügt, überspringen Sie Schritt 1 und 2 und erstellen Sie das dedizierte Subnetz innerhalb des bestehenden VNET. Rufen Sie die Subnetz-ID mit Schritt 3 ab.
1.7 Container-Group-Konfigurationsdatei
Erstellen Sie die Datei container-group.yaml mit dem folgenden Inhalt. Ersetzen Sie alle Platzhalter in spitzen Klammern vor der Bereitstellung.
| Platzhalter | Beschreibung |
|---|---|
<resource-group> |
Name der Azure Resource Group |
<location> |
Azure-Region, zum Beispiel westeurope
|
<registry-url> |
URL der DQE Container Registry |
<Username provided by DQE> |
Von DQE Software bereitgestellter Registry-Benutzername |
<Password provided by DQE> |
Von DQE Software bereitgestelltes Registry-Passwort |
<storage-account-key> |
In Abschnitt 1.3 Schritt 2 abgerufener Schlüssel |
<workspace-id> |
Log Analytics Workspace-ID (abgerufen in Abschnitt 1.5 Schritt 2) |
<workspace-key> |
Log Analytics Workspace Primary Key (abgerufen in Abschnitt 1.5 Schritt 3) |
<subscription-id> / <vnet-name> / <subnet-name>
|
Subnetz-Ressourcen-ID, abgerufen in Abschnitt 1.6 Schritt 3 |
name: dqe-unify-aci
apiVersion: '2021-10-01'
location: <azure-region>
tags:
docker-compose-application: docker-compose-application
properties:
containers:
- name: redis
properties:
image: <registry-url>/dqe-unify-redis:latest
resources:
requests:
memoryInGB: 1
cpu: 0.5
volumeMounts:
- name: redisvol
mountPath: /data
- name: rabbitmq
properties:
image: <registry-url>/dqe-unify-rabbitmq:latest
ports:
- protocol: TCP
port: 5672
resources:
requests:
memoryInGB: 1
cpu: 1
volumeMounts:
- name: rabbitvol
mountPath: /bitnami
readOnly: false
- name: nginx
properties:
image: <registry-url>/dqe-unify-nginx:latest
ports:
- protocol: TCP
port: 80
resources:
requests:
memoryInGB: 1
cpu: 0.25
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d
- name: unify-server
properties:
image: <registry-url>/unify-server-web-ms-dynamics:<version>
command: ["python", "-u", "app.pyc"]
ports:
- protocol: TCP
port: 8000
environmentVariables:
- name: REDIS_URL
value: redis://127.0.0.1:6379
- name: CLOUDAMQP_URL
value: amqp://guest:guest@127.0.0.1:5672/
- name: PORT
value: 8000
resources:
requests:
memoryInGB: 1
cpu: 0.25
- name: queue-worker
properties:
image: <registry-url>/unify-server-web-ms-dynamics:<version>
command: ["python", "-u", "queue_worker.pyc"]
environmentVariables:
- name: REDIS_URL
value: redis://127.0.0.1:6379
- name: CLOUDAMQP_URL
value: amqp://guest:guest@127.0.0.1:5672/
resources:
requests:
memoryInGB: 5
cpu: 1
imageRegistryCredentials:
- server: <registry-url>
username: <registry-username>
password: <registry-password>
diagnostics:
logAnalytics:
workspaceId: <log-analytics-workspace-id>
workspaceKey: <log-analytics-workspace-key>
restartPolicy: Always
ipAddress:
ports:
- protocol: TCP
port: 80
type: Private
osType: Linux
volumes:
- name: rabbitvol
azureFile:
shareName: rabbitvol
readOnly: false
storageAccountName: <storage-account-name>
storageAccountKey: <storage-account-key>
- name: nginxconf
azureFile:
shareName: nginxconf
readOnly: false
storageAccountName: <storage-account-name>
storageAccountKey: <storage-account-key>
- name: redisvol
azureFile:
shareName: redisvol
readOnly: false
storageAccountName: <storage-account-name>
storageAccountKey: <storage-account-key>
subnetIds:
- id: /subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/<vnet-name>/subnets/<subnet-name>Wichtige Konfigurationshinweise:
- Alle Container in einer ACI Container Group teilen denselben Netzwerk-Namespace — die Dienste kommunizieren über
localhost, nicht über Dienstnamen. - Die Variablen
REDIS_URLundCLOUDAMQP_URLverwendenlocalhostanstelle vonredisundrabbitmq. - Das Image
unify-server-web-ms-dynamics:v3.0enthält kompilierten Python-Bytecode — der Einstiegspunkt istapp.pyc, nichtapp.py. - RabbitMQ verwendet das offizielle Image mit über Umgebungsvariablen gesetzten Anmeldedaten. Der virtuelle Host ist standardmäßig
/. - Der Block
diagnostics.logAnalyticsleitet die gesamte Container-Standardausgabe/Fehlerausgabe an den Log Analytics Workspace weiter. Logs erscheinen innerhalb weniger Minuten nach der Bereitstellung in Azure Monitor unter der TabelleContainerInstanceLog_CL.
1.8 Bereitstellung der Anwendung
-
Schritt 1 — Bereitstellung der Container Group:
az container create \ --resource-group <resource-group> \ --file container-group.yaml -
Schritt 2 — Überprüfen Sie den Bereitstellungsstatus:
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "instanceView.state" -o tsvErwartete Ausgabe:
Running. -
Schritt 3 — Rufen Sie die der Container Group zugewiesene private IP-Adresse ab:
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "ipAddress.ip" -o tsvDie zurückgegebene IP-Adresse ist nur aus dem Azure Virtual Network oder aus verbundenen Netzwerken erreichbar.
-
Schritt 4 — Überprüfen Sie, ob alle Container laufen:
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "containers[].{Name:name, State:instanceView.currentState.state}" \ -o tableErwartete Ausgabe: Alle Container sollten den Status
Runninganzeigen:Name State ----------- ------- redis Running rabbitmq Running nginx Running unify-server Running queue-worker Running
Wichtig: Wenn ein Container den Status Terminated oder Waiting anzeigt, überprüfen Sie sofort dessen Logs: az container logs --resource-group <rg> --name dqe-unify --container-name <service-name>.
Hinweis: ACI startet alle Container gleichzeitig. RabbitMQ und Redis benötigen möglicherweise einige Sekunden, um bereit zu sein. Der Unify Server versucht beim Start automatisch, die Verbindung erneut herzustellen.
1.9 Network Security Group (NSG) konfigurieren
Wenn die Container Instance in einem Azure Virtual Network bereitgestellt wird, konfigurieren Sie die zugehörige NSG so, dass eingehender Datenverkehr auf den erforderlichen Ports zugelassen wird.
- Gehen Sie zu Azure Portal → Network Security Groups → [Ihre NSG] → Inbound security rules.
- Klicken Sie auf Add.
- Setzen Sie Destination port ranges: 80. Wenn HTTPS über einen externen Reverse Proxy oder ein Application Gateway aktiviert ist, können zusätzliche Regeln erforderlich sein.
- Setzen Sie Protocol auf
TCPund Action aufAllow. - Klicken Sie auf Add.
Hinweis: Port 8000 (Unify Server) und Port 5672 (RabbitMQ) sind intern innerhalb der Container Group und müssen nicht extern freigegeben werden.
Dynamics 365 — Eingehende IP-Bereiche autorisieren
Der DQE Unify Server empfängt Anfragen von Microsoft Dynamics 365, das auf Azure-Infrastruktur läuft. Sie müssen die entsprechenden Azure-IP-Bereiche in der NSG autorisieren.
Die vollständige und aktuelle Liste der Microsoft Azure IP-Bereiche steht zum Download bereit unter:
Microsoft Azure IP Ranges and Service Tags
Laden Sie die JSON-Datei herunter, identifizieren Sie die für Ihre Region relevanten Service-Tags Dynamics365 und AzureCloud und fügen Sie die entsprechenden IP-Bereiche als eingehende Allow-Regeln auf dem vom Reverse Proxy oder Application Gateway freigegebenen Port hinzu (in der Regel Port 80 oder 443, abhängig von der Infrastrukturkonfiguration). Alternativ können Sie Source auf Service Tag setzen und Dynamics365 direkt in der NSG-Regel auswählen.
1.10 DNS einrichten
Wenden Sie sich an Ihre Netzwerk- oder DNS-Administratoren, um einen internen DNS-Eintrag zu erstellen, der auf die private IP-Adresse der Container Group oder auf den vom Reverse Proxy/Application Gateway freigegebenen Hostnamen verweist.
| Eintragstyp | Name | Wert |
|---|---|---|
| A | unify.yourdomain.com |
Private IP der ACI Container Group |
Alternativ können Sie der Container Instance direkt im Azure Portal ein DNS-Namensbezeichnung zuweisen: Azure Portal → Container Instances → [dqe-unify] → Overview → DNS name label. Dies ergibt einen Hostnamen der Form dqe-unify.<location>.azurecontainer.io.
1.11 Bereitstellung überprüfen
Sobald sich das DNS verbreitet hat, öffnen Sie einen Browser und navigieren Sie zu:
http://unify.yourdomain.comSie können auch direkt mit der öffentlichen IP-Adresse testen:
curl http://<private-ip>Erwartete Antwort des Unify Server:
{"status": "available"}Wenn die Anwendung antwortet, ist die Bereitstellung abgeschlossen und der Server ordnungsgemäß konfiguriert.
2. Anwendungseinrichtung
Sobald die Anwendung läuft, müssen die NSG und jede vorgelagerte Firewall oder jeder Proxy so konfiguriert werden, dass die unten aufgeführten IP-Bereiche zugelassen werden.
2.1 Zu autorisierende IP-Adressen
DQE Software Office Server
Wenden Sie sich an den DQE-Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
DQE – Deduplizierungsdienst
Wenden Sie sich an den DQE-Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
DQE – Qualitätsdienst
Wenden Sie sich an den DQE-Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
Erforderliche Aktion: Teilen Sie DQE Software die ausgehende öffentliche IP-Adresse mit, die von Ihrer Azure-Infrastruktur verwendet wird (NAT Gateway, Azure Firewall oder gleichwertig), damit sie für die DQE-Dienste autorisiert werden kann.
Azure-IP-Bereiche — Dynamics 365 und Azure-Dienste
Die vollständige und aktuelle Liste der Microsoft Azure IP-Bereiche (IPv4 und IPv6) steht zum Download bereit unter:
Microsoft Azure IP Ranges and Service Tags
Laden Sie die JSON-Datei herunter und identifizieren Sie die für Ihre Region relevanten Service-Tags (Dynamics365, AzureCloud). Fügen Sie die entsprechenden IP-Bereiche zu den eingehenden NSG-Regeln hinzu.
Verknüpfung mit