ЦЗ Цахим Засаг
GitHub Нэвтрэх

open.dgov.mn — Цахим Засаг

Репо: gerege-systems/open-dgov-mn · Байрлуулалт: /opt/open-dgov-mn/ · Брэнд: Засгийн газрын нээлттэй суурь платформ / The Government's Open Platform

Иргэн, албан хаагчийн харах орчин: төрийн байгууллага өөрийн үйлчилгээгээ дээр нь босгодог суурь. Gerege Nexus цөмийн Түвшин 2 distribution — цөм нь хамаарал, дээр нь энэ байрлуулалтын өөрийн Go модулиуд.

Энэ репо 2026-08-17 хүртэл Түвшин 1 — тохиргоо л — байсан. «Өөрийн модуль хэрэгтэй болох өдөр Түвшин 2 болно» гэж бичсэн, тэр өдөр нь ирсэн. Өөрчлөгдөөгүй зүйл: цөмийн код энд нэг ч мөр байхгүй, go.mod-ын нэг мөр л байна.

Юу нь юу вэ

main.go                       цөмийг асаахдаа өөрийн модулиудаа бүртгэнэ
modules/zarlal                байгууллагын доторх зарлал — эхний өөрийн модуль
migrations/                   тэдний хүснэгтүүд, өөрийн goose түүхэнд
catalog/                      тэдний апп сторын бичилт, манифест
deploy/Dockerfile             өөрийн backend образ (цөм + эдгээр модулиуд)
deploy/compose.dgov.yml       цөмийн compose дээрх давхарга
.env.example                  бүх тохиргоо, тайлбартайгаа
brand/                        лого, өнгө, landing page-ийн үгс
nginx/open.dgov.mn.conf       vhost: бүрхүүл, API, OIDC, брэндийн зураг
deploy.sh                     образуудыг татаж стекийг солино
first-admin.sh                эхний байгууллага, эхний админ

Compose файлыг энд хуулж тавихгүй байгаа нь санаатай: хуулбар бол цөмөөс чимээгүй хоцрох арга. deploy.sh нь цөмийн docker-compose.prod.yml-ийг CORE_REF дээр түгжигдсэн commit-оос татаж, дээр нь deploy/compose.dgov.yml давхаргыг тавина.

Ямар аппууд ажиллаж байна

Төрийн үйлчилгээний дэлгэцүүд цөмийнх — энд хуулагдаагүй, зөвхөн каталогт бүртгэгдсэн:

Апп ID Зам Юу хийдэг
Байгууллага io.gerege.nexus.organisation /organisation Хуулийн профайл, хэлтэс нэгж, ажилтнууд
Цахим Засгийн холбоос io.gerege.nexus.egov /egov ХУР-ын иргэн/хуулийн этгээдийн лавлагаа, eID ба ДАН сувгийн төлөв, лавлагааны түүх
Баримт бичиг io.gerege.nexus.documents /documents Цахим баримт, батламжийн урсгал, PAdES гарын үсэг
Тайлан io.gerege.nexus.reports /reports Тайлан, экспорт, хуваалцах холбоос
Өртөө io.gerege.nexus.urtuu /urtuu Суулгац хоорондын гарын үсэгтэй мессежийн ринг
SSO клиентүүд io.gerege.nexus.sso_clients /sso-clients OAuth2 клиентийн бүртгэл
Зарлал mn.dgov.zarlal /module/zarlal Энэ репогийн өөрийн модуль

Каталогт байх нь суулгасан гэсэн үг биш: тенант бүрээр суулгацын мөр байхгүй бол API 403 хариулна, цэсэнд ч гарахгүй (Платформын чадвар).

Зарлал — эхний өөрийн модуль

Байгууллагын доторх зарлал: гарчиг, их бие, наасан эсэх, дуусах хугацаа.

