Статьи

Развернуть рельсы с Capistrano 3

CapistranoLogo

Capistrano — это инструмент для автоматизации и развертывания удаленных серверов, написанный на Ruby. Это потрясающий инструмент, расширяющий возможности DSL для rake (ruby make), который можно использовать для развертывания любого веб-приложения.

В этой статье я буду развертывать приложение Rails на экземпляре Ubuntu EC2. Вы можете выполнить развертывание приложения на любой другой платформе PaaS, например Digital Ocean, с доступом по ssh.

Я использую экземпляр Ubuntu для развертывания, и я предполагаю, что у вас уже есть работающее приложение для удаленного развертывания.

Шаг 1: Настройка сервера

Сначала вам нужно создать экземпляр EC2 из консоли Amazon AWS, вставить в него ssh и установить необходимые пакеты (база данных, веб-сервер и т. Д.) Для запуска вашего веб-приложения. Вам нужно будет обновить настройки брандмауэра в EC2 и в Google App Engine, иначе ваше приложение не будет доступно из внешнего мира. Другое дело, чтобы ваш домен указывал на экземпляр, который вы создали, используя инструменты DNS, предоставленные вашим регистратором доменов.

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

$ ssh -i <path-to-pem-file> ubuntu@<ec2-instance-address>
$ wget "https://gist.githubusercontent.com/42races/8d2c597d10dc9a0bddb0/raw/cbc4373b27dc09d2fc88a660ef1ad1b4c246c0e4/server_setup.sh"
$ chmod +x server_setup.sh
$ ./server_setup.sh

Этот сценарий установит необходимые пакеты, создаст пользователя deploy

Я использую nginx для этого приложения со следующей конфигурацией. Поместите свою конфигурацию в файл (например, foobar.conf) и скопируйте его в каталог / etc / nginx / sites-available . Я буду использовать «foobar» в качестве имени приложения и «foobar.com» в качестве адреса домена приложения.

 upstream foobar {
  # uncomment the following line if multiple application servers are used.
  # this will force nginx to send requests from the same client to the same
  # application server.
  # ip_hash;
  server unix:///home/deploy/apps/foobar/shared/tmp/sockets/puma.sock fail_timeout=0;
}

server {
  listen 80 default deferred;
  server_name foobar.com;
  root /home/deploy/apps/foobar/current/public;

  location ^~ /assets/ {
    # gzip_static on;
    expires max;
    add_header Cache-Control public;
  }

  try_files $uri/index.html $uri @foobar;
  location @foobar {
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_set_header Host $http_host;
    proxy_redirect off;
    proxy_pass http://foobar;
  }

  error_page 500 502 503 504 /500.html;
  client_max_body_size 4G;
  keepalive_timeout 10;
}

Шаг 2: Установите Capistrano

Перейдите в приложение Rails и добавьте следующую строку в Gemfile.

 group :developemnt do
  gem 'capistrano', '~> 3.1.0'
end

Запустите команду bundle

 $ bundle

проверьте версию установленного capistrano следующим образом

 $ bundle exec cap -V

Capistrano Version: 3.1.0 (Rake Version: 10.2.2) ###

Capistrano поставляется с набором задач по умолчанию, которые вы можете перечислить с помощью следующей команды.

 $ bundle exec cap -vT

Шаг 3: Инициализировать Capistrano

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

 $ bundle exec cap install

Приведенная выше команда создает несколько файлов в каталоге вашего приложения.

 Capfile
config/deploy.rb
config/deploy/production.rb
config/deploy/staging.rb
lib/capistrano/tasks          # directory

Как видите, он сгенерировал другой файл конфигурации для производственных и промежуточных сред. Начиная с версии 3, capistrano по умолчанию является многоэтапным. Существует глобальный файл конфигурации с именем config / deploy.rb, в котором вы можете поместить конфигурационные сообщения во все среды.

Шаг 4: Редактировать Capfile

Откройте Capfile в вашем любимом редакторе и добавьте / раскомментируйте следующие строки

 require 'capistrano/setup'
require 'capistrano/deploy'

