Wednesday, January 1, 2014

রুবি অন রেইলস টিউটরিয়াল পর্ব ১০: ভিপিএস সার্ভারে কিভাবে রুবি অন রেইলস এপ্লিকেশন ডিপ্লয় করবেন ( Using Nginx, Ruby 2, Rails 4, Mysql , Sqlite3 , Unicorn, capistrano )

আজকে খুব কঠিন একটা টপিক নিয়ে লিখব। কোন একটা কিছু কঠিন তখনই যখন আপনার কাছে সঠিক ডকুমেন্টশনটি না থাকবে। আমি এই ডকুমেন্টশনটি অনেক বিস্তারিত করে লেখার চেষ্টা করব এবং কোন কোন ক্ষেত্রে কাজ করতে গিয়ে এরর পেয়েছি সেগুলো সমাধান কিভাবে করতে হবে তাও লিখব।

আমি রেইলস এপ্লিকেশন কিভাবে হিরোকোতে আপলোড করতে হয় দেখিয়েছি। আপলোড পদ্ধতি অনেক সহজ। কিন্তু আপনি যখন একটা VPS এ রেইলস ডিপ্লয় করতে যাবেন তখন এই কাজটা অনেক কঠিন। আপনাকে অপারেটিং সিস্টেম ইন্সটল দিতে হবে, রুবি রেইলস, ওয়েবসার্ভার সবকিছুই নিজের পছন্দমত ইন্সটল দিতে হবে। ভিপিএস এর জন্য আমি Digital Ocean ব্যবহার করেছি। এর দাম অনেক কম ৫১২ র‍্যাম, ২০ জিবি  SSD হার্ডডিস্ক এবং ১ টেরাবাইট ডাটা ট্রান্সফার। ঘন্টায় মাত্র ০.০০৭ ডলার চার্জ করে ফলে মাসে ওরা ৫ ডলার চার্জ করে।


Digital Ocean এ সাইন আপ করে নিবেন এবং আপনার ক্রেডিট কার্ড ডিটেইলস আপডেট করুন। Create Droplet এ ক্লিক করুন। droplet hostname এ যে কোন একটা নাম দিন। কোন প্যাকেজ ব্যবহার করতে চান সিলেক্ট করুন। আপনি কোন অপারেটিং সিস্টেম ব্যবহার করতে চান সিলেক্ট করুন।

আমি আমার ভিপিএস এ ubuntu 12.10 ব্যবহার করছি। আপনি চাইলে আপনার পছন্দমত অন্যটাও ব্যবহার করতে পারেন। তারপর Create Droplet এ ক্লিক করুন। ১ মিনিটের মধ্যে আপনার ভিপিএস কনফিগার হয়ে যাবে এবং ইমেইল এড্রেসে রুট ডিটেইল পাঠিয়ে দেয়া হবে।
একটা গুরুত্বপূর্ণ তথ্য জানিয়ে রাখি। ডিজিটাল ওশান আপনি ড্রপলেট ক্রিয়েট তৈরি করার পর পরই ঘন্টা কাউন্ট করে। সে অনুযায়ী মাসের শেষে আপনার কার্ড থেকে চার্জ করে। ধরুন কিছুদিন ভিপিএস ব্যবহার করার পর ঠিক করলেই এটা আর ব্যবহার করবেন না। তাহলে অবশ্যই Power off এ ক্লিক করে Destroy এ ক্লিক করে ড্রপলেটটি ডিলিট করে দিবেন। তবে তার আগে আপনি একটি ব্যাকয়াপ ইমেজ তৈরি করতে পারেন। Snapshots সেকশনে যেয়ে একটি নাম দিতে স্ন্যাপশট ক্রিয়েট করুন। আবার আপনি যে কোন সময় এই Snapshot backup টি রিস্টোর করতে পারবেন। এর পুরো প্রক্রিয়াই অনেক সহজ। So, don't worry.


