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

fuelnet.dgov.mn — Nexus FuelNet

Репо: gerege-systems/fuelnet-dgov-mn · Байрлуулалт: /opt/fuelnet-nexus/ · Брэнд: Nexus FuelNet

Шатахууны урсгалын платформ: импортоос хошуу хүртэлх литр бүрийн мөрдлөг, ШТС-ын касс, нөөцлөгдсөн литрээр баталгаажсан ваучер. Gerege Nexus цөмийн Түвшин 2 байрлуулалт: өөрийн Go модуль, өөрийн миграц, өөрийн каталогтой.

Загварчлалын бүтэн баримт нь тэр репод: FUELNET_PLAN.md — зорилго, KPI, гинжин хэлхээ, ваучерийн механизм, үе шатууд. Энэ хуудас нь одоо ажиллаж байгаа зүйлийн тухай.

Юу нь юу вэ

Худалдааны дөрвөн модуль — харилцагч, бүтээгдэхүүн, агуулах, нэхэмжлэх — Gerege Business-аас go.mod-ын нэг мөрөөр ирдэг, энд хуулагдаагүй. Шатахууны станц бол савнаас бараа зарж, нэхэмжлэх бичдэг газар: Business-ийн хариулдаг яг тэр дөрвөн асуулт.

Энэ репод бичигдсэн нь Business хариулж чадахгүй гурав:

Модуль Юуг хариулдаг
forecourt ШТС, сав, хошуу, ээлж, гинжлэгдсэн түгээлт. Сав бол тоолдог биш, хэмждэг зүйл: түвшин, температур, 15°C-ийн залруулга. Монголын +35…−40°C-ийн далайцад ажиглалтын литрээр тооцвол улирал өөрөө бодит хулгайг дотроо нуух хэмжээний «алдагдал» үүсгэнэ
voucher Эрх, хуваарилалт, офлайн шалгагдах пасс. Ваучер = нөөцлөгдсөн литр: савд бодитоор орж, баталгаажсан түлшнээс л үүснэ, тиймээс амлалт нөөцөөсөө давахгүй
insight Нөхцөлдүүлэлт (ΔB–ΔE), нөөц ба дуусах прогноз

Хошууны тоолуур хэзээ ч буцаж болохгүй тул гүйлгээ бүр hash-chain-д холбогдоно: дараа нь засагдсан мөр өөрөөсөө хойшхи бүх hash-ийг эвдэж, устгагдсан мөр ШТС өөрөө өгсөн дугаарт завсар үлдээнэ.

Стек

Өөрийн хост дээр ганцаараа ажиллана — open.dgov.mn, sso.dgov.mn хоёроос өөр машин (Архитектур).

Контейнер Образ Порт (зөвхөн loopback)
gerege_fuelnet_nexus_postgres postgres:16-alpine 5438
gerege_fuelnet_nexus_backend fuelnet-nexus:latest (хост дээр баригдсан) 8092
gerege_fuelnet_nexus_web fuelnet-nexus-web:latest (хост дээр баригдсан) 3017

Хоёр образ хоёулаа хост дээрээ баригдана: өөр архитектур дээр барьсан образ exec format error өгдөг, шинэ push хийсэн хаалттай образыг registry татуулахаас татгалздаг — ажилладаг газраа барих нь хоёуланг арилгана. Бүрхүүл нь цөмийн репогийн frontend/-оос баригддаг ба цөм хөдөлсөн бүрд дахин баригдана.

Backend-ийн өмнө гурван миграцын түүх нэг санд ажиллана: цөмийнх (/app/db/migrations), Business-ийн таван хүснэгтийнх (goose_db_version_fuelnet) ба энэ репогийн 12 хүснэгтийнх (goose_db_version_fuelnet_modules). Goose нэг хүснэгтэд нэг мөр бичдэг тул MIGRATIONS_TABLE сайн дурын биш: гурван түүхийн 00001 бүгд нэг мөр болох байсан.

Тохиргоо

Жинхэнэ файл нь /opt/fuelnet-nexus/.env (chmod 600). Хамгийн чухал мөрүүд:

