পোস্ট
Ubuntu-তে Node.js সহ Continuous Integration সেটআপ করা
১৫ আগস্ট, ২০১৫ • 9 মিনিট পড়া
আমি এটি আপনার কাছে নিয়ে আসতে রক্ত, ঘাম এবং অশ্রু ঝরিয়েছি। আমি Death Valley-র তীব্র তাপ সহ্য করেছি এবং Mount McKinley-র শিখরে পৌঁছেছি। আমি অনেক কিছু ত্যাগ করেছি।
এই পোস্টে শেয়ার করা বেশিরভাগ কন্টেন্ট আমার মূল কাজ নয়। যেখানে সম্ভব, আমি মূল কাজের দিকে লিঙ্ক করি।
এই নিবন্ধটি অনুমান করে যে আপনি Linux-এর চারপাশে নেভিগেট করতে পারেন।
আমি Ubuntu-তে উৎপাদন ক্ষমতায় Node.js অ্যাপ্লিকেশন হোস্টিং এবং পরিচালনার উপর একটি ব্যাপক গাইড খুঁজে পেতে পারিনি। আমি এই বিষয়ে একাধিক নিবন্ধ একত্রিত করেছি। এই নিবন্ধের শেষ নাগাদ আমি আশা করি আপনি আপনার নিজের Ubuntu সার্ভার সেটআপ করতে এবং একটি continuous integration সার্ভারের মাধ্যমে Node.js স্থাপন করতে সক্ষম হবেন।
পরিবেশ
আমি Windows-এ TeamCity ব্যবহার করছি যা তারপর GitHub থেকে কোড AWS-তে হোস্ট করা Ubuntu-তে স্থাপন করে।
প্রযুক্তি
এই নিবন্ধের জন্য আমি নিম্নলিখিত প্রযুক্তি ব্যবহার করেছি:
- AWS-তে Ubuntu 14.04
- Plink 0.64
- TeamCity 9.1
- GitHub
- Nginx 1.9.3
Ubuntu সেটআপ করা
আমি এখানে বিস্তারিত যাচ্ছি না। Amazon Web Services (AWS) এটি করা বেশ সহজ করে তোলে। এটি কোথায় আছে বা এটি আপনার নিজের সার্ভারে আছে তা গুরুত্বপূর্ণ নয়।
আমি কয়েকটি সমস্যার সম্মুখীন হয়েছি। প্রথমত, নিশ্চিত করুন যে পোর্ট 80 খোলা আছে। আমি পোর্ট 80 বন্ধ থাকা অবস্থায় সংযোগ করার চেষ্টা করার মূর্খ ভুল করেছি। একবার আমি আমার ভুল আবিষ্কার করলে, আমি একটি গন্ডারের পিছনের মতো অনুভব করেছি।
উৎস থেকে Node.js ইনস্টল করা
Node.js হল Google-র V8 JavaScript ইঞ্জিন ব্যবহার করে একটি সার্ভার প্রযুক্তি। 2010 সালে এর রিলিজের পর থেকে এটি ব্যাপকভাবে জনপ্রিয় হয়ে উঠেছে।
নিম্নলিখিত নির্দেশাবলী মূলত একটি Digital Ocean পোস্ট) থেকে এসেছে।
আপনার কাছে সর্বদা apt-get থেকে Node.js ইনস্টল করার বিকল্প রয়েছে, তবে এটি কয়েকটি সংস্করণ পিছিয়ে থাকবে। সর্বশেষ বিট পেতে, উৎস থেকে Node.js ইনস্টল করুন।
এই বিভাগের শেষে আমরা Node-এর সর্বশেষ স্থিতিশীল সংস্করণ ডাউনলোড করব (এই নিবন্ধ অনুযায়ী), আমরা উৎস তৈরি করব এবং Node.js ইনস্টল করব।
আপনার সার্ভারে লগইন করুন। আমরা প্যাকেজ তালিকা আপডেট করে শুরু করব।
sudo apt-get update
আমি এটিও পরামর্শ দিচ্ছি যে আপনি সমস্ত প্যাকেজ আপগ্রেড করুন। এটি Node.js-এর জন্য প্রয়োজনীয় নয়, তবে আপনার সার্ভার আপডেট রাখা ভাল অনুশীলন।
sudo apt-get upgrade
আপনার সার্ভার সম্পূর্ণ আপডেট। এখন উৎস ডাউনলোড করার সময়।
cd ~
লেখার সময় 12.7 হল Node.js-এর সর্বশেষ স্থিতিশীল রিলিজ। সর্বশেষ সংস্করণের জন্য nodejs.org দেখুন।
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
আপনি যে আর্কাইভ ডাউনলোড করেছেন তা এক্সট্র্যাক্ট করুন।
tar xvf node-v*
নতুন তৈরি ডিরেক্টরিতে যান
cd node-v*
Node.js কনফিগার এবং তৈরি করুন।
./configure
make
Node.js ইনস্টল করুন
sudo make install
ডাউনলোড করা এবং এক্সট্র্যাক্ট করা ফাইলগুলি সরাতে। অবশ্যই, এটি ঐচ্ছিক।
cd ~
rm -rf node-v*
অভিনন্দন! Node.js এখন ইনস্টল করা হয়েছে! এবং এটি খুব কঠিন ছিল না।
Nginx সেটআপ করা
Node.js একটি ওয়েব সার্ভার হিসাবে কাজ করতে পারে, তবে এটি এমন কিছু নয় যা আমি বিশ্বের কাছে প্রকাশ করতে চাই। একটি শিল্প, শক্তিশালী, বৈশিষ্ট্য সমৃদ্ধ ওয়েব সার্ভার এই কাজের জন্য আরও উপযুক্ত। আমি এই কাজের জন্য Nginx-এর দিকে ফিরেছি।
এটি একটি পরিপক্ক ওয়েব সার্ভার যার বৈশিষ্ট্য আমাদের প্রয়োজন। একাধিক Node.js উদাহরণ চালাতে, আমাদের পোর্ট ফরওয়ার্ডিং প্রয়োজন হবে।
আপনি ভাবছেন হতে পারে, কেন আমাদের একাধিক Node.js উদাহরণ একই সাথে চালাতে হবে। এটি একটি ন্যায্য প্রশ্ন… আমার পরিস্থিতিতে, আমার একটি সার্ভার আছে এবং আমাকে একই মেশিনে DEV, QA এবং PROD চালাতে হবে। হ্যাঁ, আমি জানি আদর্শ নয়, তবে আমি প্রতিটি পরিবেশের জন্য 3টি সার্ভার সেটআপ করতে চাই না।
শুরু করতে Nginx ইনস্টল করি
sudo -s
add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx
একবার Nginx সফলভাবে ইনস্টল হয়ে গেলে আমাদের ডোমেইনগুলি সেটআপ করতে হবে। আমি অনুমান করছি আপনি আপনার প্রতিটি সাইট তার নিজস্ব ডোমেইন/সাব ডোমেইনে চাইবেন। যদি আপনি না চান এবং বিভিন্ন সাব-ফোল্ডার ব্যবহার করতে চান, তা সম্ভব এবং করা খুবই সহজ। আমি এখানে সেই পরিস্থিতি কভার করছি না। বিভিন্ন ডোমেইন এবং পোর্ট ফরওয়ার্ডিং সেটআপ করার বিষয়ে খুব কম ডকুমেন্টেশন রয়েছে। এটি আমি কভার করব।
এখন যে Nginx ইনস্টল করা হয়েছে, /etc/nginx/sites-available/-এ yourdomain.com-এর জন্য একটি ফাইল তৈরি করুন
sudo nano /etc/nginx/sites-available/yourdomain.com
আপনার নতুন তৈরি ফাইলে নিম্নলিখিত কনফিগারেশন যোগ করুন
# the IP(s) on which your node server is running. I chose port 9001.
upstream app_myapp1 {
server 127.0.0.1:9001;
keepalive 8;
}
# the nginx server instance
server {
listen 80;
server_name yourdomain.com;
access_log /var/log/nginx/yourdomain.log;
# pass the request to the node.js server with the correct headers
# and much more can be added, see nginx config options
location / {
proxy_http_version 1.1;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header Host $http_host;
proxy_set_header X-NginX-Proxy true;
proxy_pass http://app_myapp1;
}
}
নিশ্চিত করুন যে আপনি “yourdomain.com” আপনার প্রকৃত ডোমেইনের সাথে প্রতিস্থাপন করেছেন। সংরক্ষণ করুন এবং আপনার সম্পাদক থেকে বেরিয়ে আসুন।
sites-enabled ডিরেক্টরিতে এই ফাইলের জন্য একটি প্রতীকী লিঙ্ক তৈরি করুন।
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
সবকিছু সঠিকভাবে কাজ করছে তা পরীক্ষা করতে, একটি সাধারণ node অ্যাপ তৈরি করুন এবং এটি /var/www/yourdomain.com/app.js-এ সংরক্ষণ করুন এবং এটি চালান।
যদি আপনার কাছে একটি না থাকে তবে এখানে একটি সাধারণ nodejs অ্যাপ রয়েছে।
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');}).listen(9001, "127.0.0.1");
console.log('Server running at http://127.0.0.1:9001/');
Nginx পুনরায় চালু করি।
sudo /etc/init.d/nginx restart
আপনার Node.js উদাহরণ শুরু করতে ভুলবেন না, যদি আপনি ইতিমধ্যে না করেন।
cd /var/www/yourdomain/ && node app.js
যদি সবকিছু সঠিকভাবে কাজ করছে, যখন আপনি yourdomain.com-এ নেভিগেট করেন তখন আপনি “Hello World” দেখতে পাবেন।
একটি ভিন্ন Node.js উদাহরণের জন্য অন্য একটি ডোমেইন যোগ করতে আপনাকে উপরের পদক্ষেপগুলি পুনরাবৃত্তি করতে হবে। বিশেষত আপনাকে আপনার নতুন Nginx কনফিগ ফাইলে upstream নাম, পোর্ট এবং ডোমেইন পরিবর্তন করতে হবে। proxy_pass ঠিকানা nginx কনফিগ ফাইলে upstream নামের সাথে মেলে। upstream নাম এবং proxy_pass মান দেখুন এবং আপনি বুঝতে পারবেন আমি কী বলছি।
সংক্ষেপে, আমরা উৎস থেকে NodeJS ইনস্টল করেছি এবং আমরা এখনই Nginx ইনস্টল করা শেষ করেছি। আমরা Nginx এবং Node.js-এর সাথে পোর্ট ফরওয়ার্ডিং কনফিগার এবং পরীক্ষা করেছি
PM2 ইনস্টল করা
আপনি হয়তো “PM2 কী?” জিজ্ঞাসা করছেন যেমন আমি প্রথম শুনেছিলাম। PM2 হল Node.js অ্যাপ্লিকেশনের জন্য একটি প্রক্রিয়া ম্যানেজার। Node.js বেশি কিছু নিয়ে আসে না। এটি এর আবেদনের অংশ। এর নেতিবাচক দিক হল, ভাল, আপনাকে এর সামনে স্তরগুলি প্রদান করতে হবে। PM2 সেই স্তরগুলির মধ্যে একটি।
PM2 Node.js প্রক্রিয়ার জীবন পরিচালনা করে। যখন এটি সমাপ্ত হয়, PM2 এটি পুনরায় চালু করে। যখন সার্ভার পুনরায় বুট হয় PM2 আপনার জন্য সমস্ত Node.js প্রক্রিয়া পুনরায় চালু করে। এটিতে ব্যাপক উন্নয়ন জীবনচক্র প্রক্রিয়াও রয়েছে। আমরা PM2-এর এই দিকটি কভার করছি না। আমি আপনাকে ভালভাবে লিখিত ডকুমেন্টেশন পড়তে উৎসাহিত করি।
ধরে নিচ্ছি আপনি টার্মিনালে লগইন করেছেন, আমরা NPM-এর মাধ্যমে PM2 ইনস্টল করে শুরু করব। Npm হল Node.js প্যাকেজ ম্যানেজার (npm)। এটি ইনস্টল করা হয়েছিল যখন আপনি Node.js ইনস্টল করেছিলেন।
sudo npm install pm2 -g
এটাই। PM2 এখন ইনস্টল করা হয়েছে।
PM2 ব্যবহার করা
PM2 ব্যবহার করা সহজ।
PM2-এর জন্য hello world সহজ।
pm2 start hello.js
এটি আপনার অ্যাপ্লিকেশন PM2-এর প্রক্রিয়া তালিকায় যোগ করে। এই তালিকা প্রতিটি অ্যাপ্লিকেশন শুরু হওয়ার সময় আউটপুট করা হয়।

