كيفية نشر تطبيق Node.js: من إعداد الخادم إلى بيئة الإنتاج

دقائق القراءة: 6

مقدمة: كيف تنقل تطبيق Node.js إلى بيئة الإنتاج باحترافية؟

يحتاج نشر تطبيق Node.js على خادم فعلي إلى أكثر من مجرد رفع الملفات وتشغيل الأمر node app.js. فبيئة الإنتاج تتطلب إعدادًا آمنًا ومنظمًا يضمن استقرار التطبيق، سهولة الوصول إليه، وإمكانية إعادة تشغيله تلقائيًا عند حدوث أي مشكلة.

في هذا الدليل العملي، سنتناول خطوات نشر تطبيق Node.js بدءًا من إنشاء خادم على منصة DigitalOcean، مرورًا بإعداد الاتصال الآمن عبر SSH، وتثبيت Nginx كـ Reverse Proxy، وصولًا إلى تشغيل التطبيق كخدمة مستقرة باستخدام PM2.

نشر تطبيق Node.js على خادم إنتاج مع إعداد الخادم وNginx وPM2

لماذا نختار DigitalOcean لاستضافة تطبيقات الويب؟

تُعد منصة DigitalOcean خيارًا شائعًا بين المطورين، خاصة في المشاريع الصغيرة والمتوسطة، وذلك لعدة أسباب:

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

تعتمد المنصة على مفهوم Droplets، وهي خوادم افتراضية تعمل فوق بنية سحابية مشتركة. ويمكن النظر إليها بوصفها بيئة مستقلة يمكنك التحكم بها كما لو كانت خادمًا خاصًا بك.

إنشاء مشروع جديد على DigitalOcean

قبل إنشاء الخادم، من الأفضل إنشاء مشروع جديد لتجميع الموارد المتعلقة به داخل لوحة التحكم.

  1. سجّل الدخول إلى حسابك في DigitalOcean.
  2. من القائمة الجانبية، اختر إنشاء مشروع جديد.
  3. أدخل اسم المشروع المناسب.
  4. تجاوز خطوة نقل الموارد الحالية عبر خيار Skip، لأننا سننشئ الخادم لاحقًا.

واجهة إنشاء مشروع جديد على منصة DigitalOceanتسمية المشروع الجديد داخل لوحة تحكم DigitalOcean

كيفية إنشاء Droplet لتشغيل تطبيق Node.js

بعد إنشاء المشروع، يمكنك البدء في إنشاء الخادم من خلال زر Get Started.

بدء إنشاء Droplet جديد على DigitalOcean

اختيار صورة النظام

يفضّل استخدام Ubuntu 20.04 LTS أو أي إصدار LTS حديث، لأن هذا النوع من الإصدارات يحصل على دعم طويل المدى وتحديثات أمنية مستقرة، وهو ما يجعله مناسبًا لبيئات الإنتاج.

اختيار نظام Ubuntu LTS عند إنشاء خادم على DigitalOcean

إذا لم تكن لديك متطلبات أداء مرتفعة، فيمكنك البدء بأقل خطة تكلفة ثم الترقية لاحقًا عند الحاجة.

اختيار مركز البيانات المناسب

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

اختيار مركز البيانات المناسب للخادم السحابي على DigitalOcean

اختيار طريقة المصادقة الآمنة

بدلاً من الاعتماد على كلمة المرور التقليدية، يُنصح باستخدام مفاتيح SSH لأنها أكثر أمانًا وملاءمة للإدارة الاحترافية للخوادم.

اختيار المصادقة باستخدام مفاتيح SSH عند إنشاء الخادم

إنشاء مفتاح SSH على جهازك

للسماح بالاتصال الآمن مع الخادم، يجب أولًا إنشاء زوج مفاتيح SSH على جهازك المحلي.

cd ~/.ssh
ssh-keygen

إذا لم يكن الأمر ssh-keygen متاحًا على جهازك، فستحتاج إلى تثبيت الأدوات المطلوبة أولًا.

إنشاء مفتاح SSH من خلال سطر الأوامر

أثناء التنفيذ سيُطلب منك تحديد اسم الملف وإدخال passphrase. إذا كنت تريد الإعداد الافتراضي، اضغط Enter دون إدخال اسم جديد.

عادةً ستجد الملفات التالية داخل مجلد ~/.ssh:

id_dsa
id_rsa
known_hosts

المفتاح العام هو الذي تقوم برفعه إلى مزود الاستضافة، أما المفتاح الخاص فيجب الاحتفاظ به على جهازك وعدم مشاركته مطلقًا.

إضافة مفتاح SSH إلى DigitalOcean

