Giải pháp Ứng dụng API WhatsApp Business tiêu chuẩn chạy trên một vùng chứa Docker duy nhất. Việc chạy nhiều vùng chứa Docker sẽ gây ra sự cố và khiến tài khoản bị cấm tạm thời. Hướng dẫn này sẽ chỉ cho bạn cách thiết lập độ sẵn sàng cao, nhờ đó bạn sẽ có các vùng chứa Docker dự phòng trong trường hợp vùng chứa Docker chính không hoạt động.
Giải pháp độ sẵn sàng cao này yêu cầu bạn cài đặt một phiên bản Ứng dụng API WhatsApp Business hiện có để chạy trên ứng dụng đó. Nếu bạn chưa thiết lập số điện thoại cho Ứng dụng API WhatsApp Business, hãy xem lại tài liệu hướng dẫn Cài đặt trước khi tiếp tục sử dụng giải pháp này.
Nhóm có độ sẵn sàng cao cần có ít nhất 2 nút Master và 2 nút Coreapp như minh họa trong sơ đồ sau:
Bạn nên chạy tất cả nút này trên các máy/dàn máy khác nhau để tránh trường hợp một lỗi máy/dàn máy ảnh hưởng đến nhiều nút cùng lúc.
Khi một nhóm khởi động, toàn bộ nút Master sẽ cạnh tranh để giành vị trí chính. Chỉ một nút sẽ thành công còn các nút khác sẽ trở thành Master phụ. Nếu nhóm có N nút Master thì sẽ có 1 Master chính và N-1 Master phụ. Master chính chịu trách nhiệm đăng ký, nâng cấp lược đồ cơ sở dữ liệu, gửi các thay đổi về cấu hình, báo cáo trạng thái cơ sở dữ liệu, quản lý nhóm, v.v. Nếu Master chính ngừng hoạt động và mất vị trí chính, những Master phụ khác sẽ cạnh tranh để giành vị trí Master chính.
Khi giành được vị trí chính, trước tiên, Master sẽ tải bảng sơ đồ phân đoạn từ cơ sở dữ liệu để biết Coreapp chính hiện tại. Nếu nhóm chưa có Coreapp chính, Master chính sẽ thăng cấp một Coreapp phụ hiệu quả làm Coreapp chính và cập nhật bảng sơ đồ phân đoạn trong cơ sở dữ liệu sao cho Webapp có thể tra cứu nút Coreapp nào đã gửi yêu cầu API. Bằng cách này, ngay cả khi tất cả các Master gặp sự cố thì Webapp vẫn có thể phân phối yêu cầu API trong nút Coreapp để đạt được Độ sẵn sàng cao.
Khi khởi động, nút Coreapp sẽ chạy với vai trò là Coreapp phụ cho đến khi được Master chính thăng cấp lên thành Coreapp chính để kết nối với máy chủ WhatsApp. Sau đó, Coreapp sẽ chịu trách nhiệm xử lý yêu cầu API.
Mỗi phút, từng nút Coreapp sẽ cập nhật cơ sở dữ liệu để xác nhận trạng thái hoạt động của nút đó. Master chính sẽ kiểm tra cơ sở dữ liệu theo định kỳ để phát hiện những nút Coreapp hoạt động không hiệu quả. Nếu một nút Coreapp chính không cập nhật cơ sở dữ liệu trong hơn 2 phút, Master chính sẽ xem nút Coreapp đó là không hiệu quả và thăng cấp nút Coreapp khác lên làm nút chính. Theo cách này, thời gian dừng hoạt động sẽ kéo dài khoảng 2 phút.
Nếu nhóm có nhiều Master đang chạy, tính năng giám sát dựa trên thông báo hoạt động sẽ phát hiện lỗi nút nhanh hơn tính năng giám sát dựa trên cơ sở dữ liệu. Trong tính năng giám sát dựa trên thông báo hoạt động, tất cả Master chịu trách nhiệm giám sát các nút Coreapp bằng cách gửi thông báo hoạt động đến nút Coreapp 5 giây một lần (được đặt cấu hình theo heartbeat_interval
). Nếu không phản hồi Master chính và một Master phụ trong 30 giây (được đặt cấu hình theo unhealthy_interval
), Coreapp chính sẽ được xem là không hiệu quả và Master chính sẽ thăng cấp một Coreapp phụ hiệu quả lên làm Coreapp chính. Theo cách này, thời gian dừng hoạt động sẽ mặc định là khoảng 30 giây. Bạn có thể giảm giá trị unhealthy_interval
nếu muốn giảm thời gian dừng hoạt động. Hãy tham khảo tài liệu về Cài đặt để xem các phần tải dữ liệu mẫu.
Một nhóm có Độ sẵn sàng cao sẽ có 3 loại nút: Webapp, Master và Coreapp. Bạn có thể khởi động từng nút này trên các máy khác nhau. Tuy nhiên, các nút đó cần phải ở trong cùng một mạng để có thể giao tiếp với nhau.
Nút Webapp chịu trách nhiệm xử lý lưu lượng truy cập API, chẳng hạn như vùng chứa Webapp gốc. Nút Coreapp chịu trách nhiệm xử lý lưu lượng truy cập tin nhắn đến và từ WhatsApp. Cuối cùng, nút Master chịu trách nhiệm giám sát các nút Coreapp trong nhóm. Do đó, nếu một nút Coreapp ngừng hoạt động, nút Master sẽ chuyển lưu lượng truy cập đến một nút Coreapp khác để đảm bảo độ sẵn sàng cao. Một nhóm có thể có nhiều nút Webapp, nút Coreapp và nút Master.
Các nút đang hoạt động không còn được gọi là nút lệ thuộc nữa. Chúng được gọi là nút Coreapp.
Lưu ý: Đối với môi trường chính thức, trong hầu hết các trường hợp, bạn nên chạy cơ sở dữ liệu trên một máy chủ thực tách biệt với vùng chứa Coreapp và Webapp. Để đạt được Độ sẵn sàng cao thật sự, bạn nên chạy vùng chứa Master, Webapp và Coreapp trên các máy thực khác nhau.
Nếu bạn không quan tâm đến tin nhắn có file phương tiện, hãy bỏ qua bước này.
Để hỗ trợ gửi/nhận tin nhắn có file phương tiện, bạn cần phải thiết lập một hệ thống file NFS và liên kết hệ thống này với một thư mục cục bộ trên tất cả các nút Webapp, Master và Coreapp. Hãy nhớ cấp quyền đọc/ghi trên thư mục dùng chung.
mkdir new-local-directory mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory
Theo hướng dẫn này, bạn cần có nền tảng vùng chứa Docker thì mới chạy được Ứng dụng API WhatsApp Business. Ngoài ra, bạn cần có Docker Compose. Docker Compose đi kèm với Docker dành cho macOS và Windows, nhưng bạn cần phải cài đặt riêng khi sử dụng Linux.
multiconnect-compose.yml
và db.env
: WhatsApp_Configuration_Files.zip.
db.env
theo đúng cấu hình MySQL của bạn. Nếu bạn chưa cài đặt MySQL, các file docker-compose.yml
và db.env
sẽ có cấu hình mặc định để hiển thị phiên bản trong một vùng chứa cục bộ.docker-compose -f your-single-connect-yml-filename stop
docker-compose -f multiconnect-compose.yml upBạn sẽ nhận được một số thông tin đầu ra khi tập lệnh tải hình ảnh Docker xuống và thiết lập mọi nội dung. Để chạy các vùng chứa dưới nền, hãy sử dụng thông số
-d
:
docker-compose -f multiconnect-compose.yml up -d
Sau khi bạn hoàn tất các bước này, hãy dùng lệnh sau để đảm bảo rằng các vùng chứa đang chạy:
docker-compose ps
Theo mặc định, vùng chứa Webapp sẽ chạy trên cổng 9090.
multiconnect-coreapp.yml
, multiconnect-master.yml
, multiconnect-webapp.yml
và db.env
: WhatsApp_Configuration_Files.zip rồi lưu từng file vào máy chủ tương ứng.
db.env
theo đúng cấu hình MySQL của bạn.docker-compose -f your-single-connect-yml-filename stop
Biến môi trường EXTERNAL_HOSTNAME phải là địa chỉ IP hoặc tên máy chủ có thể truy cập được từ các máy đang chạy những vùng chứa khác. Các cổng hiển thị trong file YML dịch vụ phải mở để tiếp nhận kết nối từ các máy đang chạy những vùng chứa khác. Ví dụ: các cổng được xác định là COREAPP_EXTERNAL_PORTS
trong multiconnect-coreapp.yml
cần mở để tiếp nhận lưu lượng truy cập đến trên máy chủ chạy vùng chứa 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 serverBạn sẽ nhận được một số thông tin đầu ra khi tập lệnh tải hình ảnh Docker xuống và thiết lập mọi nội dung. Để chạy các vùng chứa dưới nền, hãy sử dụng thông số
-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
Sau khi bạn hoàn tất các bước này, hãy dùng lệnh sau để đảm bảo rằng các vùng chứa đang chạy:
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
Theo mặc định, bạn không thể chạy nhiều phiên bản của cùng một dịch vụ (ví dụ: chạy 2 Coreapp trên cùng một máy chủ) do xung đột cổng máy chủ. Để tránh xung đột cổng, bạn cần sửa đổi file YML dịch vụ tương ứng (trong trường hợp này là multiconnect-coreapp.yml
) để hiển thị các cổng máy chủ khác nhau cho từng phiên bản như sau:
ports:
- "HOST_PORT_RANGE:6250-6253"
Theo mặc định, vùng chứa Webapp sẽ chạy trên cổng 9090.
File multiconnect-compose.yml
có các trường cho biết phiên bản vùng chứa. Ví dụ:
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
Để nâng cấp bản cài đặt, hãy thay đổi số phiên bản trong file 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
Sau đó, khởi động lại các vùng chứa Docker:
docker-compose -f multiconnect-compose.yml up
Các file YAML có những trường cho biết phiên bản của vùng chứa. Ví dụ:
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
Để nâng cấp bản cài đặt, hãy thay đổi số phiên bản trong file tương ứng:
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
Sau đó, khởi động lại các vùng chứa 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
Nếu bạn có dung lượng chứa file phương tiện từ bản cài đặt trước, hãy thay thế định nghĩa dung lượng sau đây trong file YAML:
volumes: whatsappData: driver: local whatsappMedia: driver: local
bằng:
volumes: whatsappData: external: true whatsappMedia: external: true
Bạn chỉ nên dùng nếu muốn duy trì dung lượng liên kết ràng buộc hiện có.
Nếu muốn liên kết trực tiếp đường dẫn máy chủ (một vị trí hiện có trên máy chủ của bạn) với vùng chứa, bạn có thể làm điều đó bằng cách thay đổi dòng dung lượng trong phần dịch vụ để trỏ đến đường dẫn máy chủ này.
wacore: volumes: /filepath/waent/data:/usr/local/waent/data /filepath/wamedia:/usr/local/wamedia
Bạn sẽ phải lặp lại thao tác này cho tất cả các máy mà bạn đang chạy nút.
Nếu bạn cần gỡ tất cả các vùng chứa để đặt lại môi trường phát triển, hãy chạy lệnh sau từ thư mục chứa file multiconnect-compose.yml
:
docker-compose -f multiconnect-compose.yml down
Ngoài vùng chứa, để loại bỏ toàn bộ dung lượng được xác định trong file multiconnect-compose.yml
, hãy chạy lệnh down
bằng thông số -v
:
docker-compose -f multiconnect-compose.yml down -v
Nếu bạn cần gỡ tất cả các vùng chứa để đặt lại môi trường phát triển, hãy chạy lệnh sau từ thư mục chứa file YAML trên mỗi máy chủ:
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
Ngoài vùng chứa, để loại bỏ toàn bộ dung lượng được xác định trong file YAML, hãy chạy lệnh down
bằng thông số -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
Để lấy nhật ký khắc phục sự cố, hãy chạy lệnh sau trên các máy chủ của bạn:
docker-compose logs > debug_output.txt