এই উদাহরণে দুটি Node.js অ্যাপ্লিকেশন চলছে। একটি api.dev এবং api.pre বলা হয়।
PM2 স্বয়ংক্রিয়ভাবে অ্যাপের নাম তালিকায় “App name”-এ নির্ধারণ করে।
বাক্সের বাইরে, PM2 সার্ভার পুনরায় চালু হলে নিজেকে স্টার্টআপের জন্য কনফিগার করে না। কমান্ডটি Linux-এর বিভিন্ন ফ্লেভারের জন্য আলাদা। আমি Ubuntu-তে চলছি, তাই আমি Ubuntu কমান্ড চালাব।
pm2 start ubuntu
আমরা এখনও সম্পূর্ণ করিনি। আমাদের PM2 বাইনারিতে একটি পথ যোগ করতে হবে। ভাগ্যক্রমে, পূর্ববর্তী কমান্ডের আউটপুট আমাদের কীভাবে করতে হবে তা বলে।
আউটপুট:
[PM2] You have to run this command as root
[PM2] Execute the following command :
[PM2] sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
Run the command that was generated (similar to the highlighted output above) to set PM2 up to start on boot (use the command from your own output):
sudo env PATH=$PATH:/usr/local/bin pm2 startup ubuntu -u sammy
PM2 ব্যবহারের অন্যান্য উদাহরণ (ঐচ্ছিক)
অ্যাপ নাম দ্বারা একটি অ্যাপ্লিকেশন বন্ধ করা
pm2 stop example
অ্যাপ নাম দ্বারা পুনরায় চালু করা
pm2 restart example
PM2 দ্বারা পরিচালিত বর্তমান অ্যাপ্লিকেশনের তালিকা
pm2 list
একটি প্রক্রিয়া শুরু করার সময় একটি নাম নির্দিষ্ট করা। যদি আপনি কল করেন, PM2 JavaScript ফাইলটি নাম হিসাবে ব্যবহার করে। এটি আপনার জন্য কাজ নাও করতে পারে। এখানে নাম নির্দিষ্ট করার উপায়।
pm2 start www.js --name api.pre
এটি PM2-এর সাথে শুরু করার জন্য যথেষ্ট হওয়া উচিত। PM2-এর ক্ষমতা সম্পর্কে আরও জানতে, GitHub Repo পরিদর্শন করুন।
Plink সেটআপ এবং ব্যবহার করা
আপনি সম্ভবত ভাবছেন, “Betsey-র গাভীর নামে Plink কী?” কমপক্ষে এটি চিন্তা। আমি এখনও এটি সম্পর্কে কী ভাবব তা নিশ্চিত নই। আমি এর মতো কিছু কখনও দেখিনি।
আপনি কি Wall-e মুভি দেখেছেন? Wall-e একটি spork বের করে। প্রথমে সে এটি কাঁটার সাথে রাখার চেষ্টা করে, কিন্তু এটি ফিট করে না এবং তারপর সে এটি চামচের সাথে রাখার চেষ্টা করে, কিন্তু এটি ফিট করে না। ভাল যে Plink। এটি Putty (SSH) এবং Windows Command Line-এর মধ্যে একটি ক্রস।
Plink মূলত আপনাকে Windows কমান্ড লাইন থেকে Linux (এবং সম্ভবত Unix) শেলে লগইন করার সময় bash কমান্ড চালাতে দেয়।
Plink ডাউনলোড করে শুরু করুন। এটি শুধু একটি এক্সিকিউটেবল। আমি এটি C:/Program Files (x86)/Plink-এ রাখার পরামর্শ দিই। আমাদের পরে এটি রেফার করতে হবে।
যদি আপনি AWS-তে একটি Ubuntu উদাহরণ চালাচ্ছেন। আপনার ইতিমধ্যে Putty-র জন্য একটি সার্ট সেটআপ থাকবে (আমি অনুমান করছি আপনি Putty ব্যবহার করছেন)।
যদি আপনি না করেন, আপনাকে নিশ্চিত করতে হবে যে আপনার AWS-এ Ubuntu-এর জন্য একটি সামঞ্জস্যপূর্ণ ssh সার্ট রয়েছে।
যদি আপনি AWS ব্যবহার না করেন, আপনি কমান্ড লাইনে ব্যবহারকারীর নাম এবং পাসওয়ার্ড নির্দিষ্ট করতে পারেন এবং ssh সার্টের বিষয়ে চিন্তা করতে হবে না।
এখানে Plink-এর সাথে Ubuntu-তে সংযোগ করার একটি উদাহরণ কমান্ড লাইন রয়েছে।
"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk"