Capistrano был перестроен для использования плагинов. В нашем случае мы можем использовать плагины bundler, rvm и rails. Плагины упакованы как гемы, поэтому мы можем добавить их в Gemfile и требовать его в Capfile . Вот список официальных плагинов .

Нам нужен сервер приложений для запуска нашего приложения, и я собираюсь использовать Puma .

Добавьте это в Gemfile :

 group :development do
  gem 'capistrano', '~> 3.1.0'
  # cap tasks to manage puma application server
  gem 'capistrano-puma', require: false
  gem 'capistrano-rails',   '~> 1.1', require: false
  gem 'capistrano-bundler', '~> 1.1', require: false
  gem 'capistrano-rvm',   '~> 0.1', require: false
end

И bundle В Capfile добавьте следующие строки:

 require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/puma'
require 'capistrano/rails/assets' # for asset handling add
require 'capistrano/rails/migrations' # for running migrations

Шаг 5: Глобальная настройка

Теперь откройте config / deploy.rb в вашем любимом редакторе, чтобы установить различные параметры, такие как имя приложения:

 set :application, 'foobar'                       # application name
set :repo_url, '[email protected]:me/foobar.git'   # your repo url
set :deploy_to, '/home/deploy/apps/foobar'

Установите контроль версий, который вы используете:

 set :scm, :git

Ветвь, которую вы хотите развернуть:

 set :branch, 'master'

Количество копий релиза, который вы хотите сохранить

 set :keep_releases, 5

Можно запросить у пользователя ответы на некоторые из этих вопросов. Например, если вы хотите динамически установить имя ветви git, сделайте это:

 ask :branch, proc { `git rev-parse --abbrev-ref HEAD`.chomp }

Некоторые другие варианты форматирования вывода:

 set :format, :pretty
set :log_level, :debug
set :pty, true

Целесообразно настроить связанные каталоги, чтобы избежать перезаписи их при каждом развертывании:

 set :linked_dirs, %w{bin log tmp/pids tmp/cache tmp/sockets vendor/bundle public/system}

Шаг 6: Конфигурация среды

Откройте файл, соответствующий выбранной среде развертывания. Итак, если мы развертываем в производство, откройте файл config / deploy / production.rb и установите параметры конфигурации. Если файл среды недоступен, просто создайте файл.

 set :stage, :production

role :app, %w{deploy@<vps_ip_address>}
role :web, %w{deploy@<vps_ip_address>}
role :db,  %w{deploy@<vps_ip_address>}

Шаг 8: Настройки Puma

Некоторые плагины требуют собственной настройки, и Puma является одним из них. Добавьте следующие строки в config / deploy.rb

 set :puma_rackup, -> { File.join(current_path, 'config.ru') }
set :puma_state, "#{shared_path}/tmp/pids/puma.state"
set :puma_pid, "#{shared_path}/tmp/pids/puma.pid"
set :puma_bind, "unix://#{shared_path}/tmp/sockets/puma.sock"
set :puma_conf, "#{shared_path}/puma.rb"
set :puma_access_log, "#{shared_path}/log/puma_error.log"
set :puma_error_log, "#{shared_path}/log/puma_access.log"
set :puma_role, :app
set :puma_env, fetch(:rack_env, fetch(:rails_env, 'production'))
set :puma_threads, [0, 16]
set :puma_workers, 0
set :puma_init_active_record, true
set :puma_preload_app, true

Шаг 8: Развертывание

Чтобы развернуть приложение, просто запустите задачу deploy

 $ bundle exec cap production deploy

Обратите внимание, что вы должны указать среду в каждой команде cap

После завершения развертывания посетите «foobar.com» (или как вы его называли) в своем браузере.

Обновление до Capistrano 3

Обновление приложения Rails для использования capistrano 3 очень просто. Первым шагом является резервное копирование ваших старых файлов конфигурации capistrano:

 Capfile
config/deploy.rb

Если у вас есть несколько этапов для вашего приложения, сделайте резервную копию их также.

Теперь удалите старый драгоценный камень capistrano из Gemfile вместе со всеми связанными плагинами. На этом этапе просто выполните ранее упомянутые шаги в этой статье. Легко.

Я надеюсь, что этот пост поможет вам попасть на Capistrano 3.