কারন আমি কমান্ড লাইনে init 0 দিয়ে ভিপিএস অফ করেছিলাম। ভেবেছি অফ তো করে দিয়েছি আর চার্জ কাটবে না। পরে দেখি আমাকে চার্জ করেছে। কাস্টমার কেয়ার বলল যে ভিপিএস অফ করতে হলে অবশ্যই আপনার ড্রপলেটে যেয়ে নীল Power off বাটনে ক্লিক দিতে। তারপর ড্রপলেটটি ডেস্ট্রয় করে দিতে। মনে রাখবেন ড্রপলেট ডেস্ট্রয় না করলে চার্জ কাটবে।

এখন আপনি আপনার পিসির ssh কী ডিজিটল ওশান সাইটের এই লিঙ্কে আপডেট করে দিন। কিভাবে আপনার পিসির ssh key বের করে সেটা জানলে এই লিঙ্কে দেখতে পারেন।

প্রথমেই বলে নেই আমি টিউটরিয়ালটিকে এমনভাবে সাজানোর চেষ্টা করেছি যাতে আপনি Sqlite3 এবং mysql যে কোন রেইলস এপ্লিকেশন ডিপ্লয় করতে পারেন। আর আপনি এই ভিডিও টিউটরিয়াল ফলো করতে পারেন । এটা দেখলে আপনি জাস্ট একটা ধারনা পাবেন যে কোনটার পর কোনটা করতে হবে। তবে এখানে অনেক কিছুতে ভুল আছে। বা লেটেস্ট ভার্সনগুলোতে এর অনেক কোড কাজ করবে না। ভিডিওটি দেখতে হলে আপনাকে ৯ ডলার দিয়ে সাবসক্রাইব করতে হবে। অথবা টরেন্ট বা গুগল সার্চ করে চুরি করে ডাউনলোড করেন।

Mysql এর জন্য এই এপ্লিকেশনের বিভিন্ন ফাইল বিভিন্ন উদাহরন হিসেবে দেখতে পারেন। mysql এর জন্য ১৪ নং স্টেপ লাগবে না।
আর sqlite এর জন্য এই এপ্লিকেশনের এবং এই কমিট ট্রি এর বিভিন্ন ফাইল বিভিন্ন উদাহরন হিসেবে দেখতে পারেন। sqlite এর জন্য ১২ , ১৩ এবং ২৫ নং স্টেপ করা লাগবে না।

১। আপনি নিশ্চয় আপনার আইপি এড্রেস এবং ইউজার এবং পাসওয়ার্ড পেয়ে গেছেন। আমার যেহেতু আইপি এড্রেস 162.243.21.171 সেহেতু আমি এটা লিখে লগিন করলাম-

$ ssh root@162.243.21.171

অনেক ক্ষেত্রে দেখবেন আপনি অনেকক্ষন কাজ না করলে লগিন অবস্থায় থাকা স্বত্বেও ভিপিএস এ কমান্ড লিখতে পারছেন না। তখন টার্মিনাল অফ করে আবার ssh লগিন করবেন।

২। আমি এখন সফটওয়্যার রিপোজেটরির সব লিঙ্ক আপডেট করে নিব। কমান্ড লিখুন -

 $ apt-get -y update

৩। Curl , গিট কোর, এবং python-software-properties ডাউনলোড করব। এগুলোতে ২-৩ সেকেন্ড সময় লাগে। কারন সার্ভারের স্পীড তো অনেক।

$ apt-get -y install curl git-core python-software-properties

৪। আবার রিপোজেটরি আপডেট করে নিব

$ apt-get -y update

৫। আমরা এবার ওয়েবসার্ভার Nginx ইন্সটল করব। এটা অনেক লাইট এবং ওপেনসোর্স একটা সফটওয়্যার। আপনি এর বদলে Apache ও ইন্সটল করতে পারেন। তবে Apache অনেক ভারী সফটওয়্যার। আমাদের যেহেতু কনফিগারেশন কম সেহেতু Nginx ই ভাল।

$ apt-get -y install nginx

( এটা ইন্সটলে যদি সমস্যা হয় তাহলে $ apt-get -y install software-properties-common চালান। তারপর আবার রিপোজেটরি আপডেট করে নিন এই কমান্ড দিয়ে - $ apt-get -y update । এবার nginx ইন্সটল করুন)

