Estamos retirando la API local. Consulta nuestro documento Retirada de la API local para obtener más información y aprender a migrar a nuestra API de nube de nueva generación.
Este documento te indica cómo configurar un grupo de alta disponibilidad en producción. También proporciona orientación sobre cómo activar la conexión múltiple y describe los cambios necesarios para un grupo de conexión múltiple de alta disponibilidad.
Si aún no lo has hecho, te recomendamos configurar la instancia de alta disponibilidad/conexión múltiple del cliente de la API de WhatsApp Business en una máquina de desarrollador siguiendo las instrucciones de Configuración para desarrolladores: alta disponibilidad y conexión múltiple para probar la configuración antes de utilizar este documento para configurar el cliente de la API de WhatsApp Business en producción.
Antes de empezar con cualquiera de estas configuraciones, comprueba nuestros requisitos.
Para configurar un grupo de alta disponibilidad:
biz
para los scripts de configuración.Para configurar un grupo de conexión múltiple de alta disponibilidad:
Una vez que hayas configurado la instancia por completo, puedes elegir actualizarla. Para desinstalar el cliente, sigue estos pasos.
Si ya has ejecutado una configuración de desarrollador y quieres reutilizar el número de teléfono en producción, consulta la guía de migración antes de continuar con el resto de las indicaciones de este documento.
El contenido de este documento se basa en el supuesto de una nueva instalación usando un nuevo número de teléfono.
Necesitarás lo siguiente:
Se requiere MySQL 5.7.xx/8.0.xx o PostgreSQL 13.x/12.x/11.x.
La contraseña de la base de datos no puede contener ninguno de estos caracteres: ?{}&~!()^=.
Si se incumplen estas condiciones, es posible que la configuración no se complete correctamente.
755
está establecido como el modo de archivo en la ruta de montaje y todos los subdirectorios. 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
para los scripts de configuraciónEjecuta el siguiente código en tu ubicación preferida para el cliente de la API de WhatsApp Business:
mkdir ~/biz; cd ~/biz;
Clona los archivos de configuración prod-multiconnect-compose.yml
y db.env
del directorio de instalación del repositorio de GitHub WhatsApp-Business-API-Setup-Scripts en el directorio ~/biz
que creaste en el paso 1.
Cambia las variables de entorno de la base de datos en el archivo db.env
del directorio ~/biz
para reflejar tu configuración de 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
El volumen de contenido multimedia local (whatsappMedia:/usr/local/wamedia
de forma predeterminada) definido en el archivo prod-docker-compose.yml
se utiliza para almacenar archivos multimedia. De forma predeterminada, el volumen se monta en un directorio de la máquina Docker. También puedes montar el volumen de contenido multimedia en un directorio del host. Para cambiar el punto de montaje del volumen de contenido multimedia, modifica la definición del volumen de la sección services
de whatsappMedia
y cámbiala por el directorio del host que estás utilizando.
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
Para iniciar el cliente de la API de WhatsApp Business con un contenedor de aplicación web, dos contenedores maestros y dos contenedores de aplicación principal de forma similar al diagrama de introducción a la alta disponibilidad, utiliza los siguientes comandos con los cambios necesarios para tu entorno (es decir, nombres del host, nombres de usuario del host y rutas locales):
# 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 resumen, los comandos anteriores harán lo siguiente:
prod-multiconnect-compose.yml
y db.env
en todos los hosts de la aplicación web (your-webapp-hostname
en este ejemplo) e iniciar el servicio waweb
en estos hosts;prod-multiconnect-compose.yml
y db.env
en todos los hosts maestros (your-master1-hostname
y your-master2-hostname
en este ejemplo) e iniciar el servicio maestro en estos hosts;prod-multiconnect-compose.yml
y db.env
en todos los hosts de la aplicación principal (your-coreapp1-hostname
y your-coreapp2-hostname
en este ejemplo) e iniciar el servicio wacore
en estos hosts.Puedes comprobar que todos los contenedores tienen estado EN EJECUCIÓN ejecutando:
EXTERNAL_HOSTNAME=$host WA_API_VERSION=2.23.4 docker-compose -f prod-multiconnect-compose.yml ps
Puedes descargar y configurar nuestra Colección de Postman para interactuar con la API de WhatsApp Business si no quieres utilizar la línea de comandos.
Puedes realizar una comprobación de estado en el cliente de la API de WhatsApp Business utilizando una llamada a la API del nodo health
.
La salida resultante debería tener el siguiente aspecto:
{ "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 respuesta muestra un valor unregistered
en el parámetro gateway_status
como parámetro gateway_status
porque el cliente de la API de WhatsApp Business aún no está registrado.
Puedes registrar el cliente de la API de WhatsApp Business mediante una llamada de API al nodo account
.
Realiza otra comprobación de estado en el cliente de la API de WhatsApp Business mediante una llamada de API al nodo health
después de completar el registro y asegúrate de que uno de los contenedores de la aplicación principal tiene un valor de connected
en el parámetro gateway_status
.
La salida resultante debería tener el siguiente aspecto:
{ "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
Nota:En el modo de alta disponibilidad, solo se conectará una aplicación principal (your-coreapp1-hostname:753efb1cf72c
en este ejemplo) al servidor de WhatsApp y los demás nodos, incluido el maestro principal, tendrán el valor disconnected
en el parámetro gateway_status
. Si se cae your-coreapp1-hostname:753efb1cf72c
, your-coreapp2-hostname:75d7355eaaaa
lo sustituirá y se conectará al servidor de WhatsApp para mantener la alta disponibilidad.
Se recomienda configurar la supervisión para el cliente de la API de WhatsApp Business en producción.
Ya has configurado el cliente de la API de WhatsApp Business en modo de alta disponibilidad. En este modo, solo una aplicación principal se puede conectar al servidor de WhatsApp y enviar mensajes en cualquier momento. Si quieres tener varias aplicaciones principales enviando mensajes al mismo tiempo para aumentar el rendimiento de los mensajes, sigue los pasos en la sección Configuración de un grupo de conexión múltiple de alta disponibilidad a continuación.
Usa el extremo de particiones para configurar dos particiones. Deberías ver una respuesta HTTP con el estado 201 Created
.
Puedes realizar una comprobación de estado en el cliente de la API de WhatsApp Business mediante una llamada de API al nodo health
para verificar que todos los nodos se están ejecutando correctamente.
La salida resultante debería tener el siguiente aspecto:
{ "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
Nota: En el modo de conexión múltiple con dos particiones, se conectarán dos aplicaciones principales (your-coreapp1-hostname:753efb1cf72c
y your-coreapp2-hostname:75d7355eaaaa
en este ejemplo) al servidor de WhatsApp, y el maestro principal (your-master2-hostname:8dd3f5bea27d
en este ejemplo) también se conectará al servidor.
Hasta ahora en este ejemplo, tienes dos contenedores de aplicación principal y las cargas de los mensajes se dividen entre los dos. Sin embargo, si se cae uno de los contenedores de aplicación principal, la mitad de los mensajes no se enviará. A fin de mantener la alta disponibilidad en esta nueva configuración de conexión múltiple, puedes iniciar una tercera aplicación principal en un nuevo host de aplicación principal (
your-coreapp3-hostname
en este ejemplo) para que se permita el fallo de una aplicación principal, de forma similar al diagrama que se muestra en la sección Introducción a la conexión múltiple.
Para iniciar el tercer contenedor de la aplicación principal, ejecuta el siguiente comando:
# 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
Realiza otra comprobación de estado para verificar que todos los nodos se están ejecutando correctamente utilizando una llamada de API al nodo health
.
La salida resultante debería tener el siguiente aspecto:
{ "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
El nuevo contenedor de aplicación principal (your-coreapp3-hostname
:23b50199bec2
en este ejemplo) actúa ahora como contenedor en espera, pero no está conectado en este momento al servidor de WhatsApp. Si alguno de los otros dos contenedores de aplicación principal conectados deja de funcionar, el tercer contenedor se conectará al servidor de WhatsApp para mantener un número total de dos particiones.
Para que se puedan admitir 100-150 mensajes/segundo, se recomiendan al menos dos aplicaciones web. Si quieres alcanzar una alta disponibilidad para aplicación web, puedes ejecutar contenedores de aplicación web en más de dos hosts y alojarlos tras un equilibrador de carga como HAProxy, Nginx o ELB. En lugar de acceder a los extremos del cliente de la API de WhatsApp Business a través de https://your-webapp-hostname:your-webapp-port/
, debes usar https://your-load-balancer-name:your-load-balancer-port/
.
Se recomienda tener tres maestros ejecutándose en distintos hosts. No hay ninguna razón para tener más de tres maestros en producción independientemente de cuántas particiones tengas. Las cargas en los maestros son ligeras y las puedes ubicar junto con contenedores de aplicación principal.
Se recomienda tener un número de aplicaciones principales igual a shard_number + X
ejecutándose en distintos hosts para que se admita un número X
de fallos del host.
Se producirá un tiempo de inactividad durante el proceso de actualización.
Te recomendamos encarecidamente que hagas una copia de seguridad de la configuración actual de la aplicación antes de actualizarla para que puedas volver a ponerte en marcha rápidamente. Sigue la documentación sobre las copias de seguridad y la restauración.
Siempre es recomendable llevar a cabo las actualizaciones durante las horas con menos actividad.
La variable de entorno WA_API_VERSION
debe actualizarse al nuevo número de versión. Ejecuta los siguientes comandos con los cambios necesarios para tu entorno (es decir, nombres del host, nombres de usuario del host y rutas locales):
# 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
y posterioresAhora se puede hacer uso del servicio de actualización de la base de datos, que permite actualizar la base de datos mientras la aplicación se ejecuta para evitar tiempos de inactividad.
El archivo dbupgrade-compose.yml contiene campos que indican la versión del contenedor.
Ejemplo:
services: dbupgrade: image: docker.whatsapp.biz/coreapp:v${WA_API_VERSION:-2.21.3}
Para actualizar una instalación, inicia el contenedor de servicio “dbupgrade” con la variable de entorno WA_API_VERSION
establecida en la versión más reciente:
EXTERNAL_HOSTNAME=$host_to_upgradedb WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d
Nota: Si vas a utilizar una orquestación que reinicia el contenedor al salir independientemente del código de salida, inicia el servicio con la variable de entorno EXIT_ON_SUCCESS
establecida en FALSE
para evitar salir del contenedor cuando el código de salida sea 0
.
Si la actualización de la base de datos se realiza correctamente, el contenedor saldrá con el código 0
. Puedes utilizar el siguiente comando Docker para hacer un seguimiento del estado:
docker wait your-database-upgrade-container-name
Esta operación mostrará el código de salida del contenedor de servicio “dbupgrade”.
Reinicia los contenedores de la aplicación principal y la aplicación web con la variable de entorno WA_API_VERSION
establecida en la versión más reciente:
EXTERNAL_HOSTNAME=$host_to_upgradedb WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d
2.29.3
y posterioresSi estás actualizando desde las versiones v2.29.1
o v2.29.2
, o has experimentado problemas durante la actualización a esas versiones y has tenido que retroceder para ganar estabilidad, te recomendamos que actualices a la versión v2.29.3
y ejecutes el siguiente comando en el contenedor de Docker de la aplicación web:
chown -R root your-media-directory/incoming your-media-directory/outgoing your-media-directory/shared
A menos que lo hayas cambiado, el directorio de contenido multimedia predeterminado es /usr/local/wamedia
.
Nota:
v2.29.1
y v2.29.2
.Si necesitas restablecer tu entorno de desarrollo eliminando todos los contenedores, utiliza los siguientes comandos con los cambios necesarios para tu entorno (es decir, nombres del host, nombres de usuario del host y rutas locales):
# 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
Para obtener los registros de todos los contenedores de un host, ejecuta el comando siguiente:
EXTERNAL_HOSTNAME=$host_to_collect_logs docker-compose -f /local/path/prod-multiconnect-compose.yml logs > debug_output.txt
Para obtener los registros de un servicio determinado, añade el nombre del servicio (p. ej., waweb
, master1
, wacore1
) al comando docker-compose logs
.
EXTERNAL_HOSTNAME=$host_to_collect_logs docker-compose -f /local/path/prod-multiconnect-compose.yml logs waweb > debug_output.txt
Encontrarás los registros en el archivo debug_output.txt
del directorio actual.
Este software utiliza código de FFmpeg con licencia de LGPLv2.1 y el código fuente puede descargarse aquí.