Deploy Ruby On Rails Automatic với Capistrano

Nội dung chính

I. Giới thiệu Capistrano.

II. Chuẩn bị môi trường Server

III. Download và cài đặt Capistrano

IV. Tạo user deploy

V. Chuẩn bị một project Ruby on Rails và tạo một Git Repository

VI. Deploy tự động với Capistrano

I. Giới thiệu Capistrano

1. Giới thiệu chung.

Capistrano là một chương trình được viết bằng Ruby cung cấp cho bạn một bộ công cụ tiên tiến để triển khai các ứng dụng web đến các máy chủ của bạn.

Capistrano cho phép bạn sao chép mã từ (SVN hoặc Git) đến máy chủ thông qua SSH, và thực hiện chức năng trước và sau khi triển khai như khởi động lại một máy chủ web, bộ nhớ cache busting, đổi tên tập tin, chạy di chuyển cơ sở dữ liệu và vv.

Với Capistrano nó cũng có thể để triển khai đến nhiều máy cùng một lúc.

2. Các tính năng

Triển khai ứng dụng web một cách chính xác cho bất kỳ số lượng máy chủ nào ta chỉ định theo tiến trình của hàng đợi do ta định nghĩa cho nó.

Tự động hóa lưu trữ logs của bất kỳ máy nào khi tương tác với nó chẵn hạn như kiểm tra số lần login, liệt kê bản cập nhật, fix các lỗi bảo mật.

Chạy các kịch bản script thông qua giao thức SSH

Thực hiện tự động hóa các công việc

Hỗ trợ các infrastructure(cơ sở hạ tầng) Chef-solo

Hiển thị cũng như định dạng các dữ liệu đầu ra (progress, pretty, html, etc).

Dễ dàng tích hợp với công cụ quản lý source như git

Hỗ trợ nhiều môitrường phát triển.

II. Chuẩn bị môi trường Server

1. Update lại hệ thống

sudo apt-get update

2. Cài đặt môi trường cho Ruby và Rails

Chạy lệnh dưới đây để cài đặt RVM và tạo môi trường cho Ruby

curl -L get.rvm.io | bash -s stable

source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

Sau đó chúng ta install NodeJs

sudo apt-get install nodejs

Install Rails bằng lệnh sau

sudo gem install bundler rails

Download và Install App & HTTP Servers

Tạo một SWAP space với 1024 MB

sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

**Install Phusion Passenger **

Chạy lệnh dưới đây

sudo gem install passenger

Install Nginx

passenger-install-nginx-module

Ở màn hình thông báo bạn chọn Ruby như bên dưới

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.

 ‣ ⬢  Ruby
   ⬢  Python
   ⬢  Node.js
   ⬡  Meteor

Màn hình tiếp theo bạn chọn 1

1. Yes: download, compile and install Nginx for me. (recommended)
    The easiest way to get started. A stock Nginx 1.4.4 with Passenger
    support, but with no other additional third party modules, will be
    installed for you to a directory of your choice.

Nhấn Enter để tiếp tục việc cài đặt.

Tạo Nginx Management Script

Chạy lệnh bên dưới

nano /etc/rc.d/init.d/nginx

Coppy và past nội dung dưới đây vào file vừa mở. Sau đó lưu file lại.

#!/bin/sh
. /etc/rc.d/init.d/functions
. /etc/sysconfig/network
[ "$NETWORKING" = "no" ] && exit 0

nginx="/opt/nginx/sbin/nginx"
prog=$(basename $nginx)

NGINX_CONF_FILE="/opt/nginx/conf/nginx.conf"

lockfile=/var/lock/subsys/nginx

start() {
    [ -x $nginx ] || exit 5
    [ -f $NGINX_CONF_FILE ] || exit 6
    echo -n $"Starting $prog: "
    daemon $nginx -c $NGINX_CONF_FILE
    retval=$?
    echo
    [ $retval -eq 0 ] && touch $lockfile
    return $retval
}

stop() {
    echo -n $"Stopping $prog: "
    killproc $prog -QUIT
    retval=$?
    echo
    [ $retval -eq 0 ] && rm -f $lockfile
    return $retval
}

restart() {
    configtest || return $?
    stop
    start
}

reload() {
    configtest || return $?
    echo -n $”Reloading $prog: ”
    killproc $nginx -HUP
    RETVAL=$?
    echo
}

force_reload() {
    restart
}

configtest() {
    $nginx -t -c $NGINX_CONF_FILE
}

rh_status() {
    status $prog
}

rh_status_q() {
    rh_status >/dev/null 2>&1
}

case "$1" in
start)
rh_status_q && exit 0
$1
;;
stop)
rh_status_q || exit 0
$1
;;
restart|configtest)
$1
;;
reload)
rh_status_q || exit 7
$1
;;
force-reload)
force_reload
;;
status)
rh_status
;;
condrestart|try-restart)
rh_status_q || exit 0
;;
*)
echo $"Usage: $0 {start|stop|status|restart|condrestart|try-restart|reload|force-reload|configtest}"
exit 2
esac

Phân quyền cho file /etc/rc.d/init.d/nginx

sudo chmod 777 /etc/rc.d/init.d/nginx

Cấu hình Nginx cho ứng dụng cần Deploy

Mở file nginx.conf lên

sudo nano /opt/nginx/conf/nginx.conf

Trước tiên nó sẽ tìm http và thêm quyền passenger_root và passenger_ruby được chỉ thị

# Only for development purposes.
# Remove this line when you upload an actual application.
# For * TESTING * purposes only.
passenger_app_env development;

Tìm đến dòng như bên dưới

..........................
#    location / {
#            root   html;
#            index  index.html index.htm;
#        }
..........................