GET    /api/v1/dgov/zarlal        жагсаалт      zarlal.read
POST   /api/v1/dgov/zarlal        нийтлэх       zarlal.manage
DELETE /api/v1/dgov/zarlal/{id}   буцаан татах  zarlal.manage

Эрхийн загвар нь энгийн: RoutePermissionPrefix() буцаасны дараа платформ GET-ийг zarlal.read-ээр, өөрчлөлт хийх бүх хүсэлтийг zarlal.manage-ээр хаана. Суулгах үед .read-ийг гишүүн бүр, .manage-ийг админ авна — зарлалыг бүгд уншиж, цөөхөн хүн нийтэлдэг гэсэн үг.

Дэлгэц нь өнөөдөр орлуулагч. Бүрхүүл бол нэг образ, бүх суулгацад үйлчилдэг тул distribution өөрийн дэлгэцээ аваачих механизм байхгүй. Модулийн API ажиллана, цэсэнд гарна, харин хуудас нь «Тун удахгүй». Жинхэнэ дэлгэц хэрэгтэй бол тэр нь цөмийн бүрхүүлд нэмэгдэнэ.

Шинэ модуль нэмэх

  1. modules/<нэр>/<нэр>.go — nexus.Module-ийн долоон метод, New(p) дотор nexus.Register(m);
  2. migrations/0000N_<нэр>.sql — хүснэгтүүд, доор нь tenant_isolation бодлого. Цөмийн 00029 нь тухайн үед байсан хүснэгтүүд дээр л ажилласан тул шинэ хүснэгт бүр өөрийн бодлогыг өөртөө авч явна;
  3. catalog/apps.json + catalog/manifests/<slug>.json — эдгээргүй бол модуль бинарт байгаа боловч хэн ч суулгаж чадахгүй;
  4. main.go-д нэг мөр: <нэр>.New(p).

go test ./... нь каталог, бинар хоёр зөрсөн эсэхийг хэлнэ — тэр зөрөө нь production дээр чимээгүй унадаг цорын ганц зүйл.

Стек

Хостын хажууд sso.dgov.mn ажилладаг тул контейнер бүр нэрээ хэлдэг (STACK=dgov_nexus) ба портууд давхцахгүй:

Контейнер Образ Порт (зөвхөн loopback)
dgov_nexus_postgres postgres:16-alpine 5434
dgov_nexus_redis redis:7-alpine 6381
dgov_nexus_backend ghcr.io/gerege-systems/open-dgov-mn/backend:<commit> 8082
dgov_nexus_frontend ghcr.io/gerege-systems/open-gerege-nexus/frontend:<commit> 3008

Backend образ нь энэ репогийнх (цөм + өөрийн модулиуд), CI угсарч GHCR рүү түлхдэг; бүрхүүл нь цөмийнх. Хоёр образ өөр өөр амьдралтай тул нэг тагаар барихаа больсон: IMAGE_TAG нь энэ репогийн commit, FRONTEND_TAG нь deploy.sh дотор түгжигдсэн цөмийн commit.

POSTGRES_VOLUME=dgov_nexus_platform_postgres_data бол дискэн дээрх заагч. Хоосон санг цөм эрүүл мэт асаадаг тул энэ мөрийг өөрчлөх нь өгөгдөл нүүлгэх ажил, засвар биш.

Нэвтрэлт

Энэ суулгац хүнийг өөрөө таних биш, sso.dgov.mn дээр таниулна.

2026-08-17-ноос SSO_CLIENT_LOCAL_LOGIN=false — энэ домэйн руу орох цорын ганц зам sso.dgov.mn. Тэр нь ажиллахаа болих өдөр энд нэг ч хүн шинээр нэвтрэхгүй; буцах зам Runbook-ууд-д.

Провайдер дээрх бүртгэл:

client_id app_opendgovmn_28426259
redirect_uris https://open.dgov.mn/api/v1/auth/sso/callback
post_logout_redirect_uris https://open.dgov.mn/
grant_types authorization_code
scopes openid profile email