৬। এই কমান্ড দিয়ে nginx সার্ভার স্টার্ট করুন।

$ service nginx start

এবার আপনার ব্রাউজারে আপনার আইপি এড্রেস(162.243.21.171) লিখে এন্টার দিয়ে দেখুন welcome to Nginx এসেছে কিনা।

৭। রেইলস এপ্লিকেশনে যেন জাভাস্ক্রীপ্ট ঠিকমত কাজ করে এজন্য nodejs ইন্সটল করব -

 $ apt-get install nodejs

৮। আমরা এসব কাজ করেছি root ইউজারে থেকে। সিকিরিটির জন্য আমরা আরেকটা ইউজার ক্রিয়েট করি। এবং ঐ ইউজার থেকেই সব কাজ করি। তাই এখন নতুন একটা ইউজার ক্রিয়েট করব এবং তাকে এডমিন এক্সেস দিব।

$ adduser mashpy --ingroup sudo

৯। এখন আমরা রুট থেকে লগআউট তারপর এবার mashpy ইউজারে লগিন করব।

$ logout
$ ssh mashpy@162.243.21.171

এরপর থেকে আমরা যেই কমান্ডই লিখি না কেন sudo ব্যবহার করব। অবশ্য mashpy কে যেহেতু এডমিন গ্রুপে যোগ করেছি sudo ব্যবহার না করলেও হয়। তবে অনেক পারমিশনে সমস্যা করে তখন sudo ব্যবহার অবশ্যই করা লাগে।

১০। আমরা এখন রুবি এবং রেইলস ইন্সটল করব। এর জন্য আমরা rbenv installer  ব্যবহার করব। লিঙ্কে গেলে
$ curl https://raw.github.com/fesplugas/rbenv-installer/master/bin/rbenv-installer | bash

এরপর আপনি  এই কমান্ডডি চালান - $ nano ~/.bashrc  তারপর নিচের লাইনটি যোগ করুন -

export RBENV_ROOT="${HOME}/.rbenv"

if [ -d "${RBENV_ROOT}" ]; then
  export PATH="${RBENV_ROOT}/bin:${PATH}"
  eval "$(rbenv init -)"
fi


 তারপর যথাক্রমে ctrl+o, ctrl+M, ctrl+x প্রেস করুন।

১১। যথাক্রমে নিচের কমান্ডগুলো চালান রুবি ইন্সটলের জন্য -
$ rbenv install 2.0.0-p247
(এটা হতে ১৫ মিনিট সময় লাগতে পারে। ধৈর্য ধরে অপেক্ষা করুন।)

এই ভার্সনকেই গ্লোবার হিসেবে সিলেক্ট করে দেন -
$ rbenv global 2.0.0-p247

রুবি ঠিকমত ইন্সটল হয়েছে কিনা ভার্সন চেক করুন -
$ ruby -v

rvenv কে আপডেট করে নিন -
$ rbenv update

বান্ডিল জেম ইন্সটল করুন। -
$ gem install bundler --no-ri --no-rdoc
$ rbenv rehash


এবার চেক করুন বান্ডিল ঠিকমত ইন্সটল হয়েছে কিনা -
$ bundle -v

 আপনাকে rbenv এর জন্য আরো কিছু কমান্ড চালানো প্রয়োজন -
$ rbenv bootstrap-ubuntu-12-04


(sqlite3 ডিপ্লয়ের ক্ষেত্রে নিচের ১২ এবং ১৩ নং ধাপ করা লাগবে না।)
 ১২। আমি যে রেইলস এপ্লিকেশনটি ডিপ্লয় করতে যাচ্ছি এটাতে Mysql আছে। তাই মাইসিকিয়েল সার্ভার ইন্সটল দিতে হবে -
$ sudo apt-get install libmysqlclient-dev
$ sudo apt-get install mysql-server

পাসওয়ার্ড চাইবে। আপনি আপনার ডাটাবেজের জন্য পছন্দমত পাসওয়ার্ড দিন।

