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

Введение


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

Но не бойтесь! Capistrano, инструмент автоматизации задач, здесь, чтобы помочь.

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

Примечание: Эта статья основана на знаниях из нашей предыдущей статьи о Capistrano: Автоматизация развертывания с помощью Capistrano: первые шаги. Для приобретения хороших знаний о данном инструменте, что настоятельно рекомендуется при его использовании, рекомендуется прочитать ее перед продолжением чтения этого материала. Точно так же, если вы хотите узнать больше о подготовке нового droplet для развертывания приложений на основе Rails с использованием Passenger (и Nginx), ознакомьтесь со статьей Как развертывать приложения Rails с помощью Passenger и Nginx.

Примечание: Capistrano зависит от Git для развертывания. Для получения дополнительной информации рекомендуется ознакомиться с сообщественными статьями DigitalOcean по этой теме, перейдя по ссылке.

Глоссарий


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


  1. Обновление и подготовка операционной системы
  2. Настройка среды Ruby и Rails
  3. Загрузка и установка приложения и HTTP-серверов
  4. Создание сценария управления Nginx
  5. Настройка Nginx для развертывания приложения
  6. Загрузка и установка Capistrano
  7. Создание системного пользователя для развертывания

2. Подготовка приложений Rails для развертывания с использованием Git и Capistrano


  1. Создание базового приложения Ruby-On-Rails
  2. Создание репозитория Git

3. Работа с Capistrano для автоматизации развертывания


  1. Установка Capistrano внутри каталога проекта
  2. Работа с config/deploy.rb внутри каталога проекта
  3. Работа с config/deploy/production.rb внутри каталога проекта
  4. Развертывание на производственный сервер

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


Примечание: Для лучшего понимания нижеприведенного раздела, который можно считать длинным резюме, ознакомьтесь с полной статьей на эту тему: Как развернуть приложения Rails, используя Passenger с Nginx.

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


Запустите следующую команду для обновления стандартных инструментов вашего виртуального сервера на базе CentOS:

yum -y update

Установите набор, содержащий инструменты разработки, выполнив следующую команду:

yum groupinstall -y 'development tools'

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

Запустите следующую команду, чтобы добавить репозиторий 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 и создать системную среду для 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

Выполните следующую команду с использованием RubyGems’ gem для загрузки и установки rails:

gem install bundler rails

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


Примечание: Если ваш VPS имеет менее 1 ГБ оперативной памяти, вам потребуется выполнить следующую простую процедуру для подготовки SWAP-пространства размером 1024 МБ, которое будет использоваться как временное хранилище данных (замена ОЗУ). Поскольку серверы DigitalOcean поставляются с быстрыми SSD-дисками, это действительно не является проблемой во время выполнения задач установки серверных приложений.

# Создание SWAP-пространства размером 1024 МБ
sudo dd if=/dev/zero of=/swap bs=1M count=1024
sudo mkswap /swap
sudo swapon /swap

Phusion Passenger


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

Используйте следующую команду для простой загрузки и установки Passenger:

gem install passenger

Nginx


Примечание: Обычно для загрузки и установки Nginx вы можете добавить репозиторий EPEL (как мы уже сделали) и получить Nginx через yum. Однако, чтобы заставить 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

На следующем этапе выберите Item 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.

И нажмите 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 для развертывания приложений


На этом последнем этапе настройки наших серверов нам необходимо создать блок сервера Nginx, который приблизительно соответствует виртуальным хостам Apache.

Как вы, возможно, помните из процесса установки Nginx Passenger, эту процедуру состоит в добавлении блока кода в файл конфигурации Nginx nginx.conf. По умолчанию, если вы не указываете иное, этот файл можно найти по пути /opt/nginx/conf/nginx.conf.

Введите следующую команду, чтобы открыть этот файл конфигурации для редактирования с помощью текстового редактора nano:

nano /opt/nginx/conf/nginx.conf

