1. Installation
Cette section décrit le déploiement de DQE Unify Server sur Azure Container Instances (ACI). La pile applicative — Redis, RabbitMQ, Nginx, Unify Server et Queue Worker — s'exécute en tant que Container Group Azure unique. Tous les conteneurs partagent le même espace de noms réseau et communiquent via localhost.
1.1 Prérequis
1.1.1 Configuration des ressources requises
| Conteneur | CPU (vCores) | Mémoire |
|---|---|---|
| redis | 0.5 | 0.5 Go |
| rabbitmq | 0.5 | 1 Go |
| nginx | 0.5 | 0.5 Go |
| unify-server | 0.5 | 1 Go |
| queue-worker | 1.0 | 5 Go |
| Total | 3.0 | 8 Go |
Remarque : Ces estimations sont basées sur 1 million d'enregistrements. Selon le volume de données, il peut être nécessaire d'augmenter l'allocation mémoire du conteneur queue-worker.
1.1.2 Configuration logicielle requise
| Logiciel | Version / Remarques |
|---|---|
| Azure CLI | Dernière version stable — commande az disponible dans le terminal |
| Abonnement Azure | Abonnement actif avec les permissions nécessaires pour créer des Container Instances, des réseaux virtuels et des comptes de stockage |
| Accès Internet | Requis pour récupérer les images depuis le DQE Container Registry |
1.2 S'authentifier auprès du DQE Container Registry
Toutes les images (DQE Unify, Redis, RabbitMQ, Nginx) sont hébergées sur un Azure Container Registry privé. Utilisez les identifiants fournis par DQE Software pour vous connecter depuis votre terminal local :
az login
docker login <registry-url> --username <Username provided by DQE> --password <Password provided by DQE>Une connexion réussie affiche : Login Succeeded.
Remarque : Les identifiants du registre sont également requis dans le fichier YAML du Container Group (section 1.7) afin qu'ACI puisse récupérer les images au moment du déploiement.
1.3 Configurer Azure Storage
Azure Container Instances ne prend pas en charge les bind mounts locaux. Les données persistantes de Redis et RabbitMQ doivent être stockées dans des Azure File Shares. Le fichier de configuration Nginx est également téléversé vers un file share afin que le conteneur puisse le monter au démarrage.
-
Étape 1 — Créer un compte de stockage :
az storage account create \ --name dqeunifystorage \ --resource-group <resource-group> \ --location <location> \ --sku Standard_LRS -
Étape 2 — Récupérer la clé du compte de stockage :
az storage account keys list \ --account-name dqeunifystorage \ --resource-group <resource-group> \ --query "[0].value" -o tsv -
Étape 3 — Créer les 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 Configurer Nginx
Nginx agit comme reverse proxy, redirigeant les requêtes HTTP/HTTPS entrantes vers le Unify Server. Dans ACI, tous les conteneurs partagent le même espace de noms réseau, la cible du proxy est donc http://localhost:8000 et non un nom de service.
Créez le fichier default.conf en local, puis téléversez-le vers l'Azure File Share.
Le fichier default.conf doit contenir :
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;
}
}Téléverser vers l'Azure File Share :
az storage file upload \
--account-name dqeunifystorage \
--share-name nginxconf \
--source ./default.conf \
--path default.confHTTPS
Ajoutez un second server block et téléversez votre certificat SSL et votre clé privée vers le file share nginxconf. Mettez à jour le YAML du Container Group pour exposer le port 443.
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;
}
}Remarque : Téléversez les fichiers de certificat vers le file share nginxconf sous un sous-répertoire ssl/, et montez le share sur /etc/nginx/ssl dans la configuration du conteneur Nginx.
1.5 Configurer le Log Analytics Workspace
Un Log Analytics workspace centralise les logs des conteneurs et permet la supervision via Azure Monitor. L'ID et la clé du workspace sont référencés dans le YAML du Container Group (section 1.7).
-
Étape 1 — Créer un Log Analytics workspace :
az monitor log-analytics workspace create \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --location <location> -
Étape 2 — Récupérer le Workspace ID :
az monitor log-analytics workspace show \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --query customerId -o tsv -
Étape 3 — Récupérer la Workspace Primary Key :
az monitor log-analytics workspace get-shared-keys \ --resource-group <resource-group> \ --workspace-name dqe-unify-logs \ --query primarySharedKey -o tsv
Remarque : Conservez le Workspace ID et la Primary Key à portée de main — ils sont utilisés comme placeholders <workspace-id> et <workspace-key> dans le YAML du Container Group (section 1.7).
1.6 Configurer le réseau virtuel (VNET)
Le Container Group doit être déployé dans un réseau virtuel Azure afin de recevoir une adresse IP privée accessible depuis votre environnement Azure (backend Dynamics 365, DNS interne, Application Gateway). Le sous-réseau doit être explicitement délégué à Microsoft.ContainerInstance/containerGroups — il s'agit d'une exigence stricte pour l'intégration VNET d'ACI.
-
Étape 1 — Créer un réseau virtuel :
az network vnet create \ --name dqe-unify-vnet \ --resource-group <resource-group> \ --location <location> \ --address-prefix 10.0.0.0/16 -
Étape 2 — Créer un sous-réseau délégué à ACI :
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 -
Étape 3 — Récupérer l'ID de ressource complet du sous-réseau :
az network vnet subnet show \ --name dqe-unify-subnet \ --vnet-name dqe-unify-vnet \ --resource-group <resource-group> \ --query id -o tsvLa valeur retournée a la forme suivante :
/subscriptions/<subscription-id>/resourceGroups/<resource-group>/providers/Microsoft.Network/virtualNetworks/dqe-unify-vnet/subnets/dqe-unify-subnetConservez cette valeur — elle est utilisée comme placeholder
subnetIds[0].iddans le YAML du Container Group (section 1.7).
Remarque : Un sous-réseau délégué à Microsoft.ContainerInstance/containerGroups ne peut héberger aucun autre type de ressource. Utilisez un sous-réseau dédié — un bloc /24 (256 adresses) est recommandé. ACI consomme une adresse IP par déploiement de container group.
Remarque : Si le client dispose déjà d'un VNET existant, ignorez les étapes 1 et 2 et créez le sous-réseau dédié au sein du VNET existant. Récupérez l'ID du sous-réseau avec l'étape 3.
1.7 Fichier de configuration du Container Group
Créez le fichier container-group.yaml avec le contenu ci-dessous. Remplacez tous les placeholders entre chevrons avant de déployer.
| Placeholder | Description |
|---|---|
<resource-group> |
Nom du Resource Group Azure |
<location> |
Région Azure, par exemple westeurope
|
<registry-url> |
URL du DQE Container Registry |
<Username provided by DQE> |
Nom d'utilisateur du registre fourni par DQE Software |
<Password provided by DQE> |
Mot de passe du registre fourni par DQE Software |
<storage-account-key> |
Clé récupérée à la section 1.3, étape 2 |
<workspace-id> |
Log Analytics Workspace ID (récupéré à la section 1.5, étape 2) |
<workspace-key> |
Log Analytics Workspace Primary Key (récupérée à la section 1.5, étape 3) |
<subscription-id> / <vnet-name> / <subnet-name>
|
ID de ressource du sous-réseau récupéré à la section 1.6, étape 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>Points clés de configuration :
- Tous les conteneurs d'un Container Group ACI partagent le même espace de noms réseau — les services communiquent via
localhost, et non via des noms de service. -
REDIS_URLetCLOUDAMQP_URLutilisentlocalhostà la place deredisetrabbitmq. - L'image
unify-server-web-ms-dynamics:v3.0contient du bytecode Python compilé — le point d'entrée estapp.pyc, et nonapp.py. - RabbitMQ utilise l'image officielle avec des identifiants définis via des variables d'environnement. Le virtual host est
/par défaut. - Le bloc
diagnostics.logAnalyticsroute l'ensemble des stdout/stderr des conteneurs vers le Log Analytics workspace. Les logs apparaissent dans Azure Monitor sous la tableContainerInstanceLog_CLquelques minutes après le déploiement.
1.8 Déployer l'application
-
Étape 1 — Déployer le Container Group :
az container create \ --resource-group <resource-group> \ --file container-group.yaml -
Étape 2 — Vérifier le statut du déploiement :
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "instanceView.state" -o tsvRésultat attendu :
Running. -
Étape 3 — Récupérer l'adresse IP privée attribuée au Container Group :
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "ipAddress.ip" -o tsvL'adresse IP retournée n'est accessible que depuis le réseau virtuel Azure ou depuis les réseaux connectés.
-
Étape 4 — Vérifier que tous les conteneurs sont en cours d'exécution :
az container show \ --resource-group <resource-group> \ --name dqe-unify \ --query "containers[].{Name:name, State:instanceView.currentState.state}" \ -o tableRésultat attendu : tous les conteneurs doivent afficher l'état
Running:Name State ----------- ------- redis Running rabbitmq Running nginx Running unify-server Running queue-worker Running
Important : Si un conteneur affiche l'état Terminated ou Waiting, consultez immédiatement ses logs : az container logs --resource-group <rg> --name dqe-unify --container-name <service-name>.
Remarque : ACI démarre tous les conteneurs simultanément. RabbitMQ et Redis peuvent nécessiter quelques secondes avant d'être prêts. Le Unify Server retentera automatiquement la connexion au démarrage.
1.9 Configurer le Network Security Group (NSG)
Si le Container Instance est déployé dans un réseau virtuel Azure, configurez le NSG associé pour autoriser le trafic entrant sur les ports requis.
- Allez dans Azure Portal → Network Security Groups → [Votre NSG] → Inbound security rules.
- Cliquez sur Add.
- Définissez Destination port ranges : 80. Si HTTPS est activé via un reverse proxy externe ou une Application Gateway, des règles supplémentaires peuvent être nécessaires.
- Définissez Protocol sur
TCPet Action surAllow. - Cliquez sur Add.
Remarque : Le port 8000 (Unify Server) et le port 5672 (RabbitMQ) sont internes au Container Group et n'ont pas besoin d'être exposés à l'extérieur.
Dynamics 365 — Autoriser les plages d'IP entrantes
Le DQE Unify Server reçoit des requêtes de Microsoft Dynamics 365, qui s'exécute sur l'infrastructure Azure. Vous devez autoriser les plages d'IP Azure correspondantes dans le NSG.
La liste complète et à jour des plages d'IP Microsoft Azure est disponible en téléchargement à l'adresse suivante :
Microsoft Azure IP Ranges and Service Tags
Téléchargez le fichier JSON, identifiez les service tags Dynamics365 et AzureCloud pertinents pour votre région, et ajoutez les plages d'IP correspondantes en tant que règles d'autorisation entrantes sur le port exposé par le reverse proxy ou l'Application Gateway (généralement le port 80 ou 443 selon la configuration de l'infrastructure). Vous pouvez également définir Source sur Service Tag et sélectionner directement Dynamics365 dans la règle NSG.
1.10 Configurer le DNS
Contactez vos administrateurs réseau ou DNS pour créer un enregistrement DNS interne pointant vers l'adresse IP privée du Container Group ou vers le nom d'hôte exposé par le reverse proxy/l'Application Gateway.
| Type d'enregistrement | Nom | Valeur |
|---|---|---|
| A | unify.yourdomain.com |
IP privée du Container Group ACI |
Vous pouvez également attribuer un DNS name label directement au Container Instance dans le Azure Portal : Azure Portal → Container Instances → [dqe-unify] → Overview → DNS name label. Cela donne un nom d'hôte de la forme dqe-unify.<location>.azurecontainer.io.
1.11 Vérifier le déploiement
Une fois le DNS propagé, ouvrez un navigateur et accédez à :
http://unify.yourdomain.comVous pouvez également tester directement à l'aide de l'IP publique :
curl http://<private-ip>Réponse attendue du Unify Server :
{"status": "available"}Si l'application répond, le déploiement est terminé et le serveur est correctement configuré.
2. Configuration de l'application
Une fois l'application en cours d'exécution, le NSG ainsi que tout pare-feu ou proxy en amont doivent être configurés pour autoriser les plages d'IP listées ci-dessous.
2.1 Adresses IP à autoriser
DQE Software Office Server
Contactez le support DQE Software pour obtenir l'adresse IP à autoriser.
DQE – Service de dédoublonnage
Contactez le support DQE Software pour obtenir l'adresse IP à autoriser.
DQE – Service de qualité
Contactez le support DQE Software pour obtenir l'adresse IP à autoriser.
Action requise : Communiquez à DQE Software l'adresse IP publique sortante utilisée par votre infrastructure Azure (NAT Gateway, Azure Firewall ou équivalent) afin qu'elle puisse être autorisée sur les services DQE.
Plages d'IP Azure — Dynamics 365 et services Azure
La liste complète et à jour des plages d'IP Microsoft Azure (IPv4 et IPv6) est disponible en téléchargement à l'adresse suivante :
Microsoft Azure IP Ranges and Service Tags
Téléchargez le fichier JSON et identifiez les service tags pertinents pour votre région (Dynamics365, AzureCloud). Ajoutez les plages d'IP correspondantes à vos règles entrantes NSG.
Associé à