এটি আমাদের এগিয়ে যাওয়া হতে পারে, তবে Ubuntu সার্ভারে একটি ssh স্ক্রিপ্ট চালাতে আমরা Plink কমান্ডের শেষে সম্পূর্ণ পথ যোগ করি।
"C:\Program Files (x86)\Plink\plink.exe" -ssh ubuntu@xx.xx.xx.xx -i "C:\Program Files (x86)\Plink\ssh certs\aws-ubuntu.ppk" /var/www/deploy-dev-ui.sh
এবং এটি, প্রিয় পাঠক, Plink।
NODE_ENV বোঝা
NODE_ENV হল একটি পরিবেশ পরিবর্তনশীল যা expressjs দ্বারা জনপ্রিয় হয়েছে। আপনার node উদাহরণ শুরু করার আগে, NODE_ENV পরিবেশে সেট করুন। কোডে আপনি পরিবেশের উপর ভিত্তি করে নির্দিষ্ট ফাইলগুলি লোড করতে পারেন।
Setting NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD
পরিবেশ পরিবর্তনশীল একটি Node.js উদাহরণের ভিতরে process.env.NODE_ENV ব্যবহার করে পুনরুদ্ধার করা হয়।
উদাহরণ
var environment = process.env.NODE_ENV
বা expressjs-এর সাথে
app.get('env')
*নোট: app.get('env') ডিফল্ট “development”-এ।
সবকিছু একসাথে নিয়ে আসা
Node.js, PM2, Nginx এবং Plink ইনস্টল করা হয়েছে এবং আশাকরি কাজ করছে। আমাদের এখন এই সমস্ত অংশগুলি একটি continuous integration সমাধানে একত্রিত করতে হবে।
/var/www/yourdomain.com
লেখক: চাক কনওয়ে একজন এআই ইঞ্জিনিয়ার যার কাছে প্রায় ৩০ বছরের সফটওয়্যার ইঞ্জিনিয়ারিং অভিজ্ঞতা রয়েছে। তিনি ব্যবহারিক এআই সিস্টেম তৈরি করেন—কন্টেন্ট পাইপলাইন, অবকাঠামো এজেন্ট এবং সরঞ্জাম যা বাস্তব সমস্যার সমাধান করে—এবং তার শেখার বিষয়গুলি শেয়ার করেন। তার সাথে সোশ্যাল মিডিয়ায় সংযোগ করুন: X (@chuckconway) অথবা তাকে YouTube এবং SubStack এ দেখুন।