Deploy Ruby On Rails Automatic với Capistrano
Bài đăng này đã không được cập nhật trong 3 năm
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 git@github.com:[user name]/[proj. name].git
git remote add origin git@github.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 "user123@gmail.com"
# 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{deployer@162.243.74.190}
role :web, %w{deployer@162.243.74.190}
role :db, %w{deployer@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
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.
All rights reserved