engine-whatsapp punya dua workflow GitHub Actions — satu untuk staging, satu untuk produksi. Keduanya memakai self-hosted runner dan PM2 untuk restart app.
Dua workflow
| Workflow | File | Trigger | Runner | Target |
|---|---|---|---|---|
| Staging | deploy_staging.yml | push ke staging | self-hosted, staging | Staging |
| Production | deploy_production.yml | push ke v3 | self-hosted, production | Produksi |
Alur workflow
Kedua workflow identik struktur — hanya berbeda 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 sudah ada)PM2 service name
| Environment | App | Project dir |
|---|---|---|
| Staging | engine-dazo-dev | /home/deployer/app/engine-whatsapp |
| Production | engine-dazo | /var/www/engine-whatsapp |
Langkah workflow detail (production)
# .github/workflows/deploy_production.yml
name: Deploy to Staging # ← salah label, target sudah benar (production)
on:
push:
branches:
- v3
jobs:
deploy:
runs-on: [self-hosted, production]
steps:
- 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..."Build step
# package.json scripts
"dev": "tsx src/app.ts"
"build": "tsc && resolve-tspaths --out ./dist"
"start": "node dist/app.js"npm run build menjalankan:
tsc— compile TypeScript kedist/resolve-tspaths --out ./dist— resolve path alias*→src/*di output
NODE_OPTIONS=--max-old-space-size=4096 menaikkan heap limit Node ke 4GB untuk mencegah OOM saat compile (TypeScript + resolve-tspaths).
Caveats
| Caveat | Dampak |
|---|---|
| Salah label workflow | deploy_production.yml bernama “Deploy to Staging” — target deploy sudah benar, hanya nama yang keliru |
| First-start tidak ditangani | if grep -q hanya restart jika service sudah ada — deploy pertama ke server baru butuh SSH manual untuk pm2 start |
Tidak ada npx tsc --noEmit gate | Syntax/type error baru terlihat saat PM2 start crash |
| Tidak ada automated test | Tidak ada regression test di CI |
.env tidak ter-deploy | File gitignored — harus ada di server manual dengan kredensial produksi |
session/auth/ tidak ter-deploy | Folder gitignored — kredensial sesi tetap di server |
npm install tanpa lockfile tracked | package-lock.json ada di repo tapi tidak di-gitignore (beda dari engine-bot) |
Yang TIDAK boleh diubah tanpa koordinasi
| Area | Lokasi |
|---|---|
| Bentuk payload webhook | src/utils/helper.ts — sendWebhook |
WEBHOOK_URL | .env — base URL backend Dazo |
| Event Socket.IO | src/service/socketService.ts, src/service/notificationService.ts |
Field instanceId konsistensi | folder session/auth/, key Map, room Socket.IO, kolom id device |
Aturan operasi git
- Jangan commit, push, atau merge tanpa diminta eksplisit
- Pisahkan commit pembenahan dari commit fitur
- Sebelum push ke
v3, pastikannpx tsc --noEmitlolos (exit 0) - Jangan ubah bentuk payload webhook tanpa koordinasi backend
- Jangan ubah event Socket.IO tanpa koordinasi frontend
- Jangan commit
.envdengan kredensial nyata — file ini gitignored
Konvensi pesan commit (Bahasa Indonesia, prefix titik dua dengan spasi):
feat : deskripsi fitur baru
fix : deskripsi perbaikan
log : penambahan logging
conf: perubahan konfigurasi
style: perubahan gaya/formatLangkah berikutnya
- Detail PM2 process? Baca Deployment.
- Setup environment? Baca Environment.
- Known issues CI? Baca Tech Debt.