إعداد المطوّر: التوفّر العالي والاتصال المتعدد

يوضح هذا المستند كيفية إعداد مجموعة التوفّر العالي على جهاز المطوّر. كما يوفر إرشادات حول كيفية تمكين الاتصال المتعدد أولاً، وكذلك التغييرات المطلوبة لمجموعة الاتصال المتعدد ذات التوفّر العالي.

وبالنسبة لإعداد الإنتاج، اتبع التعليمات ذات الصلة الواردة في عمليات إعداد الإنتاج.

قبل البدء

إذا اتبعت تعليمات إعداد المطوّر: المثيل المنفرد لإعداد عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال على جهاز المطوّر مسبقًا، فيرجى اتباع دليل الترحيل قبل متابعة الاطلاع على بقية المحتوى الوارد في هذا المستند.

يعتمد المحتوى الوارد في هذا الدليل على افتراض التثبيت الحديث.

ستحتاج إلى ما يلي:

  • Docker Compose
    • يجب أن يتم إرفاقه مع عملية تثبيت Docker، ولكن إذا لم يكن الأمر كذلك، يمكنك تثبيته.
  • حساب اختباري تم إعداده محليًا في بيئة تطوير
    • هذا الحساب مخصص لإجراء عملية التطوير السريع واختبار الإصدارات الجديدة.

للتعرف على المزيد حول التوفّر العالي والاتصال المتعدد، يوصى بشدة أيضًا بالاطلاع على دليل التوفّر وتوسيع النطاق.

إعداد مجموعة التوفّر العالي

الخطوة الأولى: إنشاء دليل biz للبرامج النصية للإعداد

قم بتشغيل الرمز البرمجي التالي في موقعك المفضل لعميل واجهة API الخاصة بتطبيق WhatsApp للأعمال:

mkdir ~/biz; cd ~/biz;

الخطوة الثانية: الحصول على ملفات تكوين عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال

توجد ملفات تكوين عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال في مستودع GitHub لـ WhatsApp-Business-API-Setup-Scripts. ويمكنك إعداد عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال باستخدام مثيل قاعدة بيانات MySQL أو Postgres.

الخطوة الثالثة: تعيين متغير البيئة WA_API_VERSION

يجب تعيين المتغير البيئي WA_API_VERSION إلى الإصدار الحالي باستخدام:

export WA_API_VERSION=current-whatsapp-version

الخطوة الرابعة: بدء تشغيل عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال من خلال التوفّر العالي

لبدء تشغيل مجموعة التوفّر العالي بحاوية قاعدة بيانات واحدة وحاوية Webapp واحدة وحاويتي Master وحاويتي Coreapp في الخلفية تكون متماثلة للمخطط الموضح في مقدمة حول التوفّر العالي، قم بتشغيل الأمر التالي:

docker-compose -f multiconnect-compose.yml up -d db waweb master1 master2 wacore1 wacore2

يجب أن يبدو الإخراج الناتج كما يلي:

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

الخطوة الخامسة: التحقق من تشغيل الحاويات

يمكنك التحقق من أن جميع الحاويات متوفرة بالحالة UP من خلال تشغيل:

docker-compose -f multiconnect-compose.yml ps

يجب أن يبدو الإخراج الناتج كما يلي:

      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

سيتم افتراضيًا تشغيل حاوية Webapp في المنفذ 9090 وسيتم تشغيل حاوية قاعدة البيانات في المنفذ 33060.

الخطوة السادسة: إجراء التحقق من سلامة الأداء

يمكنك تنزيل مجموعة Postman التي نوفرها وتكوينها للتفاعل مع واجهة API الخاصة بتطبيق WhatsApp للأعمال إذا كنت لا تريد استخدام سطر الأوامر.

يمكنك إجراء التحقق من سلامة الأداء بعميل واجهة API الخاصة بتطبيق WhatsApp للأعمال باستخدام استدعاء واجهة API إلى العقدة health.

يجب أن يبدو الإخراج الناتج كما يلي:

{
    "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."
              }
          ]
      }
  }
}

تعرض الاستجابة حالة gateway_status لـ unregistered باعتبارها gateway_status بالنسبة لحاوية Master الرئيسية نظرًا لأنه لم يتم تسجيل عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال بعد.

الخطوة السابعة: تسجيل عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال

يمكنك تسجيل عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال باستخدام استدعاء واجهة API إلى العقدة account.

الخطوة الثامنة: إجراء التحقق من سلامة الأداء للمرة الثانية

