انتقل إلى المحتوى

Gerege Nexus

Production · الطبقة 3 — أساس المنصّة · المستودع: open-gerege-nexus · nexus.gerege.mn

منصّة موحّدة للخدمات والعمليات والأنظمة. منصّة معيارية تجمع خدمات المؤسّسات الحكومية والخاصة وعملياتها وأنظمتها وبياناتها على أساس واحد. مفتوحة المصدر برخصة Apache 2.0.

كلمة Nexus تعني نقطة الالتقاء — حيث تلتقي المؤسّسات والخدمات وسير العمل والأنظمة والمستخدمون والبيانات. المنصّة نفسها ليست موجّهة إلى قطاع بعينه: ما يحدّد احتياجات مؤسّسة ما هو الوحدات التي تعمل فوقها.

نموذج المنظومة يتغيّر

Gerege Nexus هو الأساس الخَلَف لِـ Template Platform. كان النموذج السابق «قالب واحد ← نسخة متفرّعة لكل منتج»، أمّا الجديد فهو «مصدر أعلى واحد (Nexus) ← نسخة متفرّعة لكل علامة تجارية، تُحدَّث بالدمج من المصدر الأعلى». الانتقال جارٍ الآن — والمنصّات القائمة ما تزال في الإنتاج. انظر البنية الطبقية.

الفارق الجوهري: التطبيق وحدة برمجية

في النموذج السابق كان المنتج الجديد يعني مستودعًا جديدًا ونشرًا جديدًا وقاعدة بيانات جديدة. أمّا في Nexus فالمنتج الجديد هو غالبًا وحدة جديدة: تطبيق مُصرَّف داخل الملف التنفيذي نفسه، يمكن لكل مستأجر تفعيله أو تعطيله.

نموذج Template (السابق) نموذج Nexus (الجديد)
منتج جديد تفريع القالب كتابة وحدة وإضافتها إلى الكتالوج
التوزيع نشرة واحدة لكل مستودع لكل مستأجر، عبر متجر التطبيقات
مشاركة الشيفرة حزمتا open-gerege-core و@gerege/ui-core مصدر أعلى واحد؛ الفروع تدمج منه
الاستدعاء بين الوحدات HTTP (عند انفصال المستودعات) استدعاءات Go داخل العملية
التفعيل / التعطيل يتطلّب نشرًا يقرّره المسؤول في app_installations

وحدة متراصّة معيارية

تنفّذ وحدات الأعمال عقد Module في لغة Go وتُصرَّف في ملف تنفيذي واحد. أمّا التطبيقات الفعّالة لدى مستأجر بعينه فيحدّدها ديناميكيًا جدول app_installations في PostgreSQL.

  • لا قفزات شبكية إضافية — تتنادى الوحدات داخل العملية، فلا يظهر لا تأخّر الخدمات المصغّرة ولا تعقيد التنسيق بينها.
  • حلّ التبعيات عبر DAG — تُحلّ تبعيات الوحدات تعاوديًا على رسم بياني موجّه لا دوري، مع كشف الحلقات والتحقّق من semver.
  • مزامنة الكتالوجcatalog/apps.json هو مصدر الحقيقة الوحيد؛ ويُحدَّث جدول apps منه عند كل إقلاع. إضافة تطبيق لا تتطلّب كتابة SQL يدويًا.
  • بوّابة التطبيقات — أي مسار يخصّ تطبيقًا غير مثبَّت يردّ بِـ 403 Forbidden.

لماذا لا خدمات مصغّرة؟

حدود الوحدات تضمنها واجهات Go لا الشبكة. وهكذا تبقى ضمانة الحدّ قائمة، بينما يُتجنَّب في آن واحد تأخّر الشبكة والمعاملات الموزّعة وكلفة تشغيل نشرات متعدّدة.

الوحدات الجاهزة

الوحدة المعرّف المسار الغرض
Contacts io.example.contacts /contacts دليل جهات التعامل مع تعبئة تلقائية من XYP
Products io.example.products /products المنتجات والتسعير وأكواد SKU ضمن نطاق المستأجر
Inventory io.example.inventory /inventory المستودعات ومستويات المخزون وسجلّ حركة بالإضافة فقط
Billing & e-Barimt io.example.billing /billing الفواتير وضريبة 10٪ وإيصالات e-Barimt
Digital Documents io.example.documents /documents المستندات الإلكترونية ومسارات الاعتماد
Developer Portal io.example.developer_portal /developer/apps تسجيل تطبيقات عملاء OAuth2
التوقيع الإلكتروني للـ PDF io.example.esign /esign توقيع ذو حجّية قانونية عبر eID Mongolia (PIN2)
الخدمات الحكومية io.example.gov_services /gov سير خدمة قابل للتهيئة، وتسلسل هرمي، واتفاقيات مستوى خدمة

سير الخدمة الحكومية القابل للتهيئة