open.dgov.mn нь провайдерийн OAUTH_REDIRECT_HOSTS дотор яг таг байх ёстой — тэр жагсаалт дэд домэйныг өвлүүлдэггүй. Дэлгэрэнгүйг SSO-д холбогдох-оос.

Тохиргоо

Жинхэнэ файл нь серверийн /opt/open-dgov-mn/.env (chmod 600), загвар нь репогийн .env.example.

Хувьсагч Утга Тайлбар
IMAGE_BACKEND ghcr.io/gerege-systems/open-dgov-mn/backend Энэ репогийн образ. Цөмийнхийг зааж байвал эндэх модулиуд ачаалагдахгүй
IMAGE_TAG commit CI роллаут хийхдээ угсарсан commit-оо дамжуулна
PUBLIC_ORIGIN https://open.dgov.mn Гадна ертөнцөд харагдах хаяг
DEVICE_LINE_ORIGINS https://open.dgov.mn Хоосон орхивол цөм nexus.gerege.mn-ий шугамуудыг анхдагчаар тавина
BRAND_NAME Засгийн газрын нээлттэй суурь платформ Хүсэлт бүр дээр уншигдана, образ биш
BRAND_COPY_FILE /brand/copy.json Landing page-ийн үгс ба нэр нь хэл тус бүрээр
EID_RP_NAME Цахим Засаг Хоосон орхивол иргэн утсан дээрээ «Gerege Nexus» гэж уншина
SSO_CLIENT_ISSUER https://sso.dgov.mn Хэн таних вэ
SSO_CLIENT_ID app_opendgovmn_28426259 Провайдерийн олгосон id — гараар сонгодоггүй
SSO_CLIENT_LOCAL_LOGIN false Эндэх нууц үг, eID-ийн нэвтрэлт хаалттай
SSO_CLIENT_TENANT dgov Провайдерийн баталгаажуулсан ч энд бүртгэлгүй хүнийг ямар байгууллагад үүсгэх

CORE_REF ба FRONTEND_TAG хоёр нь .env дотор биш, deploy.sh дотор түгжигдсэн: серверийн хуулбар репогийн пиныг дардаг тул тэднийг нэг газар, git-ийн түүхтэй хамт байлгана.

nginx

nginx/open.dgov.mn.conf нь бүрхүүл (3008) ба API (8082)-г барина. Гурван зүйл анхаарууштай:

Мөн /api/ дээр limit_req бүсүүд ажиллана: нэвтрэлтэд 5r/m, OAuth-ийн солилцоонд 30r/m.

Шинэчлэх

Гараар хийх зүйл алга. main руу орсон commit бүр дээр CI → Image (GHCR) → Deploy гэсэн гинж ажиллана; сүүлийнх нь SSH-ээр орж git pull && ./deploy.sh хийхдээ угсарсан яг тэр commit-ын тагийг дамжуулна. Улаан CI бол образ ч байхгүй, роллаут ч байхгүй. Дэлгэрэнгүйг Ажиллагаа.

Цөмийг шинэчлэх нь энэ репод гурван мөр: go.mod-ын хувилбар (бинар), deploy.sh-ийн CORE_REF (compose ба nginx snippet), FRONTEND_TAG (бүрхүүл). Гурвуулаа нэг commit дээр байх нь зөв — нэг настай стек.

Эхний админ ба апп суулгах

cd /opt/open-dgov-mn && ./first-admin.sh <и-мэйл> <нууц үг>

Бүртгүүлэх дэлгэц байхгүй, control plane нь өөрийн vhost, TOTP шаарддаг тул эхний хүн SQL-ээр ордог. Скрипт өөрөө нэвтэрч үзэж баталгаажуулна.

Аппуудыг API-аар суулгана, SQL-ээр биш — суулгацын мөр каталог дүүргэдэг apps хүснэгт рүү заадаг тул гараар оруулсан мөр дутуу байна:

POST /api/v1/store/apps/{slug}/install