Skip to content

পোস্ট

Ubuntu-তে Nodejs দিয়ে Continuous Integration সেটআপ করা

১৫ আগস্ট, ২০১৫ • 11 মিনিট পড়া

Ubuntu-তে Nodejs দিয়ে Continuous Integration সেটআপ করা

আপনাদের কাছে এটি পৌঁছে দিতে আমি রক্ত, ঘাম এবং অশ্রুর মধ্য দিয়ে গেছি। আমি Death Valley-র প্রচণ্ড গরমে কষ্ট পেয়েছি এবং Mount McKinley-র চূড়ায় আরোহণ করেছি। আমি অনেক ত্যাগ স্বীকার করেছি।

এই পোস্টে শেয়ার করা বেশিরভাগ কন্টেন্ট আমার মৌলিক কাজ নয়। যেখানে পারি, আমি মূল কাজের সাথে লিংক করে দিয়েছি।

এই আর্টিকেলটি ধরে নেয় যে আপনি Linux এ কাজ করতে পারেন।

আমি Ubuntu-তে production capacity-তে Nodejs অ্যাপ্লিকেশন হোস্ট এবং পরিচালনার উপর একটি সম্পূর্ণ গাইড খুঁজে পাইনি। আমি এই বিষয়ে একাধিক আর্টিকেল একসাথে করেছি। এই আর্টিকেলের শেষে আমি আশা করি আপনি আপনার নিজস্ব Ubuntu সার্ভার সেটআপ করতে পারবেন এবং একটি continuous integration সার্ভারের মাধ্যমে Nodejs deploy করতে পারবেন।

পরিবেশ

আমি Windows-এ TeamCity ব্যবহার করছি যা তারপর GitHub থেকে AWS-এ হোস্ট করা Ubuntu-তে কোড deploy করে।

প্রযুক্তি

এই আর্টিকেলের জন্য আমি নিম্নলিখিত প্রযুক্তি ব্যবহার করেছি:

  • AWS-এ Ubuntu 14.04
  • Plink 0.64
  • TeamCity 9.1
  • GitHub
  • Nginx 1.9.3

Ubuntu সেটআপ করা

আমি এখানে বিস্তারিত যাব না। Amazon Web Services (AWS) এটি বেশ সহজ করে তোলে। এটি কোথায় আছে বা এটি আপনার নিজস্ব সার্ভারে আছে কিনা তা কোন ব্যাপার না।

আমি কয়েকটি সমস্যার সম্মুখীন হয়েছি। প্রথমত, নিশ্চিত করুন যে port 80 খোলা আছে। আমি port 80 বন্ধ রেখে সংযোগ করার মূর্খামি করেছিলাম। একবার আমি আমার ভুল আবিষ্কার করার পর, আমি একটি গণ্ডারের পাছার মতো অনুভব করেছি।

সোর্স থেকে Nodejs ইনস্টল করা

Nodejs হল Google-এর V8 javascript ইঞ্জিন ব্যবহার করে একটি সার্ভার প্রযুক্তি। 2010 সালে এর রিলিজের পর থেকে, এটি ব্যাপকভাবে জনপ্রিয় হয়েছে।

নিম্নলিখিত নির্দেশাবলী মূলত একটি Digital Ocean পোস্ট থেকে এসেছে।

আপনার সবসময় apt-get থেকে Nodejs ইনস্টল করার বিকল্প আছে, কিন্তু এটি কয়েক সংস্করণ পিছিয়ে থাকবে। সর্বশেষ bits পেতে, সোর্স থেকে Nodejs ইনস্টল করুন।

এই বিভাগের শেষে আমরা node-এর সর্বশেষ stable সংস্করণ ডাউনলোড করব (এই আর্টিকেল অনুযায়ী), আমরা সোর্স build করব এবং Nodejs ইনস্টল করব।

আপনার সার্ভারে লগ ইন করুন। আমরা package lists আপডেট করে শুরু করব।

sudo apt-get update

আমি সব packages আপগ্রেড করার পরামর্শও দিচ্ছি। এটি Nodejs-এর জন্য প্রয়োজনীয় নয় কিন্তু আপনার সার্ভার আপডেট রাখা ভাল অভ্যাস।

sudo apt-get upgrade

আপনার সার্ভার সব আপ টু ডেট। এখন সোর্স ডাউনলোড করার সময়।

cd ~

লেখার সময় 12.7 হল Nodejs-এর সর্বশেষ stable রিলিজ। সর্বশেষ সংস্করণের জন্য nodejs.org দেখুন।

wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz

আপনার ডাউনলোড করা archive extract করুন।

tar xvf node-v*

নতুন তৈরি directory-তে চলে যান

cd node-v*

Nodejs configure এবং build করুন।

