systemd के तहत Node.js एप्लिकेशन
VDS पर Node एप्लिकेशन ऐसे चलाएँ कि 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;
}
ज़्यादा जानकारी के लिए 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 पर आउटपुट अपने आप journal में चला जाता है — आपको अपनी लॉग फ़ाइलें या लॉग रोटेशन सेट करने की ज़रूरत नहीं है।
आम एरर
| लक्षण | कारण |
|---|---|
status=203/EXEC | ExecStart में node या फ़ाइल का गलत पाथ — absolute पाथ इस्तेमाल करें |
| सर्विस लूप में रीस्टार्ट होती है | एप्लिकेशन स्टार्टअप पर क्रैश होता है: journalctl -u myapp -n 50 देखें |
EADDRINUSE | मैन्युअल रूप से शुरू किया गया प्रोसेस अब भी चल रहा है: ss -tulpn | grep 3000 |
| SSH पर काम करता है, लेकिन सर्विस के रूप में नहीं | एनवायरनमेंट वेरिएबल गायब हैं — systemd के पास ये नहीं होते, इन्हें EnvironmentFile में सेट करें |
| VDS-1 पर बिल्ड की मेमोरी खत्म हो जाती है | लोकली बिल्ड करें और तैयार बिल्ड को मशीन पर अपलोड करें |
systemd के ऊपर pm2 मत लगाएँ। एक प्रोसेस पर दो सुपरवाइज़र भ्रम पैदा करते हैं: systemd प्रोसेस को ज़िंदा मानता है जबकि pm2 उसे रीस्टार्ट कर रहा होता है।