نشر نظام LMS كامل المكونات (Full-Stack) على استضافة مشتركة وRender
لقد قمنا بنشر تطبيق Node.js وReact وPostgreSQL في بيئة الإنتاج دون استخدام VPS.
قمنا ببناء نظام إدارة تعلم (LMS) كامل لـ G3HUB. تضمنت الحزمة التقنية (Stack): • الواجهة الأمامية (Frontend): React 18 وVite وTailwindCSS • الواجهة الخلفية (Backend): Node.js 20 وExpress 5 • قاعدة البيانات (Database): PostgreSQL 15 عبر Supabase • ORM: Drizzle ORM
لم يكن لدينا خادم افتراضي سحابي (Cloud VM) أو VPS. كان لدينا فقط حساب استضافة مشتركة cPanel يشغل بالفعل موقع WordPress. إليكم كيف جعلنا الأمر يعمل.
تقسيم البنية التحتية لم نتمكن من تشغيل Node.js وPostgreSQL على نفس الخادم. لذا قمنا بتقسيم التطبيق عبر ثلاث خدمات: • الواجهة الأمامية (Frontend): استضافة مشتركة cPanel (ملفات ثابتة) • واجهة برمجة التطبيقات (API): Render (الخطة المجانية) • قاعدة البيانات (Database): Supabase (الخطة المجانية)
أكبر العقبات
١. عائق قاعدة البيانات حاولنا تشغيل Node.js API مباشرة على cPanel، لكن الأمر فشل على الفور. غالبًا ما يقوم مزودو الاستضافة المشتركة بحظر الاتصالات الصادرة عبر المنفذ 5432. وهذا يعني أن تطبيقك لا يمكنه التواصل مع قاعدة بيانات خارجية. قمنا بنقل الـ API إلى Render لحل هذه المشكلة.
٢. معاناة الـ Monorepo
استخدمت قاعدة الكود لدينا pnpm workspaces. عندما قمنا بالرفع (push) إلى Render، فشلت عملية البناء (build) لأن Render لم يتعرف على تبعيات مساحة العمل المحلية (local workspace dependencies).
الحل: استخدمنا esbuild لتجميع كل شيء في ملف واحد بحجم 6.4 ميجابايت. واستبدلنا ملف package.json المعقد بنسخة مبسطة تحتوي فقط على التبعيات الخارجية.
٣. حرب الـ CORS والـ Proxy
حاولنا استخدام Apache mod_proxy لتوجيه طلبات الـ API من نطاقنا (domain) إلى Render، لكن العملية انتهت بانتهاء المهلة (timed out). غالبًا ما تفرض الاستضافة المشتركة قيودًا على هذه الوحدة (module).
الحل: استخدمنا PHP cURL proxy. بما أن الواجهة الأمامية وسكريبت PHP يعملان على نفس النطاق، فقد تجنبنا جميع مشكلات CORS. يقوم سكريبت PHP بتوجيه الطلبات بصمت إلى Render.
نصائح للنشر • قم بالبناء (Build) باستخدام PowerShell وليس Git Bash؛ حيث تتعامل Windows مع متغيرات البيئة (environment variables) بشكل مختلف في Git Bash. • استخدم كلمة مرور لقاعدة البيانات بدون رموز خاصة. الرموز مثل @ أو ! تتطلب ترميز URL وتسبب أخطاء في الاتصال. • استخدم UptimeRobot. الخطة المجانية في Render تدخل في وضع السكون بعد 15 دقيقة. قم بضبط "ping" لنقطة نهاية فحص الحالة (health check endpoint) الخاصة بك لإبقائها نشطة.
إجمالي تكلفة البنية التحتية: 0 دولار/شهر.
إذا كانت لديك الميزانية، فاستخدم VPS؛ فهو يزيل كل هذه العوائق. ولكن إذا كانت ميزانيتك صفرًا، فإن التوجيه الإبداعي (creative routing) يجعل التطبيقات الجاهزة للإنتاج أمرًا ممكنًا.
المصدر: https://dev.to/oyohedmond/deploying-a-full-stack-lms-on-shared-hosting-render-free-the-hard-way-4ke0
