Menjalankan backend-go butuh dua proses terpisah: Go API (HTTP server) dan Node engine (cron + BullMQ worker). Keduanya berbagi MongoDB, tapi tidak saling memanggil langsung.
Menjalankan Go API
# dengan hot reload (rekomendasi)
air
# atau langsung
go run main.goGo API listens di 0.0.0.0:<PORT> (default :8081, lihat main.go:62).
Air — hot reload
Konfigurasi Air di .air.toml:
| Pengaturan | Nilai | Efek |
|---|---|---|
cmd | go build -o ./tmp/main.exe . | Build ke tmp/ |
bin | tmp\main.exe | Binary yang dijalankan |
exclude_dir | assets, tmp, vendor, testdata, engine, node_modules | Folder tidak di-watch |
include_ext | go, tpl, tmpl, html | Ekstensi yang memicu rebuild |
Folder engine/ sengaja di-exclude — Node engine punya proses sendiri.
Menjalankan Node engine
Node engine ada di engine/, dijalankan per-worker:
cd engine
npm install
# jalankan tiap worker (terminal terpisah atau PM2)
node cron_mdv2.js # outbox polling → WA gateway :5002
node cron_botV2.js # chatbot automation
node cron_broadcast.js # broadcast scheduler
# dll.Mengelola via PM2 (opsional)
Untuk menjalankan semua worker sekaligus:
pm2 start engine/cron_mdv2.js --name cron_mdv2
pm2 start engine/cron_botV2.js --name cron_botV2
# dll.
pm2 statusVerifikasi setelah mengubah kode
Tidak ada CI test. Setelah mengubah kode, jalankan:
go build -o /dev/null . # compile check (tidak menghasilkan binary)
go vet ./... # static analysisService eksternal — batasan lokal
Go API bergantung pada beberapa service eksternal:
| Service | Konstanta | Port | Fungsi |
|---|---|---|---|
| WhatsApp gateway | EngineUri | :5002 | Terima callback_message, kirim pesan via submitPoint |
| CRM engine | EngineUriCRM | :5003 | Update chatlist, broadcast CRM |
| Chatbot engine | EngineBot | :1313 | AI agent dispatch |
| MongoDB | — | :27017 | Datastore primer |
| Redis | — | (Node engine) | BullMQ queue |
| AWS S3 | AWS_* | — | Upload file |
Apa yang bisa dites tanpa WA gateway
| Fitur | Bisa? | Catatan |
|---|---|---|
| Auth JWT validasi | Ya | Butuh token dari dazoapp |
| CRUD chat (baca inbox/list) | Ya | Butuh MongoDB berisi data |
Submit pesan (write chat_outbox) | Ya | Tapi pesan tidak terkirim tanpa Node engine |
| Upload S3 | Ya | Butuh kredensial AWS valid |
| Broadcast scheduler | Ya | Tapi fan-out gagal tanpa WA gateway |
Apa yang TIDAK bisa dites tanpa service ini
| Fitur | Service yang dibutuhkan |
|---|---|
| Pesan benar-benar terkirim ke WA | WA gateway :5002 + Node engine (BullMQ worker) |
| Inbound message dari WA | WA gateway memanggil POST /v1/callback_message |
| Chatbot auto-reply | Chatbot engine :1313 |
| Broadcast fan-out | WA gateway :5002 |
Tenant CRM — batasan krusial
mongo.ConnectCrmDB() dikomentari di main.go:50-53 — artinya mongo.MongoClientCrm nil. Semua route _crm yang menyentuh CRM DB akan panic.
Untuk testing lokal: hindari route _crm, atau uncomment ConnectCrmDB() + sediakan MongoDB crm_dazo terpisah. Lihat Multi-tenant dan Tech Debt.
Debug
- Log Zap ke file di
logs/(rotasi via lumberjack). Lihatlogger/logger.go. mongo.go:57log URI MongoDB beserta password saat startup — known issue, jangan andalkan ini untuk debug produksi.- Handler memakai
log.Println/logger.Logad-hoc. Tidak ada request-ID middleware.
Struktur direktori utama (non-engine)
main.go # entry: Fiber + Mongo + routes
config/config.go # Viper .env
routes/routes.go # POST /v1/* + JWT middleware
handlers/ # 23 file, ~15.650 baris — fat handlers
models/ # 28 file: mongo_*.go (BSON) + legacy GORM
mongo/mongo.go # koneksi MongoDB per GO_ENV
middlewares/ # VerifyToken
internal/service/ # CS rotator
utils/ # validasi, Spintax, rate limiter
logger/ # Zap + lumberjackLangkah berikutnya
- Siap deploy? Baca Deployment — branch produksi
v3, ada 2 job paralel. - Akan kerja fitur? Wajib baca Multi-tenant sebelum menyentuh handler.