مقدمة: من الخادم المحلي إلى حل جاهز للإنتاج
\nلقد قمت بإنشاء تطبيق JavaScript قوي على Node.js، واختبرته محليًا، والآن حان الوقت لعرضه على العالم. مجرد رفع الملفات إلى VPS وتشغيل node app.js هو طريق المبتدئين. على المستوى المتقدم، يتضمن النشر إعداد خادم وكيل عكسي، ومدير عمليات، وتجديد تلقائي لشهادات SSL، ونظام تكامل وتسليم مستمر (CI/CD)، بالإضافة إلى مراقبة وتسجيل فعال.
في هذه المقالة، سنشرح عملية النشر خطوة بخطوة لتطبيق Node.js على VPS (Ubuntu 22.04) على المستوى المتقدم. سنقوم بإعداد Nginx كوكيل عكسي، وPM2 لإدارة العملية، وLet's Encrypt لـ HTTPS، وGitHub Actions للنشر التلقائي عند الدفع إلى المستودع، وسنضيف مراقبة أساسية.
\n\nالمتطلبات الأساسية
\n- \n
- خادم VPS (Ubuntu 22.04) مع إمكانية الوصول عبر SSH. \n
- نطاق مرتبط بعنوان IP الخاص بالخادم (مثل
myapp.example.com). \n - تثبيت Node.js (v18+) و npm على الخادم. \n
- تثبيت Git على الخادم. \n
- مستودع تطبيقك على GitHub. \n
1. إعداد الخادم ومدير العمليات PM2
\nلنبدأ بتحضير البيئة الأساسية. بعد الاتصال بالخادم عبر SSH، سنقوم بتحديث الحزم وتثبيت الأدوات اللازمة:
\nsudo apt update && sudo apt upgrade -y\nsudo apt install nginx git curl -y\nنتأكد من تثبيت Node.js. إذا لم يكن مثبتًا، سنقوم بتثبيته عبر NodeSource:
\ncurl -fsSL https://deb.nodesource.com/setup_18.x | sudo -E bash -\nsudo apt install -y nodejs\nnode -v\nnpm -v\nالآن سنقوم بتثبيت PM2 بشكل عام - مدير عمليات متقدم لـ Node.js، والذي يعيد تشغيل التطبيق تلقائيًا عند تعطله، ويدير السجلات والتجميع:
\nsudo npm install -g pm2\nنقوم باستنساخ مستودع تطبيقك وتثبيت التبعيات:
\ngit clone https://github.com/your-username/your-repository.git /var/www/myapp\ncd /var/www/myapp\nnpm install --production\nسنقوم بإنشاء ملف النظام البيئي لـ PM2 (ecosystem.config.js) للضبط الدقيق:
// ecosystem.config.js\nmodule.exports = {\n apps: [{\n name: 'myapp',\n script: 'app.js', // أو server.js\n instances: 'max', // استخدام جميع أنوية المعالج\n exec_mode: 'cluster',\n env: {\n NODE_ENV: 'production',\n PORT: 3000\n },\n error_file: '/var/log/node-app/err.log',\n out_file: '/var/log/node-app/out.log',\n log_date_format: 'YYYY-MM-DD HH:mm Z'\n }]\n};\nسنقوم بإنشاء مجلد للسجلات وتشغيل التطبيق عبر PM2:
\nsudo mkdir -p /var/log/node-app\nsudo chown -R $USER:$USER /var/log/node-app\npm2 start ecosystem.config.js\npm2 save\npm2 startup systemd\nالأمر pm2 startup سينشئ خدمة systemd لتشغيل PM2 عند بدء تشغيل النظام. الآن تطبيقك يعمل على المنفذ 3000، لكن الوصول المباشر إليه غير آمن. ننتقل إلى إعداد Nginx.
2. إعداد Nginx كوكيل عكسي و SSL عبر Let's Encrypt
\nسيتولى Nginx استقبال الطلبات الواردة على المنافذ 80 (HTTP) و 443 (HTTPS)، وتوجيهها إلى عملية Node.js الخاصة بك التي تعمل على المنفذ 3000، بالإضافة إلى خدمة الملفات الثابتة مباشرة - مما يقلل الحمل على Node.js.
\nسنقوم بإنشاء ملف تكوين للنطاق الخاص بنا:
\nsudo nano /etc/nginx/sites-available/myapp\nأدخل التكوين التالي (استبدل myapp.example.com بنطاقك):
server {\n listen 80;\n server_name myapp.example.com;\n return 301 https://$server_name$request_uri; # إعادة توجيه إلى HTTPS\n}\n\nserver {\n listen 443 ssl http2;\n server_name myapp.example.com;\n\n # SSL ser