systemd کے تحت Node.js ایپلیکیشن
VDS پر Node ایپلیکیشن کیسے چلائیں کہ SSH منقطع ہونے اور مشین ری بوٹ ہونے پر بھی قائم رہے: systemd یونٹ، ماحولیاتی متغیرات، لاگز۔
اپ ڈیٹ 23 اگست، 2026
SSH سیشن کے ساتھ دستی طور پر شروع کیا گیا node index.js ختم ہو جاتا ہے۔ ایپلیکیشن کو مستقل طور پر چلتے رکھنے اور ری بوٹ کے بعد دوبارہ شروع ہونے کے لیے، اسے 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;
}
مزید تفصیلات کے لیے، reverse proxy اور 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 | ExecStart میں node یا فائل کا غلط پاتھ — مطلق پاتھ استعمال کریں |
| سروس لوپ میں ری اسٹارٹ ہوتی ہے | ایپلیکیشن اسٹارٹ اپ پر کریش ہوتی ہے: journalctl -u myapp -n 50 چیک کریں |
EADDRINUSE | دستی طور پر شروع کیا گیا پروسیس اب بھی چل رہا ہے: ss -tulpn | grep 3000 |
| SSH پر کام کرتا ہے، مگر سروس کے طور پر نہیں | انوائرنمنٹ ویری ایبلز غائب ہیں — systemd کے پاس وہ نہیں ہوتے، انہیں EnvironmentFile میں سیٹ کریں |
| VDS-1 پر بلڈ میموری سے باہر ہو جاتا ہے | لوکل طور پر بلڈ کریں اور تیار بلڈ مشین پر اپلوڈ کریں |
systemd کے اوپر pm2 نہ رکھیں۔ ایک پروسیس پر دو سپروائزرز الجھن پیدا کرتے ہیں: systemd پروسیس کو زندہ سمجھتا ہے جبکہ pm2 اسے ری اسٹارٹ کر رہا ہوتا ہے۔