لماذا تنشر Node.js على VPS بدلاً من منصة مُدارة؟
منصات serverless وPaaS عملية في البداية، لكن تكلفتها ترتفع مع ازدياد الزيارات، وتفرض قيودًا (timeouts وcold starts وحدود على اتصالات WebSocket). يمنحك VPS عملية Node.js دائمة، واتصالات طويلة (WebSocket وSSE) دون حد مصطنع، وموارد مخصّصة وتكلفة ثابتة قابلة للتوقّع. أنت من يقرّر إصدار Node ومدير العمليات والبروكسي العكسي واستراتيجية التحديث، دون الاعتماد على أعراف مزوّد معيّن.
ما الذي تكسبه مع VPS لتشغيل Node.js
- عملية Node.js دائمة، مثالية لـWebSocket وSSE والمهام الطويلة دون cold start
- إعادة تشغيل تلقائية عند التعطّل وعند إعادة إقلاع الخادم بفضل PM2
- وضع cluster لاستغلال جميع أنوية المعالج في VPS دون تغيير شيفرتك
- بروكسي عكسي Nginx أمام Node لأجل HTTPS والضغط والملفات الثابتة
- تكلفة ثابتة وقابلة للتوقّع، دون فوترة لكل طلب ودون مفاجآت في التوسّع (scaling)
- تحكم كامل في إصدار Node.js وفي اعتماديات النظام
المتطلبات المسبقة
يعمل تطبيق Node.js اعتيادي (واجهة API بـExpress أو Nest أو Fastify) بأريحية على VPS بـ1 إلى 2 vCPU و1 إلى 2 غيغابايت من ذاكرة RAM؛ وخصّص ذاكرة RAM أكبر إذا كنت تُصرّف واجهة أمامية ثقيلة أثناء البناء أو تشغّل workers. ثبّت Node.js عبر nvm أو مستودع NodeSource لتثبيت إصدار LTS، إضافةً إلى PM2 كمدير عمليات وNginx كبروكسي عكسي. تحتاج إلى نطاق يشير إلى عنوان IP الخاص بـVPS وإلى فتح المنفذين 80/443.
نشر تطبيق Node.js في الإنتاج
تجهيز VPS وتثبيت Node.js
على VPS بنظام Ubuntu 22.04، حدّث النظام وثبّت إصدار LTS من Node عبر nvm (nvm install --lts) أو مستودع NodeSource. تحقّق باستخدام: node -v وnpm -v. أنشئ مستخدمًا غير جذري (non-root) مخصّصًا للتطبيق بدلًا من تشغيل كل شيء بصلاحيات root.
جلب الشيفرة والبناء
استنسخ مستودعك على VPS، وثبّت اعتماديات الإنتاج (npm ci --omit=dev)، وشغّل عملية البناء عند الحاجة (npm run build). ضع المتغيرات الحساسة في ملف .env غير مُودَع في المستودع أو في متغيرات بيئة الخدمة.
تشغيل التطبيق باستخدام PM2
ثبّت PM2 بشكل عام (npm install -g pm2) ثم شغّل التطبيق: pm2 start app.js --name monapp -i max. يفعّل العلَم -i max وضع cluster على جميع الأنوية. ويعيد PM2 تشغيل العملية تلقائيًا عند تعطّلها.
تفعيل بدء التشغيل التلقائي عند الإقلاع
أنشئ سكربت systemd باستخدام pm2 startup، ونفّذ الأمر الظاهر، ثم ثبّت الحالة الراهنة باستخدام pm2 save. وعند إعادة إقلاع VPS التالية، سيُعاد تشغيل تطبيقك تلقائيًا دون أي تدخل.
إعداد Nginx كبروكسي عكسي
ثبّت Nginx وأنشئ مضيفًا افتراضيًا (virtual host) لنطاقك يوجّه الطلبات إلى منفذ Node المحلي (مثال: proxy_pass http://localhost:3000;). أضف ترويسَتَي Upgrade وConnection إذا كنت تستخدم WebSocket. اختبر الإعداد (nginx -t) ثم أعد التحميل.
التأمين بـHTTPS عبر Let's Encrypt
ثبّت Certbot وإضافته الخاصة بـNginx، ثم نفّذ certbot --nginx -d yourdomain.com. يحصل Certbot على الشهادة، ويضبط إعادة التوجيه من HTTP إلى HTTPS، ويجدول التجديد التلقائي. أصبح تطبيق Node لديك الآن يُقدَّم عبر HTTPS.
لعمليات نشر دون انقطاع، ادمج وضع cluster في PM2 مع pm2 reload monapp بدلًا من restart: يعيد PM2 تشغيل الـworkers واحدًا تلو الآخر، مع الإبقاء دائمًا على نسخة واحدة على الأقل متاحة أثناء التحديث. ثم راقب الذاكرة باستخدام pm2 monit وحدّد حدًّا لإعادة التشغيل التلقائي (--max-memory-restart 500M) لمنع تسرّبات الذاكرة في الإنتاج.