Многократное развертывание с использованием Capistrano
Capistrano – это написанная на Ruby утилита, созданная в целях надежного и многократного развертывания Rails-приложений на удаленных серверах (хотя можно разворачивать и не только ROR). Для связи с серверами и выполнения серверных команд в ней используется SSH. Эту утилиту очень трудно настроить, но для обычного развертывания она довольно проста в использовании и напоминает форсированую версию Rake, в которой средства Capistrano состоят из набора выполняемых задач. Но в Capistrano задачи обеспечены методами, которые способны вызывать действия на одном или нескольких удаленных серверах.
Подобно Rails, Capistrano довольно своенравная программа, выстраивающая ряд предложений. Первое из них состомт в том, что развертывание производится на системе, основаной на Unix. Второе – что код содержится в хранилище, доступном той машине, с которой ведеться развертывание, и той машине, на которую оно ведется.
Приступим
Как только появиться машина, пригодная для развертывания приложения, сначала её нужно очистить от всего ненужного и приготовить к работе. Если это PC, он должен работать самой последней версии Linux, FreeBSD или Solaris. Если это Mac, то на нем должен быть запущен последний выпуск версии Mac OS X.
Далее нужно установить ряд необходимых компонентов программного обезпечения. На машине потребуються следующие компоненты:
- Веб-сервер (Apache, lighttpd или nginx)
- Сервер баз данных (Mysql, Postgresql, Oracle прочее, что поддерживает ROR)
- Ruby 1.8.4 или поздний выпуск
- RubyGems для управления пакетами, создаными на основе Ruby
- Библиотека Mysql/Ruby (или Pgsql/Ruby, смотря какую базу данных вы поставите и будете использовать)
- Библиотека Ruby Termios
Для установки этих пакетов лучше использовать систему управления пакетов. В Ubuntu Linux – apt-get, в Red Hat – rpm, Mac OS X – MacPorts. Как только упомянутые компоненты будут установлены, нужно будет установить следующие RubyGems: Rake, Rails, Capistrano и Mongrel.
Для ускорения установки этих gem-пакетов используются следующие команды:
-
# на сервере (серверах), а также на клиентской машине
-
# (если не установлены ранее)
-
$ gem install –include-dependencies rake
-
$ gem install –include-dependencies rails
-
$ gem install –include-dependencies termios
-
$ gem install –include-dependencies capistrano
-
$ gem install –include-dependencies mongrel
-
$ gem install –include-dependencies mongrel_cluster
Теперь вы располагаете всем необходимым программным обезпечением, которое требуется для запуска стандартных Rails-приложений. Разумеется, если в в приложении используються другие gem-пакеты Ruby, то их также нужно будет установить. В предыдущей статье я рассказывал как настроить mongrel, поэтому тут я это упускаю.
Настройка Capistrano
Чтобы Capistrano начал творить свои чудеса, нужно выполнить следующию команду:
-
$#cd /projects/rails_demo # rails_demo – директория нашего приложения
-
$/projects/rails_demo# capify .
-
[add] writing `./Capfile’
-
[add] writing `./config/deploy.rb’
-
[done] capified!
Из информации, выведенной на экран, видно, что Capistrano устанавливает два файла. Первый из них, /config/deploy.rb, содержит предписания, необходимые для развертывания приложения. Теперь нужно отредактировать файл config/deploy.rb для настройки его под конкретное развертывание. В начало файла нужно добавить оператор require, чтобы включить предписание mongrel_cluster, которое обеспечит беспроблемное развертывание Mongrel:
-
require "mongrel_cluster/recipes"
-
# Имя приложения
-
set :application, "rails_demo"
-
# Вызов функции set создаст переменную application и присвоит ей значение "rails_demo"
-
-
# В проекте мы используем только один сервер, выполняющий роль веб-сервиса.
-
role :web, "example.com" # хост удалённого сервера
-
set :user, ‘user’ # пользователь удалённого сервера
-
set :use_sudo, false # не запускать команды под sudo
-
-
# Директория приложения на удалённом хостинге
-
set :app_dir, "/home/#{user}/#{application}/" # /home/user/rails_demo/
-
# Запись "/home/#{user}/#{application}/" аналогична "/home/$user/$application/" в PHP
-
-
# Директория, куда будет делаться checkout из репозитория
-
set :deploy_to, "#{app_dir}/deploy" # /home/user/rails_demo/deploy
-
# Указываем где находится конфигурационный файл Mongrel
-
set(:mongrel_conf) {"#{current_path}/config/mongrel_cluster.yml"}
-
-
# Настройки репозитория
-
set :scm, :subversion # используем subversion
-
set :scm_user, ‘svn_user’ # имя пользователя репозитория
-
set :scm_url, "svn://svnhost/trunk/#{application}" # svn://svnhost/trunk/rails_demo/
-
# Формируем команду svn checkout –username svn_user svn://host/trunk/rails_demo
-
set :repository, Proc.new { "–username #{scm_user} #{scm_url}"}
-
# можно выполнить дополнительное задание после работы
-
# например создать символическую ссылку в папку main на текущий релиз
-
task :after_symlink, :roles => :web do
-
run "ln -nfs #{release_path} #{app_dir}/main"
-
end
Как только будут внесены эти исправления, можно приступать к развертыванию. Если вы все правильно сделали, то набрав команду cap -T вы должны увидеть возможные ваши команды
-
$ cap -T
-
cap deploy # Deploys your project.
-
cap deploy:check # Test deployment dependencies.
-
cap deploy:cleanup # Clean up old releases.
-
cap deploy:cold # Deploys and starts a `cold’ application.
-
cap deploy:migrate # Run the migrate rake task.
-
cap deploy:migrations # Deploy and run pending migrations.
-
cap deploy:pending # Displays the commits since your last deploy.
-
cap deploy:pending:diff # Displays the `diff’ since your last deploy.
-
cap deploy:restart # Restart the Mongrel processes on the app serv…
-
cap deploy:rollback # Rolls back to a previous version and restarts.
-
cap deploy:rollback:code # Rolls back to the previously deployed version.
-
cap deploy:setup # Prepares one or more servers for deployment.
-
cap deploy:start # Start the Mongrel processes on the app server…
-
cap deploy:stop # Stop the Mongrel processes on the app server …
-
cap deploy:symlink # Updates the symlink to the most recently depl…
-
cap deploy:update # Copies your project and updates the symlink.
-
cap deploy:update_code # Copies your project to the remote servers.
-
cap deploy:upload # Copy files to the currently deployed version.
-
cap deploy:web:disable # Present a maintenance page to visitors.
-
cap deploy:web:enable # Makes the application web-accessible again.
-
cap invoke # Invoke a single command on the remote servers.
-
cap mongrel:cluster:configure # Configure Mongrel processes on the app server.
-
cap mongrel:cluster:restart # Restart the Mongrel processes on the app serv…
-
cap mongrel:cluster:start # Start Mongrel processes on the app server.
-
cap mongrel:cluster:status # Check the status of the Mongrel processes on …
-
cap mongrel:cluster:stop # Stop the Mongrel processes on the app server.
-
cap shell # Begin an interactive Capistrano session.
Выполняем команду
-
$ cap deploy:setup
Это сделает начальную инициализацию, создание папок на сервере. Следующий шаг
-
$ cap deploy:cold
После запуска этой команды произойдет развертывание приложения на сервер, а затем будет запущенны копии Mongrel:
-
* executing `deploy:cold’
-
* executing `deploy:update’
-
** transaction: start
-
* executing `deploy:update_code’
-
executing locally: "svn info –username leopard http://10.108.9.142/svn/rails_films/rails_films/ -rHEAD"
-
* executing "svn checkout -q -r12 –username leopard http://10.108.9.142/svn/rails_films/rails_films/ /var/www/rails/rails_films/deploy/releases/20090121085418 && (echo 12 > /var/www/rails/rails_films/deploy/releases/20090121085418/REVISION)"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing `deploy:finalize_update’
-
* executing "chmod -R g+w /var/www/rails/rails_films/deploy/releases/20090121085418"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing "rm -rf /var/www/rails/rails_demo/deploy/releases/20090121085418/log /var/www/rails/rails_demo/deploy/releases/20090121085418/public/system /var/www/rails/rails_demo/deploy/releases/20090121085418/tmp/pids &&\\\n mkdir -p /var/www/rails/rails_demo/deploy/releases/20090121085418/public &&\\\n mkdir -p /var/www/rails/rails_demo/deploy/releases/20090121085418/tmp &&\\\n ln -s /var/www/rails/rails_demo/deploy/shared/log /var/www/rails/rails_demo/deploy/releases/20090121085418/log &&\\\n ln -s /var/www/rails/rails_demo/deploy/shared/system /var/www/rails/rails_demo/deploy/releases/20090121085418/public/system &&\\\n ln -s /var/www/rails/rails_demo/deploy/shared/pids /var/www/rails/rails_demo/deploy/releases/20090121085418/tmp/pids"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing "find /var/www/rails/rails_demo/deploy/releases/20090121085418/public/images /var/www/rails/rails_demo/deploy/releases/20090121085418/public/stylesheets /var/www/rails/rails_demo/deploy/releases/20090121085418/public/javascripts -exec touch -t 200901210854.19 {} ‘;’; true"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing `deploy:symlink’
-
* executing "rm -f /var/www/rails/rails_demo/deploy/current && ln -s /var/www/rails/rails_demo/deploy/releases/20090121085418 /var/www/rails/rails_demo/deploy/current"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing `after_symlink’
-
* executing "ln -nfs /var/www/rails/rails_demo/deploy/releases/20090121085418 /var/www/rails/rails_demo//main"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
** transaction: commit
-
* executing `deploy:migrate’
-
* executing "ls -xt /var/www/rails/rails_demo/deploy/releases"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
command finished
-
* executing "cd /var/www/rails/rails_demo/deploy/releases/20090121085418; rake RAILS_ENV=production db:migrate"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
** [out :: 10.108.9.141] (in /var/www/rails/rails_demo/deploy/releases/20090121085418)
-
** [out :: 10.108.9.141] Loaded suite /usr/bin/rake
-
** [out :: 10.108.9.141] Started
-
** [out :: 10.108.9.141]
-
** [out :: 10.108.9.141] Finished in 0.000285 seconds.
-
** [out :: 10.108.9.141]
-
** [out :: 10.108.9.141] 0 tests, 0 assertions, 0 failures, 0 errors
-
command finished
-
* executing `deploy:start’
-
* executing `mongrel:cluster:start’
-
* executing "mongrel_rails cluster::start -C /var/www/rails/rails_demo/deploy/current/config/mongrel_cluster.yml"
-
servers: ["10.108.9.141"]
-
[10.108.9.141] executing command
-
** [out :: 10.108.9.141] starting port 3000
-
** [out :: 10.108.9.141] starting port 3001
-
command finished
Как видим db:migrate происходит тоже автоматически. Что бы проверить, запустился ли Mongrel (хотя по логам и так видно что все хорошо), выполняем на сервера:
-
$ curl -I http://127.0.0.1:3000
-
HTTP/1.1 200 OK
-
Connection: close
-
Date: Wed, 21 Jan 2009 09:07:42 GMT
-
Set-Cookie: _rails_demo_session=BAh7BiIKZmxhc2hJQzonQWN0aW9uQ29udHJvbGxlcjo6Rmxhc2g6OkZsYXNoSGFzaHsABjoKQHVzZWR7AA%3D%3D–b005599b2682d41b58913b29b3a6d90b9df0a6a1; path=/; HttpOnly
-
Status: 200 OK
-
ETag: "9e83fd09513c147745f5eb696352e9e7"
-
X-Runtime: 30ms
-
Content-Type: text/html; charset=UTF-8
-
Content-Length: 1392
-
Server: Mongrel 1.1.5
-
Cache-Control: private, max-age=0, must-revalidate
И в заключение
Ваш сервер готов. Что бы обновить приложение на сервере, обновите хранилище (например Subversion) и выполнить команду cap deploy:update на локальной компьютере, что и произведет повторное развертывание. Если по каким то причинам нужно будет вернуться на шаг назад, к предыдущей версии приложения, можно использовать следующую команду – cap deploy:rollback. Так же можно управлять запуском, остановкой, а так же перегрузкой Mongrel через Capistrano. При каждом новом развертывании на сервере появляеться новая версия приложения, обновляться соответствующие ссылки и перезапускаются экземпляры Mongrel.
Все. Удачи!
Ну наконец-то более-менее приличный туториал на русском языке
буду советовать новичкам
2DEkart
Пожалуйста, по вопросам обращайтесь, будем их решать. Софтина очень понравилась, настраивал и запускал уже на многих машинах
Спасибо, действительно интересный материал. Добавлю в закладки, скоро разворачивать проект