قم بإجراء التحقق من سلامة الأداء مرة أخرى بعميل واجهة API الخاصة بتطبيق WhatsApp للأعمال باستخدام استدعاء واجهة API إلى العقدة health بعد إكمال التسجيل، والتأكد من أن إحدى حاويات Coreapp تتوفر بالحالة gateway_status لـ connected.

يجب أن يبدو الإخراج الناتج كما يلي:

{
    "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"
        }
    }
} 

ملاحظة: في وضع التوفّر العالي، لن يتم سوى ربط عقدة Coreapp واحدة فقط (wacore1 في هذا المثال) بخادم Whatsapp، وستتمتع جميع العُقد الأخرى بما في ذلك عقدة Master الرئيسية بالحالة gateway_status لـ disconnected. وفي حالة تعطل wacore1، فسيحل wacore2 محله ويتم ربطه بخادم Whatsapp للحفاظ على التوفّر العالي.

لقد انتهيت الآن من إعداد عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال في وضع التوفّر العالي. وعند التعيين إلى هذا الوضع، لن تتمكّن سوى حاوية Coreapp من الربط بخادم WhatsApp وإرسال الرسائل في أي وقت. وإذا كنت تريد توفر العديد من حاويات Coreapp لإرسال الرسائل في الوقت نفسه من أجل زيادة معدل نقل الرسائل، فاتبع الخطوات الواردة في قسم إعداد مجموعة الاتصال المتعدد ذات التوفّر العالي الموضح أدناه.

إعداد مجموعة الاتصال المتعدد ذات التوفّر العالي

الخطوة الأولى: إعداد قسمين

استخدم نقطة نهاية الأقسام لإعداد قسمين. ويجب أن تظهر لك استجابة HTTP بالحالة 201 Created.

الخطوة الثانية: إجراء التحقق من سلامة الأداء

يمكنك إجراء التحقق من سلامة الأداء بعميل واجهة API الخاصة بتطبيق WhatsApp للأعمال باستخدام استدعاء واجهة API إلى العقدة health.

يجب أن يبدو الإخراج الناتج كما يلي:

{
    "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"
        }
    }
}          

ملاحظة: في وضع الاتصال المتعدد ذي القسمين، سيتم ربط عقدتي Coreapp (wacore1 وwacore2 في هذا المثال) بخادم WhatsApp، كما سيتم ربط عقدة Master الرئيسية (master2 في هذا المثال) بخادم WhastsApp.

الخطوة الثالثة: بدء تشغيل حاوية Coreapp ثالثة للحفاظ على التوفّر العالي

في هذا المثال حتى الآن، تتوفر لديك حاويتا Coreapp وتم تقسيم عمليات تحميل الرسائل بينهما. ومع ذلك، إذا تعطلت إحدى حاويتي Coreapp، فستفشل نصف عمليات إرسال الرسائل لديك. ومن أجل الحفاظ على التوفّر العالي في إعداد الاتصال المتعدد الجديد هذا، يمكنك تشغيل حاوية Coreapp ثالثة للسماح بفشل حاوية Coreapp واحدة والتي تكون مماثلة للمخطط الموضح في مقدمة حول الاتصال المتعدد.

من أجل تشغيل حاوية Coreapp الثالثة، قم بتشغيل الأمر التالي:

docker-compose -f multiconnect-compose.yml up -d wacore3

يجب أن يبدو الإخراج الناتج كما يلي:

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

الخطوة الرابعة: إجراء التحقق من سلامة الأداء للمرة الثانية

قم بإجراء التحقق من سلامة الأداء مرة أخرى للتأكد من أن جميع العُقد تعمل بشكل صحيح باستخدام استدعاء واجهة API إلى العقدة health.

يجب أن يبدو الإخراج الناتج كما يلي:

{
    "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"
        }
    }
} 

تعمل حاوية Coreapp الجديدة (wacore3 في هذا المثال) الآن باعتبارها حاوية احتياطية، ولكن لم يتم ربطها حاليًا بخادم WhatsApp. في حالة توقف wacore1 أو wacore2 عن العمل، فسيتم ربط wacore3 بخادم WhatsApp للحفاظ على العدد الكلي للأقسام وهو 2.

ترقية عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال

ستواجه مشكلة وقت التعطل أثناء عملية الترقية.

يوصى بشدة بإجراء نسخ احتياطي لإعدادات التطبيق الحالية لديك قبل الترقية للتأكد من أنه يمكنك نسخ الإعدادات احتياطيًا وتشغيلها سريعًا. لذا يرجى اتباع وثائق النسخ الاحتياطي والاستعادة.