./configure

make

Nodejs ইনস্টল করুন

sudo make install

ডাউনলোড করা এবং extract করা ফাইলগুলি সরাতে। অবশ্যই, এটি ঐচ্ছিক।

cd ~

rm -rf node-v*

অভিনন্দন! Nodejs এখন ইনস্টল হয়েছে! এবং এটি খুব কঠিন ছিল না।

Nginx সেটআপ করা

সোর্স

Nodejs একটি web server হিসেবে কাজ করতে পারে, কিন্তু এটি আমি বিশ্বের কাছে expose করতে চাইব না। একটি industrial, harden, feature rich web server এর জন্য এটি আরও উপযুক্ত। আমি এই কাজের জন্য Nginx-এর দিকে ফিরেছি।

এটি একটি পরিপক্ক web server যার আমাদের প্রয়োজনীয় features আছে। Nodejs-এর একাধিক instance চালানোর জন্য, আমাদের port forwarding প্রয়োজন হবে।

আপনি হয়তো ভাবছেন, কেন আমাদের একই সময়ে Nodejs-এর একাধিক instance চালানোর প্রয়োজন। এটি একটি ন্যায্য প্রশ্ন… আমার scenario-তে, আমার একটি সার্ভার আছে এবং আমার একই মেশিনে DEV, QA এবং PROD চালানোর প্রয়োজন। হ্যাঁ, আমি জানি আদর্শ নয়, কিন্তু আমি প্রতিটি environment-এর জন্য 3টি সার্ভার দাঁড় করাতে চাই না।

শুরু করতে চলুন Nginx ইনস্টল করি

sudo -s

add-apt-repository ppa:nginx/stable

apt-get update 

apt-get install nginx

একবার Nginx সফলভাবে ইনস্টল হয়ে গেলে আমাদের domains সেটআপ করতে হবে। আমি ধরে নিচ্ছি আপনি আপনার প্রতিটি সাইট তার নিজস্ব domain/sub domain-এ রাখতে চাইবেন। যদি আপনি না চান এবং বিভিন্ন sub-folder ব্যবহার করতে চান, তা করা যায় এবং খুবই সহজ। আমি এখানে সেই scenario কভার করব না। এটি কীভাবে করতে হয় সে বিষয়ে প্রচুর documentation আছে। বিভিন্ন domain সেটআপ এবং সংশ্লিষ্ট Nodejs instances-এ port forwarding সম্পর্কে খুব কম documentation আছে। এটিই আমি কভার করব।

এখন যে Nginx ইনস্টল হয়েছে, /etc/nginx/sites-available/-এ yourdomain.com-এর জন্য একটি ফাইল তৈরি করুন

sudo nano /etc/nginx/sites-available/yourdomain.com

আপনার নতুন তৈরি ফাইলে নিম্নলিখিত configuration যোগ করুন

# 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” কে আপনার প্রকৃত domain দিয়ে প্রতিস্থাপন করেছেন। save করুন এবং আপনার editor থেকে বের হন।

sites-enabled directory-তে এই ফাইলের একটি symbolic link তৈরি করুন।

cd /etc/nginx/sites-enabled/ 

ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com

সবকিছু সঠিকভাবে কাজ করছে কিনা পরীক্ষা করতে, একটি সহজ node app তৈরি করুন এবং এটি /var/www/yourdomain.com/app.js-এ save করুন এবং চালান।

যদি আপনার কাছে একটি সহজ nodejs app না থাকে তাহলে এখানে একটি আছে।

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 restart করি।

sudo /etc/init.d/nginx restart

আপনার Nodejs instance শুরু করতে ভুলবেন না, যদি আপনি ইতিমধ্যে না করে থাকেন।

cd /var/www/yourdomain/ && node app.js

যদি সব সঠিকভাবে কাজ করে, যখন আপনি yourdomain.com-এ navigate করবেন তখন আপনি “Hello World” দেখতে পাবেন।

একটি ভিন্ন Nodejs instance-এর জন্য আরেকটি domain যোগ করতে আপনার উপরের steps পুনরাবৃত্তি করতে হবে। বিশেষভাবে আপনার নতুন Nginx config ফাইলে upstream name, port এবং domain পরিবর্তন করতে হবে। proxy_pass address অবশ্যই nginx config ফাইলের upstream name-এর সাথে match করতে হবে। upstream name এবং proxy_pass value দেখুন এবং আপনি বুঝতে পারবেন আমি কী বলতে চাইছি।

সংক্ষেপে, আমরা source থেকে NodeJS ইনস্টল করেছি এবং আমরা এইমাত্র Nginx ইনস্টল করা শেষ করেছি। আমরা Nginx এবং Nodejs দিয়ে port forwarding configure এবং test করেছি

