Автоматизация развертывания приложений Ruby On Rails с помощью Capistrano

Повторять одни и те же задачи, чтобы обновить серверы приложений и сделать проект доступным в Интернете, очень утомительно. Вся радость от разработки приложения теряется, когда дело доходит до скучных повседневных задач (загрузки кодовой базы, изменения конфигураций, повторного выполнения команд и т. д.).

В таких ситуациях на помощь приходит Capistrano, инструмент для автоматизации задач.

Данный мануал поможет создать надежную основу для запуска приложения Ruby-on-Rails на Nginx и Passenger в CentOS. Вы научитесь автоматизировать процессы развертывания и обновления с помощью  Capistrano.

Для дальнейшей работы рекомендуем ознакомиться с мануалом Автоматизация развёртываний при помощи Capistrano. Чтобы подготовить приложение Rails на основе Passenger и Nginx, читайте мануал Развёртывание Rails-приложений на Passenger и Nginx в CentOS 6.5.

Примечание: Для развертываний Capistrano использует Git.

1: Подготовка сервера развертывания

Читайте также: Развёртывание Rails-приложений на Passenger и Nginx в CentOS 6.5

Обновление и подготовка операционной системы

Запустите эту команду, чтобы обновить стандартные инструменты сервера:

yum -y update

Установите связку инструментов разработки:

yum groupinstall -y 'development tools'

В официальном репозитории CentOS есть не все инструменты, которые понадобятся в работе (например, libyaml-devel, nginx).

Добавьте репозиторий EPEL:

sudo su -c 'rpm -Uvh http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm'
yum -y update

Установите недостающие пакеты и библиотеки:

yum install -y curl-devel nano sqlite-devel libyaml-devel

Настройка среды Ruby и Rails

Читайте также: Установка Ruby 2.1.0 на CentOS 6.5 с помощью RVM

Запустите следующие две команды, чтобы установить RVM и создать среду для Ruby:

curl -L get.rvm.io | bash -s stable
source /etc/profile.d/rvm.sh
rvm reload
rvm install 2.1.0

Rails нужен интерпретатор JavaScript, установите для этого Node.js. Запустите следующую команду, чтобы загрузить и установить nodejs с помощью yum:

yum install -y nodejs

Добавьте gem для rails:

gem install bundler rails

Загрузка и установка сервера приложений и HTTP-сервера

Примечание: Если ваш VPS имеет менее 1 ГБ памяти, вам необходимо выполнить следующую простую процедуру для подготовки дискового пространства SWAP, которое будет использоваться в качестве временного хранилища данных (заменитель оперативной памяти):

# Create a 1024 MB SWAP space
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Установка Phusion Passenger

Менеджер пакетов Red Hat по умолчанию RPM (RPM Package Manager) предоставляет приложения в файлах .rpm. К сожалению, файлы для Phusion Passenger довольно сильно устарели. Поэтому нужно использовать RubyGem, чтобы загрузить и установить последнюю доступную версию Passenger.

Используйте приведенную ниже команду, чтобы загрузить и установить сервер:

gem install passenger

Установка Nginx

Примечание: Обычно для установки и настройки Nginx используется репозиторий EPEL. Но чтобы сервер Nginx мог работать с Passenger, его исходный код нужно скомпилировать с дополнительными модулями.

Запустите следующую команду, чтобы скомпилировать Nginx с модулем Passenger:

passenger-install-nginx-module

После запуска команды нажмите Enter и выберите язык (в данном случае Ruby). Чтобы выбрать Ruby, используйте клавиши со стрелками и пробел,

Use <space> to select.
If the menu doesn't display correctly, ensure that your terminal supports UTF-8.
‣ ⬢  Ruby
⬢  Python
⬢  Node.js
⬡  Meteor

Далее нужно выбрать пункт 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.

Нажмите Enter, чтобы продолжить.

После этого код Nginx будет загружен и установлен с поддержкой Passenger.

Примечание: На установку уйдет некоторое время.

Сценарий для управления Nginx

После компиляции Nginx для простоты работы нужно создать сценарий управления.

Запустите следующую команду, чтобы создать сценарий:

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

Скопируйте и вставьте следующие параметры:

#!/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

Нажмите CTRL+X и Y, чтобы сохранить и закрыть файл.

Сделайте сценарий исполняемым:

chmod +x /etc/rc.d/init.d/nginx

Настройка Nginx для развертывания приложения

На этом последнем этапе настройки серверов нужно создать виртуальный хост (блок server) Nginx.

Для этого нужно добавить блок кода в конфигурационный файл Nginx, nginx.conf. По умолчанию этот файл можно найти в /opt/nginx/conf/nginx.conf.

Чтобы открыть конфигурационный файл, запустите следующую команду:

nano /opt/nginx/conf/nginx.conf

