Развертывание приложения Ruby on Rails при помощи Mina

Mina – это инструмент для развертывания приложений, позволяющий разрабатывать и запускать скрипты для управления развертыванием через SSH. В отличие от Capistrano и Vlad, Mina создает одну SSH-сессию для каждого развертывания. Инструмент Mina разработан в Rake, а это значит, что он не использует YAML-файлы: все написано в Ruby, потому все конфигурационные файлы являются простыми файлами Rake. Mina позволяет развернуть любой проект, развёртываемый через SSH.

Примечание: строки, которые выделены красным, пользователь должен отредактировать или ввести самостоятельно.

1: Установка Mina

Если в системе установлен Ruby, то mina можно установить как gem при помощи RubyGems из командной строки:

gem install mina

Или же можно внести mina в конец файла Gemfile текущего приложения rails:

nano Gemfile
gem 'mina'

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

2: Создание и редактирование deploy.rb

Файл deploy.rb – это Rakefile, в котором хранятся настройки сервера и определяются задачи, которые в дальнейшем запускаются при помощи mina.

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

  • queue – очень полезная команда, которая позволяет создавать очередь команд bash для запуска на удаленном сервере.
  • invoke – это вспомогательная команда, при помощи которой можно вызвать одну задачу из другой.

Предположим, deploy.rb содержит следующее:

set  :domain,  'myserver.com'
set  :user,  'myuser'
task :down do
invoke :restart
invoke :logs
end
task :restart do
queue 'sudo service nginx restart'
end
task :logs do
queue 'tail -f /var/log/nginx/error.log'
end

Если запустить команду mina restart в терминале, mina будет искать задачу по имени restart и запустит запланированные задачи на удаленном сервере, который указан в строке «set  :domain», через SSH. То есть, в данном случае mina перезапустит сервер nginx на удаленном сервере myserver.com.

То же самое происходит и с задачей logs: mina удаленно вызывает команду queue (tail -f /var/log/nginx/error.log) при помощи ssh myuser@myserver.com.
Итак, теперь создайте файл deploy.rb. Для этого запустите mina init в папке приложения rails:

mina init

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

nano config/deploy.rb

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

В начале файла нужно указать bundler, rails и git. При использовании rbenv или rvm раскомментируйте соответствующую строку (4 или 5).

require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rbenv'
# require 'mina/rvm'

Строки 13-16 – это параметры домена, путей к развернутой папке, репозиторию и веткам.

# set :rails_env, 'production'
set :domain, 'myserver.com'
set :deploy_to, '/home/myuser/myserver.com'
set :repository, 'https://github.com/my-git-user/my-repo.git'
set :branch, 'master'

:rails_env задает среду, используемую для развертывания. :domain – это имя хоста или ip, к которому нужно создать SSH-подключение. :deploy_to – это путь к развертыванию, здесь можно указать любую папку сервера, на которую есть соответствующие права.

chown -R user-name /var/www/mydir

:repository – это Git-репозиторий, который нужно клонировать. Тут можно использовать клонированный URL HTTP или SSH, но для URL-а SSH на сервере нужно иметь закрытый ключ (что не рекомендуется) или же использовать некоторые уловки mina. Все, что нужно сделать – внести set :ssh_options, ‘-A’ и указать имя пользователя и порт.

set :user, 'myuser'
# set :port, '22'
set :ssh_options, '-A'

Затем нужно указать хост и активировать forwardagent в ~/.ssh/config.

nano ~/.ssh/config

Поместите в файл следующую строку, заменив myserver.com своим именем хоста или ip-адресом.

Host myserver.com
ForwardAgent yes

Первая команда установит имя пользователя, к которому нужно создать SSH-подключение. Если для SSH используется нестандартный порт, раскомментируйте вторую строку. Третья строка внесет флаг -A в команду ssh, что активирует переадресацию соединения агента аутентификации. Последняя команда говорит SSH использовать закрытый ключ, используемый для входа на сервер, чтобы клонировать репозиторий.

В задаче environment нужно раскомментировать среду, которую нужно использовать. Если ruby был установлен через rbenv, раскомментируйте строку 32; если для установки использовался rvm, раскомментируйте строку 35:

task :environment do
invoke :'rbenv:load'
# invoke :'rvm:use[ruby-1.9.3-p125@default]'
end

Примечание: при использовании rvm поместите версию ruby в квадратные скобки. Узнать версию ruby можно при помощи команды

ruby -v

В задаче :setup mina создаст несколько папок и файлов, используя указанный в deploy_to путь, а затем изменит права на эти папки и файлы. Для начала удобнее будет использовать стандартную структуру папок.

В конце файла находится задача :deploy. При запуске mina deploy будут выполнены все команды invoke. По умолчанию mina клонирует репозиторий, развернет shared_paths, запустит bundle install, чтобы установить все необходимые gem-ы, мигрирует БД и предварительно скомпилирует ресурсы.

task :deploy => :environment do
deploy do
invoke :'git:clone'
invoke :'deploy:link_shared_paths'
invoke :'bundle:install'
#invoke :'rails:db_migrate'
#invoke :'rails:assets_precompile'
to :launch do
queue "touch #{deploy_to}/tmp/restart.txt"
end
end
end

При использовании MySQL раскомментируйте #invoke :’rails:db_migrate’.

3: Развертывание приложения

Чтобы создать структуру папок, заданную в файле deploy.rb, выполните:

mina setup --verbose

Команда verbose продемонстрирует, что происходит на данном этапе, и если что-то пойдет не так, причина ошибки будет сразу видна.

Это не должно занять более 3 секунд. Чтобы развернуть приложение, запустите:

mina deploy --trace

Команда trace отобразит обратную трассировку в случае ошибки.

4: Пример развертывания (опционально)

Создайте приложение rails:

rails new mynewapp

Измените директорию и добавьте mina в Gemfile:

cd mynewapp && nano Gemfile

Прежде чем приступить к созданию deploy.rb, добавьте приложение rails на Github:

git init
git remote add origin git@github.com:username/mynewapp.git
git add .
git commit -a -m 'start a new rails application'
git push origin master

Создайте deploy.rb, поместив в него требуемые конфигурации:

nano config/deploy.rb

Вот пример кода, который может находиться в deploy.rb:

require 'mina/bundler'
require 'mina/rails'
require 'mina/git'
require 'mina/rbenv'
set :rails_env, 'production'
set :domain,     'ip_adress'
set :deploy_to,  "/home/username/app/#{rails_env}"
set :app_path,   "#{deploy_to}/#{current_path}"
set :repository, 'https://github.com/username/mynewapp.git'
set :branch,     'master'
task :environment do
invoke :'rbenv:load'
end
task deploy: :environment do
deploy do
invoke :'git:clone'
invoke :'bundle:install'
end
end

Примечание: в данном коде вместо ssh используется https. Кроме того, это всего лишь довольно простой пример файла, потому не бойтесь добавить в него больше задач.

Запустите mina setup, чтобы создать все папки, а затем mina deploy, чтобы развернуть приложение rails.

Чтобы просмотреть результаты, войдите на сервер и проверьте папку /home/username/app/production/current.

Чтобы протестировать приложение rails, запустите в этой папке bundle exec rails server, а затем перейдите на ip_adress:3000.

Tags: , , , , , ,

Добавить комментарий