النشر والتشغيل
صورة عامة لمكوّنات أي تثبيت عامل وكيف يُحافَظ على سلامته. لا تحتوي عمدًا على أي أسماء خوادم سوى النطاقات العامة، ولا على بيانات دخول أو تفاصيل خوادم.
العناوين الحية على helsen-med.com
| العنوان العام | ما يقدّمه |
|---|---|
| helsen-med.com | المتجر (Next.js): العربية على /ar والإنجليزية على /en. ويُحوَّل www.helsen-med.com إليه. |
| seller.helsen-med.com | لوحة البائع على الويب (ملفات ثابتة). |
| delivery.helsen-med.com | لوحة التوزيع والتوصيل على الويب (ملفات ثابتة)، لحسابات المرسِلين. |
| api.helsen-med.com | الواجهة البرمجية على /api/v1، وواجهة Swagger على /docs، وفحوص الصحة، والاتصالات الفورية، ووسائط المنتجات. |
| docs.helsen-med.com | موقع التوثيق هذا: ملفات ثابتة يقدّمها nginx. |
| ملفات APK لأندرويد | تطبيقات المشتري والبائع والسائق، يوزّعها الفريق كملفات (ليست على Google Play بعد). تتصل بـ api.helsen-med.com وتثبّت المفتاح العام لشهادته. |
لوحة الإدارة مبنية لكنها غير منشورة على أي عنوان عام؛ وذلك بانتظار قرار. يستخدم المديرون واجهة Swagger في الأثناء. راجع المنصة الحية والخطوات الأولى لمعرفة ما يعمل اليوم.
بنية الخوادم، وإدارة العمليات، وشهادات TLS، والنسخ الاحتياطي، ومتغيرات البيئة، وصلاحيات الوصول موثّقة في دليل التشغيل المحفوظ لدى الفريق — الملف infra/deploy/README.md في المستودع — وليس في هذا الموقع العام. لا يُعدّ أي شيء هنا إجراءً للنشر.
ما الذي يجب أن يعمل
بيئة الإنتاج خادم واحد. ينهي nginx اتصالات HTTPS بشهادات Let's Encrypt تتجدد تلقائيًا وتعيد استخدام المفتاح نفسه، فتبقى تثبيتات الشهادة في التطبيقات صالحة عبر التجديدات. ويحدّ nginx أيضًا معدل الطلبات لكل عنوان IP، بشدة أكبر على مسارات الدخول، قبل حدود الواجهة البرمجية الخاصة لكل عنوان. وكل ما عدا ذلك يعمل في Docker.
| العملية / الخدمة | السبب |
|---|---|
الواجهة البرمجية (dist/main.js) | تخدم كل العملاء. |
العامل الخلفي (dist/worker.js) | يفرّغ صندوق الصادر (outbox) وينفّذ كل المهام المجدولة. بدونه لا يُعالَج أي إشعار ولا تعمل أي مهمة مجدولة — ومنها تحرير الحجوزات المنتهية، والإكمال التلقائي للطلبات، والمدفوعات للبائعين، والمطابقات. |
| PostgreSQL 16 | مصدر الحقيقة، بما في ذلك صندوق الصادر وأقفال المهام. |
| Redis 7 | مطلوب في الإعدادات؛ ومحجوز لميزات تعدد النسخ (الحضور، وإلغاء الاتصالات المفتوحة). |
| Meilisearch 1.12 | بحث المشترين عن المنتجات. |
| SeaweedFS (متوافق مع S3) | تخزين الكائنات لصور المنتجات والمستندات وصور إثبات التسليم. لا يُستخدم MinIO إلا في بيئة التطوير. |
| المتجر (Next.js) | متجر يُعرض من الخادم. أما لوحتا البائع والتوصيل فملفات Vite ثابتة يقدّمها nginx. |
- imgproxy غير منشور: تُعرض صور المنتجات بملفاتها الأصلية المرفوعة دون تصغير.
- مشغّلات البريد والرسائل النصية والإشعارات الفورية مضبوطة على
none. تُنشأ الإشعارات وتوضع في الطابور لكنها لا تُرسل؛ والإشعارات داخل التطبيق تعمل. وعند تهيئة SMTP (أو حساب رسائل نصية أو إشعارات فورية) يُرسل ما تراكم. - الدفع بالبطاقة: لم يُضبط Stripe ولا Paymob. الدفع عند الاستلام فقط.
- لوحة الإدارة غير منشورة.
تسجّل قائمة الإطلاق أن الذاكرة المؤقتة وحضور الاتصال الفوري وبعض الأجزاء الأخرى تعمل داخل العملية حاليًا، فلا تكون صحيحة إلا مع نسخة واحدة حتى تتوفر محوّلات مبنية على Redis. وسّع الموارد رأسيًا حتى ذلك الحين.
فحوص الصحة
GET /health— الحياة؛ العملية تعمل.GET /ready— الجاهزية؛ تُرجعreadyعندما تستجيب قاعدة البيانات، وdegradedعندما لا تستجيب.
الإصدارات
- تُبنى صورة الواجهة البرمجية من
infra/docker/api.Dockerfile(متعددة المراحل، بمستخدم غير جذري) وتوسم برقم الإيداع، وليسlatestأبدًا. - ترحيلات قاعدة البيانات تسير للأمام فقط (Prisma Migrate عبر
migrate deploy). تتبع تغييرات المخطط أسلوب «التوسيع ثم التقليص» ليعمل الكود القديم والجديد معًا — راجعdocs/zero-downtime-migrations.md. - التراجع بعد إصدار رحّل قاعدة البيانات ليس مجرد إرجاع الصورة؛ اتبع الدليل §8.
أدلة الحوادث
يغطي الملف docs/runbooks.md في المستودع، من بين أمور أخرى:
- دفتر الأستاذ غير متوازن
- إشعار دفع (webhook) انتهى في قائمة الرسائل الميتة
- إتمام الشراء بطيء
- اتصالات قاعدة البيانات مشبعة
- تراكم صندوق الصادر
- بيع مخزون أكثر من المتاح
- نقد السائقين لا يطابق دفتر الأستاذ
- الحاجة إلى التراجع عن إصدار
- لا يوجد سائقون في مناوبة
- إشارات الموقع تُغرق قاعدة البيانات
- العامل الخلفي متوقف أو مهمة لا تعمل
تُتابَع جاهزية الإطلاق لكل بند (العوائق، البيانات والاستعادة، المراقبة، الأمان) في docs/GO_LIVE_CHECKLIST.md.
نشر هذا الموقع
الموقع ملفات HTML بسيطة مع ملف تنسيق واحد وسكربت صغير، بلا أي خطوة بناء. وجّه كتلة خادم nginx للنطاق docs.helsen-med.com إلى المجلد docs/site مع index index.html؛ الصفحات الإنجليزية في الجذر والعربية تحت /ar/.