Produksi engine-whatsapp berjalan sebagai satu proses PM2 — tidak ada worker terpisah seperti engine-bot. Deploy via GitHub Actions ke self-hosted runner.
Branch dan workflow
| Branch | Environment | Workflow | Runner | Direktori server | Proses PM2 |
|---|---|---|---|---|---|
staging | Staging | deploy_staging.yml | [self-hosted, staging] | /home/deployer/app/engine-whatsapp | engine-dazo-dev |
v3 | Production | deploy_production.yml | [self-hosted, production] | /var/www/engine-whatsapp | engine-dazo |
Single process PM2
# Staging
pm2 start dist/app.js --name engine-dazo-dev
# Production
pm2 start dist/app.js --name engine-dazoTidak ada ecosystem.config.js di repo — PM2 config produksi ada di server, tidak terlihat dari git. Setup server baru butuh provisioning manual.
Alur workflow
Kedua workflow identik struktur — hanya beda branch, runner, project dir, dan PM2 service name:
1. checkout repo
2. cd $PROJECT_DIR → git fetch --all → git reset --hard origin/<branch>
3. npm install
4. NODE_OPTIONS="--max-old-space-size=4096" npm run build
5. PM2 restart app (jika ada) — tidak start first-runLangkah workflow detail (production)
# deploy_production.yml
- name: Checkout code
uses: actions/checkout@v3
- name: Deploy Dazo App production
run: |
cd /var/www/engine-whatsapp
echo "Pulling latest code..."
git fetch --all
git reset --hard origin/v3
echo "Installing Dependencies..."
npm install
echo "Building resources..."
NODE_OPTIONS="--max-old-space-size=4096" npm run build
echo "Deploy Successfully..."
- name: Restart app
run: |
if sudo pm2 list | grep -q 'engine-dazo'; then
sudo pm2 restart engine-dazo
fi
echo "Deploy Successfully..."Caveats
| Caveat | Dampak |
|---|---|
| Salah label workflow | deploy_production.yml bernama “Deploy to Staging” — target deploy-nya sudah benar (production), hanya salah nama |
| First-start PM2 tidak ditangani | if grep -q hanya restart jika service sudah ada — first-start tidak ada else branch untuk pm2 start |
Tidak ada working-directory di step install | Step npm install tidak menetapkan working-directory, tapi cd di awal step mengakomodasi |
npm install tanpa --legacy-peer-deps | Beda dari engine-bot — engine-whatsapp pakai install biasa |
| Tidak ada automated test | Tidak ada npx tsc --noEmit gate di CI — syntax error baru terlihat saat PM2 start crash |
.env tidak ter-deploy via git | File gitignored — harus ada di server manual |
session/auth/ tidak ter-deploy | Folder gitignored — kredensial sesi tetap di server, tidak ikut repo |
Setelah deploy
Verifikasi cepat:
pm2 status— pastikanengine-dazo(atauengine-dazo-dev)onlinecurl http://localhost:5002/api/device-info?instance=test-uuid— harus merespons (bukan connection refused)- Cek log PM2 —
pm2 logs engine-dazo - Cek
wa-logs.txt— cari error MongoDB atau Baileys - Verifikasi sesi tersisa di-restore — log harus menunjukkan
startSessionuntuk setiap folder disession/auth/ - Test kirim pesan via
POST /api/send-messagedengan instance yang aktif
Checklist sebelum push ke v3
-
npx tsc --noEmitlolos (exit 0) - Tidak ada
console.logdebug tambahan di diff - Tidak ada perubahan
.envdengan kredensial nyata - Tidak ada perubahan bentuk payload webhook tanpa koordinasi backend
- Tidak ada perubahan event Socket.IO tanpa koordinasi frontend
- Tidak ada perubahan
instanceIdkonsistensi (folder, Map key, room, kolomid) - Commit message jelas, Bahasa Indonesia, prefix sesuai konvensi
Runbook failure
MongoDB down
- Cek
pm2 logs engine-dazo— cariMongodb Error Connection connectDBprocess.exit(1)saat gagal — service akan restart otomatis via PM2 (jika tidak exit repeatedly)- Pulihkan MongoDB
- PM2 auto-restart setelah MongoDB pulih (PM2 restart pada crash)
- Verifikasi sesi di-restore setelah restart
Sesi tidak ter-restore
- Cek folder
session/auth/di server — pastikan masih ada - Cek log
wa-logs.txt— cari[INIT] Gagal memuat sesi <instanceId> - Restart PM2:
sudo pm2 restart engine-dazo - Jika masih gagal, hapus folder sesi bermasalah dan minta pemilik device scan QR ulang
Baileys disconnect berulang
- Cek log untuk
Connection closed. Reconnecting: true - Baileys auto-reconnect — tunggu beberapa menit
- Jika
loggedOut, sesi dihapus dari memory dan filesystem — device butuh scan QR ulang - Verifikasi koneksi internet server stabil (WhatsApp butuh koneksi persisten)
Webhook ke backend gagal
- Cek
WEBHOOK_URLdi.envserver — pastikan menunjuk ke backend yang benar - Cek log — cari
Gagal mengirim webhook: - Verifikasi backend reachable:
curl -X POST {WEBHOOK_URL}/callback_message - Jika
WEBHOOK_URLmengandungwebhook-test, webhook sengaja dilewati (mode dummy)
Log prefixes
| Prefix/Sumber | Makna |
|---|---|
| Pino (wa-logs.txt) | Log Baileys per sesi, tagged {session: "<instanceId>"} |
console.log tercecer | Debug di whatsappService.ts, incomingMessageService.ts, chatHistoryService.ts |
[INIT] | Sesi restore saat boot |
[HISTORY] | chatHistoryService — manage chat_histories |
[API] | Backend menolak webhook (result: false) |
Langkah berikutnya
- Detail workflow GitHub Actions? Baca CI/CD & GitHub Actions.
- Setup environment? Baca Environment.
- Cara kerja sesi? Baca Session Lifecycle.