Configuration အလွှာနှစ်ခု
- Base process env — DB_*၊ Redis၊ MODE၊ path များ (base/backend/.env သို့မဟုတ် Compose); process.env ဖြင့် ဖတ်ပါသည်
- Plugin Env (@InjectEnv) — လက်ရှိ plugin နှင့် scoped key/value; boot တွင် Postgres မှ load; ERP env UI / /env API မှ ပြင်နိုင်ပါသည်
- Secret များကို git ထဲ မထည့်ရပါ — .env (local) သို့မဟုတ် env table (runtime)
- Base process-env စာရင်း အပြည့် — Environment variables ကို ကြည့်ပါ
Base environment (.env)
Base app နှင့် worker များအတွက် infrastructure connection setting ဖြစ်ပါသည်။ များသောအားဖြင့် base/backend/.env နှင့် Docker Compose မှ လာပါသည်။ သော့ အပြည့်အစုံအတွက် Environment variables ကို ဖွင့်ကြည့်ပါ။
- DB_HOST, DB_PORT, DB_USERNAME, DB_PASSWORD, DB_SCHEMA — Postgres
- DB_SYNC — optional TypeORM synchronize (dev သာ)
- REDIS_HOST, REDIS_PORT, REDIS_PASSWORD — cache၊ queue၊ BullMQ cron
- Compose တွင် DB_HOST သည် များသောအားဖြင့် service name db
- Host ပေါ်မှ local psql / module seed အတွက် localhost / 127.0.0.1
1DB_HOST=db
2DB_PORT=5432
3DB_USERNAME=postgres
4DB_PASSWORD=postgres
5DB_SCHEMA=quan_erp
6DB_SYNC=false
7REDIS_HOST=redis
8REDIS_PORT=6379
9REDIS_PASSWORD=@InjectEnv
Module၊ service၊ workflow node စသည်တွင် Env helper ကို inject လုပ်ရပါသည်။ Instance သည် လက်ရှိ plugin နှင့် scoped ဖြစ်ပါသည်။
1import {
2 Env,
3 InjectEnv,
4 Module,
5 OnInit,
6 Service,
7} from "@quan-erp/shared-backend-core";
8import metadata from "../../module.metadata.json" with { type: "json" };
9
10@Service()
11export class PaymentConfigService {
12 @InjectEnv()
13 private env: Env;
14
15 getApiKey() {
16 return this.env.get("API_KEY");
17 }
18}
19
20@Module({
21 name: metadata.name,
22 providers: [PaymentConfigService],
23 controllers: [],
24 entities: [],
25})
26export class MyPluginModule {
27 @InjectEnv()
28 env: Env;
29
30 @OnInit()
31 async init() {
32 // seed defaults — see below
33 }
34}Env API
- get(key) — plugin-scoped value ဖတ်ပါသည် (secret များကို decrypt)
- set(key, value, options?) — ရေးပါသည်; InjectEnv default: { isPublic: false, sync: true, isSecret: false }
- sync() — in-memory registry ကို env table သို့ persist လုပ်ပါသည်
- onChanged(key, callback) — key ပြောင်းလျှင် react လုပ်ပါသည်
- clear() — ဤ plugin ၏ env များကို ဖျက်ပါသည်
- all() — ဤ plugin အတွက် key အားလုံး
1import { Env, InjectEnv, OnInit, Service } from "@quan-erp/shared-backend-core";
2
3@Service()
4export class IntegrationSettingsService {
5 @InjectEnv()
6 private env: Env;
7
8 @OnInit()
9 async init() {
10 if (!this.env.get("API_BASE_URL")) {
11 await this.env.set("API_BASE_URL", "https://api.example.com", {
12 isPublic: true,
13 isSecret: false,
14 sync: true,
15 });
16 }
17
18 if (!this.env.get("API_KEY")) {
19 await this.env.set("API_KEY", "", {
20 isPublic: false,
21 isSecret: true,
22 sync: true,
23 });
24 }
25
26 this.env.onChanged("API_KEY", () => {
27 // reload clients that cache the key
28 });
29 }
30
31 async rotateKey(next: string) {
32 await this.env.set("API_KEY", next, {
33 isSecret: true,
34 sync: true,
35 });
36 }
37}set() options
- sync — Postgres သို့ ချက်ချင်း ရေးပါသည်
- isPublic — GET /env/public တွင် ဖော်ပြပါသည်
- isSecret — at rest encrypt; listing တွင် mask လုပ်ပါသည်
- API key / token / password အတွက် isSecret: true
- UI က owner မလိုဘဲ ဖတ်ရမည့် non-sensitive value အတွက်သာ isPublic: true
Persistence & boot
Startup တွင် core က env table မှ load လုပ်ပါသည်။ set({ sync: true }) သို့မဟုတ် env.sync() ဖြင့် EnvService မှတဆင့် persist လုပ်ပါသည်။
- Table: env (EnvEntity) — pluginName, key, value, isPublic, isSecret
- Boot: PluginEnvConfigManager.loadFromDB()
- Secret များကို encrypt သိမ်းပါသည်; get() က decrypt လုပ်ပါသည်
- Admin UI / API bulk update ပြီး restart status broadcast နိုင်ပါသည်
HTTP surface (core)
- GET /env — owner; secret mask
- GET /env/public — isPublic: true သာ
- GET /env/db — owner; EnvService raw rows
- PUT /env — key တစ်ခု set + sync
- PUT /env/many — bulk set ပြီး syncToDB
- Plugin code တွင် @InjectEnv() ကို အသုံးပြုရပါသည် — HTTP route မခေါ်ရပါ
မည်သည့်အချိန်တွင် မည်သည်ကို သုံးမည်
- process.env / .env — host၊ port၊ Redis၊ Compose၊ @Database options
- @InjectEnv — redeploy မလုပ်ဘဲ ERP UI မှ ပြင်သော per-plugin setting
- DeveloperConfigService — typed developer config (Env နှင့် မတူပါ)
- SettingEntity / SettingService — user/system setting UI (Env နှင့် မတူပါ)
Local-only လုပ်ဆောင်ချက်များ
DB_* ကို .env မှ ဖတ်သော module seed စသည်တို့သည် local/dev host (localhost / 127.0.0.1) သို့သာ ဖြစ်ပါသည်။ UAT / production တွင် မလုပ်ရပါ။
- Local INSERT pattern အတွက် Module seed ကို ကြည့်ပါ
- DB_HOST က remote UAT/prod ဖြစ်လျှင် ရပ်ရပါသည်
Package version များ
Plugin package.json ရှိ @quan-erp/* version များကို base / shared-backend-core နှင့် ကိုက်အောင် ထားရပါသည်။
Checklist
- Infrastructure secret များကို base/backend/.env တွင် ထားရပါသည်
- @InjectEnv() ကို property ပေါ်တွင် သုံးရပါသည် (constructor မရပါ)
- @OnInit တွင် missing key များကို isPublic / isSecret / sync ဖြင့် seed လုပ်ရပါသည်
- API key များကို isSecret: true
- ဘေးကင်းသော UI value အတွက်သာ isPublic
- Restart ခံနိုင်အောင် sync() သို့မဟုတ် sync: true