PM2 ইনস্টল করা

আপনি হয়তো জিজ্ঞাসা করছেন “PM2 কী?” যেমনটা আমি প্রথম শুনলে করেছিলাম। PM2 হল Nodejs অ্যাপ্লিকেশনের জন্য একটি process manager। Nodejs খুব বেশি কিছু নিয়ে আসে না। এটি তার আবেদনের অংশ। এর নেতিবাচক দিক হল, আপনাকে এর সামনে layers প্রদান করতে হবে। PM2 সেই layers-এর একটি।

PM2 Nodejs process-এর জীবন পরিচালনা করে। যখন এটি terminate হয়, PM2 এটি restart করে। যখন সার্ভার reboot হয় PM2 আপনার জন্য সব Nodejs processes restart করে। এটির ব্যাপক development lifecycle process আছে। আমরা PM2-এর এই দিকটি কভার করব না। আমি আপনাকে ভাল লিখিত documentation পড়তে উৎসাহিত করি।

ধরে নিচ্ছি আপনি terminal-এ logged in আছেন, আমরা NPM-এর মাধ্যমে PM2 ইনস্টল করে শুরু করব। Npm হল Nodejs package manager (npm)। এটি Nodejs ইনস্টল করার সময় ইনস্টল হয়েছিল।

sudo npm install pm2 -g

এটাই। PM2 এখন ইনস্টল হয়েছে।

PM2 ব্যবহার করা

PM2 ব্যবহার করা সহজ।

PM2-এর জন্য hello world সহজ।

pm2 start hello.js

এটি আপনার অ্যাপ্লিকেশনকে PM2-এর process list-এ যোগ করে। এই list প্রতিবার একটি অ্যাপ্লিকেশন শুরু হওয়ার সময় output হয়।

এই উদাহরণে দুটি Nodejs অ্যাপ্লিকেশন চলছে। একটি api.dev এবং api.pre নামে।

PM2 স্বয়ংক্রিয়ভাবে list-এ “App name”-এ app-এর নাম assign করে।

Out of the box, PM2 সার্ভার restart হওয়ার সময় নিজেকে startup করার জন্য configure করে না। বিভিন্ন Linux flavors-এর জন্য command ভিন্ন। আমি Ubuntu-তে চলছি, তাই আমি Ubuntu command execute করব।

pm2 start ubuntu

আমরা এখনও সম্পূর্ণ শেষ করিনি। আমাদের PM2 binary-তে একটি path যোগ করতে হবে। সৌভাগ্যবশত, পূর্ববর্তী command-এর output আমাদের বলে কীভাবে এটি করতে হয়।

Output:

[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 ব্যবহারের উদাহরণ (ঐচ্ছিক)

app name দিয়ে একটি অ্যাপ্লিকেশন বন্ধ করা

pm2 stop example

app name দিয়ে restart করা

pm2 restart example

PM2 দ্বারা পরিচালিত বর্তমান অ্যাপ্লিকেশনের তালিকা

pm2 list

একটি process শুরু করার সময় একটি নাম নির্দিষ্ট করা। যদি আপনি call করেন, PM2 javascript ফাইলকে নাম হিসেবে ব্যবহার করে। এটি আপনার জন্য কাজ নাও করতে পারে। এখানে নাম নির্দিষ্ট করার উপায়।

pm2 start www.js --name api.pre

PM2 দিয়ে আপনাকে চালিয়ে যাওয়ার জন্য এটি যথেষ্ট হওয়া উচিত। PM2-এর capabilities সম্পর্কে আরও জানতে, GitHub Repo দেখুন।

আপনি সম্ভবত ভাবছেন, “Betsey-র গরুর নামে Plink কী?” অন্তত সেটাই ভাবনা। আমি এখনও এটি নিয়ে কী ভাবতে হবে তা নিশ্চিত নই। আমি এর মতো কিছু কখনও দেখিনি।

আপনি কি কখনও Wall-e সিনেমা দেখেছেন? Wall-e একটি spork বের করে। প্রথমে সে এটি forks-এর সাথে রাখার চেষ্টা করে, কিন্তু এটি fit করে না এবং তারপর সে এটি spoons-এর সাথে রাখার চেষ্টা করে, কিন্তু এটি fit করে না। ঠিক সেটাই Plink। এটি Putty (SSH) এবং Windows Command Line-এর মধ্যে একটি cross।

Plink মূলত আপনাকে Linux (এবং সম্ভবত Unix) shell-এ logged in থাকার সময় Windows command line-এর মাধ্যমে bash commands চালানোর অনুমতি দেয়।

Plink ডাউনলোড করে শুরু করুন। এটি শুধু একটি executable। আমি এটি C:/Program Files (x86)/Plink-এ রাখার পরামর্শ দিই। আমাদের পরে এটি reference করতে হবে।

যদি আপনি AWS-এ একটি Ubuntu instance চালাচ্ছেন। আপনার ইতিমধ্যে Putty-এর জন্য একটি cert setup থাকবে (আমি ধরে নিচ্ছি আপনি Putty ব্যবহার করছেন)।

যদি আপনি না করেন, আপনাকে নিশ্চিত করতে হবে যে AWS-এ Ubuntu-এর জন্য আপনার একটি compatible ssh cert আছে।

যদি আপনি AWS ব্যবহার না করেন, আপনি command line-এ username এবং password নির্দিষ্ট করতে পারেন এবং ssh certs নিয়ে চিন্তা করতে হবে না।

এখানে একটি উদাহরণ command line যা 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 script চালানোর জন্য আমরা Plink command-এর শেষে complete path যোগ করি।

"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 হল একটি environment variable যা expressjs দ্বারা জনপ্রিয় হয়েছে। node instance শুরু করার আগে, NODE_ENV কে environment-এ set করুন। কোডে আপনি environment-এর উপর ভিত্তি করে নির্দিষ্ট ফাইল load করতে পারেন।

Setting NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD

Environment variable একটি Nodejs instance-এর ভিতরে process.env.NODE_ENV ব্যবহার করে retrieve করা হয়।

উদাহরণ

var environment = process.env.NODE_ENV

অথবা expressjs দিয়ে

app.get('env')

*নোট: app.get('env') defaults to “development”।

সবকিছু একসাথে আনা

Nodejs, PM2, Nginx এবং Plink ইনস্টল হয়েছে এবং আশা করি কাজ করছে। আমাদের এখন এই সব pieces একটি continuous integration solution-এ একসাথে আনতে হবে।

/var/www/yourdomain.com-এ আপনার GitHub repository clone করুন। যদিও SSH HTTPS-এর চেয়ে বেশি secure, আমি HTTPS ব্যবহার করার পরামর্শ দিই। আমি জানি এটি আদর্শ নয়, কিন্তু আমি Ubuntu-তে GitHub-এর সাথে Plink কাজ করাতে পারিনি। খুব বেশি বিস্তারিত না গিয়ে Plink এবং GitHub SSH cert formats ভিন্ন এবং SSH-এর মাধ্যমে Plink দিয়ে GitHub call করা কাজ করেনি। যদি আপনি সমস্যাটি বের করতে পারেন আমাকে জানান!

GitHub pull handsfree করতে, username এবং password origin url-এর অংশ হতে হবে।

এখানে আপনি কীভাবে আপনার origin url set করবেন। অবশ্যই আপনাকে যথাযথ জায়গায় আপনার তথ্য substitute করতে হবে।

git remote set-url origin  https://username:password@github.com/username/yourdomain.git

আপনার repository clone করুন।

cd /var/www/yourdomain.com
git clone https://username:password@github.com/username/yourdomain.git .

নোট করুন যে, যদি এই directory সম্পূর্ণভাবে empty না হয়, hidden files সহ, Git এই directory-তে repo clone করবে না।

Directory-তে hidden files খুঁজতে এই command চালান

ls -a

glue-এর জন্য, আমরা একটি shell script ব্যবহার করছি। এখানে আমার script-এর একটি copy।

#!/bin/bash

echo "> Current PM2 Apps"
pm2 list

echo "> Stopping running API"
pm2 stop api.dev

echo "> Set Environment variable."
export NODE_ENV=DEV

echo "> Changing directory to dev.momentz.com."
cd /var/www/yourdomain.com

echo "> Listing the contents of the directory."
ls -a

echo "> Remove untracked directories in addition to untracked files."
git clean -f -d

echo "> Pull updates from Github."
git pull

echo "> Install npm updates."
sudo npm install

echo "> Transpile the ECMAScript 2015 code"
gulp babel

echo "> Restart the API"
pm2 start transpiled/www.js --name api.dev

echo "> List folder directories"
ls -a

echo "> All done."

আমি এই shell script TeamCity দিয়ে launch করি, কিন্তু আপনি যেকোনো কিছু দিয়ে launch করতে পারেন।

এখানে raw command।

"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-yourdomain.sh
exit
>&2

এটাই।

শেষ কথায়

এই process-এর কিছু

লেখক: চাক কনওয়ে সফটওয়্যার ইঞ্জিনিয়ারিং এবং জেনারেটিভ এআই-তে বিশেষজ্ঞ। তার সাথে সোশ্যাল মিডিয়ায় যোগাযোগ করুন: X (@chuckconway) অথবা তাকে YouTube-এ দেখুন।

↑ উপরে ফিরে যান

আপনি এগুলোও পছন্দ করতে পারেন