D
Setup

Deployment

Branch produksi v3 memicu dua job paralel — deploy_api (Go binary via systemd) dan deploy_cron (Node engine via PM2) di host terpisah. Push langsung mengenai produksi.

Branch dan workflow

BranchWorkflowRunnerTargetBinary
v3deploy_production.ymlself-hosted productionProduksidazo
stagingdeploy_staging.ymlself-hosted stagingStagingdazodev

Branch produksi adalah v3, bukan main. main ada di repo tapi tidak digunakan untuk deploy.

Produksi — dua job paralel

deploy_production.yml menjalankan dua job terpisah di host berbeda:

deploy_api — host api

bash
cd $PROJECT_DIR_PRODUCTION
git fetch --all
git reset --hard origin/v3      # DESTRUCTIVE — perubahan server hilang
go mod tidy
go build -o dazo main.go        # binary: dazo

# restart systemd
sudo systemctl restart dazo     # atau start jika belum jalan
sudo systemctl status dazo --no-pager

deploy_cron — host cron

bash
cd $PROJECT_DIR_CRON_PRODUCTION
git fetch --all
git reset --hard origin/v3

# restart PM2 workers (loop dari vars.SERVICE_NAME_PROD)
for cron_name in "${cron[@]}"; do
  if sudo pm2 describe "$cron_name" > /dev/null 2>&1; then
    sudo pm2 restart "$cron_name"
  else
    sudo pm2 start "$PROJECT_DIR_PRODUCTION/engine/$cron_name.js" --name "$cron_name"
  fi
done

Staging — satu job

deploy_staging.yml menjalankan di runner self-hosted, staging:

bash
cd $PROJECT_DIR_DEVELOPMENT
git fetch --all
git reset --hard origin/staging
go mod tidy
go build -o dazodev main.go     # binary: dazodev

cd engine/ && npm i             # Node engine di mesin yang sama

sudo systemctl restart dazodev  # systemd

# PM2 restart loop (vars.SERVICE_NAME_DEV)

Di staging, Go API + Node engine satu mesin.

Apa yang dilakukan workflow (ringkasan)

Langkahstagingproduksi (api)produksi (cron)
git fetch --all + reset --hard✅✅✅
go build✅ → dazodev✅ → dazo❌
npm i (engine)✅❌❌
Restart systemd✅ dazodev✅ dazo❌
Restart PM2✅❌✅

Aturan operasi git

  • Jangan commit, push, atau merge tanpa diminta eksplisit
  • Pisahkan commit pembenahan dari commit fitur
  • Sebelum push ke v3, pastikan go build dan go vet lolos lokal
  • Jangan ubah JWT_SECRET tanpa koordinasi dengan dazoapp

Setup server — yang tidak terlihat dari repo

Dua blocker yang membuat service gagal jalan di server baru:

  1. handlers/environtment.go — gitignored. Harus dibuat manual dengan konstanta produksi. Lihat Environment.
  2. .env — wajib GO_ENV=production + seluruh kredensial. JWT_SECRET harus sama dengan dazoapp.
  3. systemd unit — dazo.service (produksi) / dazodev.service (staging) harus terpasang. Tidak ada template di repo.
  4. PM2 service — semua cron_*.js harus pernah di-start manual sekali untuk menghindari bug path first-start.

Setelah deploy

Verifikasi cepat:

  1. sudo systemctl status dazo — pastikan active (running)
  2. curl http://localhost:8081/ — harus balas {"Dazo":"App"}
  3. Cek logs/ — cari error Zap
  4. Test satu endpoint ter-auth (mis. POST /v1/chat_list dengan Bearer token)
  5. Verifikasi PM2: pm2 status — semua cron_* harus online

Checklist sebelum push ke v3

  • go build lolos lokal
  • go vet ./... bersih
  • Tidak ada log.Println / debug tambahan di diff
  • Tidak ada perubahan handlers/environtment.go (gitignored — tidak akan ter-deploy)
  • Tidak ada perubahan JWT_SECRET atau payload token tanpa koordinasi dazoapp
  • Tidak ada perubahan URL service (EngineUri, dll.) tanpa koordinasi tim
  • Commit message jelas, terpisah antara fitur dan pembenahan

Langkah berikutnya