Хувьсагч Утга Тайлбар
PUBLIC_ORIGIN https://fuelnet.dgov.mn Callback, issuer, CORS бүгд эндээс гарна
FUELNET_VOUCHER_KEY base64, 32 байт Ed25519 үр. Ваучерийн пасс офлайн шалгагддаг тул түлхүүр процессоос урт наслах ёстой — дахин асахдаа шинийг үүсгэвэл хүмүүсийн утсан дахь бүх ваучер хүчингүй болно. Production-д энэ мөргүй бол модуль асахаас татгалзана
SSO_DEFAULT_CLIENT_SECRET санамсаргүй Энэ суулгац өөрөө ч провайдер: дээр нь суусан аппуудад identity тарааж өгдөг
SSO_CLIENT_ISSUER https://sso.dgov.mn Хүнийг хэн таних вэ
SSO_CLIENT_ID app_fuelnetdgovmn_315eb02e Провайдерийн олгосон id — гараар сонгодоггүй
SSO_CLIENT_TENANT dgov Провайдер баталгаажуулсан ч энд бүртгэлгүй хүнийг ямар байгууллагад үүсгэх
SSO_CLIENT_LOCAL_LOGIN false Эндэх нууц үг, eID-ийн нэвтрэлт хаалттай

Нэвтрэлт

2026-08-17-наас энэ суулгац хүнийг өөрөө таихаа больж, sso.dgov.mn-д таниулна. Провайдер дээрх бүртгэл:

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

fuelnet.dgov.mn нь провайдерийн OAUTH_REDIRECT_HOSTS дотор яг таг байх ёстой — тэр жагсаалт дэд домэйныг өвлүүлдэггүй тул dgov.mn бичээстэй байх нь энэ хостыг зөвшөөрсөн хэрэг биш (SSO-д холбогдох).

Хоёр талын нийлбэр — провайдер л танина, платформ нь хаалттай (access_mode=private) — гэдэг нь шинэ суулгац дээр хэн ч орж чадахгүй гэсэн үг: провайдер хүнийг баталгаажуулна, харин энд бүртгэлгүй хүнийг үүсгэхийг access mode татгалзана. Эхний тенант, эхний админыг санд тавьсны дараа id_token дахь и-мэйлээр (провайдер email_verified үргэлж true өгдөг) байгаа бүртгэлдээ холбогдоно. SQL нь репогийн README-д; хоёр дахь хүнээс эхлээд урилгын урсгал ажиллана.

Шинэчлэх

Гаргалт нь GitHub Actions, зөвхөн гараар (workflow_dispatch) — deploy.yml. Хост дээр очиж репогоо шинэчилж, образуудаа барьж, docker compose up -d хийгээд backend эрүүл болтол хүлээнэ. Гурван миграц backend-ээс өмнө гүйцэд ажилладаг тул эрүүл backend гэдэг нь гурван түүх хамт хөдөлсөн гэсэн үг.

Цөмийг шинэчлэх нь go.mod-ын нэг мөр (Dependabot PR). Гэхдээ CI-д catalog_test нь энэ build-ийн цөм ба Business өөрийн каталогоо бичихдээ түшсэн цөм хоёрыг тэнцүү байхыг шаардана: улаан болвол хариулт нь эхлээд Business-ийг ахиулах. Каталог зөрчилтэй бол платформ асахаа болино, тиймээс энэ бол хост дээр биш CI дээр олдох ёстой алдаа.

Юу хараахан байхгүй вэ

Төлөвлөгөөний Фаз 1–2-ын сервер тал ажиллаж байна. Дараах нь зориудаар дутуу:

Дутуу Тэмдэглэл
Гурван модулийн дэлгэц Menus() хоосон: бүрхүүлд дэлгэц нь хараахан бичигдээгүй тул цэсний бичилт операторыг 404 руу нэг товшилтын зайд аваачих байсан. API нь ажиллаж байна
Хошуу/ATG-ийн драйверууд Эхлээд Фаз 0-ийн техникийн тооллого — аль протокол хэрэгтэйг тэр л хэлнэ
Ирмэгийн агент, офлайн дараалал Энэ репогийн API нь түүний сервер тал
ХУР/e-Mongolia, Гааль, e-Barimt Тиймээс ΔA баланс байхгүй — нэг талаас нь тооцвол нотолгоо мэт харагдах буруу тоо гарна