Агуулгыг алгасах

Тохиргоо (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 хий.