L’API On-Premises ne sera bientôt plus disponible. Consultez notre document Abandon progressif de l’API On-Premises pour de plus amples détails, mais aussi pour connaître la procédure de migration vers notre API Cloud nouvelle génération.
Ce document explique comment configurer un cluster à haute disponibilité en production. Il vous aidera également à activer Multiconnect et indiquera les modifications requises pour un cluster Multiconnect hautement disponible.
Si vous ne l’avez pas encore fait, nous vous recommandons de configurer une instance du client de l’API WhatsApp Business sur une machine de développement en suivant les instructions de la page Configuration de développement : haute disponibilité et Multiconnect pour tester votre configuration avant de suivre la méthode présentée dans ce document pour configurer ce client en production.
Avant de commencer ces configurations, vérifiez nos conditions requises.
Pour configurer un cluster à haute disponibilité :
biz
pour les scripts de configurationPour configurer un cluster Multiconnect à haute disponibilité :
Une fois que votre instance est entièrement configurée, vous pouvez choisir de mettre à jour le client. Pour désinstaller le client, suivez ces étapes.
Si vous avez déjà exécuté une configuration de développement et que vous souhaitez utiliser le même numéro de téléphone en production, reportez-vous au guide de migration avant de passer à la suite de ce document.
En effet, ce dernier s’applique aux nouvelles installations utilisant un nouveau numéro de téléphone.
Vous aurez besoin des éléments suivants :
MySQL 5.7.xx/8.0.xx ou PostgreSQL 13.x/12.x/11.x est obligatoire.
Le mot de passe de votre base de données ne doit contenir aucun des caractères suivants : ?{}&~!()^=
Dans le cas contraire, la configuration risque d’échouer.
755
pour le chemin de montage et tous ses sous-répertoires. mkdir your-local-media-volume-path mount -t nfs nfs_server_IP_addr:/shared_directory /your-local-media-volume-path
To install Docker Desktop on your developer machine:
The remaining steps are based on macOS and should be very similar for Linux or Windows 10.
To install Docker using macOS:
Docker Compose is a plugin that is bundled with Docker Desktop and should have installed automatically. For more information about using or Docker Compose, see Overview of Docker Compose. If for some reason Docker Compose was not installed, you can install it by following the instructions located at Install Docker Compose.
biz
pour les scripts de configurationExécutez le code suivant à l’emplacement de votre choix pour le client de l’API WhatsApp Business :
mkdir ~/biz; cd ~/biz;
Clonez les fichiers de configuration prod-multiconnect-compose.yml
et db.env
situés dans le répertoire Installation du dépôt GitHub WhatsApp-Business-API-Setup-Scripts dans le répertoire ~/biz
que vous avez créé à l’étape 1.
Modifiez les variables d’environnement de la base de données dans le fichier db.env
du répertoire ~/biz
de sorte qu’elles correspondent à votre configuration MySQL/PostgreSQL.
WA_DB_ENGINE=MYSQL | PGSQL WA_DB_HOSTNAME=your-database-server WA_DB_PORT=your-database-server-port WA_DB_USERNAME=your-database-username WA_DB_PASSWORD=your-database-password
Le volume de contenu multimédia local (whatsappMedia:/usr/local/wamedia
, par défaut) défini dans le fichier prod-docker-compose.yml
sert à stocker les fichiers multimédias. Par défaut, le volume est monté dans un répertoire sur la machine Docker. Vous pouvez toutefois choisir de le monter dans un répertoire hôte. Pour modifier le point de montage du volume de contenu multimédia, indiquez le chemin d’accès au répertoire hôte que vous utilisez dans la définition du volume, à la section services
de whatsappMedia
.
services: waweb: ... volumes: - /your-local-media-volume-path:/usr/local/wamedia ... wacore: ... volumes: - /your-local-media-volume-path:/usr/local/wamedia ... master: ... volumes: - /your-local-media-volume-path:/usr/local/wamedia
Pour démarrer le client de l’API WhatsApp Business avec un conteneur Webapp, deux conteneurs Maîtres et deux conteneurs Coreapp comme illustré sur le diagramme Introduction à la haute disponibilité, utilisez les commandes suivantes en y apportant les modifications nécessaires pour votre environnement (c’est-à-dire noms d’hôtes, noms d’utilisateur·ices hôtes et chemins d’accès locaux) :
# copy configuration scripts to each Webapp host, ssh to each Webapp host, execute scripts to install Webapp on the host for host in your-webapp-hostname; do scp db.env prod-multiconnect-compose.yml username@$host:/local/path/ cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd waweb done # copy configuration scripts to each Master host, ssh to each Master host, execute scripts to install Master on the host for host in your-master1-hostname your-master2-hostname; do scp db.env prod-multiconnect-compose.yml username@$host:/local/path/ cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd master done # copy configuration scripts to each Coreapp host, ssh to each Coreapp host, execute scripts to install Coreapp on the host for host in your-coreapp1-hostname your-coreapp2-hostname; do scp db.env prod-multiconnect-compose.yml username@$host:/local/path/ cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd wacore done
En résumé, les commandes ci-dessus effectuent les opérations suivantes :
prod-multiconnect-compose.yml
et db.env
sur tous les hôtes Webapp (your-webapp-hostname
dans cet exemple) et lancer le service waweb
sur ces hôtesprod-multiconnect-compose.yml
et db.env
sur tous les hôtes Maîtres (your-master1-hostname
et your-master2-hostname
dans cet exemple) et démarrer le service Maître sur ces hôtesprod-multiconnect-compose.yml
et db.env
sur tous les hôtes Coreapp (your-coreapp1-hostname
et your-coreapp2-hostname
dans cet exemple) et démarrer le service wacore
sur ces hôtesPour vérifier que l’état de tous les conteneurs est RUNNING, exécutez :
EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f prod-multiconnect-compose.yml ps
Vous pouvez télécharger et configurer notre collection Postman pour interagir avec l’API WhatsApp Business si vous ne souhaitez pas utiliser la ligne de commande.
Vous pouvez contrôler l’état du client de l’API WhatsApp Business en envoyant un appel d’API au nœud health
.
Le résultat de cette commande doit se présenter comme suit :
{ "health": { "your-master1-hostname:85cdd51506fd": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] }, "your-master2-hostname:8dd3f5bea27d": { "gateway_status": "unregistered", "role": "primary_master" }, "your-coreapp1-hostname:753efb1cf72c": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] }, "your-coreapp2-hostname:75d7355eaaaa": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] } } } 200
La réponse affiche un gateway_status
unregistered
comme gateway_status
, car le client de l’API WhatsApp Business n’est pas encore inscrit.
Vous pouvez inscrire votre client de l’API WhatsApp Business en envoyant un appel d’API au nœud account
.
Effectuez un autre contrôle de l’état du client de l’API WhatsApp Business en utilisant un appel d’API sur le nœud health
après avoir finalisé l’inscription et assurez-vous que l’un des conteneurs Coreapp a un gateway_status
connected
.
Le résultat de cette commande doit se présenter comme suit :
{ "health": { "your-master1-hostname:85cdd51506fd": { "gateway_status": "disconnected", "role": "secondary_master" }, "your-master2-hostname:8dd3f5bea27d": { "gateway_status": "disconnected", "role": "primary_master" }, "your-coreapp1-hostname:753efb1cf72c": { "gateway_status": "connected", "role": "coreapp" }, "your-coreapp2-hostname:75d7355eaaaa": { "gateway_status": "disconnected", "role": "coreapp" } } } 200
Remarque : en mode haute disponibilité, un seul Coreapp (your-coreapp1-hostname:753efb1cf72c
dans cet exemple) sera connecté au serveur WhatsApp, tous les autres nœuds, y compris le Maître principal, auront un gateway_status
disconnected
. Si your-coreapp1-hostname:753efb1cf72c
connaît une défaillance, your-coreapp2-hostname:75d7355eaaaa
le remplacera et se connectera au serveur WhatsApp afin de maintenir la haute disponibilité.
Nous vous recommandons de configurer une surveillance de votre client de l’API WhatsApp Business en production.
Vous avez désormais configuré le client de l’API WhatsApp Business en mode haute disponibilité. Dans ce mode, seul un Coreapp peut se connecter au serveur WhatsApp pour envoyer des messages à tout moment. Si vous souhaitez que plusieurs Coreapp envoient des messages simultanément pour augmenter le débit des messages, suivez les étapes de la section Configurer un cluster Multiconnect hautement disponible ci-dessous.
Utilisez le point de terminaison « shards » pour configurer deux partitions. La réponse HTTP devrait renvoyer l’état 201 Created
.
Vous pouvez contrôler l’état du client de l’API WhatsApp Business en envoyant un appel d’API au nœud health
afin de vérifier que tous les nœuds s’exécutent correctement.
Le résultat de cette commande doit se présenter comme suit :
{ "health": { "your-master1-hostname:85cdd51506fd": { "gateway_status": "disconnected", "role": "secondary_master" }, "your-master2-hostname:8dd3f5bea27d": { "gateway_status": "connected", "role": "primary_master" }, "your-coreapp1-hostname:753efb1cf72c": { "gateway_status": "connected", "role": "coreapp" }, "your-coreapp2-hostname:75d7355eaaaa": { "gateway_status": "connected", "role": "coreapp" } } } 200
Remarque : en mode Multiconnect avec deux partitions, deux Coreapps (your-coreapp1-hostname:753efb1cf72c
et your-coreapp2-hostname:75d7355eaaaa
dans cet exemple) seront connectés au serveur WhatsApp, et le Maître principal (your-master2-hostname:8dd3f5bea27d
dans cet exemple) se connectera également au serveur WhatsApp.
Dans cet exemple, nous avons pour l’instant deux conteneurs Coreapp et les charges des messages sont réparties entre eux. Cependant, si l’un des conteneurs Coreapp tombe en panne, la moitié des messages ne sera pas envoyée. Afin de maintenir la haute disponibilité dans cette nouvelle configuration Multiconnect, vous pouvez démarrer un troisième Coreapp sur un nouvel hôte Coreapp (
your-coreapp3-hostname
dans cet exemple) afin de tolérer la défaillance d’un Coreapp, de manière similaire au diagramme figurant dans l’introduction à Multiconnect.
Pour démarrer le troisième conteneur Coreapp, exécutez la commande suivante :
# copy configuration scripts to the 3rd Coreapp host, ssh to the Coreapp host, execute scripts to install Coreapp on the host for host in your-coreapp3-hostname; do scp db.env prod-multiconnect-compose.yml username@$host:/local/path/ cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd wacore done
Effectuez un autre contrôle de l’état pour vérifier que tous les nœuds fonctionnent correctement en utilisant un appel d’API sur le nœud health
.
Le résultat de cette commande doit se présenter comme suit :
{ "health": { "your-master1-hostname:85cdd51506fd": { "gateway_status": "disconnected", "role": "secondary_master" }, "your-master2-hostname:8dd3f5bea27d": { "gateway_status": "disconnected", "role": "primary_master" }, "your-coreapp1-hostname:753efb1cf72c": { "gateway_status": "connected", "role": "coreapp" }, "your-coreapp2-hostname:75d7355eaaaa": { "gateway_status": "connected", "role": "coreapp" }, "your-coreapp3-hostname:23b50199bec2": { "gateway_status": "disconnected", "role": "coreapp" } } } 200
Le nouveau conteneur Coreapp (your-coreapp3-hostname
:23b50199bec2
dans cet exemple) agit maintenant comme conteneur de secours, mais il n’est actuellement pas connecté au serveur WhatsApp. Si l’un des deux autres conteneurs Coreapp connectés cesse de fonctionner, le troisième se connectera au serveur WhatsApp afin de maintenir un nombre total de deux partitions.
Nous vous recommandons l’utilisation d’au moins deux Webapps pour une charge de 100 à 150 messages/sec. Si vous voulez profiter de la haute disponibilité pour Webapp, vous pouvez exécuter les conteneurs Webapp sur plus de deux hôtes et les héberger derrière un répartiteur de charge tel que HAProxy, Nginx ou ELB. Au lieu d'accéder aux points de terminaison de client de l'API WhatsApp Business via https://your-webapp-hostname:your-webapp-port/
, vous devriez utiliser https://your-load-balancer-name:your-load-balancer-port/
.
Nous vous recommandons de disposer de trois Maîtres s’exécutant sur des hôtes différents. Il est inutile de disposer de plus de trois Maîtres en production, peu importe le nombre de partitions. La charge sur les Maîtres est légère et vous pouvez les colocaliser avec des conteneurs Coreapp.
Nous vous recommandons de disposer de shard_number + X
Coreapps s’exécutant sur des hôtes différents afin de pouvoir tolérer X
défaillances d’hôtes.
Il y aura un temps d’arrêt pendant la mise à jour.
Il est fortement recommandé de sauvegarder vos paramètres d’application avant de lancer une mise à jour afin de vous assurer de pouvoir reprendre votre activité rapidement. Veuillez consulter la documentation sur la sauvegarde et la restauration.
Il est toujours recommandé d’effectuer les mises à jour pendant les heures creuses.
La variable d’environnement WA_API_VERSION
doit toujours être mise à jour de manière à indiquer le numéro de la nouvelle version avec la commande : Exécutez les commandes suivantes en y apportant les changements nécessaires pour votre environnement (c’est-à-dire noms d'hôtes, noms d'utilisateur·ices hôtes et chemins d’accès locaux) :
# ssh to each Webapp host, execute scripts with new WA_API_VERSION to upgrade Webapp on the host for host in your-webapp-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.x docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd waweb done # ssh to each Master host, execute scripts with new WA_API_VERSION to upgrade Master on the host for host in your-master1-hostname your-master2-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.x docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd master done # ssh to each Coreapp host, execute scripts with new WA_API_VERSION to upgrade Coreapp on the host for host in your-coreapp1-hostname your-coreapp2-hostname your-coreapp3-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.x docker-compose -f /local/path/prod-multiconnect-compose.yml up -d" ssh username@$host $cmd wacore done
2.23.x
et supérieureVous pouvez maintenant utiliser un service de mise à jour qui vous permettra de mettre à jour votre base de données pendant l’exécution de votre application, pour éviter les temps d’arrêt.
Le fichier dbupgrade-compose.yml contient des champs indiquant la version du conteneur.
Exemple :
services: dbupgrade: image: docker.whatsapp.biz/coreapp:v${WA_API_VERSION:-2.21.3}
Pour mettre à jour une installation, démarrez le conteneur dbupgrade-service avec la variable d’environnement WA_API_VERSION
définie sur la dernière version :
EXTERNAL_HOSTNAME=$host_to_upgradedb WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d
Remarque : si vous utilisez une orchestration qui redémarre le conteneur à la sortie indépendamment du code de sortie, démarrez le service avec la variable d’environnement EXIT_ON_SUCCESS
définie sur FALSE
pour éviter de quitter le conteneur lorsque le code de sortie est 0
.
Si la mise à jour de la base de données est réussie, le code de sortie du conteneur sera 0
. Vous pouvez utiliser la commande Docker suivante pour suivre l’état :
docker wait your-database-upgrade-container-name
Le code de sortie du conteneur dbupgrade-service sera alors indiqué dans la sortie.
Redémarrez les conteneurs Docker Coreapp et Webapp avec la variable d’environnement WA_API_VERSION
définie sur la dernière version :
EXTERNAL_HOSTNAME=$host_to_upgradedb WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d
2.29.3
ou une version ultérieureSi vous effectuez une mise à jour de v2.29.1
à v2.29.2
ou rencontrez des problèmes durant la mise à jour de ces versions et que vous devez revenir à l’ancienne version pour des raisons de stabilité, nous vous recommandons d’effectuer la mise à jour vers v2.29.3
, puis d’exécuter la commande suivant sur le conteneur Webapp Docker :
chown -R root your-media-directory/incoming your-media-directory/outgoing your-media-directory/shared
Si vous ne l’avez pas modifié, le répertoire de contenu multimédia par défaut est /usr/local/wamedia
.
Remarque :
v2.29.1
et v2.29.2
.Si vous devez réinitialiser votre environnement de développement en supprimant tous les conteneurs, utilisez les commandes suivantes en y apportant les changements nécessaires pour votre environnement (c’est-à-dire noms d'hôtes, noms d'utilisateur·ices hôtes et chemins d’accès locaux) :
# ssh to each Webapp host, execute scripts to uninstall Webapp on the host for host in your-webapp-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-docker-compose.yml down" ssh username@$host $cmd waweb done # ssh to each Master host, execute scripts to uninstall Master on the host for host in your-master1-hostname your-master2-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-docker-compose.yml down" ssh username@$host $cmd master done # ssh to each Coreapp host, execute scripts to uninstall Coreapp on the host for host in your-coreapp1-hostname your-coreapp2-hostname your-coreapp3-hostname; do cmd="EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f /local/path/prod-docker-compose.yml down" ssh username@$host $cmd wacore done
Exécutez la commande suivante pour collecter les journaux de tous les conteneurs d’un hôte :
EXTERNAL_HOSTNAME=$host_to_collect_logs docker-compose -f /local/path/prod-multiconnect-compose.yml logs > debug_output.txt
Pour recueillir les journaux d’un service spécifique, ajoutez le nom du service (par exemple waweb
, master1
, wacore1
) à la commande docker-compose logs
:
EXTERNAL_HOSTNAME=$host_to_collect_logs docker-compose -f /local/path/prod-multiconnect-compose.yml logs waweb > debug_output.txt
Vous trouverez les journaux dans le fichier debug_output.txt
enregistré dans le répertoire actuel.
Ce logiciel utilise le code de FFmpeg sous licence du LGPLv2.1 et sa source peut être téléchargée ici.