En este documento se muestra cómo configurar un clúster de alta disponibilidad en la máquina de un desarrollador. También se proporcionan instrucciones sobre cómo habilitar en él una conexión múltiple, junto con los cambios necesarios para configurar un clúster de conexión múltiple de alta disponibilidad.
Para configurar un entorno de producción, sigue las instrucciones relevantes indicadas en la sección Configuraciones de producción.
Si anteriormente seguiste las instrucciones indicadas en Configuración del desarrollador: instancia única para configurar el cliente de la API de WhatsApp Business en la máquina de un desarrollador, sigue la guía de migración antes de continuar con el resto de este documento.
Para el contenido de esta guía, se supone que realizarás una instalación nueva.
Necesitarás lo siguiente:
También es muy recomendable que leas la guía de disponibilidad y escalado para obtener más información acerca de la alta disponibilidad y la conexión múltiple.
biz
para los scripts de configuraciónEjecuta el código siguiente en tu ubicación preferida para el cliente de la API de WhatsApp Business:
mkdir ~/biz; cd ~/biz;
Los archivos de configuración del cliente de la API de WhatsApp Business se encuentran en el repositorio de Github WhatsApp-Business-API-Setup-Scripts. Puedes configurar el cliente de la API de WhatsApp Business con una instancia de base de datos MySQL o Postgres.
multiconnect-compose.yml
y db.env
del directorio Installation al directorio ~/biz
que has creado en el Paso 1.multiconnect-compose.yml
y db.env
del directorio Postgres Installation al directorio ~/biz
que has creado en el Paso 1.WA_API_VERSION
La variable de entorno WA_API_VERSION
debe establecerse en la versión actual con el comando siguiente:
export WA_API_VERSION=current-whatsapp-version
Ejecuta el siguiente comando para iniciar un contenedor de alta disponibilidad con un contenedor de base datos, un contenedor de aplicación web, dos contenedores de objeto maestro y dos contenedores de aplicación principal en segundo plano, tal y como se muestra de forma similar al diagrama de la sección Introducción a la alta disponibilidad:
docker-compose -f multiconnect-compose.yml up -d db waweb master1 master2 wacore1 wacore2
La respuesta resultante debería tener el aspecto siguiente:
Creating network "biz_default" with the default driver Creating volume "biz_mysqlData" with local driver Creating volume "biz_whatsappMedia" with local driver Creating biz_db_1 ... done Creating biz_waweb_1 ... done Creating biz_master1_1 ... done Creating biz_master2_1 ... done Creating biz_wacore2_1 ... done Creating biz_wacore1_1 ... done
Para comprobar que todos los contenedores tienen el estado ACTIVADO, ejecuta el comando siguiente:
docker-compose -f multiconnect-compose.yml ps
La respuesta resultante debería tener el aspecto siguiente:
Name Command State Ports -------------------------------------------------------------------------------------------------------------------------------------------------------------- biz_db_1 docker-entrypoint.sh mysqld Up 0.0.0.0:33060->3306/tcp, 33060/tcp biz_master1_1 /opt/whatsapp/bin/wait_on_ ... Up 0.0.0.0:32931->6250/tcp, 0.0.0.0:32930->6251/tcp, 0.0.0.0:32928->6252/tcp, 0.0.0.0:32926->6253/tcp biz_master2_1 /opt/whatsapp/bin/wait_on_ ... Up 0.0.0.0:32929->6250/tcp, 0.0.0.0:32927->6251/tcp, 0.0.0.0:32925->6252/tcp, 0.0.0.0:32924->6253/tcp biz_wacore1_1 /opt/whatsapp/bin/wait_on_ ... Up 0.0.0.0:32937->6250/tcp, 0.0.0.0:32935->6251/tcp, 0.0.0.0:32933->6252/tcp, 0.0.0.0:32932->6253/tcp biz_wacore2_1 /opt/whatsapp/bin/wait_on_ ... Up 0.0.0.0:32939->6250/tcp, 0.0.0.0:32938->6251/tcp, 0.0.0.0:32936->6252/tcp, 0.0.0.0:32934->6253/tcp biz_waweb_1 /opt/whatsapp/bin/wait_on_ ... Up 0.0.0.0:9090->443/tcp
De forma predeterminada, el contenedor de la aplicación web se ejecutará en el puerto 9090
, mientras que el de la base de datos se ejecutará en el puerto 33060
.
Puedes descargar y configurar nuestra colección de Postman para interactuar con la API de WhatsApp Business si no quieres usar la línea de comandos.
Para realizar una comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health
.
La respuesta resultante debería tener el aspecto siguiente:
{ "health": { "master1:b28d835cd579": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] }, "master2:7fe542d305b4": { "gateway_status": "unregistered", "role": "primary_master" }, "wacore1:35a5fabfc79d": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] }, "wacore2:05e1a6d70665": { "errors": [ { "code": 1011, "title": "Service not ready", "details": "Wacore is not instantiated. Please check wacore log for details." } ] } } }
La respuesta muestra gateway_status
como unregistered
para gateway_status
del contenedor del objeto maestro principal porque todavía no se ha registrado el cliente de la API de WhatsApp Business.
Para registrar el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo account
.
Para realizar otra comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health
después de completar el registro y asegúrate de que uno de los contenedores de aplicación principal gateway_status
sea connected
.
La respuesta resultante debería tener el aspecto siguiente:
{ "health": { "master1:b28d835cd579": { "gateway_status": "disconnected", "role": "secondary_master" }, "master2:7fe542d305b4": { "gateway_status": "disconnected", "role": "primary_master" }, "wacore1:35a5fabfc79d": { "gateway_status": "connected", "role": "coreapp" }, "wacore2:05e1a6d70665": { "gateway_status": "disconnected", "role": "coreapp" } } }
Nota: En el modo de alta disponibilidad, solo una aplicación principal (en este ejemplo, wacore1
) estará conectada al servidor de WhatsApp. Todos los demás nodos, incluido el objeto maestro principal, tendrán el valor de gateway_status
definido en disconnected
. Si wacore1
sufre una interrupción, wacore2
lo reemplazará y se conectará al servidor de WhatsApp para mantener la alta disponibilidad.
Ya configuraste el cliente de la API de WhatsApp Business en el modo de alta disponibilidad. En este modo, solo puede conectarse una aplicación principal con el servidor de WhatsApp para enviar mensajes en un momento dado. Si quieres que varias aplicaciones principales envíen mensajes al mismo tiempo para aumentar el volumen de mensajes, sigue los pasos de la sección Configuración de un clúster de conexión múltiple de alta disponibilidad que hay a continuación.
Utiliza el extremo para particiones a fin de configurar dos particiones. Deberías ver una respuesta HTTP con el estado 201 Created
.
Para realizar una comprobación de estado en el cliente de la API de WhatsApp Business, haz una llamada a la API al nodo health
.
La respuesta resultante debería tener el aspecto siguiente:
{ "health": { "master1:b28d835cd579": { "gateway_status": "disconnected", "role": "secondary_master" }, "master2:7fe542d305b4": { "gateway_status": "connected", "role": "primary_master" }, "wacore1:35a5fabfc79d": { "gateway_status": "connected", "role": "coreapp" }, "wacore2:05e1a6d70665": { "gateway_status": "connected", "role": "coreapp" } } }
Nota: En el modo de conexión múltiple con dos particiones, se conectarán al servidor de WhatsApp dos aplicaciones principales (en este ejemplo, wacore1
y wacore2
), así como el objeto maestro principal (en este ejemplo, master2
).
Hasta ahora, en este ejemplo, existen dos contenedores de aplicación principal y cargas de mensajes que se dividen entre ellos. Sin embargo, si uno de los contenedores de la aplicación principal sufre una interrupción, se producirá un error en la mitad de los envíos de mensajes. A fin de mantener la alta disponibilidad en esta nueva configuración de conexión múltiple, puedes iniciar una tercera aplicación principal para tolerar un error de la aplicación principal, tal y como se muestra de forma similar en el diagrama de la sección Introducción a la conexión múltiple.
Para iniciar el contenedor de la tercera aplicación principal, ejecuta el siguiente comando:
docker-compose -f multiconnect-compose.yml up -d wacore3
La respuesta resultante debería tener el aspecto siguiente:
biz_db_1 is up-to-date biz_waweb_1 is up-to-date biz_master1_1 is up-to-date Creating biz_wacore3_1 ... done
Realiza otra comprobación de estado para verificar que todos los nodos se ejecutan correctamente mediante una llamada a la API al nodo health
.
La respuesta resultante debería tener el aspecto siguiente:
{ "health": { "master1:b28d835cd579": { "gateway_status": "disconnected", "role": "secondary_master" }, "master2:7fe542d305b4": { "gateway_status": "connected", "role": "primary_master" }, "wacore1:35a5fabfc79d": { "gateway_status": "connected", "role": "coreapp" }, "wacore2:05e1a6d70665": { "gateway_status": "connected", "role": "coreapp" }, "wacore3:23b50199bec2": { "gateway_status": "disconnected", "role": "coreapp" } } }
El nuevo contenedor de la aplicación principal (en este ejemplo, wacore3
) ahora actúa como contenedor en pausa, pero actualmente no está conectado al servidor de WhatsApp. Si wacore1
o wacore2
dejan de funcionar, wacore3
se conectará al servidor de WhatsApp para que el recuento global de particiones siga siendo 2.
Se producirá un tiempo de inactividad durante el proceso de actualización.
Te recomendamos encarecidamente que realices una copia de seguridad de la configuración actual de la aplicación antes de actualizarla para asegurarte de que puedas volver a trabajar rápidamente. Sigue la documentación Copia de seguridad y restauración.
Se recomienda siempre llevar a cabo las actualizaciones durante las horas de menor actividad.
WA_API_VERSION
a la nueva versiónLa variable de entorno WA_API_VERSION
debe actualizarse al número de la nueva versión mediante el comando siguiente:
export WA_API_VERSION=new-whatsapp-version
Reinicia los contenedores de Docker ejecutando el comando siguiente:
docker-compose -f multiconnect-compose.yml up -d
v2.23.x
y posterioresAhora puedes utilizar un servicio de actualización de bases de datos que te permitirá actualizar la base de datos mientras la aplicación continúa ejecutándose. De este modo, evitarás el tiempo de inactividad.
El archivo dbupgrade-compose.yml contiene campos en los que se indica 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 dbupgrade-service con la variable de entorno WA_API_VERSION
establecida en la versión más reciente:
WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d
Nota: Si vas a utilizar una orquestación que reinicie el contenedor al cerrarlo (independientemente del código de salida), inicia el servicio con la variable de entorno EXIT_ON_SUCCESS
establecida en FALSE
para evitar que el contenedor se cierre cuando el código de salida sea 0
.
Si la actualización de la base de datos se realiza correctamente, el contenedor se cerrará con el código 0
. Puedes utilizar el siguiente comando de Docker para hacer un seguimiento del estado:
docker wait your-database-upgrade-container-name
Este comando devolverá el código de salida del contenedor dbupgrade-service.
Reinicia los contenedores de Docker 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:
WA_API_VERSION=new-whatsapp-version docker-compose -f multiconnect-compose.yml up -d
Es muy recomendable realizar una copia de seguridad de la configuración actual de la aplicación antes de desinstalarla. Sigue la documentación Copia de seguridad y restauración.
Si necesitas restablecer tu entorno de desarrollo mediante la eliminación de todos los contenedores, ejecuta el siguiente comando desde el directorio que contiene el archivo multiconnect-compose.yml
:
docker-compose -f multiconnect-compose.yml down
Si quieres deshacerte de todos los volúmenes definidos en el archivo multiconnect-compose.yml
además de los contenedores, ejecuta down
con el parámetro -v
:
docker-compose -f multiconnect-compose.yml down -v
Para recopilar registros de todos los contenedores, ejecuta el comando siguiente:
docker-compose -f multiconnect-compose.yml logs > debug_output.txt
Para recopilar los registros de un servicio específico, añade el nombre del servicio (por ejemplo, waweb
, master1
o wacore1
) al comando docker-compose logs
:
docker-compose -f multiconnect-compose.yml logs waweb > debug_output.txt
Puedes encontrar 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 se puede descargar aquí.