# نشر وتشغيل النظام متعدد المستأجرين (Multi-Tenant)

## DNS وشهادة SSL

- للنطاقات الفرعية مثل `lab.example.com` سجّل سجل **A** أو **CNAME** يشير إلى الخادم.
- لدعم كل المختبرات تحت نطاق واحد استخدم سجل **wildcard** (مثل `*.example.com`) ووجّهه إلى نفس الخادم.
- استخدم شهادة **SSL** تغطي النطاق الفرعي أو **wildcard** (مثلاً Let’s Encrypt مع DNS-01 أو شهادة تجارية).
- إذا كان النطاق بدون نطاق فرعي (مثل `example.com` فقط)، يُستخدم المختبر الافتراضي من الجلسة أو `tenant_id = 1` حسب الإعداد.

## النسخ الاحتياطي والاستعادة

- قاعدة البيانات **مشتركة** بين جميع المستأجرين؛ النسخ الاحتياطي الكامل يشمل الجميع.
- عند **الاستعادة الكاملة** تتأثر كل المختبرات معاً؛ خطّط لنوافذ صيانة واختبار على بيئة staging.
- للامتثال أو الطوارئ قد تحتاج **تصديراً لكل مختبر** (مثلاً تصدير CSV/تقارير أو نسخة منطقية حسب `tenant_id`) — راجع أدوات الإدارة والتقارير في النظام.

## الإعدادات والأسرار

- ضع بيانات الاتصال بقاعدة البيانات ومفاتيح الدفع وواتساب وغيرها في **`config/config.php`** أو متغيرات بيئة **لا تُرفع إلى المستودع**.
- لا تُخزّن كلمات مرور أو مفاتيح API في ملفات يمكن الوصول إليها من الويب مباشرة.

## الترحيلات (Migrations)

- نفّذ سكربتات الترحيل **بالترتيب** على بيئة الإنتاج قبل فتح الخدمة للمستخدمين.
- راقب سجلات PHP/خادم الويب بعد النشر لأخطاء مخطط قاعدة البيانات.

## سلوك النظام بعد التحديثات الأخيرة

- **نطاق فرعي غير صالح** (مختبر غير موجود، موقوف، أو اشتراك منتهٍ): يُعاد **403** مع صفحة توضيحية بدلاً من السقوط إلى المختبر `1`.
- **تسجيل دخول المختبر**: يُرفض إذا كان المختبر موقوفاً أو الاشتراك غير فعّال.
- **الاشتراك** (`tenant_subscriptions`): آخر سجل نشط؛ إن وُجد `expires_at` يجب ألا يكون قبل تاريخ اليوم.
- **حد المرضى الشهري** (`max_patients_per_month`): يُطبَّق عند إنشاء مرضى جدد في المسارات المدعومة.

## مراجعة العزل في الكود

- استخدم `tenant_id` صراحة في الاستعلامات الجديدة؛ راجع قائمة `Tenant::whereClause()` عند الحاجة.
- في وضع التطوير (`config` → `debug`) قد يُسجَّل تحذير في السجل عند استخدام جدول غير مدرج في القائمة.