১৩। এখন mysql এর জন্য আমরা ডাটাবেজ ক্রিয়েট করব। লিখুন -
$ mysql -u root -p

পাসওয়ার্ড দিয়ে লগিন করুন।
ডাটাবেজ ক্রিয়েট করুন এই কমান্ড দিয়ে -
CREATE DATABASE esljobsdb CHARACTER SET utf8 COLLATE utf8_general_ci;
> show databases;  দিয়ে দেখতে পারেন ঠিকমত ডাটাবেজ ক্রিয়েট হয়েছে কিনা।
> exit; করে বেরিয়ে যান।

১৪। (এই স্টেপ mysql এর জন্য লাগবে না)
আপনার sqlite ডাটাবেজের জন্য কমান্ডটি দিন -
 $ sudo apt-get install libsqlite3-dev

১৫। সার্ভারের সকল কাজ শেষ। logout করে বেরিয়ে আসুন এবং আপনার রেইলস এপ ডায়রেক্টেরীতে cd কমান্ড দিয়ে যান।  জেম ফাইলে গিয়ে ইউনিক্রন এবং capistrano যোগ করুন।

 gem 'unicorn'
 gem 'capistrano', '~> 2.11.2'


এখন bundle install দিন।
তারপর নিচের কমান্ডটি দিন। এটি capistrano এর জন্য প্রয়োজনীয় ফাইল যোগ করবে।
$ capify .

এখন আমরা কিছু ফাইল মডিফাই করব এবং কিছু ফাইল যোগ করব।
১৬. config/deploy.rb ফাইলটি মডিফাই করে এই লিঙ্কের মত করুন . 
    (ক) এখানে ৩ নং লাইনে সার্ভার আইপি এড্রেস দিবেন ।
    (খ) ৫ নং লাইনে আপনার এপ্লিকেশনের নাম এবং ৬ নং এ VPS এর ইউজারনেম।
    (গ) ১২ নং লাইনে গিট সোর্স কোডের https ডায়রেক্টোরী লিঙ্ক।

১৭. config ডায়রেক্টোরীতে nginx.conf নামে ফোল্ডার তৈরি করে এই লিঙ্কের কোড যোগ করুন ।
   (ক) এখানে যেসব জায়গায় esl_jobs লেখা আছে সেখানে আপনার এপ্লিকেশনের নাম লিখুন। যেমন ২ এবং ৮ নং লাইন চেঞ্জ করতে হবে।

১৮. config ডায়রেক্টোরীতে unicorn.rb নামে ফোল্ডার তৈরি করে এই লিঙ্কে কোড যোগ করুন ।
  (ক) এখানে যেসব জায়গায় esl_jobs লেখা আছে সেখানে আপনার এপ্লিকেশনের নাম লিখুন। যেমন ১ এবং ৭ নং লাইন চেঞ্জ করতে হবে।

১৯. config ডায়রেক্টোরীতে unicorn_init.sh নামে ফোল্ডার তৈরি করে এই লিঙ্কের কোড যোগ করুন ।
  (ক) এখানে যেসব জায়গায় esl_jobs লেখা আছে সেখানে আপনার এপ্লিকেশনের নাম লিখুন। যেমন ১ নং লাইন চেঞ্জ করতে হবে। এখানে আরেকটা কথা ১৫ এবং ১৮ নং লাইনে vps এর ইউজার mashpy দেয়া আছে। ঐ জায়গায় আপনার ভিপিএস এর ইউজার নেম লিখবেন।
 (খ) লোকালপিসির টার্মিনালে এই কমান্ড লিখে পারমিশন ঠিক করুন -
    $ chmod +x config/unicorn_init.sh

২০. এবার config/environment/production.rb তে নিচের দুইটা true করা আছে কিনা চেক করেন -
config.consider_all_requests_local = true
config.assets.compile = true

২১.  মূল ডায়রেক্টোরীতে capfile নামে যে ফাইলটা আছে এটা পুরাটা চেঞ্জ করে ঠিক এই লিঙ্কের কোডের মত করে করেন।

