पोस्ट
Ubuntu पर Node.js के साथ Continuous Integration सेट अप करना
15 अगस्त 2015 • 13 मिनट पढ़ना
मैंने इसे आपके लिए लाने के लिए खून, पसीना और आँसू बहाए हैं। मैंने Death Valley की तपती गर्मी को सहा है और Mount McKinley की चोटियों पर चढ़ा हूँ। मैंने बहुत कुछ त्याग किया है।
इस पोस्ट में साझा की गई अधिकांश सामग्री मेरा मूल काम नहीं है। जहाँ संभव हो, मैं मूल काम के लिए लिंक करता हूँ।
यह लेख मानता है कि आप Linux के चारों ओर घूम सकते हैं।
मुझे Ubuntu पर production क्षमता में Node.js applications को होस्ट करने और प्रबंधित करने पर एक व्यापक गाइड नहीं मिल सका। मैंने इस विषय पर कई लेखों को एक साथ खींचा है। इस लेख के अंत तक, मुझे आशा है कि आप अपना स्वयं का Ubuntu सर्वर सेट अप करने में सक्षम होंगे और Node.js को एक continuous integration सर्वर के माध्यम से तैनात कर सकेंगे।
Environment
मैं Windows पर TeamCity का उपयोग कर रहा हूँ जो फिर GitHub से कोड को AWS पर होस्ट किए गए Ubuntu में तैनात करता है।
Technologies
इस लेख के लिए मैंने निम्नलिखित technologies का उपयोग किया:
- Ubuntu 14.04 on AWS
- Plink 0.64
- TeamCity 9.1
- GitHub
- Nginx 1.9.3
Ubuntu सेट अप करना
मैं यहाँ विस्तार में नहीं जा रहा हूँ। Amazon Web Services (AWS) इसे करना काफी आसान बनाता है। इससे कोई फर्क नहीं पड़ता कि यह कहाँ है या यह आपके अपने सर्वर पर है।
मुझे कुछ समस्याओं का सामना करना पड़ा। सबसे पहले, सुनिश्चित करें कि port 80 खुला है। मैंने port 80 बंद होने के साथ कनेक्ट करने का मूर्खतापूर्ण प्रयास किया। एक बार जब मुझे अपनी गलती का पता चला, तो मुझे एक गैंडे की तरह महसूस हुआ।
Source से Node.js इंस्टॉल करना
Node.js एक सर्वर technology है जो Google के V8 javascript engine का उपयोग करती है। 2010 में इसके release के बाद से, यह व्यापक रूप से लोकप्रिय हो गया है।
निम्नलिखित निर्देश मूल रूप से एक Digital Ocean पोस्ट से आए हैं।
आपके पास हमेशा apt-get से Node.js इंस्टॉल करने का विकल्प है, लेकिन यह कुछ संस्करण पीछे होगा। नवीनतम bits प्राप्त करने के लिए, source से Node.js इंस्टॉल करें।
इस section के अंत में हम node का नवीनतम stable version डाउनलोड करेंगे (इस लेख के अनुसार), हम source को build करेंगे और Node.js को इंस्टॉल करेंगे।
अपने सर्वर में लॉगिन करें। हम package lists को अपडेट करके शुरू करेंगे।
sudo apt-get update
मैं यह भी सुझाव दे रहा हूँ कि आप सभी packages को upgrade करें। यह Node.js के लिए आवश्यक नहीं है, लेकिन अपने सर्वर को अपडेट रखना अच्छा अभ्यास है।
sudo apt-get upgrade
आपका सर्वर पूरी तरह से अपडेट है। अब source को डाउनलोड करने का समय है।
cd ~
लेखन के समय 12.7 Node.js का नवीनतम stable release है। नवीनतम संस्करण के लिए 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*
Node.js को configure और build करें।
./configure
make
Node.js इंस्टॉल करें
sudo make install
डाउनलोड किए गए और extracted files को हटाने के लिए। बेशक, यह optional है।
cd ~
rm -rf node-v*
बधाई हो! Node.js अब इंस्टॉल हो गया है! और यह बहुत कठिन नहीं था।
Nginx सेट अप करना
Node.js एक web server के रूप में कार्य कर सकता है, लेकिन यह कुछ ऐसा नहीं है जिसे मैं दुनिया के सामने expose करना चाहूँगा। एक industrial, hardened, feature-rich web server इसके लिए बेहतर है। मैंने इस कार्य के लिए Nginx की ओर रुख किया है।
यह एक mature web server है जिसमें हमें आवश्यक features हैं। Node.js के एक से अधिक instances को चलाने के लिए, हमें port forwarding की आवश्यकता होगी।
आप सोच रहे होंगे, हमें एक ही समय में Node.js के एक से अधिक instances चलाने की आवश्यकता क्यों है। यह एक उचित प्रश्न है… मेरे scenario में, मेरे पास एक सर्वर है और मुझे एक ही machine पर DEV, QA और PROD चलाने की आवश्यकता है। हाँ, मुझे पता है कि ideal नहीं है, लेकिन मैं प्रत्येक environment के लिए 3 सर्वर खड़े नहीं करना चाहता।
शुरू करने के लिए Nginx को इंस्टॉल करते हैं
sudo -s
add-apt-repository ppa:nginx/stable
apt-get update
apt-get install nginx
एक बार Nginx सफलतापूर्वक इंस्टॉल हो जाने के बाद हमें domains पर सेट अप करने की आवश्यकता है। मैं मानने जा रहा हूँ कि आप अपनी प्रत्येक site को अपने स्वयं के domain/sub domain पर चाहते हैं। यदि आप नहीं चाहते हैं और विभिन्न sub-folders का उपयोग करना चाहते हैं, तो यह doable है और बहुत आसान है। मैं यहाँ उस scenario को cover नहीं करने जा रहा हूँ। इसे कैसे करें, इस पर बहुत सारे documentation हैं। विभिन्न domains सेट अप करने और corresponding Node.js instances के लिए port forwarding करने पर बहुत कम documentation है। यह वह है जो मैं cover करूँगा।
अब जब Nginx इंस्टॉल हो गया है, तो /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 से बदलते हैं। Save करें और अपने editor से exit करें।
sites-enabled directory में इस file के लिए एक symbolic link बनाएँ।
cd /etc/nginx/sites-enabled/
ln -s /etc/nginx/sites-available/yourdomain.com yourdomain.com
यह परीक्षण करने के लिए कि सब कुछ सही तरीके से काम कर रहा है, एक simple node app बनाएँ और इसे /var/www/yourdomain.com/app.js में save करें और इसे चलाएँ।
यहाँ एक simple nodejs app है यदि आपके पास एक handy नहीं है।
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
अपने Node.js instance को शुरू करना न भूलें, यदि आपने पहले से नहीं किया है।
cd /var/www/yourdomain/ && node app.js
यदि सब कुछ सही तरीके से काम कर रहा है, तो जब आप yourdomain.com पर navigate करते हैं तो आप “Hello World” देखेंगे।
एक अलग Node.js instance के लिए एक और domain जोड़ने के लिए आपको ऊपर दिए गए steps को दोहराने की आवश्यकता है। विशेष रूप से आपको अपनी नई Nginx config file में upstream name, port और domain को बदलने की आवश्यकता होगी। proxy_pass address को nginx config file में upstream name से match करना चाहिए। upstream name और proxy_pass value को देखें और आप समझ जाएँगे कि मेरा क्या मतलब है।
संक्षेप में, हमने source से NodeJS इंस्टॉल किया है और हमने अभी Nginx को इंस्टॉल करना समाप्त किया है। हमने Nginx और Node.js के साथ port forwarding को configure और test किया है
PM2 इंस्टॉल करना
आप पूछ रहे होंगे “PM2 क्या है?” जैसा कि मैंने किया था जब मैंने पहली बार इसके बारे में सुना। PM2 Node.js applications के लिए एक process manager है। Node.js के साथ बहुत कुछ नहीं आता। यह इसके appeal का हिस्सा है। इसका downside यह है कि आपको इसके सामने की layers प्रदान करनी होंगी। PM2 उन layers में से एक है।
PM2 Node.js process के जीवन को प्रबंधित करता है। जब यह terminate हो जाता है, तो PM2 इसे restart करता है। जब सर्वर reboot होता है तो PM2 आपके लिए सभी Node.js processes को restart करता है। इसमें extensive development lifecycle process भी है। हम PM2 के इस पहलू को cover नहीं करेंगे। मैं आपको अच्छी तरह से लिखे गए documentation को पढ़ने के लिए प्रोत्साहित करता हूँ।
मानते हुए कि आप terminal में logged हैं, हम NPM के माध्यम से PM2 को इंस्टॉल करके शुरू करेंगे। Npm Node.js package manager (npm) है। यह तब इंस्टॉल किया गया था जब आपने Node.js को इंस्टॉल किया था।
sudo npm install pm2 -g
बस। PM2 अब इंस्टॉल हो गया है।
PM2 का उपयोग करना
PM2 का उपयोग करना आसान है।
PM2 के लिए hello world सरल है।
pm2 start hello.js
यह आपके application को PM2 की process list में जोड़ता है। यह list हर बार एक application शुरू होने पर output होती है।