بعد إنشاء المفتاح، انسخ محتوى المفتاح العام كاملًا، بما في ذلك الجزء الذي يبدأ بـ ssh-rsa أو الصيغة المشابهة له.

نسخ المفتاح العام SSH لرفعه إلى DigitalOcean

ثم من لوحة DigitalOcean:

  1. اضغط على New SSH Key.
  2. ألصق المفتاح في الحقل المخصص.
  3. احفظ الإعداد.

زر إضافة مفتاح SSH جديد في DigitalOceanإدخال المفتاح العام SSH داخل لوحة DigitalOcean

الاتصال بالخادم لأول مرة

بعد إنشاء الخادم، يمكنك الاتصال به باستخدام الطرفية عبر الأمر التالي:

ssh root@IP_ADDRESS

استبدل IP_ADDRESS بعنوان الخادم الفعلي. وإذا واجهت أي مشكلة في الاتصال، يمكنك استخدام الخيار -v أو -vv للحصول على معلومات تشخيصية إضافية.

تهيئة الخادم قبل نشر التطبيق

تحديث الحزم والبرمجيات

من أهم خطوات الأمان تحديث النظام فور إنشاء الخادم، لأن الإصدارات القديمة قد تحتوي على ثغرات معروفة.

apt update
apt upgrade

عند مطالبتك بالتأكيد، اكتب y لإكمال الترقية.

إنشاء مستخدم جديد بدلًا من root

العمل الدائم بحساب root غير مستحب أمنيًا. الأفضل إنشاء مستخدم جديد ومنحه صلاحيات sudo.

whoami
adduser USERNAME
usermod -aG sudo USERNAME
su USERNAME

استبدل USERNAME باسم المستخدم الذي تريده. بعد الانتقال إليه، يمكنك التحقق من المستخدم الحالي باستخدام:

whoami

وللتأكد من صلاحيات sudo، جرّب الأمر التالي:

sudo cat /var/log/auth.log

نسخ مفتاح SSH إلى المستخدم الجديد

بعد إنشاء المستخدم، يجب تفعيل دخوله عبر SSH بإضافة المفتاح العام إلى ملف authorized_keys.

mkdir -p ~/.ssh
vi ~/.ssh/authorized_keys

انسخ المفتاح العام الذي أنشأته سابقًا، ثم الصقه داخل الملف. في محرر vi أو vim:

  • اضغط i للدخول إلى وضع الإدراج.
  • ألصق المفتاح.
  • اضغط Esc.
  • اكتب :wq للحفظ والخروج.

تسجيل الدخول بالمستخدم الجديد

بعد تجهيز المفتاح، يمكنك الاتصال بالخادم باستخدام المستخدم الجديد:

ssh USERNAME@IP_ADDRESS

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

تعطيل تسجيل الدخول بحساب root

لرفع مستوى الأمان، من الجيد منع تسجيل الدخول المباشر باستخدام root.

chmod 644 ~/.ssh/authorized_keys
sudo vi /etc/ssh/sshd_config

ابحث داخل الملف عن السطر التالي:

PermitRootLogin no

إذا كان مضبوطًا على yes، غيّره إلى no، ثم احفظ الملف واخرج.

تثبيت Node.js وGit على الخادم

الآن أصبح الخادم جاهزًا لتثبيت الأدوات الأساسية اللازمة لتشغيل التطبيق وإدارة المستودعات البرمجية.

sudo apt install nodejs npm
sudo apt install git

بعد ذلك يمكنك إما سحب مشروعك من GitHub أو إنشاء تطبيق تجريبي بسيط للتأكد من سلامة البيئة.

تشغيل تطبيق Node.js تجريبي على الخادم

أنشئ ملفًا باسم app.js داخل المجلد الذي تريد العمل فيه:

sudo vi app.js

ثم أضف الكود التالي:

const express = require('express');
const app = express();
const port = 3000;

app.get('/', (req, res) => {
  res.send('Hello World');
});

app.listen(port, () => console.log(`Example app listening on port ${port}!`));

شغّل التطبيق باستخدام:

node app.js

إذا نجح التشغيل، فسترى رسالة تؤكد أن التطبيق يستمع على المنفذ 3000.

يمكنك اختبار ذلك من خلال زيارة الرابط التالي:

http://IP_ADDRESS:3000/

يفترض أن تظهر لك رسالة Hello World.

لماذا نحتاج إلى Nginx أمام تطبيق Node.js؟

رغم أن التطبيق يعمل الآن، فإن الوصول إليه عبر المنفذ 3000 ليس مناسبًا للمستخدمين العاديين. هنا يأتي دور Nginx، حيث يعمل كوسيط أمامي يستقبل الطلبات على المنفذ 80 ثم يمررها إلى تطبيق Node.js.

