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

لماذا نختار DigitalOcean لاستضافة تطبيقات الويب؟
تُعد منصة DigitalOcean خيارًا شائعًا بين المطورين، خاصة في المشاريع الصغيرة والمتوسطة، وذلك لعدة أسباب:
- واجهة استخدام بسيطة وسهلة مقارنة ببعض المنصات المعقدة.
- أسعار مناسبة للمشاريع التعليمية والتجريبية.
- إمكانية إنشاء خوادم افتراضية بسرعة.
- مرونة جيدة في ترقية الموارد مثل المعالج والذاكرة عند الحاجة.
تعتمد المنصة على مفهوم Droplets، وهي خوادم افتراضية تعمل فوق بنية سحابية مشتركة. ويمكن النظر إليها بوصفها بيئة مستقلة يمكنك التحكم بها كما لو كانت خادمًا خاصًا بك.
إنشاء مشروع جديد على DigitalOcean
قبل إنشاء الخادم، من الأفضل إنشاء مشروع جديد لتجميع الموارد المتعلقة به داخل لوحة التحكم.
- سجّل الدخول إلى حسابك في
DigitalOcean. - من القائمة الجانبية، اختر إنشاء مشروع جديد.
- أدخل اسم المشروع المناسب.
- تجاوز خطوة نقل الموارد الحالية عبر خيار
Skip، لأننا سننشئ الخادم لاحقًا.


كيفية إنشاء Droplet لتشغيل تطبيق Node.js
بعد إنشاء المشروع، يمكنك البدء في إنشاء الخادم من خلال زر Get Started.

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

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

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

إنشاء مفتاح SSH على جهازك
للسماح بالاتصال الآمن مع الخادم، يجب أولًا إنشاء زوج مفاتيح SSH على جهازك المحلي.
cd ~/.ssh
ssh-keygen
إذا لم يكن الأمر ssh-keygen متاحًا على جهازك، فستحتاج إلى تثبيت الأدوات المطلوبة أولًا.

أثناء التنفيذ سيُطلب منك تحديد اسم الملف وإدخال passphrase. إذا كنت تريد الإعداد الافتراضي، اضغط Enter دون إدخال اسم جديد.
عادةً ستجد الملفات التالية داخل مجلد ~/.ssh:
id_dsa
id_rsa
known_hosts
المفتاح العام هو الذي تقوم برفعه إلى مزود الاستضافة، أما المفتاح الخاص فيجب الاحتفاظ به على جهازك وعدم مشاركته مطلقًا.
إضافة مفتاح SSH إلى DigitalOcean
بعد إنشاء المفتاح، انسخ محتوى المفتاح العام كاملًا، بما في ذلك الجزء الذي يبدأ بـ ssh-rsa أو الصيغة المشابهة له.

ثم من لوحة DigitalOcean:
- اضغط على
New SSH Key. - ألصق المفتاح في الحقل المخصص.
- احفظ الإعداد.


الاتصال بالخادم لأول مرة
بعد إنشاء الخادم، يمكنك الاتصال به باستخدام الطرفية عبر الأمر التالي:
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 كـ Reverse Proxy

لتثبيت Nginx وتشغيله:
sudo apt install nginx
sudo service nginx start
بعد تشغيله، افتح عنوان IP الخاص بالخادم في المتصفح. إذا ظهر لك الصفحة الافتراضية الخاصة بـ 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.

تشغيل التطبيق كخدمة دائمة باستخدام PM2
تشغيل التطبيق يدويًا في كل مرة ليس حلًا عمليًا. إذا توقف التطبيق بسبب خطأ أو أُعيد تشغيل الخادم، فستحتاج إلى تشغيله من جديد. لهذا السبب يُستخدم PM2 لإدارة العمليات وتشغيل التطبيقات تلقائيًا.
sudo npm i -g pm2
pm2 start app.js
pm2 save
pm2 startup systemd
يوفّر PM2 عدة مزايا مهمة:
- إعادة تشغيل التطبيق تلقائيًا عند التعطل.
- تشغيل التطبيق تلقائيًا بعد إعادة تشغيل الخادم.
- إدارة العمليات ومراقبتها بسهولة.

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