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