تحوّل وحدة gov_services قاعدة شيفرة واحدة إلى قدرة على تقديم الخدمة يهيّئها كل مستأجر — بل وكل خدمة داخل المستأجر — لنفسه. والاختيار بين ثلاثة أنماط لا يستلزم أي تغيير في الشيفرة:

النمط المعنى
LOCAL الوحدة المستقبِلة تنجز الطلب بنفسها
DELEGATE يُحال إلى وحدة أدنى بينما تتولّى الوحدة الأعلى المتابعة والتحقّق
HYBRID قاعدة توجيه تقرّر لكل طلب على حدة

المبدأ الحاكم: الشيفرة تقرّر ما هو ممكن، والتهيئة تقرّر ما يُعرَض. يقيم جدول الانتقالات المرجعي في الشيفرة؛ وللنسخة المنشورة أن تضيّقه، لا أن توسّعه أبدًا. لذلك لا يستطيع مستأجرٌ أُسيئت تهيئته أن يبلغ حالة مستحيلة.

ضمانات أخرى:

  • الحالة يحسبها الخادم — يرسل العميل إجراءً، لا حالةً قط.
  • إنهاء وحدة أدنى لعملها لا يُغلق الطلب — فحين تشترط الخطوة تحقّقًا، ينتهي الإنجاز إلى AWAITING_VERIFICATION.
  • التأخّر مُشتقّ (due_at < now())، ولا يُكتَب فوق حالة العمل.
  • عزل المستأجر والوحدة قائم في بنية الجداول — فكل مفتاح خارجي مركّب ويشمل tenant_id، فلا يمكن لسطرٍ أن يشير إلى مستأجر آخر حتى لو وقع خطأ برمجي.
  • استقبال متكافئ (idempotent) — يُعرَّف الطلب الوارد بـ (tenant_id, source_system, external_request_id)؛ فالمحاولة المطابقة تُعيد "created": false، أمّا الإعادة بحمولة مختلفة جوهريًا فتُرفض بـ 409.
  • الإبلاغ الخارجي يمرّ عبر outbox — فلا تستطيع نقطةُ نهاية بعيدة أن تُرجِع انتقالًا أو تُعلّقه.

التوقيع الإلكتروني — eID Mongolia (PIN2)

ترتبط وحدة esign بِـالتوقيع عن بُعد المؤهَّل لدى eID Mongolia بصفة طرف معتمِد:

  1. يُجزَّأ ملف الـ PDF تجزئةً تعمويةً ← ثم يدفع eID ذلك الملخّص إلى هاتف المواطن،
  2. يوافق المواطن بـPIN2،
  3. يُضمّن موقّعُ المستندات التابع لـ eID رسالة PKCS#7 مع بيانات OCSP وCRL، ويؤلّف ملف PDF موقّعًا بمعيار PAdES.

المفتاح الخاص للتوقيع لا يبلغ المنصّة أبدًا. ومستوى الشهادة هو QUALIFIED افتراضيًا — إذ إنّ قبول ADVANCED كان سيخفض في صمت درجةَ كل مستند تنتجه المنصّة.

التوقيع نيابةً عن مؤسّسة

تُقرأ صلاحيات التمثيل مباشرةً من السجلّ الوطني، لا من الشهادة — لأنّ مديرًا استقال بالأمس ما يزال يحمل شهادة الأمس.

ويشمل أيضًا: سجلّ التوقيعات (ترشيح وتصفّح وتصدير CSV)، والتوقيع بالدفعات، ووضع الختم مع معاينة بمقاس A4، والاتصال بوحدة HSM، وسياسة التوقيع. وللمستأجر أن يشترط توقيعات eID المؤهَّلة وأن يعطّل مسار HSM بالكامل — بما يشمل من يستدعي الواجهة البرمجية مباشرة.

المصادقة والتكامل الحكومي

  • مزوّد OAuth2 / OIDC خاص بها/.well-known/openid-configuration و/oauth2/token و/oauth2/introspect و/oauth2/revoke، بدعم authorization_code وclient_credentials وrefresh_token.
  • eID وДАН / DAN — القنوات الرسمية الأربع: التوقيع الرقمي بالبنية التحتية للمفاتيح العامة، وكلمة المرور لمرّة واحدة على الهاتف، والدخول الموحّد المصرفي، والتحقّق الحيوي من الوجه.
  • ХУР / XYP — قيد الأحوال المدنية (WS100101) والتحقّق من الأشخاص الاعتباريين (WS100201).
  • رموز الجلسة معتِمة، بطول 256 بت، ولا يُخزَّن منها في قاعدة البيانات سوى ملخّص SHA-256. وتسجيل الخروج يُبطلها فعليًا.

وضع المحاكاة لا يعمل في الإنتاج

أوضاع المحاكاة لـ E-ID / ДАН / ХУР موجودة للتطوير وحده. وعند ENVIRONMENT=production تنطفئ تلقائيًا، فلا سبيل لأحد أن يدخل ببيانات مواطن ملفّقة.

