MoonStack — نظام التوزيع والتحديث الذاتي

نظام بسيط، منفصل، ومعزول ١٠٠٪ — على غرار الووردبريس. يتعايش جنب نظام Ahmed «Moon Central» من غير ما يلمسه.

خطة للمراجعة والاتفاق · 2026-06-16 · قبل أي كود
الهدف: نحوّل Moon ERP لمنتج زي الووردبريس — حزمة تتحمّل وتتركّب على أي استضافة، ولما ننزّل تحديث، النسخة المركّبة تقدر تسحبه وتحافظ على بيانات العميل بالكامل وتاخد الكود الجديد + الـ migrations.

القرار المؤسِّس (اتفقنا عليه): ده نظام مستقل تمامًا عن نظام Ahmed، نبنيه من الصفر، بسيط ومعزول. النظامين يفضلوا جنب بعض؛ ولما Ahmed يخلّص بتاعه نقرّر نعتمد عليه. دلوقتي: MoonStack بس، ومفيش أي تعديل في كود Ahmed.

١) ليه منفصل — ومبدأ التعايش

٢) حدود عدم التصادم (الأهم)

كل اسم/مسار في MoonStack مختلف تمامًا عن نظام Ahmed عشان يشتغلوا في نفس الريبو من غير تضارب:

العنصرنظام Ahmed — ممنوع نلمسهMoonStack — الجديد
نقطة التثبيتpublic/install.php · /installpublic/moonstack-setup.php · /moonstack-setup
نقطة التحديثpublic/update.php · /updatepublic/moonstack-update.php · /moonstack-update
الإعداداتconfig/license.php + config/update.phpconfig/moonstack.php
الكود (Namespace)App\Services\Update\* · MoonLicenseClientApp\MoonStack\*
الأوامرlicense:* · moon:*moonstack:*
تتبّع الإصدارMOON_APP_VERSION + storage/installedstorage/moonstack/version.json + storage/moonstack/installed
الباك أبstorage/app/backups/storage/moonstack/backups/
سيرفر التحديثMoon Central (SaaS)versions.json ثابت على CDN + API خفيف
ملاحظة: الاتنين بيتشاركوا في حاجة واحدة بس — تطبيق Laravel وقاعدة البيانات — لكن كود التوزيع في كل نظام ما يعرفش عن التاني.

٣) فصل الكود عن الداتا (القلب)

الكود (يُستبدل كل تحديث)

Modules/ · app/ · config/ · routes/ · database/migrations/ · vendor/ (مُحزّم جاهز) · artisan · الـ Angular dist المبني مسبقًا.

الداتا (تُحفظ للأبد — لا تُلمس)