इस उदाहरण में दो Node.js applications चल रहे हैं। एक को api.dev और api.pre कहा जाता है।
PM2 स्वचालित रूप से app का नाम list में “App name” को assign करता है।
Box से बाहर, PM2 अपने आप को configure नहीं करता है ताकि सर्वर restart होने पर startup हो। command विभिन्न Linux flavors के लिए अलग है। मैं 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 के अन्य उपयोगों के उदाहरण (optional)
App name द्वारा एक application को रोकना
pm2 stop example
App name द्वारा restart करना
pm2 restart example
PM2 द्वारा प्रबंधित current applications की list
pm2 list
एक process शुरू करते समय एक नाम निर्दिष्ट करना। यदि आप कॉल करते हैं, तो PM2 javascript file को नाम के रूप में उपयोग करता है। यह आपके लिए काम नहीं कर सकता। यहाँ नाम निर्दिष्ट करने का तरीका है।
pm2 start www.js --name api.pre
यह PM2 के साथ शुरू करने के लिए पर्याप्त होना चाहिए। PM2 की capabilities के बारे में अधिक जानने के लिए, GitHub Repo पर जाएँ।
Plink सेट अप करना और उपयोग करना
आप शायद सोच रहे हैं, “Betsey की गाय के नाम पर Plink क्या है?” कम से कम वह विचार है। मैं अभी भी इसके बारे में सोचना निश्चित नहीं हूँ। मैंने कभी इसके जैसा कुछ नहीं देखा।
क्या आपने Wall-e movie देखी है? Wall-e एक spork निकालता है। पहले वह इसे forks के साथ रखने की कोशिश करता है, लेकिन यह fit नहीं होता है और फिर वह इसे spoons के साथ रखने की कोशिश करता है, लेकिन यह fit नहीं होता है। खैर वह Plink है। यह Putty (SSH) और Windows Command Line के बीच एक cross है।
Plink मूल रूप से आपको Windows command line से bash commands चलाने की अनुमति देता है जबकि एक Linux (और शायद Unix) shell में logged हों।
Plink को डाउनलोड करके शुरू करें। यह सिर्फ एक executable है। मैं इसे C:/Program Files (x86)/Plink में रखने की सलाह देता हूँ। हमें इसे बाद में reference करने की आवश्यकता होगी।
यदि आप AWS में एक Ubuntu instance चला रहे हैं। आपके पास पहले से ही Putty के लिए एक cert setup होगा (मैं मान रहा हूँ कि आप Putty का उपयोग कर रहे हैं)।
यदि आप नहीं हैं, तो आपको AWS में Ubuntu के लिए एक compatible ssh cert सुनिश्चित करने की आवश्यकता होगी AWS।
यदि आप AWS का उपयोग नहीं कर रहे हैं, तो आप command line में username और password निर्दिष्ट कर सकते हैं और ssh certs के बारे में चिंता नहीं करनी होगी।
यहाँ एक example 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 पर सेट करें। code में आप environment के आधार पर specific files को load कर सकते हैं।
NODE_ENV सेट करना
Linux & Mac: export NODE_ENV=PROD
Windows: set NODE_ENV=PROD
Environment variable को process.env.NODE_ENV का उपयोग करके एक Node.js instance के अंदर retrieve किया जाता है।
उदाहरण
var environment = process.env.NODE_ENV
या expressjs के साथ
app.get('env')
*Note: app.get('env') “development” को default करता है।
सब कुछ एक साथ लाना
Node.js, PM2, Nginx और Plink इंस्टॉल हैं और hopefully काम कर रहे हैं। अब हमें इन सभी pieces को एक continuous integration solution में लाने की आवश्यकता है।
अपने GitHub repository को /var/www/yourdomain.com में clone करें। हालाँकि SSH HTTPS से अधिक सुरक्षित है, मैं HTTPS का उपयोग करने की सलाह देता हूँ। मुझे पता है कि यह ideal नहीं है, लेकिन मैं Plink को Ubuntu पर GitHub के साथ काम करने में सक्षम नहीं कर सका। बहुत विस्तार में जाए बिना Plink और GitHub SSH cert formats अलग हैं और Plink के माध्यम से SSH के माध्यम से GitHub को कॉल करना काम नहीं किया। यदि आप समस्या को figure out कर सकते हैं तो मुझे बताएँ!
GitHub pull को handsfree बनाने के लिए, username और password को origin url का हिस्सा होना चाहिए।
यहाँ आप अपने origin url को कैसे सेट करते हैं। बेशक आपको अपनी जानकारी के साथ 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 पूरी तरह से खाली नहीं है, 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 करूँगा।
लेखक: Chuck Conway एक AI इंजीनियर हैं जिनके पास सॉफ्टवेयर इंजीनियरिंग का लगभग 30 साल का अनुभव है। वह व्यावहारिक AI सिस्टम बनाते हैं—कंटेंट पाइपलाइन, इंफ्रास्ट्रक्चर एजेंट, और ऐसे टूल जो वास्तविक समस्याओं को हल करते हैं—और अपनी सीख को साझा करते हैं। सोशल मीडिया पर उनसे जुड़ें: X (@chuckconway) या YouTube और SubStack पर उनसे मिलें।