Автоматизация развертывания приложений Ruby On Rails с помощью Capistrano
Centos, Ruby | Комментировать запись
Повторять одни и те же задачи, чтобы обновить серверы приложений и сделать проект доступным в Интернете, очень утомительно. Вся радость от разработки приложения теряется, когда дело доходит до скучных повседневных задач (загрузки кодовой базы, изменения конфигураций, повторного выполнения команд и т. д.).
В таких ситуациях на помощь приходит 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: Capistrano, Git, NGINX, Passenger, Ruby, Ruby on Rails