২২.  আপনার .gitignore ফাইলে config/database.yml  যোগ করুন। এই লিঙ্কের মত।

২৩. config/database.yml এর ফাইল কপি করে database.example.yml নামে একটা ফাইল তৈরি করব। এরজন্য কমান্ড -
$ cp config/database.yml config/database.example.yml

২২ এবং ২৩ নং স্টেপের দুইটা কাজ করেছি কারন আমরা চাই যে database.yml ফাইলটি সার্ভারে আপলোড হবে না। database.example.yml ফাইলটি আপলোড হবে এবং তখন আমরা ডাটাবেজের ইউজার নেম ও পাসওয়ার্ড প্রোডাকশন সেকশনে বসিয়ে দিব।

২৪.  এবার কমিট করে গিটহাবে আপলোড করে দিন। এবার নিচের কমান্ডটি লিখুন আপনার লোকাল পিসির টার্মিনালে -
$ cap deploy:setup

তাহলে প্রয়োজনীয় অনেক ফাইল আপলোড হয়ে যাবে। এবং সার্ভারে ডিপ্লয়ের জন্য প্রস্তুত হবে।

(নিচের ২৫ অংশটি sqlite3 এর জন্য লাগবে না)
২৫। আপনি ভিপিএস এ mashpy ইউজার দিয়ে ssh লগিন করুন। লিখুন -
$ cd app/esl_jobs/shared/config  (esl_job এর জায়গায় আপনার এপ্লিকেশনের নাম দিবেন)
$ nano database.example.yml
এই ফাইলে গিয়ে production সেকশনে আপনি আপনি mysql ডাটাবেজ ইউজার ও পাসওয়ার্ড ঠিকমত বসান।  তারপর যথাক্রমে ctrl+o, ctrl+M, ctrl+x প্রেস করুন।

২৬। এখন থেকে অনেকবার ভিপিএস ssh আবার local pc এর টার্মিনালে কাজ করতে হতে পারে। সুতরাং দুইটা ট্যাব খুলে নিন। একটায় vps ssh লগিন থাকবেন আরেকটায় লোকাল পিসির এপ্লিকেশন ডায়রেক্টোরীতে লগিন থাকবেন।
ভিপিএস এ ssh mashpy ইউজারে লগিন থাকা অবস্থায় এই কমান্ডটি দিন -
$ cd
$ mkdir ~/.ssh

এবার আপনার লোকালপিসির টার্মিনালে যেয়ে নিচের কমান্ডটি দিন -

$ cat ~/.ssh/id_rsa.pub | ssh mashpy@162.243.21.171 'cat >> ~/.ssh/authorized_keys'   (আপনার ক্ষেত্রে সঠিক ইউজার এবং আইপি দিয়ে কমান্ডটি চালান। )
$ ssh add
$ ssh add -k

২৭। লোকাল টার্মিনালে নিচের কমান্ড দিন -
$ cap deploy:cold

যদি সব কিছু ঠিকভাবে কনফিগার করে থাকেন তাহলে ঠিকভাবেই আপলোড হবে। এবং command finish লেখা উঠবে। Failed : ...... এরকম কোন মেসেজ আসবে না। একেবারে শেষে যেই মেসেজটি আসে সেটার দিকে খেয়াল রাখবেন।

যদি etc/init.d/unicorn_esl_jobs start এই কমান্ডটি এক্সিকিউট হতে প্রবলেম দেখা দেয় তাহলে ভিপিএস টার্মিনালে এই কমান্ডটি চালাবেন -

$ chmod a+x /home/mashpy/apps/esl_jobs/current/config/unicorn_init.sh
(সঠিকভাবে ইউজার নেম ও এপ্লিকেশন ডায়রেক্টরী বসান।)

আবার cap deploy:cold চালিয়ে দেখেন ঠিক মত command finish লেখা উঠেছে কিনা। কোন failed লেখা যেন না আসে। failed লেখা আসলে এরর মেসেজ ভাল করে পড়েন। সে অনুযায়ী গুগল সার্চ করে সমাধান করেন।
এই এরর মেসেজ সমাধানের ব্যাপারে নিচে ৩১ নং সতর্কতা দেখুন।