الحاجة إلى Nginx لتوجيه الطلبات إلى تطبيق Node.js

تثبيت وإعداد Nginx كـ Reverse Proxy

استخدام Nginx كخادم Reverse Proxy أمام تطبيق Node.js

لتثبيت Nginx وتشغيله:

sudo apt install nginx
sudo service nginx start

بعد تشغيله، افتح عنوان IP الخاص بالخادم في المتصفح. إذا ظهر لك الصفحة الافتراضية الخاصة بـ Nginx فهذا يعني أن الخدمة تعمل بنجاح.

الصفحة الافتراضية لخادم Nginx بعد التثبيت

بشكل افتراضي، يخدم Nginx الملفات من المسار /var/www/html. ومن الأفضل إنشاء مجلد منظم لتطبيقك، مثل /var/www/app، لتسهيل إدارة الملفات مستقبلًا.

تعديل ملف إعدادات Nginx

افتح ملف الإعدادات الافتراضي:

sudo vi /etc/nginx/sites-available/default

ابحث عن كتلة location / وعدّلها بالشكل التالي:

location / {
    proxy_pass http://127.0.0.1:3000/;
}

تقوم التعليمة proxy_pass بتمرير الطلبات إلى التطبيق العامل على المنفذ 3000.

بعد الحفظ، أعد تحميل إعدادات Nginx:

sudo service nginx reload

الآن عند زيارة عنوان الخادم من المتصفح، يفترض أن تظهر رسالة Hello World دون الحاجة إلى كتابة المنفذ 3000.

نجاح توجيه الطلبات من Nginx إلى تطبيق Node.js

تشغيل التطبيق كخدمة دائمة باستخدام PM2

تشغيل التطبيق يدويًا في كل مرة ليس حلًا عمليًا. إذا توقف التطبيق بسبب خطأ أو أُعيد تشغيل الخادم، فستحتاج إلى تشغيله من جديد. لهذا السبب يُستخدم PM2 لإدارة العمليات وتشغيل التطبيقات تلقائيًا.

sudo npm i -g pm2
pm2 start app.js
pm2 save
pm2 startup systemd

يوفّر PM2 عدة مزايا مهمة:

  • إعادة تشغيل التطبيق تلقائيًا عند التعطل.
  • تشغيل التطبيق تلقائيًا بعد إعادة تشغيل الخادم.
  • إدارة العمليات ومراقبتها بسهولة.

إعداد PM2 لتشغيل تطبيق Node.js تلقائيًا مع بدء النظام

إذا كنت تستخدم توزيعة Linux مختلفة، فقد تحتاج إلى استبدال systemd بما يناسب مدير الخدمات في نظامك.

للتأكد من أن كل شيء يعمل كما ينبغي، أعد تشغيل الخادم:

sudo reboot

بعد عودته للعمل، افتح عنوان الخادم في المتصفح. إذا ظهر التطبيق دون تشغيله يدويًا، فهذا يعني أن إعداد PM2 تم بنجاح.

أفضل ممارسات مهمة بعد النشر

رغم أن الخطوات السابقة كافية لتشغيل التطبيق، فإن بيئة الإنتاج الاحترافية تستفيد من بعض التحسينات الإضافية:

  • ربط الخادم باسم نطاق بدلًا من استخدام عنوان IP.
  • تفعيل HTTPS باستخدام شهادات SSL.
  • إعداد جدار حماية مثل UFW.
  • فصل متغيرات البيئة الحساسة داخل ملف .env.
  • مراقبة السجلات وتحليل الأعطال دوريًا.
  • إعداد نسخ احتياطي وقواعد استعادة للطوارئ.

هذه الخطوات لا تزيد الأمان فقط، بل ترفع أيضًا جودة الخدمة واستقرارها على المدى الطويل.

الخلاصة التقنية

نشر تطبيق Node.js على خادم إنتاج ليس مهمة معقدة إذا قُسِّمت إلى مراحل واضحة: إنشاء الخادم، تأمين الوصول عبر SSH، تحديث النظام، تشغيل التطبيق، ثم وضع Nginx وPM2 في الواجهة لضمان الاستقرار وسهولة الوصول. من الناحية التقنية، هذه البنية تُعد نقطة انطلاق ممتازة لأي مشروع ويب جاد، كما أنها تمنحك أساسًا قويًا للتوسع لاحقًا بإضافة النطاق، الشهادات الأمنية، وخطوط النشر المستمر CI/CD.

اترك تعليقاً

لن يتم نشر عنوان بريدك الإلكتروني. الحقول الإلزامية مشار إليها بـ *