В качестве первого шага найдите узел http { и добавьте следующее сразу после директив passenger_root и passenger_ruby:

# Только для целей разработки.
# Удалите эту строку, когда загружаете реальное приложение.
# Только для * ТЕСТИРОВАНИЯ *.
passenger_app_env development;    

Прокрутите файл вниз и найдите server { ... Закомментируйте расположение по умолчанию, т.е.:

..

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

..

И определите корневое приложение по умолчанию:

# Установите папку, в которой будет развернуто ваше приложение.
# Мы используем: /home/deployer/apps/my_app
root              /home/deployer/apps/my_app/public;
passenger_enabled on;

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

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

# !! Помните о создании сценария управления Nginx
#    путем следования основной статье о развертывании Rails для CentOS
#    ссылка на которую находится в начале этого раздела.

/etc/init.d/nginx restart

Чтобы проверить статус Nginx, вы можете использовать:

/etc/init.d/nginx status

Примечание: Чтобы узнать больше о Nginx, обратитесь к статье Как настроить веб-сервер Nginx на VPS.

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


После подготовки нашей системы получить последнюю версию Capistrano, благодаря RubyGems, легко.

Вы можете просто использовать следующее, чтобы получить версию Capistrano 3:

gem install capistrano

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


На этом этапе мы собираемся создать пользовательскую систему CentOS для выполнения операций развертывания. Это будет пользователь, которым будет пользоваться Capistrano.

Примечание: Для сохранения простоты мы собираемся создать пользователя deployer с необходимыми привилегиями. Для более полной настройки рассмотрите использование примера с группами из руководства по введению в Capistrano.

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

adduser deployer

Настройте пароль deployer:

passwd deployer

# Введите пароль
# Подтвердите пароль

Отредактируйте файл /etc/sudoers с помощью текстового редактора nano:

nano /etc/sudoers

Пролистайте файл вниз и найдите, где определен root:

..

## Раздел COMMANDS может содержать добавленные другие параметры.
##
## Разрешить root выполнять любые команды в любом месте
root    ALL=(ALL)	ALL

..

Добавьте следующее сразу после root ALL=(ALL) ALL:

deployer ALL=(ALL) ALL

Этот раздел файла /etc/sudoers теперь должен выглядеть так:

..

## Раздел COMMANDS может содержать добавленные другие параметры.
##
## Разрешить root выполнять любые команды в любом месте
root     ALL=(ALL)	ALL
deployer ALL=(ALL) ALL

..

Нажмите CTRL+X и подтвердите Y для сохранения и выхода.

Подготовка приложений Rails для развертывания с помощью Capistrano на основе Git


Как только у нас будет готова наша система, со всеми необходимыми приложениями, настроенными и работающими правильно, мы можем перейти к созданию образцового приложения Rails для использования в качестве образца.

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

Примечание: Здесь мы создаем образцовое приложение. Для фактических развертываний вы должны выполнить эти действия самостоятельно, убедившись, что все сохранено в резерве – на всякий случай! Также обратите внимание, что вам нужно будет запустить Capistrano из другого местоположения, чем сервер, на котором должно быть развернуто приложение.

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


Примечание: Ниже приведен этап создания заменительного приложения Rails для тестирования Capistrano.

Установка Ruby и Rails позволяет нам начать всего с одной команды.

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

# Создание образцового приложения Rails
rails new my_app

# Перейдите в каталог приложения
cd my_app

# Создание образца ресурса
rails generate scaffold Task title:string note:text

# Создание образца базы данных
RAILS_ENV=development rake db:migrate

Для проверки правильной настройки вашего приложения и корректной работы выполните следующие действия:

# Перейдите в директорию вашего приложения
cd my_app

# Запустите простой сервер
rails s

# Теперь вы можете получить к нему доступ, перейдя по ссылке:
# http://[IP вашего droplet]:3000

# Для завершения процесса сервера
# Нажмите CTRL+C

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


Примечание: Чтобы узнать больше о работе с Git, ознакомьтесь с учебником Эффективное использование Git на страницах сообщества DigitalOcean.

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

Мы будем использовать пример инструкций, предоставленных Github, чтобы создать исходный репозиторий.

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

# !! Эти команды нужно выполнить на
#    вашей разработочной машине, откуда вы будете
#    разворачивать их на вашем сервере.
#    Инструкции могут немного отличаться в зависимости от
#    вашей операционной системы.
#
#    Убедитесь, что установлены правильные пути для приложения
#    В противном случае Nginx может не смочь его найти.

# Инициировать репозиторий
git init

# Добавить все файлы в репозиторий
git add .

# Зафиксировать изменения
git commit -m "first commit"

# Добавить ссылку на ваш репозиторий на Github 
# Пример: git remote add origin [email protected]:[имя пользователя]/[название проекта].git
git remote add origin [email protected]:user123/my_app.git

# Создать RSA/SSH ключ
# Следуйте инструкциям на экране
ssh-keygen -t rsa

# Просмотрите содержимое ключа и добавьте его на Github
# копируя и вставляя из текущей сеансной сессии
# посетив: https://github.com/settings/ssh
# Чтобы узнать больше о процессе,
# посетите: https://help.github.com/articles/generating-ssh-keys
cat /root/.ssh/id_rsa.pub

# Установите информацию о вашем Github
# Username:
# Использование: git config --global user.name "[ваше имя пользователя]"
git config --global user.name "user123"

# Email:
# Использование: git config --global user.email "[ваш email]"
git config --global user.email "[email protected]"

# Отправьте исходный код проекта в ваш аккаунт на Github
git push -u origin master

Работа с Capistrano для автоматизации развертывания


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

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


Еще один простой шаг в нашей статье – установка файлов Capistrano. Нижеприведенная команда создаст несколько каталогов и файлов, которые будут использоваться инструментом для развертывания.

Выполните следующее, чтобы инициировать (т.е. установить) файлы Capistrano:

cap install

# mkdir -p config/deploy
# создать config/deploy.rb
# создать config/deploy/staging.rb
# создать config/deploy/production.rb
# mkdir -p lib/capistrano/tasks
# Capified

Работа с config/deploy.rb внутри каталога проекта


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

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

Запустите следующее для редактирования файла с использованием текстового редактора nano:

nano config/deploy.rb

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

# Определите имя приложения
set :application, 'my_app'

# Определите, откуда Capistrano может получить доступ к репозиторию исходного кода
# set :repo_url, 'https://github.com/[имя пользователя]/[имя приложения].git'
set :scm, :git
set :repo_url, 'https://github.com/user123/my_app.git'

# Определите, куда поместить код вашего приложения
set :deploy_to, "/home/deployer/apps/my_app"

set :pty, true

set :format, :pretty

# Установите инструкции после развертывания здесь.
# После завершения развертывания Capistrano
# начнет выполнять их в соответствии с описанием.
# Чтобы узнать больше о создании задач,
# посетите:
# http://capistranorb.com/

# namespace: deploy do

#   desc 'Перезапустить приложение'
#   task :restart do
#     on roles(:app), in: :sequence, wait: 5 do
#       # Ваш механизм перезапуска здесь, например:
#       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
#       # Здесь мы можем делать что угодно, например:
#       # within release_path do
#       #   execute :rake, 'cache:clear'
#       # end
#     end
#   end

# end

Нажмите CTRL+X и подтвердите нажатием Y для сохранения и выхода.

Работа с config/deploy/production.rb внутри каталога проекта


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

Запустите следующую команду для редактирования файла с использованием текстового редактора nano:

nano config/deploy/production.rb

Введите настройки вашего сервера, аналогичные приведенным ниже:

# Определение ролей, пользователя и IP-адреса сервера развертывания
# role :name, %{[user]@[IP адрес]}
role :app, %w{[email protected]}
role :web, %w{[email protected]}
role :db,  %w{[email protected]}

# Определение сервера(ов)
server '162.243.74.190', user: 'deployer', roles: %w{web}

# SSH-опции
# Смотрите закомментированный примерный раздел в файле
# для получения дополнительных параметров.
set :ssh_options, {
    forward_agent: false,
    auth_methods: %w(password),
    password: 'user_deployers_password',
    user: 'deployer',
}

Нажмите CTRL+X и подтвердите сохранение и выход, нажав Y.

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


Когда настройки завершены, пришло время развернуть проект.

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

  • Подключится к серверу развертывания

  • Загрузите исходный код приложения

  • Выполните действия по развертыванию (например, перезапустите приложение пассажира)

cap production deploy

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

<div class=“author”>Предоставлено: <a
href=“https://twitter.com/ostezer”>O.S. Tezer</a></div>

Source:
https://www.digitalocean.com/community/tutorials/how-to-automate-ruby-on-rails-application-deployments-using-capistrano