Skip to content
VDS · ওয়েবসাইট ও ওয়েব সার্ভার

systemd-এর অধীনে একটি Node.js অ্যাপ্লিকেশন

VDS-এ Node অ্যাপ্লিকেশন কীভাবে চালাবেন যাতে SSH ডিসকানেক্ট ও মেশিন রিবুটেও এটি টিকে থাকে: systemd ইউনিট, এনভায়রনমেন্ট ভেরিয়েবল, লগ।

আপডেট: ২৩ আগস্ট, ২০২৬

ম্যানুয়ালি চালু করা 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/EXECExecStart-এ node বা ফাইলের পাথ ভুল — অ্যাবসোলিউট পাথ ব্যবহার করুন
সার্ভিসটি লুপে রিস্টার্ট হচ্ছেঅ্যাপ্লিকেশন স্টার্টআপে ক্র্যাশ করছে: journalctl -u myapp -n 50 দেখুন
EADDRINUSEম্যানুয়ালি চালু করা একটি প্রসেস এখনও চলছে: ss -tulpn | grep 3000
SSH-এ কাজ করে, কিন্তু সার্ভিস হিসেবে নয়এনভায়রনমেন্ট ভেরিয়েবল নেই — systemd-এর কাছে সেগুলো থাকে না, EnvironmentFile-এ সেট করুন
VDS-1-এ বিল্ডের মেমরি শেষ হয়ে যায়লোকালি বিল্ড করে তৈরি বিল্ডটি মেশিনে আপলোড করুন

systemd-এর উপরে pm2 বসাবেন না। একটি প্রসেসের উপরে দুটি সুপারভাইজার বিভ্রান্তি তৈরি করে: pm2 যখন প্রসেসটি রিস্টার্ট করছে, systemd তখন সেটিকে জীবিত মনে করে।