Sau đó định nghĩa đường dẫn mặc định đến thư mục root của ứng dụng

# Set the folder where you will be deploying your application.
# We are using: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

Sau đó lưu lại. Và restart Nginx

# !! Remember to create an Nginx management script
#    by following the main Rails deployment article for CentOS
#    linked at the beginning of this section.

/etc/init.d/nginx restart

Có thể xem status của Nginx

/etc/init.d/nginx status

III. Download và cài đặt Capistrano

Capistrano có thể cài đặt trực tiếp với Gem hoặc thông qua Bundle.

Cài với Gem

Trong Gemfile thêm dòng sau

gem 'capistrano'

Chạy lệnh sau

gem install capistrano

IV. Tạo user deploy

Sử dụng lệnh sau

 sudo adduser deploy

Sẽ có một thông báo yêu cầu thiết lập password cho account deploy. Nhập password vào và enter để tiếp tục.

Sau khi đã tạo account deploy, chúng ta cần thiết lập quyền root cho account deploy của mình.

Điều này cho phép user deploy có thể sử dụng với quyền administrator, bằng cách sử dụng sudo ở trước mỗi command line.

gpasswd -a deploy sudo

Bây giờ user deploy có thể chạy command line với quyền của user root

V. Chuẩn bị một project Ruby on Rails và tạo một Git Repository

1. Tạo project Ruby on Rails đơn giản

# Create a sample Rails application
rails new my_app

# Enter the application directory
cd my_app

# Create a sample resource
rails generate scaffold Task title:string note:text

# Create a sample database
RAILS_ENV=development rake db:migrate

Chạy thử ứng dụng

```PHP

# Enter the application directory

cd my_app

# Run a simple server

rails s

# You should now be able to access it by

# visiting: http://[your droplet's IP]:3000

# In order to terminate the server process

# Press CTRL+C

2. Tạo một Git Repository

Trong thư mục my_app. Ta thực hiện các công việc sau


# !! These commands are to be executed on

# your development machine, from where you will

# deploy to your server

# Instructions might vary slightly depending on

# your choice of operating system

#

# Make sure to set correct paths for application

# Otherwise Nginx might not be able to locate it

# Initiate the repository

git init

# Add all the files to the repository

git add .

# Commit the changes

git commit -m "first commit"

# Add your Github repository link

# Example: git remote add origin [email protected]:[user name]/[proj. name].git

git remote add origin [email protected].com:user123/my_app.git

# Create an RSA/SSH key

# Follow the on-screen instructions

ssh-keygen -t rsa

# View the contents of the key and add it to your Github

# by copy-and-pasting from the current remote session by

# visiting: https://github.com/settings/ssh

# To learn more about the process

# visit: https://help.github.com/articles/generating-ssh-keys

cat /root/.ssh/id_rsa.pub

# Set your Github information

# Username

# Usage: git config --global user.name "Your name"

git config --global user.name "phamkykhoi"

# Email

# Usage: git config --global user.email "your email"

git config --global user.email "[email protected]"

# Push the project's source code to your Github account

git push -u origin master

###VI. Deploy với Capistrano 1. Install Capistrano trong thư mục project Chạy lệnh sau


 bundle exec cap install

Nó sẽ tạo ra các file theo cấu trúc sau


├── Capfile
├── config
│   ├── deploy
│   │   ├── production.rb
│   │   └── staging.rb
│   └── deploy.rb
└── lib
    └── capistrano
            └── tasks

Định nghĩa config/deploy.rb

Các bạn có thể modify như bên dưới


# Define the name of the application

set :application, 'my_app'

# Define where can Capistrano access the source repository

# set :repo_url, 'https://github.com/[user name]/[application name].git'

set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Define where to put your application code

set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Set the post-deployment instructions here

# Once the deployment is complete, Capistrano

# will begin performing them as described

# To learn more about creating tasks

# check out

# http://capistranorb.com/

# namespace: deploy do

# desc 'Restart application'

# task :restart do

# on roles(:app), in: :sequence, wait: 5 do

# # Your restart mechanism here, for example

# execute :touch, release_path.join('tmp/restart.txt')

# end

# end

# after :publishing, :restart

# after :restart, :clear_cache do

# on roles(:web), in: :groups, limit: 3, wait: 10 do

# # Here we can do anything such as

# # within release_path do

# #   execute :rake, 'cache:clear'

# # end

# end

# end

# end

**Định nghĩa file config/deploy/production.rb ** Chạy lệnh


sudo nano config/deploy/production.rb

Sau đó định nghĩa nó như bên dưới và lưu lại


# Define roles, user and IP address of deployment server

# role :name, %{[user]@[IP adde.]}

role :app, %w{[email protected]162.243.74.190}
role :web, %w{[email protected]162.243.74.190}
role :db,  %w{[email protected]162.243.74.190}

# Define server(s)

server '162.243.74.190', user: 'deployer', roles: %w{web}

# SSH Options

# See the example commented out section in the file

# for more options

set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

2. Deploying to the Production Server Chúng ta sẽ chạy với lệnh này


bundle exec cap production deploy

Kết quả có thể xem qua hình minh họa cap-deploy.png

Như vậy là chúng ta đã thành công việc deploy ứng dụng lên server.

Kết luận

Capistrano là một tool khá hay, dễ sử dụng. Giúp bạn cấu hình những gì bạn muốn mà không cần phải lên serve. Nó giúp bạn dễ dàng triển khai một hoặc nhiều ứng dụng của bạn lên server

Capistrano giúp bạn tiết kiệm nhiều thời gian cho quá trình triển khai ứng dụng lên server so với cách làm truyền thống.