โซลูชั่นไคลเอ็นต์ WhatsApp Business API มาตรฐานทำงานบนคอนเทนเนอร์ Docker เดี่ยว การที่มีคอนเทนเนอร์ Docker หลายเครื่องทำงานอยู่จะทำให้เกิดปัญหาและทำให้บัญชีผู้ใช้ของคุณถูกแบนชั่วคราว คู่มือนี้จะให้คำแนะนำเกี่ยวกับวิธีการตั้งค่าความพร้อมใช้งานสูง ซึ่งช่วยให้คุณมีคอนเทนเนอร์ Docker ในโหมดสแตนด์บายในกรณีที่คอนเทนเนอร์ Docker หลักหยุดทำงาน
โซลูชั่นความพร้อมใช้งานสูงนี้จำเป็นต้องมีการติดตั้งอินสแตนซ์เดี่ยวของไคลเอ็นต์ WhatsApp Business API ที่มีอยู่เพื่อให้ทำงานบนอินสแตนซ์นั้น หากคุณยังไม่ได้ตั้งค่าหมายเลขโทรศัพท์ของไคลเอ็นต์ WhatsApp Business API ให้อ่านเอกสารประกอบเกี่ยวกับการติดตั้งก่อนที่จะดำเนินการด้วยโซลูชั่นนี้
คลัสเตอร์ที่มีความพร้อมใช้งานสูงจำเป็นต้องมีโหนด Master และโหนด Coreapp อย่างละ 2 โหนดเป็นอย่างน้อย ดังที่เห็นในแผนภาพด้านล่าง
เราขอแนะนำให้โหนดทั้งหมดทำงานในหลายๆ เครื่อง/ตู้แร็ก เพื่อหลีกเลี่ยงไม่ให้เกิดกรณีที่ความขัดข้องของเครื่อง/ตู้แร็กหนึ่งตัวส่งผลกระทบต่อหลายโหนดในเวลาเดียวกัน
เมื่อคลัสเตอร์เริ่มทำงาน โหนด Master ทั้งหมดจะแข่งขันกันเพื่อคว้าสิทธิ์หลักในการเป็นโหนดหลัก แต่จะมีเพียงโหนดเดียวเท่านั้นที่จะบรรลุเป้าหมายและโหนดอื่นๆ ก็จะกลายเป็นโหนด Master รอง หากมีโหนด Master จำนวน N โหนดในคลัสเตอร์ คุณก็จะมีโหนด Master หลัก 1 โหนดและโหนด Master รอง N-1 โหนด โหนด Master หลักมีหน้าที่รับผิดชอบการลงทะเบียน การอัพเกรดสกีมาฐานข้อมูล การเผยแพร่การเปลี่ยนแปลงการกำหนดค่า การรายงานสถิติฐานข้อมูล การจัดการคลัสเตอร์ ฯลฯ หากโหนด Master หลักหมดอายุและสูญเสียสิทธิ์หลัก โหนด Master รองอื่นๆ จะแข่งขันกันเพื่อครองตำแหน่งโหนด Master หลัก
เมื่อโหนด Master กลายเป็นโหนดหลักแล้ว โหนดนี้จะโหลดตารางการแมปชาร์ดจากฐานข้อมูลก่อนดำเนินการอย่างอื่น เพื่อให้ทราบโหนดที่เป็นโหนด Coreapp หลักในขณะนั้น หากไม่มีโหนด Coreapp หลักในคลัสเตอร์ โหนด Master หลักจะเลื่อนโหนด Coreapp รองที่ไม่มีปัญหาขึ้นมาเป็นโหนด Coreapp หลัก และอัพเดตตารางการแมปชาร์ดในฐานข้อมูลเพื่อให้ Webapp สามารถค้นหาได้ว่าจะส่งคำขอ API ไปยังโหนด Coreapp ใด ด้วยวิธีนี้ แม้ว่าโหนด Master ทั้งหมดจะไม่สามารถทำงานได้ แต่ก็ยังคงสามารถรองรับคำขอ API ในโหนด Coreapp ได้เพื่อให้มีความพร้อมใช้งานสูง
เมื่อโหนด Coreapp เริ่มทำงาน ก็จะทำงานเสมือนเป็น Coreapp รองจนกว่าโหนด Master หลักจะเลื่อน Coreapp ดังกล่าวขึ้นมาเป็น Coreapp หลัก เพื่อเชื่อมต่อกับเซิร์ฟเวอร์ของ WhatsApp หลังจากนั้น โหนดดังกล่าวจะมีหน้าที่รับผิดชอบการจัดการคำขอ API
แต่ละโหนด Coreapp จะอัพเดตฐานข้อมูลทุกนาทีเพื่อยืนยันการทำงาน โหนด Master หลักจะตรวจสอบฐานข้อมูลเป็นระยะเพื่อตรวจหาโหนด Coreapp ที่มีปัญหา หากโหนด Coreapp หลักไม่ได้อัพเดตฐานข้อมูลนานเกินกว่า 2 นาที โหนด Master หลักจะพิจารณาว่าโหนดดังกล่าวมีปัญหาและเลื่อนโหนด Coreapp อื่นๆ ขึ้นมาเป็นโหนดหลักแทน วิธีนี้จะหยุดการทำงานประมาณ 2 นาที
หากคลัสเตอร์มีโหนด Master ที่ทำงานมากกว่าหนึ่งโหนด การเฝ้าสังเกตแบบอิงสัญญาณระยะสั้นจะตรวจหาความขัดข้องของโหนดได้เร็วกว่าการเฝ้าสังเกตแบบอิงฐานข้อมูล ในการเฝ้าสังเกตแบบอิงสัญญาณระยะสั้น โหนด Master ทั้งหมดจะมีหน้าที่เฝ้าสังเกตโหนด Coreapp โดยจะส่งสัญญาณระยะสั้นไปยังโหนด Coreapp ทุกๆ 5 วินาที (กำหนดค่าโดย heartbeat_interval
) หากโหนด Coreapp หลักไม่ตอบสนองต่อโหนด Master หลักและโหนด Master รองหนึ่งโหนดเป็นเวลา 30 วินาที (กำหนดค่าโดย unhealthy_interval
) จะถือว่าโหนด Coreapp หลักดังกล่าวมีปัญหา และโหนด Master หลักจะเลื่อนระดับโหนด Coreapp รองที่ไม่มีปัญหาขึ้นมาเป็นโหนด Coreapp หลักแทน ทั้งนี้ โดยค่าเริ่มต้นแล้ว วิธีนี้จะส่งผลให้มีการหยุดทำงานประมาณ 30 วินาที คุณอาจลดค่า unhealthy_interval
ได้หากต้องการให้เวลาหยุดทำงานน้อยลง ดูตัวอย่างเพย์โหลดได้ที่เอกสารประกอบเกี่ยวกับการตั้งค่า
คลัสเตอร์ที่มีความพร้อมใช้งานสูงจะมีโหนดอยู่ 3 ประเภท ได้แก่ Webapp, Master และ Coreapp ซึ่งสามารถเริ่มงานแยกกันบนเครื่องคนละเครื่องได้ แต่จะต้องอยู่ในเครือข่ายเดียวกันเพื่อให้สามารถสื่อสารกันได้
โหนด Webapp มีหน้าที่ในการจัดการการเข้าใช้งาน API เช่นเดียวกับคอนเทนเนอร์ Webapp เดิม โหนด Coreapp มีหน้าที่ในการจัดการการรับส่งข้อความไปยังและจาก WhatsApp และสุดท้าย โหนด Master มีหน้าที่ในการเฝ้าสังเกตโหนด Coreapp ในคลัสเตอร์ ดังนั้นถ้าโหนด Coreapp หนึ่งหยุดทำงาน ก็จะมีการเปลี่ยนเส้นทางการรับส่งข้อมูลไปยังอีกโหนด Coreapp หนึ่งเพื่อให้มีความพร้อมใช้งานสูง อาจมีโหนด Webapp โหนด Coreapp และโหนด Master หลายโหนดในคลัสเตอร์
โหนดที่ใช้งานอยู่จะไม่เรียกว่าโหนด Slave อีกต่อไป โดยจะเรียกว่าโหนด Coreapp
หมายเหตุ: สำหรับสภาพแวดล้อมการใช้งานจริง ในกรณีส่วนใหญ่แล้ว ฐานข้อมูลควรทำงานบนเซิร์ฟเวอร์เครื่องจริงที่แยกจากคอนเทนเนอร์ Coreapp และ Webapp เพื่อให้มีความพร้อมใช้งานสูงอย่างแท้จริง ขอแนะนำให้ใช้คอนเทนเนอร์ Master, Webapp และ Coreapp บนเครื่องคนละเครื่องกัน
ถ้าคุณไม่สนใจเกี่ยวกับข้อความสื่อ ให้ข้ามขั้นตอนนี้
เพื่อให้สามารถรองรับการส่ง/รับข้อความสื่อได้ จะต้องตั้งค่าระบบไฟล์ NFS และติดตั้งลงในไดเรกทอรีเฉพาะที่บนโหนด Webapp, Master และ Coreapp ทุกโหนด ตรวจสอบให้แน่ใจว่ามีการให้สิทธิ์ในการอ่าน/เขียนในไดเรกทอรีที่ใช้งานร่วมกัน
mkdir new-local-directory mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory
คำแนะนำนี้จำเป็นต้องใช้ Docker ซึ่งเป็นแพลตฟอร์มคอนเทนเนอร์ที่ช่วยให้คุณเรียกใช้ไคลเอ็นต์ WhatsApp Business API ได้ นอกจากนี้ยังต้องมี Docker Compose ด้วย Docker Compose มาพร้อมกับ Docker สำหรับ macOS และ Windows แต่ต้องติดตั้งแยกต่างหากบน Linux
multiconnect-compose.yml
และ db.env
ที่ WhatsApp_Configuration_Files.zipdb.env
ให้สอดคล้องกับการกำหนดค่า MySQL ของคุณ หากคุณไม่ได้ติดตั้ง MySQL ไว้ ไฟล์ multiconnect-compose.yml
และ db.env
จะมีการกำหนดค่าเริ่มต้นเพื่อแสดงอินสแตนซ์ในคอนเทนเนอร์เฉพาะที่docker-compose -f your-single-connect-yml-filename stop
docker-compose -f multiconnect-compose.yml upคุณจะได้ผลลัพธ์บางอย่างในขณะที่สคริปต์ดาวน์โหลดรูปภาพ Docker และตั้งค่าทุกอย่างให้คุณ หากต้องการให้คอนเทนเนอร์ทำงานในพื้นหลัง ให้ใช้พารามิเตอร์
-d
ดังนี้
docker-compose -f multiconnect-compose.yml up -d
เมื่อคุณทำตามขั้นตอนเหล่านี้เสร็จแล้ว ให้ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์กำลังทำงานอยู่โดยใช้คำสั่งต่อไปนี้
docker-compose ps
โดยค่าเริ่มต้น คอนเทนเนอร์ Webapp จะทำงานบนพอร์ต 9090
multiconnect-coreapp.yml
, multiconnect-master.yml
, multiconnect-webapp.yml
และ db.env
ที่ WhatsApp_Configuration_Files.zip แล้วบันทึกแต่ละไฟล์ลงในเซิร์ฟเวอร์ที่เกี่ยวข้องกับไฟล์นั้นๆ
db.env
ให้สอดคล้องกับการกำหนดค่า MySQL ของคุณdocker-compose -f your-single-connect-yml-filename stop
ตัวแปรสภาพแวดล้อม EXTERNAL_HOSTNAME ควรเป็นที่อยู่ IP หรือชื่อโฮสต์ที่สามารถเข้าถึงได้จากเครื่องที่เรียกใช้คอนเทนเนอร์อื่นๆ พอร์ตที่ได้รับการแสดง (Expose) ในไฟล์ YML ของบริการควรเปิดรับการเชื่อมต่อต่างๆ จากเครื่องที่เรียกใช้คอนเทนเนอร์อื่นๆ ตัวอย่างเช่น พอร์ตที่กำหนดให้เป็น COREAPP_EXTERNAL_PORTS
ใน multiconnect-coreapp.yml
จะต้องเปิดไว้สำหรับการรับส่งข้อมูลขาเข้าบนโฮสต์ที่เรียกใช้คอนเทนเนอร์ coreapp
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up # on the Webapp serverคุณจะได้ผลลัพธ์บางอย่างในขณะที่สคริปต์ดาวน์โหลดรูปภาพ Docker และตั้งค่าทุกอย่างให้คุณ หากต้องการให้คอนเทนเนอร์ทำงานในพื้นหลัง ให้ใช้พารามิเตอร์
-d
ดังนี้
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up -d # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up -d # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up -d # on the Webapp server
เมื่อคุณทำตามขั้นตอนเหล่านี้เสร็จแล้ว ให้ตรวจสอบให้แน่ใจว่าคอนเทนเนอร์กำลังทำงานอยู่โดยใช้คำสั่งต่อไปนี้
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml ps # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml ps # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml ps # on the Webapp server
โดยค่าเริ่มต้น การเรียกใช้อินสแตนซ์หลายรายการจากบริการเดียวกัน (เช่น การเรียกใช้ Coreapp 2 รายการบนโฮสต์เดียวกัน) จะไม่ทำงานเนื่องจากมีการขัดแย้งกันเกี่ยวกับพอร์ตของโฮสต์ ทั้งนี้ เพื่อหลีกเลี่ยงไม่ให้พอร์ตมีการขัดแย้งกัน คุณจำเป็นต้องแก้ไขไฟล์ YML ของบริการที่เกี่ยวข้อง โดยในกรณีนี้คือไฟล์ multiconnect-coreapp.yml
เพื่อแสดง (Expose) พอร์ตของโฮสต์ที่แตกต่างกันสำหรับอินสแตนซ์แต่ละรายการดังนี้
พอร์ต:
- "HOST_PORT_RANGE:6250-6253"
โดยค่าเริ่มต้น คอนเทนเนอร์ Webapp จะทำงานบนพอร์ต 9090
ไฟล์ multiconnect-compose.yml
มีช่องต่างๆ ที่ระบุถึงเวอร์ชั่นของคอนเทนเนอร์ ตัวอย่างเช่น:
services: ... waweb: image: docker.whatsapp.biz/web:v2.19.4 ... master: image: docker.whatsapp.biz/coreapp:v2.19.4 ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.4
หากต้องการอัพเกรดการติดตั้ง ให้เปลี่ยนหมายเลขเวอร์ชั่นในไฟล์ multiconnect-compose.yml
ดังนี้
services: ... waweb: image: docker.whatsapp.biz/web:v2.19.7 ... master: image: docker.whatsapp.biz/coreapp:v2.19.7 ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.7
จากนั้น ให้รีสตาร์ทคอนเทนเนอร์ Docker ดังนี้
docker-compose -f multiconnect-compose.yml up
ไฟล์ YAML มีช่องต่างๆ ที่ระบุถึงเวอร์ชั่นของคอนเทนเนอร์ ตัวอย่างเช่น:
services: ... waweb: image: docker.whatsapp.biz/web:v2.19.4
services: ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.4
services: ... master: image: docker.whatsapp.biz/coreapp:v2.19.4
หากต้องการอัพเกรดการติดตั้ง ให้เปลี่ยนหมายเลขเวอร์ชั่นในไฟล์ที่เกี่ยวข้อง ดังนี้
services: ... waweb: image: docker.whatsapp.biz/web:v2.19.7
services: ... wacore: image: docker.whatsapp.biz/coreapp:v2.19.7
services: ... master: image: docker.whatsapp.biz/coreapp:v2.19.7
จากนั้น ให้รีสตาร์ทคอนเทนเนอร์ Docker ดังนี้
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml up # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml up # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml up # on the Webapp server
ถ้าคุณมีไดรฟ์ข้อมูลสื่อจากการติดตั้งครั้งก่อนหน้า ให้เปลี่ยนคำจำกัดความของไดรฟ์ข้อมูลต่อไปนี้ในไฟล์ YAML จาก
volumes: whatsappData: driver: local whatsappMedia: driver: local
เป็น
volumes: whatsappData: external: true whatsappMedia: external: true
เราขอแนะนำให้ใช้วิธีนี้เฉพาะในกรณีที่คุณต้องการรักษาไดรฟ์ข้อมูลแบบ Bind Mount (การติดตั้งแบบเชื่อมโยง) ที่มีอยู่เอาไว้
หากคุณต้องการติดตั้งพาธของโฮสต์ (ตำแหน่งที่มีอยู่บนโฮสต์ของคุณ) ในคอนเทนเนอร์โดยตรง คุณสามารถทำได้โดยเปลี่ยนบรรทัดไดรฟ์ข้อมูลในส่วนบริการให้ชี้ไปยังพาธของโฮสต์
wacore: volumes: /filepath/waent/data:/usr/local/waent/data /filepath/wamedia:/usr/local/wamedia
คุณจะต้องทำซ้ำขั้นตอนนี้กับเครื่องทุกเครื่องที่คุณใช้งานโหนด
หากคุณต้องการรีเซ็ตสภาพแวดล้อมการพัฒนาของคุณโดยการลบคอนเทนเนอร์ทั้งหมด ให้เรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรีที่มีไฟล์ multiconnect-compose.yml
docker-compose -f multiconnect-compose.yml down
หากต้องการกำจัดไดรฟ์ข้อมูลทั้งหมดที่กำหนดไว้ในไฟล์ multiconnect-compose.yml
นอกเหนือจากคอนเทนเนอร์ ให้เรียกใช้ down
พร้อมพารามิเตอร์ -v
ดังนี้
docker-compose -f multiconnect-compose.yml down -v
หากคุณต้องการรีเซ็ตสภาพแวดล้อมการพัฒนาของคุณโดยการลบคอนเทนเนอร์ทั้งหมด ให้เรียกใช้คำสั่งต่อไปนี้จากไดเรกทอรีที่มีไฟล์ YAML บนแต่ละเซิร์ฟเวอร์ดังนี้
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml down # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml down # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml down # on the Webapp server
หากต้องการกำจัดไดรฟ์ข้อมูลทั้งหมดที่กำหนดไว้ในไฟล์ YAML นอกเหนือจากคอนเทนเนอร์ ให้เรียกใช้ down
พร้อมพารามิเตอร์ -v
ดังนี้
EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-coreapp.yml down -v # on the Coreapp server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-master.yml down -v # on the Master server EXTERNAL_HOSTNAME=MACHINE_HOSTNAME docker-compose -f multiconnect-webapp.yml down -v # on the Webapp server
ให้เรียกใช้คำสั่งต่อไปนี้บนเซิร์ฟเวอร์ของคุณเพื่อรับบันทึกการแก้ไขปัญหา
docker-compose logs > debug_output.txt