Stellen Sie DQE One Standalone auf Azure Container Instance (ACI) für Microsoft-Dynamics-Umgebungen bereit, wobei eine verwaltete Azure Database for PostgreSQL anstelle eines Datenbank-Containers verwendet wird.
Hinweis: Alle nachfolgend beschriebenen Elemente sind Empfehlungen von DQE, die auf Erfahrungen aus Implementierungen bei 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 an die Infrastruktur des Kunden anpassen.
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 macht die Anwendung über HTTPS verfügbar 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 80, internal)
|
DQE One Standalone (port 8000, internal)
|
Redis (internal)
|
Azure Database for PostgreSQL (private VNET)Sicherheitsmaßnahmen
- Application Gateway: terminiert 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.
-
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 |
| dqeone | 1.0 vCPU | 2.0 GB |
| Gesamt | 1.75 vCPU | 3.5 GB |
ACI-Containergruppen sind auf 4 vCPU und 16 GB Arbeitsspeicher pro Gruppe begrenzt.
PostgreSQL wird auf Azure Database for PostgreSQL gehostet (außerhalb der ACI-Containergruppe). Die Einrichtung ist in Abschnitt 2.5 beschrieben.
2. Installation
2.1. Azure CLI
Die Azure CLI muss auf Ihrem lokalen Rechner 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.
Ausführliche Konfigurationsdetails finden Sie in der Microsoft-Dokumentation zu Application Gateway.
Basic Tab
Wählen Sie Ihr Abonnement, Ihre Ressourcengruppe und Ihre Region aus. Wählen Sie die Stufe WAF V2, um die Web Application Firewall zu aktivieren.
WAF Policy
Erstellen Sie über das Feld WAF policy eine neue WAF-Richtlinie. Verwenden Sie die WAF, um die eingehenden IP-Bereiche festzulegen, die zum Aufruf des Application Gateway berechtigt sind.
VNET
Erstellen Sie über das Feld Virtual network ein neues Virtual Network (VNET). Dieses VNET verbindet das Application Gateway mit der ACI.
Frontends
Erstellen Sie eine neue öffentliche IP-Adresse. Dies ist die extern zugängliche IP-Adresse, über die der Datenverkehr an die ACI weitergeleitet wird.
Backends
Erstellen Sie einen neuen Backend-Pool. Lassen Sie ihn vorerst leer — die private IP-Adresse der ACI wird nach der Bereitstellung der ACI hinzugefügt (Abschnitt 3.3).
Configuration — Routing Rules
Erstellen Sie eine Routingregel mit:
- Listener: HTTPS auf Port 443, mit Ihrem SSL-Zertifikat.
- Backend target: der oben erstellte Backend-Pool.
- Backend setting: 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 in dem in Abschnitt 2.2 erstellten VNET ein neues, der ACI vorbehaltenes Subnetz. Delegieren Sie dieses Subnetz an Microsoft.ContainerInstance/containerGroups.
az network vnet subnet create \
--resource-group MY_RESOURCE_GROUP \
--vnet-name VNET_NAME \
--name aci-subnet \
--address-prefixes 10.0.1.0/24 \
--delegations Microsoft.ContainerInstance/containerGroupsNotieren Sie sich die vollständige Ressourcen-ID des Subnetzes — 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 |
Schritt 1 — Speicherkonto erstellen:
az storage account create \
--name MY_STORAGE_ACCOUNT \
--resource-group MY_RESOURCE_GROUP \
--location MY_LOCATION \
--sku Standard_LRSSchritt 2 — Speicherkontoschlüssel abrufen:
az storage account keys list \
--account-name MY_STORAGE_ACCOUNT \
--resource-group MY_RESOURCE_GROUP \
--query "[0].value" -o tsvSchritt 3 — Dateifreigaben erstellen:
az storage share create --name nginxconf --account-name MY_STORAGE_ACCOUNT
az storage share create --name redisdata --account-name MY_STORAGE_ACCOUNT2.5. Azure Database for PostgreSQL erstellen
PostgreSQL wird als verwalteter Azure-Dienst außerhalb der ACI-Containergruppe gehostet. Azure File Shares (SMB) unterstützen nicht die von PostgreSQL benötigten POSIX-Dateisystemoperationen und führen zu einem CrashLoopBackOff.
Schritt 1 — Ein dediziertes Subnetz für PostgreSQL erstellen
Fügen Sie dem in Abschnitt 2.2 erstellten VNET ein neues Subnetz hinzu (z. B. postgres-subnet). Delegieren Sie es an Microsoft.DBforPostgreSQL/flexibleServers. Dieses Subnetz darf nicht mit dem ACI-Subnetz geteilt werden.
az network vnet subnet create \
--resource-group MY_RESOURCE_GROUP \
--vnet-name VNET_NAME \
--name postgres-subnet \
--address-prefixes 10.0.2.0/24 \
--delegations Microsoft.DBforPostgreSQL/flexibleServersSchritt 2 — Den Server erstellen
Erstellen Sie im Azure-Portal eine Azure Database for PostgreSQL-Ressource:
- Networking: wählen Sie Private access (VNet Integration).
- Virtual network: wählen Sie dasselbe VNet wie die ACI. Die ACI und der Server müssen dasselbe VNet verwenden.
- Subnet: wählen Sie das in Schritt 1 erstellte Subnetz.
-
Admin username / password: legen Sie die Anmeldedaten fest. Diese Werte werden in
DB_USERundDB_PASSWORDin der YAML-Datei der Containergruppe verwendet.
az postgres flexible-server create \
--resource-group MY_RESOURCE_GROUP \
--name SERVERNAME \
--location MY_LOCATION \
--vnet VNET_NAME \
--subnet postgres-subnet \
--admin-user DB_ADMIN_USER \
--admin-password "DB_ADMIN_PASSWORD" \
--sku-name Standard_B1ms \
--tier Burstable \
--version 16Schritt 3 — Die Anwendungsdatenbank erstellen
Navigieren Sie im Azure-Portal zur Azure Database for PostgreSQL-Ressource → Databases → + Add, geben Sie dqeone als Namen ein und speichern Sie.
az postgres flexible-server db create \
--resource-group MY_RESOURCE_GROUP \
--server-name SERVERNAME \
--database-name dqeone2.6. Einen Log Analytics-Arbeitsbereich erstellen
Ein Log Analytics-Arbeitsbereich zentralisiert die Container-Logs und ermöglicht die Überwachung über Azure Monitor. Logs werden standardmäßig 30 Tage lang gespeichert.
Schritt 1 — Den Arbeitsbereich erstellen:
az monitor log-analytics workspace create \
--resource-group MY_RESOURCE_GROUP \
--workspace-name dqe-standalone-logs \
--location MY_LOCATIONSchritt 2 — Die Workspace-ID abrufen:
az monitor log-analytics workspace show \
--resource-group MY_RESOURCE_GROUP \
--workspace-name dqe-standalone-logs \
--query customerId -o tsvSchritt 3 — Den primären Workspace-Schlüssel abrufen:
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.8).
2.7. NGINX konfigurieren
NGINX fungiert innerhalb der ACI-Containergruppe als Reverse-Proxy und leitet eingehende Anfragen an den dqeone-Container auf Port 8000 weiter. Da sich alle Container einer ACI-Gruppe denselben Netzwerk-Namespace teilen, wird als Proxy-Ziel localhost verwendet.
Erstellen Sie eine Datei mit dem Namen default.conf und folgendem Inhalt:
server {
listen 80;
location / {
proxy_pass http://localhost:8000;
proxy_read_timeout 300s;
}
}Wenn HTTPS direkt auf ACI-Ebene verarbeitet wird (ohne SSL-Offloading durch das Application Gateway), fügen Sie einen zweiten server-Block für Port 443 hinzu und laden Sie die SSL-Zertifikats- und Schlüsseldateien in einem ssl/-Unterverzeichnis in die Dateifreigabe nginxconf 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.8. YAML-Datei der Containergruppe
Erstellen Sie eine Datei mit dem Namen container-group.yaml. Ersetzen Sie alle Platzhalter, bevor Sie die Bereitstellung durchführen.
| Platzhalter | Beschreibung |
|---|---|
MY_LOCATION |
Azure-Region, zum Beispiel francecentral
|
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.6, Schritt 2, abgerufene Workspace-ID |
LOG_ANALYTICS_WORKSPACE_KEY |
In Abschnitt 2.6, Schritt 3, abgerufener primärer Schlüssel |
SUBNET_RESOURCE_ID |
In Abschnitt 2.3 notierte vollständige ACI-Subnetz-Ressourcen-ID |
SERVERNAME |
In Abschnitt 2.5 erstellter PostgreSQL-Servername |
DB_ADMIN_USER |
Administrator-Benutzername des PostgreSQL-Servers |
DB_ADMIN_PASSWORD |
Administrator-Passwort des PostgreSQL-Servers |
DQE_ADMIN_USER |
Administrator-Benutzername der DQE One-Anwendung |
DQE_ADMIN_PASSWORD |
Administrator-Passwort der DQE One-Anwendung |
name: dqe-standalone
apiVersion: '2021-10-01'
location: MY_LOCATION
tags: {"docker-compose-application": "docker-compose-application"}
properties:
containers:
- name: nginx
properties:
image: dqeone.azurecr.io/dqe-one-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: 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: DQE_ADMIN_USER
- name: DQE_ONE_SERVER_ADMIN_PASSWORD
secureValue: DQE_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: DB_ADMIN_USER
- name: DB_PASSWORD
secureValue: DB_ADMIN_PASSWORD
- name: DB_NAME
value: dqeone
- name: DB_HOST
value: SERVERNAME.postgres.database.azure.com
- name: DB_PORT
value: "5432"
- name: DB_VOLUME_PATH
value: ./db/
- name: DB_MAX_CAPACITY
value: "8000000000"
- name: AUTHORIZED_SFTP_HOSTS
value: AUTHORIZED_SFTP_HOSTS
# Only required if WEBSITE_HOSTNAME does not match the URL used to access the app:
# - name: CSRF_TRUSTED_ORIGINS
# value: https://YOUR_IP_OR_ALTERNATE_URL
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
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-Netzwerk: Alle Container der Gruppe teilen sich denselben Netzwerk-Namespace. Die Kommunikation zwischen den Containern erfolgt über localhost — deshalb lautet REDIS_URL redis://localhost:6379. PostgreSQL läuft außerhalb der Containergruppe als verwalteter Azure-Dienst, weshalb DB_HOST der FQDN von Azure Database for PostgreSQL ist.
2.9. 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 beim Start den Django-Befehl collectstatic 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 Kunden-Lizenzschlüssel. |
WEBSITE_HOSTNAME |
https://myapp.example.com |
Öffentliche HTTPS-URL. Muss dem DNS-Namen entsprechen, der auf das Application Gateway verweist. |
SECRET_ENCRYPTION_KEY |
— | Verschlüsselungsschlüssel für sensible Daten. Einmalig generieren, nach der Bereitstellung nie mehr ändern. Verwenden Sie secureValue. |
WAIT_HOSTS |
localhost:6379 |
Dienst, auf den vor dem Start gewartet wird. Verwendet in der ACI localhost. |
WAIT_HOSTS_TIMEOUT |
300 |
Maximale Wartezeit in Sekunden für abhängige Dienste. |
WAIT_SLEEP_INTERVAL |
5 |
Verzögerung in Sekunden zwischen den Verfügbarkeitsprüfungen. |
WAIT_HOST_CONNECT_TIMEOUT |
30 |
Timeout in Sekunden für jeden Verbindungsversuch. |
REDIS_URL |
redis://localhost:6379 |
Redis-Verbindungs-URL. Verwendet in der ACI localhost. |
PORT |
8000 |
Interner Listening-Port der Anwendung. |
DEBUG |
false |
Debug-Modus. Muss in der Produktion false sein. |
DB_USER |
dqeone |
PostgreSQL-Administrator-Benutzername, der bei der Erstellung des Postgres-Servers festgelegt wurde. |
DB_PASSWORD |
— | PostgreSQL-Administrator-Passwort. Verwenden Sie secureValue. |
DB_NAME |
dqeone |
Name der PostgreSQL-Datenbank. Erforderlich — ohne diesen Wert startet die Anwendung nicht. |
DB_HOST |
myserver.postgres.database.azure.com |
FQDN des PostgreSQL-Servers. |
DB_PORT |
5432 |
PostgreSQL-Port. |
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. |
CSRF_TRUSTED_ORIGINS |
https://myapp.example.com |
Vertrauenswürdige Ursprünge (Origins) für Django CSRF. Nur erforderlich, wenn auf die Anwendung über eine URL zugegriffen wird, die von WEBSITE_HOSTNAME abweicht. |
Wichtig: SECRET_ENCRYPTION_KEY muss einmalig generiert und für die gesamte Lebensdauer der Bereitstellung beibehalten werden. So generieren Sie einen kompatiblen Schlüssel:
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.yamlRufen Sie nach Abschluss des Vorgangs 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
Navigieren Sie nach der Bereitstellung der ACI 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 Application Gateway Health Probe einrichten
Der Health Probe ermöglicht es dem Application Gateway zu überprüfen, ob die Anwendung läuft. Navigieren 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-Adresse des Application Gateway |
3.6. Die Installation überprüfen
Überprüfen Sie, dass 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
dqeone RunningHinweis: Die ACI startet alle Container gleichzeitig. Der WAIT_HOSTS-Mechanismus regelt die Startreihenfolge, indem die Verbindung wiederholt versucht wird. Beim ersten Start ist eine Verzögerung von 1–2 Minuten zu erwarten, bevor die Anwendung vollständig einsatzbereit ist.
Sobald alle Container ausgeführt werden und die DNS-Änderungen verbreitet wurden, rufen Sie https://standalone.yourdomain.com auf.
4. Zu autorisierende IP-Adressen
Sobald die Anwendung läuft, konfigurieren Sie die WAF oder die vorgelagerte 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 Äquivalent), damit diese für die DQE-Dienste autorisiert werden kann.
5. Fehlerbehebung
Container-Logs anzeigen
Container-Logs sind in Azure Monitor in 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 Folgendes:
- der Abschnitt
imageRegistryCredentialsden von DQE bereitgestellten korrekten Benutzernamen und das korrekte Passwort enthält; - alle Images auf die DQE-Produktionsregistry
dqeone.azurecr.ioverweisen; - die Image-Versionen mit den von DQE bereitgestellten übereinstimmen.
PostgreSQL-Einrichtung
Das vollständige Einrichtungsverfahren finden Sie in Abschnitt 2.5. Wichtige Punkte:
- Der Server muss sich im selben VNet wie die ACI befinden — unterschiedliche VNets erfordern Peering und die Konfiguration einer DNS-Zone.
- Azure Database for PostgreSQL erfordert ein dediziertes Subnetz, das an
Microsoft.DBforPostgreSQL/flexibleServersdelegiert ist. - Erstellen Sie nach der Servererstellung die Datenbank
dqeoneüber das Azure-Portal: Azure Database for PostgreSQL → Databases → + Add. - Alle
DB_*-Umgebungsvariablen müssen vor der ersten Bereitstellung in der YAML-Datei der Containergruppe gesetzt werden — siehe Abschnitt 2.8.
CSRF-Überprüfung fehlgeschlagen (403)
Django überprüft, dass eingehende Anfragen von einem vertrauenswürdigen Ursprung stammen, der mit WEBSITE_HOSTNAME übereinstimmt. Ein 403-CSRF-Fehler tritt auf, wenn auf die Anwendung über eine URL zugegriffen wird, die vom konfigurierten Hostnamen abweicht.
Dauerhafte Lösung: Konfigurieren Sie DNS so, dass der Hostname in WEBSITE_HOSTNAME zur öffentlichen IP-Adresse des Application Gateway aufgelöst wird.
Vorübergehende Umgehungslösung (Test ohne DNS): Setzen Sie WEBSITE_HOSTNAME auf die IP-Adresse und fügen Sie CSRF_TRUSTED_ORIGINS hinzu:
- name: WEBSITE_HOSTNAME
value: https://YOUR_GATEWAY_IP
- name: CSRF_TRUSTED_ORIGINS
value: https://YOUR_GATEWAY_IPSobald DNS konfiguriert ist, setzen Sie beide Werte wieder auf den korrekten Domainnamen zurück.
Application Gateway Health Probe schlägt fehl
Überprüfen Sie Folgendes:
- 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.