Найдите блок http { и вставьте следующие строки после директив passenger_root и passenger_ruby:

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

Затем найдите блок server {, закомментируйте location по умолчанию:

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

Определите корневой каталог приложения:

# 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;

Сохраните и закройте файл.

Примечание: Создайте сценарий для управления Nginx, следуя мануалу Развёртывание Rails-приложений на Passenger и Nginx в CentOS 6.5.

Запустите следующую команду, чтобы перезапустить Nginx и обновить настройки:

/etc/init.d/nginx restart

Проверьте состояние Nginx:

/etc/init.d/nginx status

Читайте также: Настройка веб-сервера Nginx

Загрузка и установка Capistrano

Теперь система готова. Нужно установить последнюю версию Capistrano из  RubyGems.

gem install capistrano

Создание системного пользователя для развертывания

Теперь нужно создать пользователя CentOS для выполнения задач развертывания.

Примечание: Для простоты в мануале пользователь называется deployer.

Создайте нового пользователя:

adduser deployer

Установите пароль:

passwd deployer
# Enter a password
# Confirm the password

Отредактируйте /etc/sudoers:

nano /etc/sudoers

Перейдите в конец файла и найдите определение root:

..
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root    ALL=(ALL)   ALL
..

После строки root ALL=(ALL) ALL: вставьте следующую строку:

deployer ALL=(ALL) ALL

Теперь этот раздел выглядит так:

..
## The COMMANDS section may have other options added to it.
##
## Allow root to run any commands anywhere
root     ALL=(ALL)  ALL
deployer ALL=(ALL) ALL
..

Сохраните и закройте файл.

2: Подготовка Rails-приложения к развертыванию Capistrano на основе Git

Теперь система готова, все необходимые приложения установлены и работают правильно. Можно приступать к созданию приложения Rails.

Второй этап развертывания – создание репозитория Git и перемещение базы кода на Github, где ее сможет использовать Capistrano.

Примечание: В этом разделе показано, как создать простое тестовое приложение. В идеале у вас уже должно быть свое рабочее приложение, но если это не так, просто создайте образец приложения и продолжайте работу. При работе с настоящим приложением на всякий случай создайте резервную копию всех его файлов. Кроме того, обратите внимание: Capistrano нужно будет запустить с другого сервера.

Создание базового приложения Rails

Ruby и Rails уже установлены. Теперь можно запустить пару команд, чтобы начать работу и создать новое приложение:

# 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

Чтобы протестировать приложение, откройте каталог приложения и запустите простой сервер:

# 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

Создание репозитория Git

Читайте также: Продуктивное использование Git

Примечание: Чтобы следовать этому разделу, вам понадобится учетная запись Github. Кроме того, вы можете разместить свой собственный репозиторий Git на сервере, следуя мануалу Настройка приватного Git-репозитория. Если вы решите это сделать, обязательно укажите соответствующий URL-адрес в файлах развертывания.

Для создания исходного репозитория можно использовать образец с Github.

Выполните следующие команды внутри каталога my_app, чтобы запустить репозиторий:

# !! 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 username]"
git config --global user.name "user123"
# Email:
# Usage: git config --global user.email "[your email]"
git config --global user.email "user123@domain.tld"
# Push the project's source code to your Github account
git push -u origin master

3: Автоматизация развертывания с помощью Capistrano

Чтобы начать использовать Capistrano, нужно установить библиотеку внутри каталога проекта. На этом этапе нужно добавить Capistrano в каталог проекта и создать файлы, необходимые для настройки серверов.

Установка Capistrano в каталог проекта

Запустите следующую команду, чтобы установить файлы Capistrano:

cap install
# mkdir -p config/deploy
# create config/deploy.rb
# create config/deploy/staging.rb
# create config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified

Файл deploy.rb

Файл deploy.rb содержит аргументы и настройки, относящиеся к серверам развертывания. Здесь нужно указать Capistrano, какие серверы нужно подключиться и развернуть и как это сделать.

Примечание: При редактировании файла вы можете закомментировать конфигурации, либо добавить новые строки. Удостоверьтесь, что в файле нет конфликтующих параметров.

Откройте файл в редакторе:

nano config/deploy.rb

Добавьте блок кода (при необходимости откорректируйте его согласно вашим требованиям):

# 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

Сохраните и закройте файл.

Файл production.rb

Примечание: Как и в deploy.rb, в файле production.rb нужно откорректировать некоторые параметры во избежание возникновения конфликтов.

Откройте файл:

nano config/deploy/production.rb

Добавьте в него свои параметры:

# 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',
}

Сохраните и закройте файл.

Развертывание сервера производства

Теперь пора попробовать развернуть сервер.

Запустите следующий код на машине развертывания. Согласно конфигурациям, Capistrano сделает следующее:

  • Подключится к серверу развертывания.
  • Загрузит исходный код приложения.
  • Выполнит все операции по развертыванию.

cap production deploy

Больше о Capistrano можно узнать в документации проекта.

Tags: , , , , ,