إنتقل إلى المحتوى الرئيسي

دليل تشغيل دورة حياة العروض التجريبية

فحص الجاهزية

تحقق قبل إرسال أول رابط من أن سجلات DNS التالية تشير إلى خادم الإنتاج، وأن Traefik أصدر شهادات صالحة:

demo.shambus.com
demo-dashboard.shambus.com
demo-driver.shambus.com
web-api.shambus.com

تحقق أيضاً من وجود DEMO_ACCESS_SECRET وCRON_SECRET مختلفين وبطول 32 محرفاً على الأقل، ومن تشغيل حاوية maintenance-cron بفاصل بين 60 و86400 ثانية.

تطبق نقاط الوصول ثلاثة حواجز سعة مستقلة:

  • إنشاء العرض: 10 طلبات لكل مشرف وعنوان IP خلال 15 دقيقة.
  • فحص الرابط أو فتح شخصية المدير/المسافر/السائق: 30 طلباً لكل IP خلال 15 دقيقة.
  • قاعدة البيانات: 50 tenant تجريبياً فعالاً كحد backstop ذري، بعد حصاد المنتهي.

الحدود HTTP ليست بديلاً عن صلاحية demos.manage وTOTP، كما أن سقف قاعدة البيانات ليس حصة مبيعات يومية.

المسار الاعتيادي

  1. أنشئ العرض من /demos في لوحة الإدارة.
  2. انسخ الرابط وبيانات الدخول قبل إغلاق نافذة النتيجة.
  3. افتح الرابط في نافذة خاصة وتحقق من ظهور اسم الشركة. يجب أن يختفي fragment بعد قبول الرابط فقط، وألا يظهر في Network أو السجل. يجب ألا تسجل الصفحة خطأ hydration أو طلب مصادقة عميل بحالة 401.
  4. افتح الشخصيات الثلاث وتحقق من أن مدير الشركة والمسافر والسائق يرون نفس الشركة.
  5. أنشئ حجزاً تجريبياً وتأكد من ظهوره في لوحة الشركة ومن عدم إرسال رسالة حقيقية.
  6. دوّن جهة الاتصال ووقت الانتهاء في سجل المبيعات؛ المنصة تحفظهما أيضاً في المنحة.

تحقق إنتاجي محمي

يشغل الاختبار tests/e2e/production/demo-lifecycle.spec.ts دورة حقيقية محدودة: ينشئ tenant باسم ولون ومسارين مخصصين، ويتحقق من الباصات والمسارات والرحلات والمسافرين والشخصيات والعزل، ويفتح واجهات المسافر والمدير والسائق مع رصد أخطاء React hydration وpageerror وconsole.error، ثم يلغي الرابط ويحصد العرض. ينفذ teardown حذفاً احتياطياً حتى عند فشل assertion.

شغله فقط ضمن مجموعة الإنتاج المحمية مع PRODUCTION_E2E=true وملف اعتماد مؤقت بصلاحية 0600 خارج المستودع. لا تطبع الملف أو access token، ولا تعطل التنظيف للاحتفاظ ببيانات الفحص.

عند تشخيص خطأ hydration متقطع، اضبط DEMO_HYDRATION_ITERATIONS على عدد صغير مثل 6 لتكرار مركز العرض وتسليم المسافر في سياقات متصفح جديدة ضمن tenant واحد. يسجل الاختبار عنوان الصفحة مع كل pageerror وconsole.error. يمكن توجيه واجهة العميل فقط إلى خادم تطوير loopback عبر DEMO_HYDRATION_DEBUG_URL مع إبقاء التهيئة والتنظيف على APIs الإنتاج المحمية؛ لا تعرض خادم التشخيص على الشبكة.

حالات الحوادث

تسرب الرابط

استخدم تدوير الوصول إذا كان العميل الشرعي سيكمل التجربة. هذا يبطل الرابط وكلمات مرور الشخصيات السابقة ويحذف refresh tokens. استخدم إلغاء إذا لم تعد التجربة مطلوبة.

عميل يحتاج وقتاً إضافياً

استخدم تمديد 24 ساعة قبل أو بعد وقت الانتهاء ما دامت البيانات لم تُحصد بعد. لا تتجاوز مدة الأعمال المتفق عليها، ولا تحوّل العرض إلى حساب دائم.

بيانات العرض أصبحت غير مفهومة

استخدم إعادة الضبط. يحذف الإجراء الحجوزات والرحلات والتغييرات التجريبية ويعيد seed الافتراضي، لكنه يبقي الرابط الحالي صالحاً.

العرض منتهٍ لكنه ما زال موجوداً

المنع الأمني فوري ولا يعتمد على الحذف. افحص آخر تشغيل صيانة من لوحة الإدارة، ثم شغّل الحصاد يدوياً داخل جلسة PostgreSQL موثوقة عند الحاجة:

SELECT public.reap_expired_demos();

لا تنفذ حذفاً يدوياً من جداول فرعية؛ الدالة تحذف tenant وهويات auth.users بالترتيب الصحيح.

مهمة الصيانة لا تعمل

  1. تحقق من صحة حاوية maintenance-cron وسجلها.
  2. تحقق من تطابق CRON_SECRET في الحاويتين admin وmaintenance-cron دون طباعته في السجل.
  3. نفذ طلباً داخلياً اختبارياً إلى /api/maintenance وتأكد من HTTP 200 ومن عدادات الصفوف.
  4. افحص صلاحية SUPABASE_SERVICE_ROLE_KEY داخل admin؛ endpoint الصيانة يجب أن يستخدم عميل service-role لا عميل anon.

تحقق ما بعد الحذف

  • لا يفتح الرابط القديم مركز العرض.
  • لا تقبل كلمات مرور الشخصيات القديمة.
  • لا تظهر رحلات الشركة في البحث العام أو الخاص.
  • لا توجد صفوف مرتبطة بالشركة في demo_access_grants أو demo_personas أو demo_outbox.
  • يظهر إجراء الإلغاء أو الصيانة في سجل الإدارة.

الاستعادة

العرض مصمم للحذف ولا يملك restore تشغيلياً. عند الحذف بالخطأ، أنشئ عرضاً جديداً وارسل رابطاً جديداً. لا تستعد بيانات tenant تجريبي من نسخة PostgreSQL فوق قاعدة الإنتاج.