Skip to content
VDS · المواقع وخوادم الويب

تطبيق Node.js تحت systemd

كيف تشغّل تطبيق Node على VDS بحيث ينجو من انقطاع SSH وإعادة تشغيل الجهاز: وحدة systemd، ومتغيرات البيئة، والسجلات.

آخر تحديث 23 أغسطس 2026

يُغلق node index.js عند تشغيله يدويًا مع انتهاء جلسة SSH. لإبقاء التطبيق يعمل بشكل دائم والعودة بعد إعادة التشغيل، شغّله كخدمة systemd — فهذه آلية مدمجة في النظام، لذا لا حاجة إلى تثبيت أي شيء.

التحضير

ثبّت Node من المستودع الرسمي، وليس من حزمة النظام القديمة:

curl -fsSL https://deb.nodesource.com/setup_22.x | bash -
apt install -y nodejs
node -v

أنشئ مستخدمًا مخصصًا — إذ يجب ألا يعمل التطبيق بصلاحيات root:

useradd -r -m -d /srv/app -s /usr/sbin/nologin appuser
chown -R appuser:appuser /srv/app
sudo -u appuser npm ci --omit=dev --prefix /srv/app

خدمة systemd

ملف /etc/systemd/system/myapp.service:

[Unit]
Description=My Node app
After=network-online.target
Wants=network-online.target

[Service]
Type=simple
User=appuser
WorkingDirectory=/srv/app
EnvironmentFile=/srv/app/.env
ExecStart=/usr/bin/node /srv/app/index.js
Restart=always
RestartSec=5
NoNewPrivileges=true
PrivateTmp=true

[Install]
WantedBy=multi-user.target
systemctl daemon-reload
systemctl enable --now myapp
systemctl status myapp

يعيد Restart=always تشغيل العملية بعد أي انهيار. أما EnvironmentFile فهو ملف بسيط بصيغة KEY=value دون علامات اقتباس ودون export؛ اضبط أذوناته على 600 لأنه يحتوي على كلمات المرور.

إتاحته عبر وكيل عكسي

ينبغي أن يستمع التطبيق على 127.0.0.1:3000 فقط، ويتولى خادم ويب مزوّد بشهادة تقديمه إلى الخارج:

location / {
    proxy_pass http://127.0.0.1:3000;
    proxy_set_header Host $host;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header X-Forwarded-Proto $scheme;
}

لمزيد من التفاصيل، راجع الوكيل العكسي وLet's Encrypt. إذا استمع التطبيق على 0.0.0.0، فإنه يصبح متاحًا من الإنترنت متجاوزًا الوكيل ودون تشفير.

السجلات والتحديثات

journalctl -u myapp -f
journalctl -u myapp --since "1 hour ago" -p err
systemctl restart myapp

تنتقل المخرجات إلى stdout إلى السجل تلقائيًا — فلا حاجة إلى إعداد ملفات سجلات خاصة بك أو تدوير السجلات.

الأخطاء الشائعة

العَرَضالسبب
status=203/EXECمسار خاطئ إلى node أو إلى الملف في ExecStart — استخدم مسارات مطلقة
إعادة تشغيل الخدمة في حلقةينهار التطبيق عند بدء التشغيل: تحقق من journalctl -u myapp -n 50
EADDRINUSEلا تزال هناك عملية بدأت يدويًا قيد التشغيل: ss -tulpn | grep 3000
يعمل عبر SSH، لكن ليس كخدمةمتغيرات البيئة مفقودة — لا تتوفر لدى systemd، اضبطها في EnvironmentFile
ينفد الذاكرة أثناء البناء على VDS-1ابنِ محليًا وارفع البناء النهائي إلى الجهاز

لا تضع pm2 فوق systemd. فوجود مشرفين على عملية واحدة يسبب ارتباكًا: إذ يعتبر systemd العملية حية بينما يعيد pm2 تشغيلها.