২৮। নিচের কমান্ডগুলো চালান -
$ sudo rm /etc/nginx/sites-enabled/default
$ sudo service nginx restart

$ sudo update-rc.d unicorn_esl_jobs defaults
(লাস্টের কমান্ডে সঠিকভাবে এপ্লিকেশনের নাম দিন। এখানে খেয়াল করুন প্রথম কমান্ড default এবং লাস্টের কমান্ডে defaults . ভাল করে দেখে কমান্ড চালাবেন। কারন এই জায়গায় আমি অনেকবার ভুল করেছিলাম।)

২৯। ওকে ! আমাদের কাজ প্রায় শেষ। এখন আপ্নি আপনার IP addess এ ভিসিট করুন। দেখবেন আপনার সাইট চলে এসেছে।

৩০। এখন আমরা একটি টেস্ট করতে পারি। লোকালহোস্টে সাইটে কোন একটা চেঞ্জ করুন। কমিট করে গিটহাবে আপলোড করুন। এবার নিচের কমান্ডটি চালান -
$ cap deploy
এবার 162.243.21.171 আপনার আইপি এড্রেসে গিয়ে দেখুন সাইটে আমাদের করা পরিবর্তন কাজ করছে।




সতর্কতাঃ
৩০। ভিপিএস এ ডিপ্লয় করতে গেলে মনে রাখবেন আপনার একটু ভুলের কারনে শুধু এরর আর এরর দেখাবে। আপনার এপ্লিকেশন নেম ইউজার নেম ডায়রেক্টরী ঠিকভাবে বসাবেন। আমি ডিপ্লয় করার ক্ষেত্রে এসব জায়গায় অনেক ভুল করেছিলাম। আর যে কোন সময় এরর মেসেজের জন্য এবং এর সমাধানের জন্য প্রস্তুত থাকুক। মেসেজগুলো কপি করে গুগলে সার্চ করে সমাধান বের করুন। আর কমান্ডগুলো ভাল করে দেখে চালাবেন, যদি দরকার হয় কপি পেস্ট করেও প্রথম অবস্থায় কাজ করতে পারেন। হাতে সবগুলো লিখতে গিয়ে অনেক জায়গায় আমি ভুল করেছিলাম।

৩১। এ ক্ষেত্রে আমরা চাই যে ডেভেলাপমেন্ট মুডে কাজ করে কোন এরর আছে কিনা তা সল্ভ করা। এ জন্য  আমরা ভিপিএস টার্মিনালে লগিন করে app/esl_jobs/shared/cached-copy ডায়রেক্টোরীতে আসব।
$ nano config/database.example.yml  লিখুন।
 এখানে development সেকশনে আপনার সার্ভারের mysql ইউজার ডাটাবেজ নেম এবং পাসওয়ার্ড দিন। তারপর ctrl+o , ফাইলনেমটি রিনেম করে database.yml করুন। এবার ctrl + m ; ctrl+x চাপ দিয়ে বের হয়ে আসুন।
$ gem install bundler
$ bundle install

সবগুলো ইন্সটল হয়ে গেলে তো মেসেজ দেখাবে। আর না হলে দেখারে কোনটাতে সমস্যা। সে অনুযায়ী প্রবলেম সল্ভ করুন।
এবার rails s দিয়ে সার্ভার অন করুন। ব্রাউজারে 162.243.21.171:3000 লিখে পিং করুন, সাইট আসে কিনা। যদি আসে তাহলে লোকালহোস্টের টার্মিনালে cap deploy:cold দিয়ে সব কিছু আপলোড করার চেষ্টা করুন।

ধন্যবাদ। টিউটরিয়ালে কোন কিছু বুঝতে সমস্যা হলে জানাবেন।

No comments:

Post a Comment

এখানে আপনি আপনার মূল্যবান মতামতটি প্রকাশ করতে পারেন।