Solusi Klien API WhatsApp Business standar berjalan pada satu kontainer Docker. Menjalankan beberapa kontainer Docker akan menyebabkan masalah dan mengakibatkan akun Anda diblokir sementara. Panduan ini akan menjelaskan cara menyiapkan ketersediaan tinggi, memungkinkan Anda memiliki beberapa kontainer Docker dalam mode siaga apabila kontainer Docker utama mengalami gangguan.
Solusi ketersediaan tinggi ini mengharuskan adanya penginstalan instance tunggal Klien API WhatsApp Business yang berjalan di atasnya. Jika Anda belum menyiapkan nomor telepon Klien API WhatsApp Business, tinjau dokumentasi Penginstalan sebelum melanjutkan dengan solusi ini.
Klaster ketersediaan tinggi memerlukan setidaknya dua node Master dan dua node Coreapp seperti yang terlihat dalam diagram berikut:
Semua node direkomendasikan untuk dijalankan di beberapa mesin/rak yang berbeda untuk menghindari kegagalan mesin/rak yang memengaruhi banyak node sekaligus.
Saat sebuah klaster memulai, semua node Master akan bersaing untuk meraih lease master untuk menjadi Master primer. Hanya satu node akan berhasil dan yang lain akan menjadi Master sekunder. Jika ada sejumlah N node Master di dalam klaster, akan ada satu Master primer dan N-1 Master sekunder. Master primer bertanggung jawab untuk pendaftaran, peningkatan skema database, siaran perubahan konfigurasi, pelaporan statistik database, pengelolaan klaster, dsb. Jika Master primer mati dan kehilangan lease master, hanya m=Master sekunder yang akan bersaing untuk menggantikan posisi Master primer.
Saat menjadi primer, sebuah Master akan pertama-tama memuat tabel peta partisi dari database untuk mengetahui siapa Coreapp primer saat ini. Jika tidak ada Coreapp primer di klaster, Master primer akan mempromosikan satu Coreapp sekunder yang sehat menjadi Coreapp primer dan memperbarui tabel peta partisi dalam database sehingga Webapp dapat mencari node Coreapp untuk dikirimi permintaan API. Jika demikian, bahkan jika semua Master mati, Webapp masih dapat melayani permintaan API di node Coreapp untuk mencapai Ketersediaan Tinggi.
Saat mulai aktif, node Coreapp berjalan sebagai Coreapp sekunder hingga Master primer mempromosikannya menjadi Coreapp primer untuk terhubung ke server WhatsApp. Setelah itu, Coreapp ini akan bertanggung jawab untuk menangani permintaan API.
Setiap node Coreapp akan memperbarui database setiap menit untuk mengeklaim keaktifannya. Master primer akan mengecek database secara berkala untuk mendeteksi node Coreapp yang tidak sehat. Jika node Coreapp primer tidak memperbarui database selama lebih dari 2 menit, Master primer akan menganggapnya tidak sehat dan mempromosikan node Coreapp lain menjadi primer. Jika demikian, downtime berkisar 2 menit.
Jika sebuah klaster memiliki lebih dari satu Master yang berjalan, pemantauan berbasis detak mendeteksi kegagalan node lebih cepat daripada pemantauan berbasis database. Dalam pemantauan berbasis detak, semua Master bertanggung jawab untuk memantau node Coreapp dengan mengirim detak kepada node-node itu setiap 5 detik (dikonfigurasi berdasarkan heartbeat_interval
). Jika tidak menanggapi Master primer dan satu Master sekunder selama 30 detik (dikonfigurasi berdasarkan unhealthy_interval
), Coreapp primer dianggap tidak sehat dan Master primer akan mempromosikan Coreapp sekunder yang sehat menjadi Coreapp primer. Jika demikian, downtime berkisar 30 detik, secara default. Anda dapat mengurangi nilai unhealthy_interval
jika menginginkan downtime yang lebih rendah. Periksa dokumentasi Pengaturan, contoh: muatan.
Dalam klaster Ketersediaan Tinggi ada tiga jenis node: Webapp, Master, dan Coreapp. Node ini dapat dijalankan terpisah di mesin yang berbeda, tetapi harus berada di jaringan yang sama agar dapat saling berkomunikasi.
Node Webapp bertanggung jawab untuk menangani traffic API seperti kontainer Webapp asli. Node Coreapp berfungsi untuk menangani traffic pengiriman pesan ke dan dari WhatsApp. Terakhir, node Master berfungsi untuk memantau node Coreapp di dalam klaster, sehingga jika sebuah node Coreapp mati, node Master akan mengarahkan traffic ke node Coreapp lain demi ketersediaan yang tinggi. Mungkin ada beberapa node Webapp, node Coreapp, dan node Master di klaster.
Node aktif tidak lagi disebut sebagai node budak. Node aktif disebut node Coreapp.
Catatan: Untuk lingkungan produksi, dalam kebanyakan kasus, database seharusnya dijalankan pada server fisik yang terpisah dari kontainer Coreapp dan Webapp. Untuk Ketersediaan Tinggi yang sebenarnya, direkomendasikan untuk menjalankan kontainer Master, Webapp, dan Coreapp pada mesin fisik yang berbeda.
Jika Anda tidak peduli tentang pesan media, lewati langkah ini.
Untuk mendukung pengiriman/penerimaan pesan media, diperlukan untuk menyiapkan sistem file NFS dan memasangnya ke direktori lokal di semua node Webapp, Master, dan Coreapp. Pastikan izin baca/tulis diberikan pada direktori bersama.
mkdir new-local-directory mount -t nfs nfs_server_IP_addr:/share_directory new-local-directory
Panduan ini memerlukan Docker, platform kontainer yang memungkinkan Anda menjalankan Klien API WhatsApp Business. Docker Compose juga diperlukan. Docker Compose dibundel dengan Docker untuk macOS dan Windows tetapi memerlukan penginstalan terpisah pada Linux.
multiconnect-compose.yml
dan db.env
: WhatsApp_Configuration_Files.zip.
db.env
untuk merefleksikan konfigurasi MySQL Anda. Jika Anda tidak menginstal MySQL, file multiconnect-compose.yml
dan db.env
memiliki konfigurasi default untuk memunculkan instance dalam kontainer lokal.docker-compose -f your-single-connect-yml-filename stop
docker-compose -f multiconnect-compose.yml upAnda akan mendapatkan beberapa output saat skrip mengunduh gambar Docker dan mengatur semuanya. Untuk menjalankan kontainer di latar belakang, gunakan parameter
-d
:
docker-compose -f multiconnect-compose.yml up -d
Setelah Anda menyelesaikan langkah-langkah ini, pastikan kontainer berjalan dengan perintah berikut:
docker-compose ps
Secara default, kontainer Webapp akan berjalan pada port 9090.
multiconnect-coreapp.yml
, multiconnect-master.yml
, multiconnect-webapp.yml
, dan db.env
: WhatsApp_Configuration_Files.zip, dan simpan masing-masing ke server yang sesuai.
db.env
untuk merefleksikan konfigurasi MySQL Anda.docker-compose -f your-single-connect-yml-filename stop
Variabel lingkungan EXTERNAL_HOSTNAME haruslah sebuah alamat IP atau hostname yang dapat diakses dari mesin yang menjalankan kontainer lainnya. Port yang diekspos dalam file YML layanan harus terbuka ke koneksi dari mesin yang menjalankan kontainer lain. Contoh: port didefinisikan sebagai COREAPP_EXTERNAL_PORTS
di multiconnect-coreapp.yml
harus terbuka untuk traffic masuk di host yang menjalankan kontainer 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 serverAnda akan mendapatkan beberapa output saat skrip mengunduh gambar Docker dan mengatur semuanya. Untuk menjalankan kontainer di latar belakang, gunakan parameter
-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
Setelah Anda menyelesaikan langkah-langkah ini, pastikan kontainer berjalan dengan perintah berikut:
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
Menjalankan beberapa contoh dari layanan yang sama (misal: menjalankan 2 Coreapps pada host yang sama) tidak akan berfungsi secara default karena konflik port host. Untuk menghindari konflik port, Anda perlu mengubah file YML layanan terkait, dalam kasus ini multiconnect-coreapp.yml
, untuk mengekspos port host yang berbeda untuk setiap instance sebagai berikut:
ports:
- "HOST_PORT_RANGE:6250-6253"
Secara default, kontainer WebApp akan berjalan pada porta 9090.
File multiconnect-compose.yml
memiliki kolom yang menunjukkan versi kontainer. Contoh:
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
Untuk meningkatkan penginstalan, ubah nomor versi di 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
Lalu, mulai ulang kontainer Docker:
docker-compose -f multiconnect-compose.yml up
File YAML memiliki kolom yang menunjukkan versi kontainer. Contoh:
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
Untuk meningkatkan penginstalan, ubah nomor versi di masing-masing file:
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
Lalu, mulai ulang kontainer 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
Jika Anda memiliki volume media dari penginstalan sebelumnya, ganti definisi volume berikut di file YAML:
volumes: whatsappData: driver: local whatsappMedia: driver: local
dengan:
volumes: whatsappData: external: true whatsappMedia: external: true
Ini hanya direkomendasikan jika Anda ingin mempertahankan volume bind mount.
Jika ingin langsung memasang jalur host (lokasi yang ada di host Anda) ke dalam kontainer, Anda dapat melakukannya dengan mengubah baris volume di dalam bagian layanan untuk mengarahkan ke jalur host.
wacore: volumes: /filepath/waent/data:/usr/local/waent/data /filepath/wamedia:/usr/local/wamedia
Anda harus mengulangi ini untuk semua mesin tempat Anda menjalankan node.
Jika Anda perlu mereset lingkungan pengembangan Anda dengan menghapus semua kontainer, jalankan perintah berikut dari direktori yang berisi file multiconnect-compose.yml
:
docker-compose -f multiconnect-compose.yml down
Untuk menghilangkan semua volume yang ditentukan dalam file multiconnect-compose.yml
selain kontainer, jalankan down
dengan parameter -v
:
docker-compose -f multiconnect-compose.yml down -v
Jika Anda perlu mereset lingkungan pengembangan Anda dengan menghapus semua kontainer, jalankan perintah berikut dari direktori yang berisi file YAML pada setiap server:
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
Untuk membuang semua volume yang ditentukan dalam file YAML selain kontainer, jalankan down
dengan parameter -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
Untuk mendapatkan catatan guna pemecahan masalah, jalankan perintah berikut di server:
docker-compose logs > debug_output.txt