قاعدة MySQL (migrations بس) · .env (خصوصًا APP_KEY) · storage/app/** (رفع المستخدم) · public/uploads · أي إعداد خاص بالعميل.

التحديث = استبدال الكود + تشغيل migrations آمنة (إضافية فقط). ما يلمسش أبدًا صفوف الداتا أو .env أو الرفع أو الـ APP_KEY. القائمة دي تتعرّف في config/moonstack.php كـ manifest واحد (مصدر الحقيقة).

٤) قيود الاستضافة (cPanel) اللي بتشكّل كل القرارات

مفيش root، مفيش Docker، مفيش SSH مضمون؛ composer install غير موثوق؛ exec()/mysqldump ممكن يكونوا متوقفين؛ ملفات cache بملكية root → 500؛ Angular محتاج build مش متاح على الهوست. لذلك:

٥) المكوّنات الأربعة (مبسّطة)

① خط التحزيم (عندنا)

سكريبت build → حزمة zip موقّعة بإصدار = كود + vendor/ مُحزّم + الواجهة مبنية + manifest.json. يستثني .env والداتا.

② سيرفر التحديث (عندنا)

أبسط مسار: ملفات zip موقّعة ثابتة على CDN + versions.json صغير. (من غير سيرفر تقيل — ده الفرق عن Moon Central.)

③ المُثبِّت (داخل الحزمة)

معالج ويب أول تشغيل: فحص البيئة → إعداد DB → توليد .env+APP_KEY (مرة واحدة) → migrate+seed → أول أدمن/شركة.

④ المُحدِّث داخل التطبيق (داخل الحزمة)

شاشة «التحديثات» + محرّك: فحص → تنزيل → تحقق → باك أب → تطبيق → migrate → swap واجهة → استرجاع عند أي فشل.

٦) مسار التحديث (١١ خطوة)

  1. فحص: النسخة تكلّم السيرفر بـ {current_version, php_version} → ترجع أحدث إصدار + changelog + الحد الأدنى للمتطلبات + رابط + sha256 + توقيع.
  2. Pre-flight: نسخة PHP/extensions، مساحة القرص، صلاحيات الكتابة. فشل → نقف قبل ما نبدأ.
  3. وضع الصيانة: artisan down.
  4. باك أب: dump للداتابيز + zip للكود + storage → storage/moonstack/backups/<version>/. شبكة الأمان.
  5. تنزيل + تحقق: sha256 + توقيع (سلامة + أصالة).
  6. تجهيز وتطبيق: فك في staging، استبدال الكود مع الحفاظ على .env وstorage/ وpublic/uploads/.
  7. Migrate: migrate --force (إضافي) + seeders مرجعية idempotent.
  8. إعادة بناء: dump-autoload -o + optimize:clear + كاش config/route.
  9. Swap الواجهة: حذف الـ dist القديم أولًا (تفادي chunks قديمة) ثم نسخ الجديد.
  10. تشغيل: artisan up + فحص صحة.
  11. تقرير + استرجاع: أي فشل في أي خطوة → rollback (استرجاع الكود + الداتابيز + artisan up).

٧) الـ ١٤ قاعدة المؤسِّسة

1
APP_KEY ثابت — يتولّد مرة واحدة عند التثبيت، ما يتغيّرش أبدًا (تغييره يكسر الأعمدة المشفّرة).
2
manifest كود/داتا — ملف يحدّد مسارات الداتا اللي ما تُستبدلش أبدًا.
3
انضباط الـ migrations — كل migration إضافي وآمن؛ الحذف على إصدارين؛ ممنوع تعديل migration مشحون.
4
seeders idempotent — مرجعية بـ firstOrCreate، ممنوع truncate وإعادة.
5
تبعيات مُحزّمةvendor/ جاهز؛ بس dump-autoload على الهوست.
6
باك أب قبل التحديث — إجباري، تلقائي، استرجاع بضغطة.
7
حزم موقّعة + checksumsha256 + توقيع بمفتاحنا الخاص يتحقّق بمفتاح عام مدمج.
8
بوابة توافق — كل إصدار يعلن الحد الأدنى لـ PHP/extensions/الإصدار السابق؛ يرفض لو مش متوفّر.
9
تشغيل بمستخدم الويب — كل العمليات + artisan (تفادي cache بملكية root).
10
ذرّي وقابل للعكس — staging ثم swap؛ استرجاع عند الفشل (DDL في MySQL مش transactional → الباك أب هو الضمان).
11
بدون افتراض shell — المُحدِّث ويب أساسي؛ CLI اختياري للهوستات اللي فيها SSH.
12
تتبّع نسخة DB — تسجيل app_version + schema_version؛ ترقية مرتّبة بلا قفز.
13
ترخيص خفيف (اختياري) — في MoonStack البساطة أولًا؛ مفتاح بسيط/أو بدون. (مش زي licensing بتاع Ahmed.)
14
بدون تعديل core عند العميل — التخصيص عبر config/modules فقط؛ التحديث يستبدل الـ core.

٨) الخطة على ٧ مراحل (معزولة)

0

الأساسات نبدأ هنا

manifest الكود/الداتا في config/moonstack.php · تتبّع app_version+schema_version معزول · توثيق انضباط migrations + ثبات APP_KEY · فحص idempotency للـ seeders اللي هيستخدمها المُثبِّت.
1

خط التحزيم بعدها

سكريبت moonstack:build → حزمة موقّعة (كود+vendor+واجهة+manifest+sha256).
2

المُثبِّت

معالج ويب moonstack-setup.php (فحص → DB → .env/APP_KEY → migrate+seed → أدمن/شركة).
3

سيرفر التحديث

versions.json + استضافة حزم موقّعة + توقيع/تحقق.
4

المُحدِّث داخل التطبيق

محرّك فحص/تنزيل/تحقق/باك أب/تطبيق/migrate/rollback + شاشة «التحديثات».
5

الباك أب/الاسترجاع

تقوية الـ rollback (كود + داتابيز) + fallback بـ PHP خالص + الاحتفاظ.
6

الترخيص (اختياري/خفيف)

تفعيل بسيط لو احتجناه — أبسط ما يكون.
7

التجربة (Pilot)

تثبيت كامل → تحديث → بروفة rollback على حساب cPanel نظيف.

٩) القرارات المفتوحة + توصياتي (كنقطة بداية)

القرارتوصيتي
آلية التحديثويب أساسي + CLI اختياري
سيرفر التحديثzip موقّعة ثابتة على CDN + versions.json خفيف
الترخيصبدون ترخيص في البداية (أو مفتاح بسيط لاحقًا) — البساطة أولًا
المُثبِّتمعالج ويب كامل
تلقائي/يدوييدوي بضغطة افتراضيًا
طريقة باك أب DBmysqldump مع fallback بـ PHP خالص
قناة الإصدارstable فقط في البداية
القرارات دي مش بتوقف Phase 0 — الأساسات مش معتمدة على أي منها، فنقدر نبدأ فيها فورًا بعد موافقتك على الخطة دي.

١٠) حقائق البيئة/الـ stack

الخلاصة: MoonStack نظام مستقل بسيط، أسماؤه ومساراته مختلفة تمامًا عن Moon Central، مفيش بينهم تقاطع كود. نبدأ من Phase 0 (الأساسات) بعد موافقتك على الخطة دي.
MoonStack Plan · مصدر الحقيقة للعمل محفوظ في ذاكرة المشروع (self-hosted-distribution-plan.md) · آخر تحديث 2026-06-16