पोस्ट
Ubuntu पर Nodejs के साथ Continuous Integration सेट करना
15 अगस्त 2015 • 13 मिनट पढ़ना

मैंने आपके लिए यह लाने के लिए खून, पसीना और आंसू बहाए हैं। मैंने Death Valley की झुलसा देने वाली गर्मी सही है और Mount McKinley की चोटियों पर चढ़ाई की है। मैंने बहुत कुछ त्याग किया है।
इस पोस्ट में साझा की गई अधिकांश सामग्री मेरा मूल काम नहीं है। जहां मैं कर सकता हूं, मैं मूल काम से वापस लिंक करता हूं।
यह लेख मानता है कि आप Linux के आसपास घूम सकते हैं।
मुझे production क्षमता में Ubuntu पर Nodejs applications को host और manage करने पर एक comprehensive guide नहीं मिली। मैंने इस विषय पर कई लेखों को एक साथ खींचा है। इस लेख के अंत तक मुझे उम्मीद है कि आप अपना Ubuntu server सेट करने में सक्षम होंगे और continuous integration server के माध्यम से Nodejs deploy कर सकेंगे।
Environment
मैं Windows पर TeamCity का उपयोग कर रहा हूं जो फिर GitHub से AWS पर hosted Ubuntu में code deploy करता है।
Technologies
इस लेख के लिए मैंने निम्नलिखित technologies का उपयोग किया:
- AWS पर Ubuntu 14.04
- Plink 0.64
- TeamCity 9.1
- GitHub
- Nginx 1.9.3
Ubuntu सेट करना
मैं यहां विस्तार में नहीं जाऊंगा। Amazon Web Services (AWS) इसे करना काफी आसान बनाता है। यह कोई फर्क नहीं पड़ता कि यह कहां है या यह आपके अपने server पर है या नहीं।
मुझे कुछ gotchas का सामना करना पड़ा। पहले, सुनिश्चित करें कि port 80 खुला है। मैंने port 80 बंद के साथ connect करने की मूर्खतापूर्ण गलती की। जब मैंने अपनी गलती की खोज की, तो मैं एक गैंडे की गांड की तरह महसूस किया।
Source से Nodejs Install करना
Nodejs Google के V8 javascript engine का उपयोग करने वाली एक server technology है। 2010 में इसकी release के बाद से, यह व्यापक रूप से लोकप्रिय हो गई है।
निम्नलिखित निर्देश मूल रूप से एक Digital Ocean post से आए हैं।
आपके पास हमेशा apt-get से Nodejs install करने का विकल्प है, लेकिन यह कुछ versions पीछे होगा। latest bits प्राप्त करने के लिए, source से Nodejs install करें।
इस section के अंत में हमने node के latest stable version (इस लेख के अनुसार) को download किया होगा, हमने source को build किया होगा और Nodejs install किया होगा।
अपने server में log in करें। हम package lists को update करके शुरू करेंगे।
sudo apt-get update
मैं यह भी सुझा रहा हूं कि आप सभी packages को upgrade करें। यह Nodejs के लिए आवश्यक नहीं है लेकिन अपने server को updated रखना अच्छी practice है।
sudo apt-get upgrade
आपका server सभी up to date है। अब source download करने का समय है।
cd ~
लेखन के समय 12.7 Nodejs का latest stable release है। latest version के लिए nodejs.org देखें।
wget https://nodejs.org/dist/v0.12.7/node-v0.12.7.tar.gz
आपके द्वारा download किए गए archive को extract करें।
tar xvf node-v*
नई बनाई गई directory में जाएं
cd node-v*
Nodejs को configure और build करें।
./configure
make
Nodejs install करें
sudo make install
Downloaded और extracted files को remove करने के लिए। बेशक, यह optional है।
cd ~
rm -rf node-v*
बधाई हो! Nodejs अब install हो गया है! और यह बहुत कठिन नहीं था।
Nginx सेट करना
Nodejs एक web server के रूप में काम कर सकता है, लेकिन यह वह नहीं है जिसे मैं दुनिया के सामने expose करना चाहूंगा। एक industrial, harden, feature rich web server इसके लिए बेहतर अनुकूल है। मैंने इस कार्य के लिए Nginx की ओर रुख किया है।
यह हमारी आवश्यक features के साथ एक mature web server है। Nodejs के एक से अधिक instance चलाने के लिए, हमें port forwarding की आवश्यकता होगी।
आप सोच रहे होंगे, हमें एक ही समय में Nodejs के एक से अधिक instance चलाने की आवश्यकता क्यों है। यह एक उचित प्रश्न है… मेरे scenario में, मेरे पास एक server है और मुझे एक ही machine पर DEV, QA और PROD चलाने की आवश्यकता है। हां, मुझे पता है कि ideal नहीं है, लेकिन मैं प्रत्येक environment के लिए 3 servers खड़े नहीं करना चाहता।
शुरू करने के लिए आइए Nginx install करें
sudo -s
add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx
एक बार Nginx सफलतापूर्वक install हो जाने के बाद हमें domains को set up करने की आवश्यकता है। मैं मान रहा हूं कि आप अपनी प्रत्येक sites को अपने domain/sub domain पर रखना चाहेंगे। यदि आप नहीं चाहते और अलग sub-folders का उपयोग करना चाहते हैं, तो यह doable है और करना बहुत आसान है। मैं यहां उस scenario को cover नहीं करूंगा। इसे कैसे करना है इस पर बहुत सारा documentation है। अलग domains सेट करने और corresponding Nodejs instances में port forwarding पर बहुत कम documentation है। यही मैं cover करूंगा।
अब जब Nginx install हो गया है, /etc/nginx/sites-available/
पर yourdomain.com के लिए एक file बनाएं
sudo nano /etc/nginx/sites-available/yourdomain.com
अपनी नई बनाई गई file में निम्नलिखित 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” को अपने actual domain से replace करें। Save करें और अपने editor से exit करें।
Sites-enabled directory में इस file का एक symbolic link बनाएं।
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
यह test करने के लिए कि सब कुछ सही तरीके से काम कर रहा है, एक simple node app बनाएं और इसे /var/www/yourdomain.com/app.js
में save करें और इसे run करें।
यदि आपके पास कोई handy नहीं है तो यहां एक simple 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 को start करना न भूलें, यदि आपने पहले से नहीं किया है।
cd /var/www/yourdomain/ && node app.js
यदि सब कुछ सही तरीके से काम कर रहा है, तो जब आप yourdomain.com पर navigate करेंगे तो आपको “Hello World” दिखेगा।
एक अलग Nodejs instance के लिए एक और domain जोड़ने के लिए आपको ऊपर दिए गए steps को repeat करना होगा। विशेष रूप से आपको अपनी नई Nginx config file में upstream name, port और domain को change करना होगा। Proxy_pass address nginx config file में upstream name से match होना चाहिए। Upstream name और proxy_pass value को देखें और आप समझ जाएंगे कि मेरा क्या मतलब है।
Recap करने के लिए, हमने source से NodeJS install किया है और हमने अभी Nginx install करना समाप्त किया है। हमने Nginx और Nodejs के साथ port forwarding को configure और test किया है।
PM2 Install करना
आप पूछ रहे होंगे “PM2 क्या है?” जैसा कि मैंने पहली बार सुनने पर किया था। PM2 Nodejs applications के लिए एक process manager है। Nodejs बहुत कुछ के साथ नहीं आता। यह इसकी appeal का हिस्सा है। इसका downside यह है कि आपको इसके सामने layers प्रदान करनी होंगी। PM2 उन layers में से एक है।
PM2 Nodejs process के life को manage करता है। जब यह terminate हो जाता है, PM2 इसे restart करता है। जब server reboot होता है तो PM2 आपके लिए सभी Nodejs processes को restart करता है। इसमें extensive development lifecycle process भी है। हम PM2 के इस aspect को cover नहीं करेंगे। मैं आपको अच्छी तरह से लिखे गए documentation को पढ़ने के लिए प्रोत्साहित करता हूं।
यह मानते हुए कि आप terminal में logged in हैं, हम NPM के माध्यम से PM2 install करके शुरू करेंगे। Npm Nodejs package manager (npm) है। यह Nodejs install करते समय install हुआ था।
sudo npm install pm2 -g
बस इतना ही। PM2 अब install हो गया है।
PM2 का उपयोग करना
PM2 का उपयोग करना आसान है।
PM2 के लिए hello world simple है।
pm2 start hello.js
यह आपके application को PM2 की process list में add करता है। यह list हर बार application start होने पर output होती है।
इस example में दो Nodejs applications चल रहे हैं। एक को api.dev और api.pre कहा जाता है।
PM2 automatically list में “App name” के लिए app का name assign करता है।
Out of the box, PM2 खुद को server restart होने पर startup के लिए configure नहीं करता। Command Linux के अलग flavors के लिए अलग है। मैं Ubuntu पर चल रहा हूं, इसलिए मैं Ubuntu command execute करूंगा।
pm2 start ubuntu
हमारा काम अभी भी पूरा नहीं हुआ है। हमें PM2 binary के लिए एक path add करना होगा। सौभाग्य से, पिछली 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 usages के examples (optional)
App name द्वारा application को stop करना
pm2 stop example
App name द्वारा restart करना
pm2 restart example
PM2 द्वारा manage किए जा रहे current applications की list
pm2 list
Process start करते समय name specify करना। यदि आप call करते हैं, PM2 javascript file को name के रूप में उपयोग करता है। यह आपके लिए काम नहीं कर सकता। यहां name specify करने का तरीका है।
pm2 start www.js --name api.pre
यह PM2 के साथ आपको शुरू करने के लिए पर्याप्त होना चाहिए। PM2 की capabilities के बारे में अधिक जानने के लिए, GitHub Repo पर जाएं।
Plink सेट करना और उपयोग करना
आप शायद सोच रहे हैं, “Betsey की गाय के नाम पर Plink क्या है?” कम से कम यही thought था। मुझे अभी भी यकीन नहीं है कि इसके बारे में क्या सोचना है। मैंने इसके जैसा कुछ कभी नहीं देखा।
क्या आपने कभी Wall-e movie देखी है? 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 download करके शुरू करें। यह सिर्फ एक executable है। मैं इसे C:/Program Files (x86)/Plink
में रखने की सिफारिश करता हूं। हमें बाद में इसे reference करने की आवश्यकता होगी।
यदि आप AWS में Ubuntu instance चला रहे हैं। आपके पास पहले से ही Putty के लिए एक cert setup होगा (मैं मान रहा हूं कि आप Putty का उपयोग कर रहे हैं)।
यदि आप नहीं हैं, तो आपको AWS में Ubuntu के लिए एक compatible ssh cert सुनिश्चित करना होगा।
यदि आप AWS का उपयोग नहीं कर रहे हैं, तो आप command line में username और password specify कर सकते हैं और ssh certs के बारे में चिंता नहीं करनी होगी।
यहां एक example command line है जो Plink के साथ Ubuntu से connect करती है।
"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 server पर ssh script चलाने के लिए हम Plink command के अंत में complete path add करते हैं।
"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
और यही, प्रिय reader, Plink है।
NODE_ENV को समझना
NODE_ENV
एक environment variable है जो expressjs द्वारा लोकप्रिय बनाया गया है। Node instance start करने से पहले, NODE_ENV
को environment पर set करें। Code में आप environment के आधार पर specific files load कर सकते हैं।
Setting NODE_ENV
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD
Environment variable को Nodejs instance के अंदर process.env.NODE_ENV
का उपयोग करके retrieve किया जाता है।
example
var environment = process.env.NODE_ENV
या expressjs के साथ
app.get('env')
*Note: app.get('env')
defaults to “development”।
सब कुछ एक साथ लाना
Nodejs
, PM2
, Nginx
और Plink
install हैं और उम्मीद है कि काम कर रहे हैं। अब हमें इन सभी pieces को एक continuous integration solution में एक साथ लाने की आवश्यकता है।
/var/www/yourdomain.com
में अपने GitHub repository को clone करें। हालांकि SSH HTTPS से अधिक secure है, मैं HTTPS का उपयोग करने की सिफारिश करता हूं। मुझे पता है कि यह ideal नहीं है, लेकिन मैं Ubuntu पर GitHub के साथ Plink को काम नहीं करा सका। बहुत विस्तार में जाए बिना Plink और GitHub SSH cert formats अलग हैं और SSH के माध्यम से Plink के माध्यम से GitHub को call करना काम नहीं किया। यदि आप issue का पता लगा सकते हैं तो मुझे बताएं!
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 .
Note करें कि यदि यह 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 के कुछ rough edges हैं… मुझे उम्मीद है कि समय के साथ उन edges को polish करूंगा। यदि आपके पास सुझाव हैं तो कृपया उन्हें comments में छोड़ें।
यह document मेरे GitHub Repository में है। Technologies बदलती हैं, इसलिए यदि आपको कोई error मिलती है तो कृपया इसे update करें। मैं फिर इस post को update करूंगा।
लेखक: चक कॉनवे सॉफ्टवेयर इंजीनियरिंग और जेनेरेटिव AI में विशेषज्ञता रखते हैं। उनसे सोशल मीडिया पर जुड़ें: X (@chuckconway) या उन्हें YouTube पर देखें।