Stellen Sie DQE One Standalone als eigenständige Azure Container Instance (ACI)-Gruppe mit NGINX, Redis und PostgreSQL bereit, die über ein Application Gateway freigegeben wird.
Hinweis: Alle im Folgenden beschriebenen Elemente sind Empfehlungen von DQE, die auf Bereitstellungserfahrungen mit verschiedenen Kunden basieren. Der Kunde ist dafür verantwortlich, die Lösung in seine eigene Architektur zu integrieren. Ein mit dem Kundenkontext und der internen Infrastruktur vertrauter Architekt sollte die Empfehlungen von DQE mit der Kundeninfrastruktur abstimmen.
1. Architektur
Dieses Dokument beschreibt, wie das DQE One Standalone-Backend als Azure Container Instance (ACI)-Containergruppe bereitgestellt wird. Alle Container in der Gruppe teilen sich denselben Netzwerk-Namespace und kommunizieren über localhost. Ein Application Gateway stellt die Anwendung über HTTPS bereit und leitet den Datenverkehr über ein privates VNET an die ACI weiter.
Empfohlene Architektur
Internet (HTTPS port 443)
|
Application Gateway (public IP + WAF)
|
Private VNET subnet
|
ACI Container Group (private IP)
|
NGINX sidecar (port 443)
|
DQE One Standalone (port 8000, internal)
|
Redis - PostgreSQL (internal)Sicherheitsmaßnahmen
- Application Gateway: beendet HTTPS und leitet den Datenverkehr über das private VNET an die ACI weiter. Verwenden Sie die WAF, um eingehende IP-Bereiche einzuschränken.
- VNET: isoliert die ACI vom direkten öffentlichen Internetzugang. Der gesamte Datenverkehr vom Application Gateway läuft über ein privates Subnetz.
- SSL-Zertifikat: wird auf Ebene des Application Gateway oder auf NGINX-Ebene innerhalb der ACI verwaltet.
-
Geheimnisse (Secrets): Verwenden Sie
secureValuein der YAML-Datei der Containergruppe für alle sensiblen Werte (Passwörter, Lizenzschlüssel, Verschlüsselungsschlüssel).
Empfohlene Dimensionierung
| Container | CPU | Arbeitsspeicher |
|---|---|---|
nginx |
0.25 vCPU | 0.5 GB |
redis |
0.5 vCPU | 1.0 GB |
postgres |
0.5 vCPU | 1.0 GB |
dqeone |
1.0 vCPU | 2.0 GB |
| Gesamt | 2.25 vCPU | 4.5 GB |
ACI-Containergruppen sind auf 4 vCPU und 16 GB Arbeitsspeicher pro Gruppe begrenzt.
2. Installation
2.1. Azure CLI
Azure CLI muss auf Ihrem lokalen Computer installiert sein.
Linux / macOS
curl -sL https://aka.ms/InstallAzureCLIDeb | sudo bashWindows
Siehe die Microsoft-Dokumentation.
2.2. Ein Application Gateway erstellen
Das Application Gateway macht die ACI über eine öffentliche IP-Adresse und einen DNS-Namen zugänglich. Es übernimmt außerdem die HTTPS-Terminierung und die IP-Filterung über die WAF.
Vollständige Konfigurationsdetails finden Sie in der Microsoft-Dokumentation zum Application Gateway.
Registerkarte „Basics“
Wählen Sie Ihr Abonnement, Ihre Ressourcengruppe und Ihre Region aus. Wählen Sie den Tarif WAF V2, um die Web Application Firewall zu aktivieren.
WAF-Richtlinie
Erstellen Sie über das Feld WAF policy eine neue WAF-Richtlinie. Verwenden Sie die WAF, um eingehende IP-Bereiche zu definieren, die berechtigt sind, das Application Gateway aufzurufen (zum Beispiel Ihr Unternehmensnetzwerk oder bestimmte Partner-IP-Bereiche).
VNET
Erstellen Sie über das Feld Virtual network ein neues virtuelles Netzwerk (VNET). Dieses VNET verbindet das Application Gateway mit der ACI. Der gesamte Datenverkehr zwischen beiden läuft über dieses private Netzwerk.
Frontends
Erstellen Sie eine neue öffentliche IP-Adresse. Dies ist die extern zugängliche IP-Adresse, die zur Weiterleitung des Datenverkehrs an die ACI verwendet wird.
Backends
Erstellen Sie einen neuen Backend-Pool. Lassen Sie ihn vorerst leer — die private IP-Adresse der ACI wird hinzugefügt, nachdem die ACI bereitgestellt wurde (Abschnitt 3.3).
Konfiguration — Routingregeln
Erstellen Sie eine Routingregel mit:
- Listener: HTTPS auf Port 443, mit Ihrem SSL-Zertifikat.
- Backend-Ziel: der oben erstellte Backend-Pool.
- Backend-Einstellung: HTTP auf Port 80 (der Datenverkehr zwischen dem Application Gateway und der ACI läuft über das private VNET und erfordert intern kein HTTPS).
Klicken Sie auf Review + create, um das Application Gateway bereitzustellen.
2.3. Ein VNET-Subnetz für die ACI hinzufügen
Erstellen Sie im in Abschnitt 2.2 erstellten VNET ein neues, der ACI gewidmetes Subnetz. Delegieren Sie dieses Subnetz an Microsoft.ContainerInstance/containerGroups.
Notieren Sie sich die vollständige Subnetz-Ressourcen-ID — sie wird in der YAML-Datei der Containergruppe benötigt:
/subscriptions/SUBSCRIPTION_ID/resourceGroups/RESOURCE_GROUP/providers/Microsoft.Network/virtualNetworks/VNET_NAME/subnets/SUBNET_NAME2.4. Azure Storage konfigurieren
ACI-Container verwenden Azure File Shares für persistenten Speicher. Erstellen Sie ein Speicherkonto und anschließend die folgenden Dateifreigaben:
| Dateifreigabe | Zweck |
|---|---|
nginxconf |
NGINX-Konfiguration und SSL-Zertifikatsdateien |
redisdata |
Persistente Redis-Daten |
postgresdata |
PostgreSQL-Datenverzeichnis |
Schritt 1 — Erstellen Sie das Speicherkonto:
az storage account create \
--name MY_STORAGE_ACCOUNT \
--resource-group MY_RESOURCE_GROUP \
--location MY_LOCATION \
--sku Standard_LRSSchritt 2 — Rufen Sie den Speicherkontoschlüssel ab:
az storage account keys list \
--account-name MY_STORAGE_ACCOUNT \
--resource-group MY_RESOURCE_GROUP \
--query "[0].value" -o tsvSchritt 3 — Erstellen Sie die Dateifreigaben:
az storage share create --name nginxconf --account-name MY_STORAGE_ACCOUNT
az storage share create --name redisdata --account-name MY_STORAGE_ACCOUNT
az storage share create --name postgresdata --account-name MY_STORAGE_ACCOUNTHinweis zum PostgreSQL-Speicher: Azure File Shares verwenden das SMB-Protokoll, das möglicherweise nicht alle von PostgreSQL benötigten POSIX-Dateisystemoperationen unterstützt. Wenn der Container postgres nicht startet, finden Sie in Abschnitt 5 die empfohlene Alternative mit Azure Database for PostgreSQL.
2.5. Einen Log Analytics-Arbeitsbereich erstellen
Ein Log Analytics-Arbeitsbereich zentralisiert Container-Protokolle und ermöglicht die Überwachung über Azure Monitor. Protokolle werden standardmäßig 30 Tage lang gespeichert.
Schritt 1 — Erstellen Sie den Arbeitsbereich:
az monitor log-analytics workspace create \
--resource-group MY_RESOURCE_GROUP \
--workspace-name dqe-standalone-logs \
--location MY_LOCATIONSchritt 2 — Rufen Sie die Workspace-ID ab:
az monitor log-analytics workspace show \
--resource-group MY_RESOURCE_GROUP \
--workspace-name dqe-standalone-logs \
--query customerId -o tsvSchritt 3 — Rufen Sie den primären Workspace-Schlüssel ab:
az monitor log-analytics workspace get-shared-keys \
--resource-group MY_RESOURCE_GROUP \
--workspace-name dqe-standalone-logs \
--query primarySharedKey -o tsvBewahren Sie die Workspace-ID und den primären Schlüssel auf — sie werden in der YAML-Datei der Containergruppe benötigt (Abschnitt 2.7).
2.6. NGINX konfigurieren
NGINX fungiert als Reverse-Proxy innerhalb der ACI-Containergruppe und leitet eingehende Anfragen an den Container dqeone auf Port 8000 weiter. Da alle Container in einer ACI-Gruppe denselben Netzwerk-Namespace teilen, verwendet das Proxy-Ziel localhost.
Erstellen Sie eine Datei namens default.conf mit folgendem Inhalt:
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
proxy_read_timeout 300s;
}
}Wenn HTTPS direkt auf ACI-Ebene gehandhabt wird (ohne SSL-Offloading am Application Gateway), fügen Sie einen zweiten Server-Block für Port 443 hinzu und laden Sie die SSL-Zertifikats- und Schlüsseldateien in die Dateifreigabe nginxconf unter einem Unterverzeichnis ssl/ hoch.
Laden Sie default.conf in die Dateifreigabe nginxconf hoch:
az storage file upload \
--account-name MY_STORAGE_ACCOUNT \
--share-name nginxconf \
--source ./default.conf \
--path default.conf2.7. YAML-Datei der Containergruppe
Erstellen Sie eine Datei namens container-group.yaml. Ersetzen Sie vor der Bereitstellung alle Platzhalter. Die folgende Tabelle listet alle erforderlichen Werte auf.
| Placeholder | Beschreibung |
|---|---|
MY_LOCATION |
Azure-Region, zum Beispiel westeurope
|
DQE_REGISTRY_LOGIN |
Von DQE bereitgestellter Registry-Benutzername |
DQE_REGISTRY_PASSWORD |
Von DQE bereitgestelltes Registry-Passwort |
MY_STORAGE_ACCOUNT |
In Abschnitt 2.4 erstellter Speicherkontoname |
MY_STORAGE_ACCOUNT_KEY |
In Abschnitt 2.4, Schritt 2 abgerufener Speicherkontoschlüssel |
LOG_ANALYTICS_WORKSPACE_ID |
In Abschnitt 2.5, Schritt 2 abgerufene Workspace-ID |
LOG_ANALYTICS_WORKSPACE_KEY |
In Abschnitt 2.5, Schritt 3 abgerufener primärer Schlüssel |
SUBNET_RESOURCE_ID |
In Abschnitt 2.3 notierte vollständige Subnetz-Ressourcen-ID |
name: dqe-standalone
apiVersion: '2021-10-01'
location: MY_LOCATION
tags: {"docker-compose-application": "docker-compose-application"}
properties:
containers:
- name: nginx
properties:
image: nginx:latest
ports:
- protocol: TCP
port: 80
resources:
requests:
memoryInGB: 0.5
cpu: 0.25
volumeMounts:
- name: nginxconf
mountPath: /etc/nginx/conf.d
- name: redis
properties:
image: dqeone.azurecr.io/dqe-one-redis:v1.0
resources:
requests:
memoryInGB: 1.0
cpu: 0.5
volumeMounts:
- name: redisdata
mountPath: /data
- name: postgres
properties:
image: dqeone.azurecr.io/dqe-one-postgres:v1.0
resources:
requests:
memoryInGB: 1.0
cpu: 0.5
environmentVariables:
- name: POSTGRES_USER
value: dqeone
- name: POSTGRES_PASSWORD
secureValue: DATABASE_PASSWORD
- name: POSTGRES_DB
value: dqeone
volumeMounts:
- name: postgresdata
mountPath: /var/lib/postgresql/data
- name: dqeone
properties:
image: dqeone.azurecr.io/standalone:v1.4.0
command:
- "bash"
- "./entrypoint.sh"
ports:
- protocol: TCP
port: 8000
resources:
requests:
memoryInGB: 2.0
cpu: 1.0
environmentVariables:
- name: SFAPIVERSION
value: v65.0
- name: CREATE_SUPERUSER
value: "true"
- name: RUN_COLLECTSTATIC
value: "false"
- name: DQE_ONE_SERVER_ADMIN_USER
value: ADMIN_USER
- name: DQE_ONE_SERVER_ADMIN_PASSWORD
secureValue: ADMIN_PASSWORD
- name: DQE_CLIENT_LICENCE
value: CLIENT_LICENCE
- name: WEBSITE_HOSTNAME
value: https://YOUR_DNS_NAME
- name: SECRET_ENCRYPTION_KEY
secureValue: SECRET_ENCRYPTION_KEY_VALUE
- name: WAIT_HOSTS
value: "localhost:6379"
- name: WAIT_HOSTS_TIMEOUT
value: "300"
- name: WAIT_SLEEP_INTERVAL
value: "5"
- name: WAIT_HOST_CONNECT_TIMEOUT
value: "30"
- name: REDIS_URL
value: redis://localhost:6379
- name: PORT
value: "8000"
- name: DEBUG
value: "false"
- name: DB_USER
value: dqeone
- name: DB_PASSWORD
secureValue: DATABASE_PASSWORD
- name: DB_NAME
value: dqeone
- name: DB_HOST
value: localhost
- name: DB_VOLUME_PATH
value: ./db/
- name: DB_MAX_CAPACITY
value: "8000000000"
- name: AUTHORIZED_SFTP_HOSTS
value: AUTHORIZED_SFTP_HOSTS
imageRegistryCredentials:
- server: dqeone.azurecr.io
username: DQE_REGISTRY_LOGIN
password: DQE_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: nginxconf
azureFile:
shareName: nginxconf
readOnly: false
storageAccountName: MY_STORAGE_ACCOUNT
storageAccountKey: MY_STORAGE_ACCOUNT_KEY
- name: redisdata
azureFile:
shareName: redisdata
readOnly: false
storageAccountName: MY_STORAGE_ACCOUNT
storageAccountKey: MY_STORAGE_ACCOUNT_KEY
- name: postgresdata
azureFile:
shareName: postgresdata
readOnly: false
storageAccountName: MY_STORAGE_ACCOUNT
storageAccountKey: MY_STORAGE_ACCOUNT_KEY
subnetIds:
- id: SUBNET_RESOURCE_IDWichtig: Verwenden Sie die von DQE bereitgestellten Image-Versionen. Ersetzen Sie diese nicht durch das Tag latest.
Wichtiger Hinweis zum ACI-Networking: Alle Container teilen sich denselben Netzwerk-Namespace. Die Kommunikation zwischen den Containern erfolgt über localhost — deshalb ist REDIS_URL gleich redis://localhost:6379 und DB_HOST gleich localhost, im Gegensatz zu einem Docker-Compose-Setup, bei dem Dienstnamen verwendet werden.
2.8. Umgebungsvariablen
| Variable | Beispielwert | Beschreibung |
|---|---|---|
SFAPIVERSION |
v65.0 |
Von der Anwendung verwendete Salesforce-API-Version. |
CREATE_SUPERUSER |
true |
Erstellt das anfängliche Administratorkonto beim ersten Start. |
RUN_COLLECTSTATIC |
false |
Führt den Django-Befehl collectstatic beim Start aus. Auf false setzen, sofern nicht ausdrücklich erforderlich. |
DQE_ONE_SERVER_ADMIN_USER |
— | Benutzername des anfänglichen Administratorkontos. |
DQE_ONE_SERVER_ADMIN_PASSWORD |
— | Passwort des anfänglichen Administratorkontos. Verwenden Sie secureValue. |
DQE_CLIENT_LICENCE |
— | Von DQE bereitgestellter Kundenlizenzschlüssel. |
WEBSITE_HOSTNAME |
https://myapp.example.com |
Öffentliche HTTPS-URL. Muss mit dem DNS-Namen übereinstimmen, der auf das Application Gateway verweist. |
SECRET_ENCRYPTION_KEY |
— | Verschlüsselungsschlüssel für sensible Daten. Einmalig generieren, nach der Bereitstellung nie ändern. Verwenden Sie secureValue. |
WAIT_HOSTS |
localhost:6379 |
Dienst, auf den vor dem Start gewartet wird. Verwendet localhost in ACI. |
WAIT_HOSTS_TIMEOUT |
300 |
Maximale Wartezeit in Sekunden für abhängige Dienste. |
WAIT_SLEEP_INTERVAL |
5 |
Verzögerung in Sekunden zwischen Verfügbarkeitsprüfungen. |
WAIT_HOST_CONNECT_TIMEOUT |
30 |
Timeout in Sekunden für jeden Verbindungsversuch. |
REDIS_URL |
redis://localhost:6379 |
Redis-Verbindungs-URL. Verwendet localhost in ACI. |
PORT |
8000 |
Interner Lauschport der Anwendung. |
DEBUG |
false |
Debug-Modus. Muss in der Produktion false sein. |
DB_USER |
dqeone |
PostgreSQL-Benutzername. |
DB_PASSWORD |
— | PostgreSQL-Passwort. Muss mit POSTGRES_PASSWORD im Container postgres übereinstimmen. Verwenden Sie secureValue. |
DB_NAME |
dqeone |
PostgreSQL-Datenbankname. |
DB_HOST |
localhost |
PostgreSQL-Hostname. Verwendet localhost in ACI. Bei Verwendung von Azure Database for PostgreSQL auf den Hostnamen des verwalteten Servers setzen. |
DB_VOLUME_PATH |
./db/ |
Pfad für datenbankbezogenen Speicher. |
DB_MAX_CAPACITY |
8000000000 |
Maximale Datenbankkapazität in Byte. |
AUTHORIZED_SFTP_HOSTS |
depot-1.dqe-software.net |
Durch Kommas getrennte Liste der autorisierten SFTP-Hosts. |
Wichtig: Der SECRET_ENCRYPTION_KEY muss einmalig generiert und für die gesamte Lebensdauer der Bereitstellung beibehalten werden. Um einen kompatiblen Schlüssel zu generieren:
python3 -c "from cryptography.fernet import Fernet; print(Fernet.generate_key().decode())"3. Start
3.1. Bei Azure anmelden
az login3.2. Die Containergruppe bereitstellen
az container create -g MY_RESOURCE_GROUP -f container-group.yamlNachdem der Vorgang abgeschlossen ist, rufen Sie die der Containergruppe zugewiesene private IP-Adresse ab:
az container show \
--resource-group MY_RESOURCE_GROUP \
--name dqe-standalone \
--query "ipAddress.ip" -o tsvDiese private IP-Adresse ist nur innerhalb des Azure-VNET erreichbar.
3.3. Den Backend-Pool des Application Gateway einrichten
Nachdem die ACI bereitgestellt wurde, gehen Sie zu Azure Portal > Application Gateway > Backend pools > Ihr Backend-Pool > Edit.
Fügen Sie die in Schritt 3.2 abgerufene private IP-Adresse der ACI hinzu. Klicken Sie auf Save.
3.4. Den Health Probe des Application Gateway einrichten
Mit dem Health Probe kann das Application Gateway überprüfen, ob die Anwendung ausgeführt wird. Gehen Sie zu Azure Portal > Application Gateway > Health probes > Add.
Konfigurieren Sie den Probe so, dass er den Root-Pfad der Anwendung über HTTP aufruft. Klicken Sie auf Test. Wenn der Status Healthy anzeigt, ist die ACI korrekt konfiguriert und das Application Gateway kann Datenverkehr an sie weiterleiten.
Klicken Sie auf Add, um den Health Probe zu speichern.
3.5. DNS einrichten
Wenden Sie sich an Ihre DNS-Administratoren, um einen DNS-Eintrag zu erstellen, der auf die öffentliche IP-Adresse des Application Gateway verweist:
| Eintragstyp | Name | Wert |
|---|---|---|
| A | standalone.yourdomain.com |
Öffentliche IP des Application Gateway |
3.6. Überprüfen der Installation
Überprüfen Sie, ob alle Container ausgeführt werden:
az container show \
--resource-group MY_RESOURCE_GROUP \
--name dqe-standalone \
--query "containers[].{Name:name, State:instanceView.currentState.state}" \
-o tableErwartete Ausgabe:
Name State
-------- -------
nginx Running
redis Running
postgres Running
dqeone RunningHinweis: ACI startet alle Container gleichzeitig. Der Mechanismus WAIT_HOSTS regelt die Startreihenfolge durch wiederholte Verbindungsversuche. Beim ersten Start ist eine Verzögerung von 1–2 Minuten zu erwarten, bevor die Anwendung vollständig betriebsbereit ist.
Sobald alle Container ausgeführt werden und die DNS-Änderung propagiert wurde, rufen Sie https://standalone.yourdomain.com auf.
4. Zu autorisierende IP-Adressen
Sobald die Anwendung ausgeführt wird, konfigurieren Sie die WAF oder die vorgeschaltete Firewall so, dass die folgenden eingehenden IP-Bereiche autorisiert werden:
- DQE Software Office Server: Wenden Sie sich an den DQE Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
- DQE Deduplication Service: Wenden Sie sich an den DQE Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
- DQE Quality Service: Wenden Sie sich an den DQE Software-Support, um die zu autorisierende IP-Adresse zu erhalten.
Erforderliche Maßnahme: Teilen Sie DQE Software die von Ihrer Azure-Infrastruktur verwendete ausgehende öffentliche IP-Adresse mit (NAT Gateway, Azure Firewall oder gleichwertig), damit diese für die DQE-Dienste autorisiert werden kann.
5. Fehlerbehebung
Container-Protokolle anzeigen
Container-Protokolle sind in Azure Monitor unter der Tabelle ContainerInstanceLog_CL verfügbar. Sie können sie auch direkt über die CLI abrufen:
az container logs \
--resource-group MY_RESOURCE_GROUP \
--name dqe-standalone \
--container-name CONTAINER_NAMENicht autorisiert beim Abrufen von Images
Überprüfen Sie, dass:
- der Abschnitt
imageRegistryCredentialsden korrekten von DQE bereitgestellten Login und das Passwort enthält; - alle Images auf die DQE-Produktionsregistry
dqeone.azurecr.ioverweisen; - die Image-Versionen mit den von DQE bereitgestellten übereinstimmen.
PostgreSQL-Container startet nicht
Azure File Shares verwenden das SMB-Protokoll, das möglicherweise nicht die von PostgreSQL benötigten POSIX-Dateisystemoperationen unterstützt. Wenn der Container postgres wiederholt mit Berechtigungsfehlern neu startet, verwenden Sie stattdessen Azure Database for PostgreSQL — Flexible Server:
- Entfernen Sie den Container
postgresund das Volumepostgresdataaus der YAML-Datei. - Setzen Sie
DB_HOSTauf den Hostnamen des verwalteten Servers (zum Beispiel:myserver.postgres.database.azure.com). - Aktualisieren Sie
DB_USER,DB_PASSWORDundDB_NAME, damit sie mit den Anmeldedaten des verwalteten Servers übereinstimmen.
Health Probe des Application Gateway schlägt fehl
Überprüfen Sie, dass:
- alle ACI-Container den Status
Runninganzeigen; - der Backend-Pool die korrekte private IP-Adresse der ACI enthält;
- das Subnetz korrekt an
Microsoft.ContainerInstance/containerGroupsdelegiert ist; - die dem Subnetz zugeordnete NSG eingehenden Datenverkehr auf Port 80 vom Subnetz des Application Gateway zulässt.