Тохиргоо (env)¶
Бүх тохиргоо орчны хувьсагчаар дамжина. Эх жишээ:
backend/.env.example.
Secret-ийг хэзээ ч commit хийж болохгүй
backend/.env, root .env болон backend.env нь
gitignore-д багтсан. Шинэ env хувьсагч нэмбэл README-д баримтжуул,
утгыг нь биш.
Суурь¶
| Хувьсагч | Жишээ | Тайлбар |
|---|---|---|
PORT |
8080 |
API сонсох порт |
ENVIRONMENT |
production |
production үед хатуу горим асна |
DEBUG |
false |
Дэлгэрэнгүй лог |
ALLOWED_ORIGINS |
https://open.gerege.mn |
CORS allow-list (таслалаар; * хориотой) |
TRUSTED_PROXIES |
— | Reverse proxy-ийн IP-ууд |
Өгөгдлийн сан ба Redis¶
| Хувьсагч | Тайлбар |
|---|---|
DB_POSTGRE_DSN / DB_POSTGRE_URL |
Холболтын мөр |
DB_MAX_OPEN_CONNS, DB_MAX_IDLE_CONNS, DB_CONN_MAX_LIFE_MINS |
Pool тохиргоо |
REDIS_HOST, REDIS_PASS, REDIS_EXPIRED |
Redis холболт ба TTL |
Production дээр DSN нь sslmode=verify-full байх ёстой
Production guard үүнийг шаарддаг. Docker compose стек нь зориудаар
ENVIRONMENT=development-оор ажилладаг — дотоод DB нь TLS-гүй.
API нь superuser-ээр холбогдож БОЛОХГҮЙ
RLS үйлчлэхийн тулд app нь хамгийн бага эрхтэй role-оор холбогдоно.
Superuser / BYPASSRLS бол production дээр асахаас татгалзана.
JWT ба session¶
| Хувьсагч | Тайлбар |
|---|---|
JWT_SECRET |
≥32 тэмдэгт. Солих нь бүх session-ийг хүчингүй болгоно |
JWT_EXPIRED, JWT_REFRESH_EXPIRED |
Access / refresh хугацаа |
JWT_ISSUER |
Ихэвчлэн апп-ын домэйн. Солиход одоо байгаа бүх токен хүчингүй болно |
eID (Relying Party)¶
| Хувьсагч | Тайлбар |
|---|---|
EID_BASE_URL |
eID Mongolia /v3 суурь (эсвэл SSO-ийн sign relay) |
EID_RP_UUID, EID_RP_SECRET |
RP-ийн креденшл |
SIGN_RELAY_TOKEN |
Гарын үсгийн зуучлалын хуваалцсан токен (хоосон = унтраалттай) |
Gerege SSO (RP тал — энэ апп нь client)¶
| Хувьсагч | Жишээ | Тайлбар |
|---|---|---|
SSO_ISSUER |
https://sso.gerege.mn |
Хоосон бол энэ утга руу default-лана |
SSO_CLIENT_ID / SSO_CLIENT_SECRET |
— | Хоосон бол SSO урсгал идэвхгүй |
SSO_REDIRECT_URI |
https://open.gerege.mn/sso/callback |
SSO client дээр яг ийм байдлаар бүртгэгдсэн байх ёстой |
SSO_SCOPE |
openid profile email nationalid |
nationalid нь иргэний дугаар нэмнэ |
SSO_NATIVE_CLIENT_ID |
— | Мобайл (PKCE, public) урсгалын client |
SSO_EID_PROXY_BASE_URL |
— | Тохируулбал eID PKI самбар SSO proxy-гоор явна |
Client бүртгэгдээгүй бол invalid_client
SSO_CLIENT_ID нь SSO провайдерын client санд байхгүй бол authorize алхам
{"error":"invalid_client"} буцаана. Redirect URI ч мөн яг тааруулна.
OIDC provider тал (энэ апп өөрөө provider болох)¶
| Хувьсагч | Тайлбар |
|---|---|
OAUTH_ISSUER |
Жишээ https://open.gerege.mn. Тохируулсан үед л provider асна |
SSO_STATE_KEY |
login/consent урсгалын transient state HMAC түлхүүр (≥32 байт) |
SSO_FIRSTPARTY_CLIENTS |
Зөвшөөрөл алгасах first-party client-ууд |
SSO_ADMIN_API_KEYS, SSO_ADMIN_SUBS |
Admin API хандалт |
Нэвтрэх гадаргуу (AUTH_MODE)¶
Платформ өөрөө нэвтрүүлэх үү, эсвэл дээд SSO руу шилжүүлэх үү гэдэг нь кодын ялгаа биш — энэ ганц хувьсагч шийднэ:
| Утга | Нүүр хуудас ба /login дээр |
|---|---|
provider |
Нэвтрэх карт (eID РД/QR · Google) энд гарна |
client |
Дээд SSO (SSO_ISSUER) руу шилжүүлнэ |
AUTH_MODE=client # энэ template-ийн жишиг deploy — SSO-ийн relying party
AUTH_MODE=provider # sso.dgov.mn / sso.gerege.mn маягийн танилтын үйлчилгээ
Хоосон орхивол SSO_CLIENT_ID бүртгэгдсэн эсэхээс автоматаар гарна —
иймд одоо ажиллаж буй deploy-д энэ мөрийг нэмэх шаардлагагүй.
Үсгийн алдаа нь чимээгүй уналт БИШ
Танигдахгүй утга өгвөл backend эхлэхээс татгалзана. Эс бөгөөс платформ хүлээгдэж байснаас өөр нэвтрэх гадаргуутай чимээгүй асах байсан.
OAUTH_ISSUER-ээс ТУСДАА тэнхлэг
OAUTH_ISSUER нь «энэ платформ бусад аппыг нэвтрүүлэх issuer мөн үү»,
AUTH_MODE нь «энэ платформын хэрэглэгч хаана нэвтрэх вэ». Хоёулаа
зэрэг идэвхтэй байж болно — платформ өөрөө токен олгохын зэрэгцээ өөрийн
хэрэглэгчээ дээд IdP руу илгээх гинжин байдал.
Frontend нь горимоо нийтийн GET /api/v1/site/auth-аас уншина (нэвтрэлт
шаардахгүй, нууц утга агуулахгүй) — иймд frontend талд давхардсан env байхгүй.
Интерфэйсийн хэл¶
Платформ Монгол + НҮБ-ийн албан ёсны 6 хэлээр (араб · хятад · англи · франц · орос · испани) багцлагдсан орчуулгатай ирнэ. DB хоосон байхад ч, орчуулгын нэмэлт алхамгүйгээр долоон хэл шууд ажиллана.
Араб хэлэнд <html dir="rtl"> автоматаар тохируулагдана.
| Хувьсагч | Тайлбар |
|---|---|
| — | Тохиргоо шаардахгүй; хэлүүд languages хүснэгтэд is_builtin -ээр ирнэ |
Нэмэлт хэл хэрэгтэй бол super admin нь Хэл хэсгээс нэмж, орчуулгыг нь Gemini-ээр бөглөнө — тэдгээр нь DB-д overlay болж хадгалагдана.
Гуравдагч тал ба хадгалалт¶
| Хувьсагч | Тайлбар |
|---|---|
GEMINI_API_KEY |
AI pipeline. Байхгүй бол /ai/* жинхэнэ 500 өгнө |
GOOGLE_CLIENT_ID / SECRET |
Google холболт (хоосон бол товч харагдахгүй) |
VERIFY_API_BASE, VERIFY_API_KEY, VERIFY_CHANNEL |
Иргэн/байгууллага лавлах |
XYP_API_BASE, XYP_CLIENT_ID, XYP_CLIENT_SECRET |
Улсын бүртгэлийн лавлагаа |
GSPACE_* |
Апп-ын өөрийн SFTP хадгалалт (хэрэглэгч тус бүр квоттой) |
INTEGRATION_ENC_KEY |
≥16 байт. OAuth токен + super admin MFA-г шифрлэнэ |
INTEGRATION_ENC_KEY заавал шаардлагатай
Deploy хийхэд энэ түлхүүр заавал байх ёстой, ба нэгэнт тавьсны дараа хэзээ ч солигдож болохгүй — өмнө шифрлэсэн бүх өгөгдөл эвдэрнэ.
Ажиглалт (observability)¶
| Хувьсагч | Тайлбар |
|---|---|
OTEL_EXPORTER, OTEL_SAMPLE_RATIO |
OpenTelemetry trace |
OBSERVABILITY_TOKEN |
Production дээр /metrics ба /swagger-ийг хаах bearer token |
Frontend¶
| Хувьсагч | Тайлбар |
|---|---|
BACKEND_URL |
BFF-ээс backend руу залгах дотоод хаяг (жишээ http://api:8080) |
Хуваалцсан сүлжээнд api нэр давхцаж болзошгүй
Олон стек нэг Docker сүлжээнд байвал http://api:8080 өөр контейнер руу
зохирч, бүх /api/v1/* 404 болж мэднэ. Тухайн үед BACKEND_URL-ээ
өөрийн api контейнерийн бүтэн нэрээр pin хий.