engine-bot punya dua workflow GitHub Actions — satu untuk staging, satu untuk produksi. Keduanya memakai self-hosted runner dan PM2 untuk restart app + worker.
Dua workflow
| Workflow | File | Trigger | Runner | Target |
|---|---|---|---|---|
| Staging | deploy_staging.yml | push ke staging | self-hosted, staging | Staging |
| Production | deploy_production.yml | push ke master | self-hosted, production | Produksi |
Alur workflow
Kedua workflow identik structur — hanya berbeda branch, runner, project dir var, dan PM2 service name:
1. checkout repo
2. cd $PROJECT_DIR → git fetch --all → git reset --hard origin/<branch>
3. npm install --legacy-peer-deps
4. PM2 restart app (jika ada) atau PM2 start (first run)
5. PM2 restart worker (jika ada) atau PM2 start (first run)PM2 service name
| Environment | App | Worker | Project dir var |
|---|---|---|---|
| Staging | engine-bot-dev | worker-followupai-dev | vars.PROJECT_DIR_DEVELOPMENT |
| Production | engine-bot-dazo | worker-followupai | vars.PROJECT_DIR_PRODUCTION |
Langkah workflow detail (production)
# deploy_production.yml
- name: Fetch and hard reset master
run: |
cd ${{ vars.PROJECT_DIR_PRODUCTION }}
git fetch --all
git reset --hard origin/master
- name: Install dependencies
run: npm install --legacy-peer-deps
- name: Restart app
run: |
if sudo pm2 list | grep -q 'engine-bot-dazo'; then
sudo pm2 restart engine-bot-dazo
else
sudo pm2 start ${{ vars.PROJECT_DIR_PRODUCTION }}/app.js --name engine-bot-dazo
fi
if sudo pm2 list | grep -q 'worker-followupai'; then
sudo pm2 restart worker-followupai
else
sudo pm2 start ${{ vars.PROJECT_DIR_PRODUCTION }}/scheduler/worker/worker.js --name worker-followupai
fiCaveats
| Caveat | Dampak |
|---|---|
npm install --legacy-peer-deps | package-lock.json di-ignore — install tidak reproducible, versi dependency bisa drift |
Step install tanpa working-directory | Step npm install mungkin resolve ke path runner home, bukan project dir |
Tidak ada node --check gate | Syntax error baru terlihat saat PM2 start crash |
npm test tidak ada | Tidak ada regression test di CI |
| First-start PM2 path | Saat PM2 first-start (service belum ada), path $PROJECT_DIR di-resolve dari GitHub vars — pastikan var ter-set |
config/env.js gitignored | File tidak ter-deploy via git — harus ada di server manual |
Yang TIDAK boleh diubah tanpa koordinasi
| Area | Lokasi |
|---|---|
jwtSecret | config/env.js — wajib sync dengan dazoapp + backend-go |
urlEngine, urlApi, base_url | config/env.js — URL service eksternal |
TOKEN_SEND_MESSAGE, BASE_URL_SEND_MESSAGE | config/env.js — messaging API contract |
apiKey_RajaOngkirV2 | config/env.js — RajaOngkir API key |
Aturan operasi git
- Jangan commit, push, atau merge tanpa diminta eksplisit
- Pisahkan commit pembenahan dari commit fitur
- Sebelum push ke
master, pastikannode --checklolos untuk file yang berubah - Jangan ubah
jwtSecrettanpa koordinasi dengandazoapp - Jangan commit
config/env.jsdengan kredensial nyata — file ini gitignored
Langkah berikutnya
- Detail PM2 process? Baca Deployment.
- Setup environment? Baca Environment.
- Known issues CI? Baca Tech Debt.