لذا نوصي دائمًا بتنفيذ الترقيات خلال الساعات الأقل ازدحامًا.

الخطوة الأولى: تغيير متغير البيئة WA_API_VERSION إلى الإصدار الجديد

يجب تحديث المتغير البيئي WA_API_VERSION إلى رقم الإصدار الجديد باستخدام:

export WA_API_VERSION=new-whatsapp-version

الخطوة الثانية: إعادة تشغيل حاويات Docker

أعد تشغيل حاويات Docker من خلال تشغيل:

docker-compose -f multiconnect-compose.yml up -d

بالنسبة لمستخدمي قاعدة بيانات MySQL الذين يقومون بالترقية إلى الإصدار v2.23.x والإصدارات الأحدث

ويمكنك الآن الاستفادة من خدمة ترقية قاعدة البيانات التي ستتيح لك ترقية قاعدة البيانات بينما لا يزال تطبيقك قيد التشغيل لتجنب وقت التعطل.

الخطوة الأولى: تنزيل ملف التكوين

يتضمن الملف dbupgrade-compose.yml حقولاً تشير إلى إصدار الحاوية.

المثال:

services:
  dbupgrade:
    image: docker.whatsapp.biz/coreapp:v${WA_API_VERSION:-2.21.3}

الخطوة الثانية: بدء تشغيل الحاوية

لترقية عملية تثبيت، يمكنك بدء تشغيل الحاوية dbupgrade-service مع تعيين متغير البيئة WA_API_VERSION إلى أحدث إصدار:

WA_API_VERSION=new-whatsapp-version docker-compose -f dbupgrade-compose.yml up -d

ملاحظة: إذا كنت تستخدم تزامنًا يعيد تشغيل الحاوية عند الخروج بغض النظر عن الرمز البرمجي للخروج، يمكنك بدء تشغيل الخدمة من خلال تعيين متغير البيئة EXIT_ON_SUCCESS إلى القيمة FALSE لتجنب الخروج من الحاوية عندما يكون الرمز البرمجي للخروج بالقيمة 0.

الخطوة الثالثة: السماح بإكمال الترقية

إذا تمت ترقية قاعدة البيانات بنجاح، فستخرج الحاوية بالرمز البرمجي 0. ويمكنك استخدام أمر Docker التالي لتتبع الحالة:

docker wait your-database-upgrade-container-name

وسيؤدي ذلك إلى إخراج الرمز البرمجي للخروج الخاص بحاوية dbupgrade-service.

الخطوة الرابعة: إعادة تشغيل حاويات Coreapp وWebapp

أعد تشغيل حاويات Docker في Coreapp وWebapp مع تعيين متغير البيئة WA_API_VERSION إلى أحدث إصدار:

WA_API_VERSION=new-whatsapp-version docker-compose -f multiconnect-compose.yml up -d

إلغاء تثبيت عميل واجهة API الخاصة بتطبيق WhatsApp للأعمال

يوصى بشدة بنسخ إعدادات التطبيق الحالية احتياطيًا قبل إلغاء التثبيت. لذا يرجى اتباع وثائق النسخ الاحتياطي والاستعادة.

إذا كنت تريد إعادة تعيين بيئة التطوير لديك من خلال إزالة كل الحاويات، فقم بتشغيل الأمر التالي من الدليل الذي يتضمن الملف multiconnect-compose.yml:

docker-compose -f multiconnect-compose.yml down

للتخلص من جميع وحدات التخزين المحددة في الملف multiconnect-compose.yml وكذلك الحاويات، قم بتشغيل down باستخدام المعلمة -v:

docker-compose -f multiconnect-compose.yml down -v

استكشاف الأخطاء وإصلاحها

لتجميع السجلات من جميع الحاويات، قم بتشغيل الأمر التالي:

docker-compose -f multiconnect-compose.yml logs > debug_output.txt

من أجل تجميع سجلات خدمة معينة، قم بإلحاق اسم الخدمة (مثل waweb أو master1 أو wacore1) بالأمر docker-compose logs:

docker-compose -f multiconnect-compose.yml logs waweb > debug_output.txt

يمكنك العثور على السجلات في الملف debug_output.txt في الدليل الحالي.


يستخدم هذا البرنامج الرمز البرمجي FFmpeg المُرخص بموجب رخصة جنو العمومية الصغرى (LGPL) بالإصدار 2.1 ويمكن تنزيل مصدره من هنا.