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 بصفة طرف
معتمِد:
- يُجزَّأ ملف الـ PDF تجزئةً تعمويةً ← ثم يدفع eID ذلك الملخّص إلى هاتف المواطن،
- يوافق المواطن بـPIN2،
- يُضمّن موقّعُ المستندات التابع لـ 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 |
التغييرات بحسب الإصدار |