العودة إلى بوابة العملياتBAZAD Operations — ملف تأسيس المنتج والمعمارية v0.3
2 نوفمبر 2026 | BAZAD Group – Saudi Arabia
ملخص الإصدار
نظام تشغيل داخلي وبوابة عملاء، مبنيان على المصدر والتصميم الحاليين، دون بيع تراخيص أو تسجيل عام. القرار التقني هو الاحتفاظ بـ Node.js24 مع MySQL. اكتمل التنفيذ الأساسي لحزمة نشر تجريبية، ولم ينشر التطبيق على Hostinger أو operation.bazadgroup.com.sa.
تتضمن الحزمة المصدر، و SQL الفعلي، وأدوات الترحيل والنسخ المشفر والاستعادة، ودليل Hostinger ، ونتائج الاختبارات، وقائمة المتطلبات المتبقية. النسخة ليست معتمدة لبيانات العملاء الحقيقية.
الحماية وإعادة الاستخدام
طابق التدقيق ملفات ZIPv0.2 العشرين مع المصدر المحلي. حُفظت النسخة السابقة في git history و tag before-v03-deployment-hardening. أُعيد استخدام الواجهة وألوانها و RTL ومسار الطلب وأسماء الحالات، ثم طُورت النواة إلى وصول غير متزامن ومجمع MySQL وصلاحيات أدق ومعاملات.
أزيل الحفظ المحلي ومحاكاة الأدوار من التطبيق الجاري. حسابات العينات لا تنشأ عند بدء الخدمة، وتُرفض فيالإنتاج. لا توجد تكاملات حكومية مفترضة أو بيانات حقيقية فيالاختبار.
القرار التقني: Node.js 24 مع MySQL
2 نوفمبر 2026 — قرار التنفيذ للنسخة v0.3
| العامل | الاحتفاظ بـ Node.js مع MySQL | التحويل إلى Laravel |
|---|
| إعادة الاستخدام | الواجهة والحالات والمسارات وعقود API ومعظم قواعد التشغيل | الواجهة قابلة للاحتفاظ، لكن الخدمات والصلاحيات والقاعدة والاختبارات تحتاج نقلًا |
| الوقت والتكلفة | أقل إعادة عمل، والتركيز على مواضع النقص | زمن نقل ومراجعة إضافي دون مطلب يفرضه |
| الأمان | يحتاج جلسات و CSRF وصلاحيات ومعاملات وإعدادات مغلقة واختبارات؛ نُفذت أساسياتها | مكونات جاهزة مفيدة، لكنها لا تعالج أخطاء نموذج الصلاحيات وحدها |
| الصيانة | JavaScript واحد، ووحدات خادم واضحة، واعتماديتان مباشرتان | منظومة PHP ومهارة إضافية وتكلفة نقل المنطق |
| الاستضافة | Cloud Professional يدعم Node و MySQL ونوع Other رسميًا | مناسب لـ PHP بعد التحقق من الإصدارات والامتدادات |
| الجدولة | Cron قصير يحمل بيئته صراحة، دون عامل دائم | Scheduler مع Cron ؛ لا ميزة تشغيلية تفرض النقل هنا |
| المخاطر | يلزم الانضباط في الوحدات والتحقق والاختبارات | مخاطر إعادة الكتابة والانحدار وإعادة التحقق |
القرار: Node 24 و MySQL/InnoDB ، مع تحويل النواة إلى عمليات غير متزامنة ومعاملات. تبقى SQLite لاختبارات سريعة وقراءة مصدر v0.2 ، وتُمنع في الإنتاج. لا حاجة وظيفية إلى VPS أو Redis أو WebSockets. المقارنة خاصة بهذا المصدر؛ لا تدعي تفوق تقنية في جميع الحالات.
المصادر الرسمية التي فُحصت
- دعم Cloud Professional ونوع Other: https://www.hostinger.com/support/how-to-deploy-a-nodejs-website-in-hostinger/
- محركات البيانات: https://www.hostinger.com/support/which-databases-and-data-tools-are-supported-at-hostinger/
- اتصال Node بقاعدة Hostinger: https://www.hostinger.com/support/connecting-a-hostinger-mysql-database-to-a-node-js-application/
- Cron لمواقع Node: https://www.hostinger.com/support/how-to-run-cron-jobs-for-node-js-websites-at-hostinger/
- حدود تشغيل Node: https://www.hostinger.com/support/hostinger-node-js-limits-for-web-and-cloud-plans/
- إعلان نوع Other: https://www.hostinger.com/changelog/nodejs-hosting-now-supports-applications-without-a-detected-framework
الاستحقاقات العامة لا تثبت وجود حصة متاحة للتطبيق الجديد في هذا الحساب؛ تُراجع الحصة الفعلية عند إعداد التجربة.
الحالة الوظيفية v0.3
| الوظيفة | الحالة |
|---|
| Node 24 و MySQL | منفذة ومختبرة على MySQL 8.0.46 محليًا، مع مجمع اتصالات ومعاملات |
| الشركات والعملاء | إضافة عميل وشركة وربطهما، وعرض مقيد؛ تحرير جميع بيانات الشركة وأرشفتها لم يكتمل |
| المستخدمون | إنشاء حساب مؤقت، وشركات متعددة، وموافقة مستقلة، وتعطيل وإعادة تفعيل وإبطال جلسات |
| الطلبات والإسناد | استقبال من العميل والإدارة، ومفتاح إرسال، وإسناد موظف مخول وسجل له |
| المراحل والموافقة | انتقالات مقيدة وقفل نسخة واعتماد ورفض ومرجع سداد وتعثر مسبب وإغلاق بإثبات |
| المستندات | رفع محدود ومحمي، وتوقيع وبصمة، وتنزيل مقيد وتاريخ انتهاء قابل للتحديث |
| الالتزامات | إنشاء وتعديل وتجديد دورة وربط مستند ومتلقي وفترة تنبيه |
| التذكيرات | معالجة الفائت، ومنع تكرار الدورة والمرحلة، وقفل مهمة و lease ، وتأخير وخمس محاولات وسجل فشل |
| الجدولة | CLI و Cron و watchdog مجهزة؛ لم تُثبت فعليًا على Hostinger |
| البريد | موصل SMTP جاهز؛ اختُبر الفشل والنجاح بمزود مصطنع، دون إرسال خارجي |
| العقود والتقارير | إنشاء وتعديل نطاق وفترة وأتعاب وسداد، وتقارير وتصدير مقيد؛ ليست منظومة محاسبية |
| الترحيل والنسخ | ترحيلات ببصمات، واستيراد v0.2 دون تعديل المصدر، ونسخ مشفرة واستعادة إلى قاعدة فارغة |
| بوابة العميل | طلب ومستند وتعليق وقرار ومواعيد وعقد وشركات مخولة، دون تسجيل عام |
| التصميم | عناصر v0.2 و Cairo و Inter و RTL محفوظة؛ اختُبر متصفح مكتبي، دون جهاز هاتف حقيقي |
| MFA وفحص الملفات وتشفير القاعدة والاحتفاظ | متطلبات غير مكتملة قبل البيانات الحقيقية |
| PWA و Push وواتساب والتكاملات الحكومية | مؤجلة وغير مفعلة |
| النشر | لم يُنشر على Hostinger أو النطاق المعتمد؛ Design Lab المنشور يبقى v0.2 |
تقرير الاختبارات v0.3
النتائج المنفذة
- 18 اختبار تطبيق و HTTP وترحيل: نجحت كلها، دون حالات متجاوزة في التشغيل المسجل.
- تكامل MySQL 8.0.46: تسعة سيناريوهات فرعية، مع نجاح الحاوية الرئيسية؛ يعرض Node العدد 10. نجحت جميعها.
- فحص المصدر والبناء: نجح. فحص npm audit للتبعيات وقت التنفيذ: لا ثغرات معلنة.
مصفوفة التغطية
| المجال | الدليل |
|---|
| العزل | قوائم وقراءة بمعرف مباشر وإنشاء وتعليق وتنزيل، ومنع موظف من شركة غير مسندة |
| الموافقات | عميل مخول فقط، ونسخة العرض، وإبطال الاعتماد بالتغيير، وموافقة واحدة من 8 محاولات متزامنة |
| عدم تكرار الطلب | عشرة إرسالات متزامنة بالمفتاح نفسه تعود إلى سجل واحد؛ اختلاف المحتوى بالمفتاح نفسه يُرفض |
| العلاقات | قيد MySQL يمنع مستندًا من شركة مرتبطة بطلب شركة أخرى |
| دورة الطلب | إسناد صحيح، ومرجع سداد، وانتقالات مقيدة، وإثبات قبل الإغلاق |
| التذكير | عودة بعد توقف، ودورات جديدة، وتشغيلان متزامنان، ومستلم سُحبت صلاحيته |
| الفشل | تراجع معاملة، وسجل فشل وظيفة وفك قفلها، وفشل بريد وتأخير واستنفاد واستعادة lease منتهية |
| الدخول | جلسة وخروج وانتهاء وتعطيل وتغيير كلمة، وحد محاولات محفوظ و CSRF وأصل طلب |
| الملفات | توقيع وحجم وربط صحيح وتنزيل خاص وتحديث تاريخ بنسخة |
| النسخ | تشفير وتحقق من العبث، واستعادة إلى قاعدة MySQL ثانية، ومطابقة ملفات، وعدم استعادة جلسات، ورفض هدف غير فارغ |
| الترحيل | مصدر SQLite لا يُعدل، والحسابات القديمة تُعطل، وتاريخ المهام يُؤرشف، وهدف غير فارغ يُرفض |
| الحمل | 20 مستخدمًا افتراضيًا، و 100 إنشاء ثم 100 قراءة مقيدة، دون أخطاء |
نتيجة الحمل المسجلة: p95 للإنشاء نحو 20ms ؛ الملف LOAD_RESULT.json هو المرجع الرقمي. لا تمثل هذه الأرقام سعة Hostinger أو أداء ملفات وبيانات كبيرة.
التحقق البصري
اختُبر الدخول إلى الإدارة، وقائمة المستخدمين وصلاحياتهم، ونموذج عقد جديد وحفظه وظهوره بقيمة 600 ريال تجريبية. اختُبر نموذج التزام جديد مع مستلم مخول وحُفظ موعده. اختبارات v0.2 السابقة للعميل وعزل الشركات محفوظة، لكن الضمان الحالي مصدره اختبارات الخادم الجديدة، لا تلك الواجهة القديمة.
الحدود
لا اختبار اختراق أو هاتف فعلي أو نشر Hostinger أو تسليم SMTP خارجي أو مزود Push. اختبارات البريد تستخدم موصلًا مصطنعًا. معاينة المتصفح تستخدم SQLite الاختبارية؛ اختبارات MySQL نفذت بمحرك حقيقي منفصل، دون بيانات عملاء. ليست النتيجة اعتمادًا للإنتاج أو حماية البيانات.
الموارد والتكلفة الإضافية
| البند | الحاجة الحالية | التكلفة الإضافية |
|---|
| Node 24 و MySQL | تطبيق واحد وقاعدة مستقلة في الباقة القائمة إذا سمحت الحصة | لا شراء ضروري وظيفيًا؛ تُؤكد الحصة وقت إعداد التجربة |
| VPS و Redis وعامل دائم | غير مطلوبة لهذه النسخة | لا شراء مقترح |
| اسم النطاق | النطاق الفرعي من النطاق القائم | لا نطاق جديد |
| البريد | SMTP مصرح بها، مع حصة إرسال وتوثيق مناسبين | يمكن استخدام الموجود إن ناسب؛ لا عرض سعر مؤكد |
| النسخ | مساحة خاصة ومفتاح منفصل ونسخة خارج الخادم | قد تكفي الموارد المتاحة؛ أي خدمة جديدة تحتاج عرضًا وموافقة |
| المراقبة | watchdog ومراقب خارجي قبل التشغيل الحقيقي | لم تُشتر خدمة؛ السعر غير محدد |
| مراجعة الأمان والقانون | اختراق وتقييم معالجة ونقل البيانات | تتحدد بعروض ونطاق فعليين؛ لا أسعار سوقية مفترضة |
تخصيص مبدئي للتجربة
عملية Node واحدة، وخمس اتصالات قاعدة، وملف حتى 2MB ، وجسم طلب حتى 3MB. تعرض الواجهة أحدث 500 طلب مع تنبيه عند بلوغ الحد؛ يشمل تصديرها النتائج المعروضة فقط.
جولة البريد محدودة بخمسين محاولة ومدة إرسال نحو 60 ثانية، إضافة إلى مهلة الرسالة الحالية. حجز 256–512MB للتطبيق فرضية تخطيط أولية، وليس قياس حمل Hostinger. النسخ حتى 50MB قد ترفع الذاكرة مؤقتًا. اقترح Cron كل خمس دقائق ومراقبًا كل عشر دقائق، مع تجنب تزامن النسخ مع مهام المواقع الأخرى.
نتيجة القياس المحلي
20 مستخدمًا افتراضيًا، و 100 إنشاء و 100 قراءة، دون أخطاء. بلغ p95 للإنشاء قرابة 20ms في النتيجة المحفوظة. هذا قياس لبيئة صغيرة محلية؛ ليس وعد استجابة أو عدد عملاء مضمونًا على Hostinger. أعد القياس على الاستضافة بحجم ملفات مناسب بعد اعتماد التجربة.
لا تُستخدم إيرادات تراخيص مستقبلية لتبرير النسخة الحالية. قس العائد بساعات التنفيذ الموفرة والتأخر وإعادة العمل وطاقة الموظف وهامش عقود الخدمات، مع مقارنة قبل التشغيل وبعده. لم يُنشأ التزام مالي.
متطلبات إدخال بيانات العملاء الحقيقيين
هذه شروط الانتقال للتشغيل، وليست شهادة امتثال أو أمان.
المنفذ في v0.3
فحص صلاحيات الشركة على الخادم، وصلاحية موافقة مستقلة، ومعاملات وقفل نسخة الطلب، ومنع تكرار مفتاح الإرسال. الجلسات تحفظ بصمة التوكن وتستخدم HttpOnly و SameSite و Secure على HTTPS. اشتقاق كلمات المرور غير متزامن، وتغييرها يبطل الجلسات. حد محاولات الدخول محفوظ في القاعدة.
أضيفت حماية CSRF وأصل ثابت للطلبات، وحدود للحجم، وتخزين خاص للملفات مع فحص النوع والتوقيع والبصمة. توجد سياسة CSP ، ومراجع أخطاء لا تطبع المدخلات، ونسخ مشفرة، وسجل تدقيق، وسجل فشل وإعادة محاولة للتنبيهات.
المطلوب قبل البيانات الحقيقية
1. تحديد مواقع المعالجة والنسخ والمعالجين الفرعيين فعليًا، واتفاق المعالجة، وأساس نقل البيانات خارج المملكة، والأغراض والبيانات الدنيا والاحتفاظ وحقوق الأفراد والحوادث. المواقع المرصودة سابقًا فرنسا وليتوانيا؛ لم تُعتمد لمعالجة ملفات العملاء.
2. اعتماد عقد خدمات بازاد وتفويض كل خدمة وحدود الصلاحيات والموافقات ومسؤوليات المحاسب والعميل. لا تُخزن أسرار المنصات الحكومية أو رموز التحقق.
3. مراجعة انطباق PDPL ومتطلبات قطاع العميل والأمن السيبراني. الوثائق العامة لا تكفي لاستنتاج أن جميع الضوابط ملزمة لكل شركة.
4. إضافة MFA للإدارة والأدوار الحساسة، أو اعتماد ضابط مصادقة بديل مناسب. MFA غير منفذة. يجب أيضًا اعتماد طريقة تسليم الحسابات واستعادة كلمات المرور؛ إعادة الضبط الحالية بأداة إدارية مقيدة.
5. التحقق من تشفير القاعدة عند التخزين ومفاتيحها وسياسات الاحتفاظ والحذف على المضيف. تشفير النسخ في التطبيق موجود، لكنه لا يفرض تشفير ملفات MySQL نفسها.
6. ربط فحص خبيث وحجر للملفات أو اعتماد ضابط بديل. فحص التوقيع والحجم لا يثبت خلو PDF أو الصور من المخاطر.
7. اختبار اختراق مستقل ومراجعة الكود والتبعيات والأدوار. نتيجة npm audit الحالية صفر ثغرات معلنة؛ لا تعني ضمان غياب الثغرات.
8. اختبار Hostinger نفسه: HTTPS والقاعدة و Cron و SMTP والنسخ والاستعادة والأداء. الاختبار المحلي لا يحل محله.
9. مراقبة مستقلة لا تعتمد على المهمة التي ترصدها، وسياسة احتفاظ بالسجلات. سجل التدقيق الحالي لا يدعي مقاومة مدير القاعدة للعبث؛ يلزم مخزن مستقل إذا اقتضى مستوى الإثبات ذلك.
10. استضافة الخطوط محليًا بملفات مرخصة إذا كان تحميل Google Fonts غير مقبول في تقييم الخصوصية؛ ما زالت الخطوط خارجية في هذه النسخة.
لم تُستخدم بيانات حقيقية أو اتصالات حكومية، ولم يُرسل بريد خارجي أو يتغير DNS أو تُشتر خدمة.
دليل التثبيت والنشر على Hostinger
الحالة: الحزمة مجهزة، ولم تُنشر على Hostinger. لم يتغير DNS أو البريد أو الموقع الرئيسي. الوجهة المعتمدة لاحقًا هي operation.bazadgroup.com.sa.
1. تجربة معزولة أولًا
يضيف المسؤول تطبيق Node.js جديدًا على عنوان Hostinger مؤقت، وقاعدة MySQL جديدة ببيانات مصطنعة فقط، بعد مراجعة أثر إنشاء بيئة التجربة. لا تستخدم تطبيقًا أو قاعدة قائمة، ولا تعد ربط نطاق الموقع الرئيسي. لم ننفذ هذه الخطوة في الحساب.
تحقق من الحصة المتاحة لتطبيقات Node وقواعد البيانات والعمليات والمساحة. تأكدت قراءة لوحة الحساب في 2 نوفمبر 2026 من Cloud Professional ، وانتهاء الباقة في 22 أكتوبر 2027 ، وآخر مؤشر استخدام ظاهر 13%. الموارد المشتركة المرصودة في الفحص السابق: 5 أنوية و 6GB ذاكرة و 250GB تخزين؛ الخادم في فرنسا والنسخ في ليتوانيا. حدود التسويق العامة قد تختلف عن الباقة الموروثة، لذلك تُراجع حدود الحساب نفسه.
2. رفع حزمة التطبيق
حزمة Hostinger-release.zip تضع package.json في جذر ZIP ، دون مجلد أب، ودون node_modules أو .env أو بيانات تشغيل أو مفاتيح. اختر Node.js ، ونوع Other ، وإصدار Node 24 ، ثم:
- Root directory: .
- Output directory: .
- Entry file: server/http.mjs
- Build script: build
- Start command: npm start
- PORT: 3000 ، أو القيمة التي يزودها المضيف.
هذه إعدادات الحزمة؛ يجب التحقق منها في شاشة hPanel قبل اعتماد نشر التجربة. نفذ npm ci --omit=dev من ملف القفل. لا تشغل ترحيل قاعدة أو إدخال بيانات أثناء build ؛ البناء يفحص المصدر فقط.
3. قاعدة البيانات
أنشئ قاعدة ومستخدمًا مستقلين. وفق دليل Hostinger ، استخدم DB_HOST=127.0.0.1 و DB_PORT=3306 ، مع DB_USER و DB_PASSWORD و DB_NAME من الحساب. لا تضع القيم في تقرير أو رابط. الحجم الافتراضي للمجمع خمس اتصالات، ويمكن تخفيضه إلى ثلاث إذا كانت حصة القاعدة محدودة.
نُفذ الاختبار الفعلي على MySQL 8.0.46. تحقق من النسخة الفعلية للمضيف وتوافقها قبل التشغيل. شغّل npm run db:migrate مرة واحدة قبل بدء التطبيق. يحتفظ schema_migrations ببصمات الملفات ويرفض تعديل نسخة سبق تطبيقها.
لا تدعي الأداة أن تغييرات DDL في MySQL قابلة للتراجع تلقائيًا. قبل ترقية بنية قائمة، خذ نسخة وحدد نافذة صيانة، وراجع أي فشل قبل إعادة المحاولة. لا تعدّل ملفات ترحيل مطبقة؛ أضف إصدارًا جديدًا.
4. إعدادات الأمان والحساب الأول
انسخ أسماء المتغيرات من .env.example إلى إعدادات التطبيق الخاصة. يفرض production استخدام MySQL و APP_ORIGIN صحيحًا على HTTPS. استخدم أصل العنوان المؤقت للتجربة، ثم الأصل النهائي عند اعتماد الانتقال. لا يوجد حفظ بديل في المتصفح، ولا يُسمح بـ SQLite أو demo mode في الإنتاج.
شغّل npm run admin:bootstrap مع BOOTSTRAP_USERNAME و BOOTSTRAP_NAME و BOOTSTRAP_PASSWORD و BOOTSTRAP_EMAIL ، مؤقتًا في بيئة آمنة. لا تكتب كلمة المرور في رابط أو أمر محفوظ. يُطلب تغييرها عند أول دخول، وتُلغى الجلسات بعد التغيير. احذف متغير كلمة المرور المؤقتة من الإعدادات بعد الاستخدام.
بعد الدخول: أضف مجموعة العميل، ثم الشركة، ثم المستخدمين وشركاتهم وصلاحيات الموافقة، ثم أسند الموظفين. لا يوجد تسجيل عام.
5. بيانات التجربة
في قاعدة تجريبية فارغة فقط، ومع NODE_ENV=development و BAZAD_DEMO_MODE=1 ، يمكن تشغيل npm run db:seed-demo يدويًا. لا يشغله start أو build.
قبل التشغيل الحقيقي، استخدم قاعدة نظيفة وحسابات مخصصة. يرفض بدء الإنتاج الحسابات النشطة ذات كلمات مرور العينات، حتى إذا أُخفيت أزرار دخولها.
6. الجدولة والبريد
جهز Cron كل خمس دقائق لتشغيل scripts/jobs.mjs ، مع تحميل ملف متغيرات البيئة الخاص بالمضيف صراحة. راجع deployment/cron-example.txt واستبدل المسارات بالقيم الفعلية. دليل Hostinger يحدد UTC للجدولة، و 255 حرفًا للأمر، و 30 دقيقة كحد لعمر المهمة. لا تستخدم PM2 أو عاملًا دائمًا.
يعالج المحرك الاستحقاقات الفائتة عند العودة، ويولد أحدث مرحلة مناسبة بدل إغراق المستلم بجميع المواعيد القديمة. يمنع قفل المهمة تشغيلين متداخلين، وتمنع فريدة الدورة والمستلم والقناة والمرحلة تكرار إنشاء التنبيه.
الإرسال خارج معاملة القاعدة، بمعرف رسالة ثابت وتأخير متزايد وحد أقصى خمس محاولات. قد يقبل SMTP الرسالة ثم ينقطع الاتصال قبل تسجيل النجاح؛ لذلك الضمان عمليًا at-least-once ، وليس exactly-once أو إثبات قراءة المستلم.
اضبط SMTP و MAIL_FROM المصرح بهما فقط. بدونهما تظهر blocked ولا يُدعى الإرسال. اختبر صندوقًا تجريبيًا قبل المستلمين الحقيقيين. لم ترسل رسائل خارجية أثناء التطوير. يتحقق الموصل من شهادات TLS.
شغّل watchdog بصورة مستقلة كل عشر دقائق، وراقب غياب النجاح لأكثر من 15 دقيقة. يبقى مراقب خارج الاستضافة مطلوبًا لاكتشاف انقطاع المضيف أو توقف Cron كله؛ لم يُربط أو يُشتر هذا المراقب.
7. النسخ والاستعادة
BACKUP_KEY مفتاح base64 من 32 بايت عشوائية. احفظه منفصلًا عن النسخ، ولا تضعه في المستودع. BACKUP_DIRECTORY مسار خاص خارج dist. ينشئ npm run backup:daily نسخة AES-256-GCM في ملف جديد بصلاحية 600. حدد مدة الاحتفاظ والمساحة، واحفظ نسخة خارج الخادم.
النسخة التطبيقية محدودة بحجم 50MB قبل التشفير لحماية الذاكرة. بعد ذلك استخدم نسخة MySQL أصلية مشفرة ومختبرة؛ لا ترفع الحد عشوائيًا.
للاستعادة: أنشئ قاعدة فارغة، وطبق migrations ، ثم اضبط BACKUP_FILE و BACKUP_KEY و RESTORE_CONFIRM=EMPTY_TARGET وشغّل npm run restore. تتحقق الأداة من نسخة البنية وتوقيع التشفير وبصمات الوثائق، ولا تستعيد الجلسات. ترفض الكتابة على قاعدة غير فارغة. اختبر الاستعادة على Hostinger نفسه قبل التشغيل الحقيقي؛ اختبار MySQL المحلي نجح.
8. ترحيل v0.2
احتفظ بملف SQLite الأصلي ونسخة منه. في قاعدة MySQL فارغة بعد migrations ، اضبط V02_SQLITE_PATH و IMPORT_CONFIRM=EMPTY_TARGET ، ثم شغّل npm run import:v02.
تقرأ الأداة المصدر دون تعديله، وتنقل السجلات داخل معاملة. تُعطل حسابات المصدر، وتُصفّر صلاحيات الموافقة، وتحتاج الإسنادات مراجعة. يُحفظ تاريخ notifications و job_runs القديم في import_archives بدل إدخاله إلى طابور التوصيل الجديد. لا تُستعاد الجلسات.
لاستعادة حساب المشرف، استخدم npm run admin:reset مع ADMIN_RESET_CONFIRM=RESET_LOCAL_ACCOUNT و BOOTSTRAP_USERNAME و BOOTSTRAP_PASSWORD بطريقة آمنة. راجع كل حساب وصلاحية قبل إعادة التفعيل. تفرض إعادة تفعيل حساب معطل كلمة مرور مؤقتة جديدة.
تحفظ الأداة المستندات، لكنها تُصفّر مؤشر evidence في الطلبات القديمة؛ يجب مراجعة مراجع إثبات الإنجاز قبل اعتمادها في البنية الجديدة.
9. اختبار قبول التجربة
تحقق من health/live و health/ready ، والدخول والخروج وتغيير كلمة المرور، ورفض أصل مختلف. اختبر منع شركة أ من قراءة شركة ب، ورفض موافقة مستخدم غير مخول، ورفض إسناد موظف لا يملك الشركة. اختبر العرض والموافقة والمستند والإثبات والإغلاق.
أوقف Cron وأعده، وكرر تشغيله، ثم اختبر فشل SMTP وإعادة المحاولة. خذ نسخة واستعدها إلى قاعدة ثانية، وقس الأداء على موارد الحساب.
بعد نجاح التجربة ومراجعة حماية البيانات، اعرض تغيير النطاق المحدد للحصول على موافقة النشر. خطة الرجوع: احتفظ بالحزمة السابقة ونسخة القاعدة، وأوقف الكتابة قبل الاستعادة. لا تشغل كودًا قديمًا على بنية جديدة دون توافق موثق.