الذكاء الاصطناعي والمرونة

الذكاء الاصطناعي — مساعد قائم على Gemini ومرتكز على الحالة الفعلية لقاعدة بيانات المستأجر (/api/v1/ai/chat و/stt و/tts و/translate)، مع مُوجِّهات وقاعدة معرفة يديرها المسؤول، إضافةً إلى مُتنبِّئ بالطلب على المخزون.

مرونة سحابية المنشأ (مستوحاة من go-zero):

المكوّن الدور
Adaptive circuit breaker نسبة إخفاق على نافذة منزلقة على طريقة SRE في Google
Adaptive load shedding 503 مع Retry-After عند تجاوز حدّ التزامن
Singleflight coalescing يدمج الاستعلامات المكرّرة فيمنع انهيار الذاكرة المؤقّتة
Exponential backoff retry يعيد المحاولة على الأعطال العابرة بتراجع أسّي

السياسة اللغوية

المنغولية إضافةً إلى لغات الأمم المتحدة الرسمية الستّ = سبع لغات. والمنغولية هي المصدر. والوثائق متاحة باللغات السبع كلّها، غير أنّ البرمجية تُسلَّم بالمنغولية والإنجليزية، وتُفعَّل الخمس الباقية من الإعدادات ← المظهر. وهو المبدأ نفسه المعمول به في سياسة التعدّد اللغوي لهذا الموقع.

العلامات المتفرّعة عنها

Nexus هو المصدر الأعلى؛ وكل علامة تتفرّع عنه وتُحدَّث بالدمج منه.

العلامة المستودع النطاق موضع الاختلاف
Gerege Nexus open-gerege-nexus nexus.gerege.mn المصدر الأعلى، والنشر المرجعي
Gerege SSO sso-gerege-nexus فرع متمحور حول طبقة الدخول والصلاحيات والوصول
Eduge.mn eduge-mn-nexus eduge.mn علامة قطاع التعليم؛ تحمل طبقة بناء على المضيف حين يتعذّر السحب من GHCR

شيئان يحملان اسم Gerege SSO

sso-gerege-nexus هو الفرع الجديد المبني على Nexus؛ أمّا sso.gerege.mn في الإنتاج فما يزال يعمل بشيفرة sso-gerege-mn السابقة. فلا يُخلط بينهما: وإلى أن يكتمل الانتقال، يبقى السلوك الموصوف في صفحة Gerege SSO هو النافذ.

النشر

يُشغّل الدفعُ إلى main GitHub Actions: بناء صورتي الواجهة الخلفية والأمامية ودفعهما إلى GHCR ← نسخ docker-compose.prod.yml إلى الخادم ← سحب الصور ← تبديل الواجهة البرمجية والواجهة الأمامية بعد اكتمال عمليات الترحيل فقط ← فحص /health و/ready. ولا يبدأ النشر إلّا بعد نجاح التكامل المستمر فعليًا.

ولا يحتاج الخادم إلى شيء سوى Docker — لا شيفرة مصدرية ولا Go ولا Node.

PUBLIC_ORIGIN يحدّد ثلاثة أمور دفعةً واحدة

إذ يُشتقّ منه CORS ومُصدِر OIDC ونداء eID العائد جميعًا. وتغييره ينقل معه في آنٍ واحد سجلّ DNS وشهادة TLS وكل عميل يعتمد على المُصدِر. فعند تغيير النطاق استعمل قائمة التحقّق في صفحة المصادقة والصلاحيات.

حزمة التقنيات

الطبقة الاختيار
الواجهة الخلفية Go 1.25 · موجّه chi · pgx (بلا ORM، وSQL مكتوب يدويًا)
الواجهة الأمامية Next.js 15 App Router
قاعدة البيانات PostgreSQL 16 — مخطّط مشترك، معزول بـ tenant_id
الترحيلات goose (backend/db/migrations/)؛ ويُمنع تنفيذ DDL أثناء التشغيل
المراقبة Prometheus (/metrics) · OpenTelemetry
الحاويات Docker Compose · GHCR

للصورة الشاملة على مستوى المنظومة انظر حزمة التقنيات.

الوثائق التفصيلية

توجد وثائق مستوى التنفيذ داخل المستودع، بسبع لغات:

الوثيقة المحتوى
README.md نظرة عامة على المنصّة (7 لغات)
docs/ARCHITECTURE_SPECIFICATION.md الطبقات وقرارات البنية (المنغولية/الإنجليزية)
docs/MODULE_AUTHORING_GUIDE.md كيفية كتابة وحدة تطبيق جديدة
docs/GOV_SERVICES_WORKFLOW.md النموذج الكامل لسير الخدمة الحكومية
docs/DOCUMENTS_SIGNING.md مراسم التوقيع وعقدها
docs/TRANSLATION_GUIDE.md دليل الترجمة إلى سبع لغات
CHANGELOG.md التغييرات بحسب الإصدار