D
Setup

Deployment

Produksi single process via PM2. Dua workflow GitHub Actions — staging (branch staging) dan production (branch v3). Self-hosted runner, git reset --hard, npm install, npm run build, pm2 restart. Tidak ada worker terpisah.

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

BranchEnvironmentWorkflowRunnerDirektori serverProses PM2
stagingStagingdeploy_staging.yml[self-hosted, staging]/home/deployer/app/engine-whatsappengine-dazo-dev
v3Productiondeploy_production.yml[self-hosted, production]/var/www/engine-whatsappengine-dazo

Single process PM2

bash
# Staging
pm2 start dist/app.js --name engine-dazo-dev

# Production
pm2 start dist/app.js --name engine-dazo

Tidak 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:

text
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-run

Langkah workflow detail (production)

yaml
# 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

CaveatDampak
Salah label workflowdeploy_production.yml bernama “Deploy to Staging” — target deploy-nya sudah benar (production), hanya salah nama
First-start PM2 tidak ditanganiif grep -q hanya restart jika service sudah ada — first-start tidak ada else branch untuk pm2 start
Tidak ada working-directory di step installStep npm install tidak menetapkan working-directory, tapi cd di awal step mengakomodasi
npm install tanpa --legacy-peer-depsBeda dari engine-bot — engine-whatsapp pakai install biasa
Tidak ada automated testTidak ada npx tsc --noEmit gate di CI — syntax error baru terlihat saat PM2 start crash
.env tidak ter-deploy via gitFile gitignored — harus ada di server manual
session/auth/ tidak ter-deployFolder gitignored — kredensial sesi tetap di server, tidak ikut repo

Setelah deploy

Verifikasi cepat:

  1. pm2 status — pastikan engine-dazo (atau engine-dazo-dev) online
  2. curl http://localhost:5002/api/device-info?instance=test-uuid — harus merespons (bukan connection refused)
  3. Cek log PM2 — pm2 logs engine-dazo
  4. Cek wa-logs.txt — cari error MongoDB atau Baileys
  5. Verifikasi sesi tersisa di-restore — log harus menunjukkan startSession untuk setiap folder di session/auth/
  6. Test kirim pesan via POST /api/send-message dengan instance yang aktif

Checklist sebelum push ke v3

  • npx tsc --noEmit lolos (exit 0)
  • Tidak ada console.log debug tambahan di diff
  • Tidak ada perubahan .env dengan kredensial nyata
  • Tidak ada perubahan bentuk payload webhook tanpa koordinasi backend
  • Tidak ada perubahan event Socket.IO tanpa koordinasi frontend
  • Tidak ada perubahan instanceId konsistensi (folder, Map key, room, kolom id)
  • Commit message jelas, Bahasa Indonesia, prefix sesuai konvensi

Runbook failure

MongoDB down

  1. Cek pm2 logs engine-dazo — cari Mongodb Error Connection
  2. connectDB process.exit(1) saat gagal — service akan restart otomatis via PM2 (jika tidak exit repeatedly)
  3. Pulihkan MongoDB
  4. PM2 auto-restart setelah MongoDB pulih (PM2 restart pada crash)
  5. Verifikasi sesi di-restore setelah restart

Sesi tidak ter-restore

  1. Cek folder session/auth/ di server — pastikan masih ada
  2. Cek log wa-logs.txt — cari [INIT] Gagal memuat sesi <instanceId>
  3. Restart PM2: sudo pm2 restart engine-dazo
  4. Jika masih gagal, hapus folder sesi bermasalah dan minta pemilik device scan QR ulang

Baileys disconnect berulang

  1. Cek log untuk Connection closed. Reconnecting: true
  2. Baileys auto-reconnect — tunggu beberapa menit
  3. Jika loggedOut, sesi dihapus dari memory dan filesystem — device butuh scan QR ulang
  4. Verifikasi koneksi internet server stabil (WhatsApp butuh koneksi persisten)

Webhook ke backend gagal

  1. Cek WEBHOOK_URL di .env server — pastikan menunjuk ke backend yang benar
  2. Cek log — cari Gagal mengirim webhook:
  3. Verifikasi backend reachable: curl -X POST {WEBHOOK_URL}/callback_message
  4. Jika WEBHOOK_URL mengandung webhook-test, webhook sengaja dilewati (mode dummy)

Log prefixes

Prefix/SumberMakna
Pino (wa-logs.txt)Log Baileys per sesi, tagged {session: "<instanceId>"}
console.log tercecerDebug 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