В этой статье мы настроим Capistrano в приложении Ruby on Rails. Затем мы развернем приложение в облаке, где в качестве операционной системы используется Ubuntu, независимо от вашего хостинг-провайдера. Вы можете использовать любой облачный сервис или даже локальный сервер для тестирования или повторения наших действий.
После развертывания приложения мы вкратце рассмотрим, как можно отслеживать развертывание приложения с помощью AppSignal.
Но сначала вы можете спросить: почему я должен использовать Capistrano?
- Почему стоит выбрать Capistrano для вашего приложения на Ruby on Rails?
- Добавление Capistrano в ваше приложение Ruby on Rails
- Конфигурация сервера с Capistrano для вашего Rails-приложения
- Добавление гема capistrano-rvm
- Настройка конфигурации сервера
- Установка гема capistrano-secrets-yml для вашего Rails-приложения
- Настройка Capistrano для выполнения миграции базы данных
- Начало развертывания вашего приложения Ruby on Rails
- Как интегрировать AppSignal с Capistrano и вашим Rails-приложением
- Подведение итогов и следующие шаги
Почему стоит выбрать Capistrano для вашего приложения на Ruby on Rails?
Вы можете задаться вопросом, имеет ли смысл продолжать использовать Capistrano для развертывания в наши дни. Сейчас у нас есть множество инструментов и сервисов для развертывания и непрерывной интеграции.
Но чтобы ответить на этот вопрос, нам нужно вернуться к истокам Capistrano и его эволюции до сегодняшнего дня. Первый тег, созданный в репозитории Capistrano, появился в 2006 году. Его целью было позволить выполнять команды удаленно через SSH параллельно на нескольких машинах, используя DSL. С тех пор Capistrano развивался, добавляя несколько функций в каждую версию.
В настоящее время, спустя 16 лет, Capistrano находится в версии 3, продолжает активно развиваться и теперь известен как фреймворк для создания сценариев автоматического развертывания.
Таким образом, это уже не просто инструмент для выполнения команд на удаленных машинах. В дополнение к возможностям Capistrano, многие плагины и другие драгоценные камни специально работают с Capistrano.
Благодаря этому, а также тому, что большое сообщество до сих пор использует Capistrano, он остается отличным инструментом для автоматического развертывания.
Добавление Capistrano в ваше приложение Ruby on Rails
Сначала вам нужно настроить приложение Ruby on Rails, чтобы интегрировать его с Capistrano. Вы можете следовать документации Capistrano. Однако в ней содержится больше информации, чем вам нужно в рамках данной статьи. Поэтому для простоты эта статья включает только необходимые шаги и конфигурацию, которые вам понадобятся.
Чтобы начать настройку, добавьте гем Capistrano в раздел разработки вашего Gemfile:
group :development do
# Deployment
gem "capistrano", "~> 3.10", require: false
gem "capistrano-rails", "~> 1.3", require: false
end
Гем capistrano-rails нужен для запуска миграции вашей базы данных и работы с активами, которые мы увидим в следующих разделах.
Теперь запустите bundle install
, чтобы добавить Capistrano в ваше приложение:
bundle install
Затем вы можете установить Capistrano:
bundle exec cap install
Эта команда создаст файл под названием Capfile
, который импортирует и конфигурирует необходимые библиотеки. Кроме того, файл под названием deploy.rb
(созданный внутри папки config
) будет содержать все конфигурации, которые должны быть включены в развертывание с Capistrano.
Примечание: Capistrano создает файл, переопределяющий конфигурацию deploy.rb
как для staging, так и для production окружения, но это не будет рассматриваться в данной статье.
После этого вы готовы приступить к настройке и взаимодействию между вашим приложением Ruby on Rails и сервером.
Конфигурация сервера с Capistrano для вашего Rails-приложения
В этом шаге мы добавим инструкции в файл конфигурации Capistrano. Эти инструкции будут сообщать вашему серверу, на котором будет развернуто ваше приложение. Здесь мы определим информацию о доступе и конфигурацию безопасности.
Чтобы убедиться, что в вашей производственной среде используется та же версия Ruby, что и в разработке, используйте менеджер версий Ruby, такой как RVM или rbenv (Capistrano поддерживает оба).
В этой статье мы будем использовать RVM. Убедитесь, что RVM установлен на вашей машине разработки и на рабочем сервере. Также проверьте, одинакова ли версия Ruby в вашем окружении и проекте.
Добавление гема capistrano-rvm
Проект Capistrano предоставляет гем под названием capistrano-gem, который позволяет вам легко настроить RVM. Чтобы включить его в свой проект, добавьте его в Gemfile вашей группы разработчиков и снова запустите bundle install
.
gem "capistrano-rvm"
Обновите ваш Capfile с помощью импорта capistrano-rvm:
# Capfile
require 'capistrano/rvm'
В файл deploy добавьте конфигурацию для установки версии Ruby и пути к RVM (особенно если вы использовали другой путь для установки RVM).
Если версия Ruby не определена, Capistrano выбирает последнюю версию, установленную на сервере, где будет развернуто ваше приложение.
# config/deploy.rb
set :rvm_ruby_version, "ruby-2.6.3"
set :default_env, { rvm_bin_path: "~/.rvm/bin" }
Capistrano::RVM имеет и другие настройки для RVM, но приведенные здесь — это то, что вам понадобится для начала работы.
Настройка конфигурации сервера
Хорошей практикой является определение пользователя для развертывания. Не забудьте выполнить эти шаги на своем сервере перед началом развертывания:
- Добавьте открытый ключ, сгенерированный на вашей локальной машине, в файл
~/home/YOUR_USER/.ssh/authorized_keys
. - Создайте ключ и включите открытый ключ в репозиторий кода. Это даст вам доступ к клонированию вашего проекта на рабочем сервере. Если вы используете GitHub, вы можете следовать этой документации.
- Установите разрешения на запись в каталог
/var/www/
.
Вы можете настроить Capistrano для любой среды, которая вам необходима. Вам просто нужно создать новый файл конфигурации внутри config/deploy/<имя_среды>.rb
, затем настроить IP или DNS, а также имя пользователя для подключения к вашему серверу.
# config/deploy/production.rb
server "11.22.333.444", user: "ubuntu", roles: %w{app db web}
Чтобы завершить настройку развертывания, включите информацию о вашем приложении, такую как имя приложения и URL репозитория кода. Любая информация, одинаковая для всех сред, должна быть добавлена в config/deploy.rb
. Сохраняйте конкретные конфигурации среды в config/deploy/<имя_среды>.rb
.
# config/deploy.rb
set :application, "ruby_rails_app"
set :repo_url, "git@github.com:username/ruby_rails_app.git"
Установка гема capistrano-secrets-yml
для вашего Rails-приложения
Вам также необходимо установить гем capistrano-secrets-yml.
Добавьте гем в свой Gemfile и запустите пакет для установки:
# Gemfile
gem "capistrano-secrets-yml"
Импортируйте его в Capfile:
# Capfile
require "capistrano/secrets_yml"
Затем создайте config/secret.yml
в вашем приложении и включите базу секретных ключей в качестве переменной окружения. Эта переменная будет создана на вашем рабочем сервере. Не забудьте не фиксировать этот файл в репозитории.
# config/secrets.yml
production:
secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
Внутри папки вашего приложения в терминале выполните эту команду для генерации базы секретных ключей:
$ rails secret
Скопируйте сгенерированный ключ и используйте его для установки SECRET_KEY_BASE на рабочем сервере. Зайдите на свой рабочий сервер и экспортируйте переменную SECRET_KEY_BASE в финальный файл ~/.bashrc
, чтобы она всегда была доступна:
# ~/.bashrc
export SECRET_KEY_BASE="YOUR_SECRET_KEY_BASE"
Запустите исходный текст, чтобы он был мгновенно доступен в вашем окружении:
$ source ~/.bashrc
Теперь, вернувшись на свою машину, зайдите в папку приложения в терминале и выполните приведенную ниже команду Capistrano для создания config/secrets.yml
на рабочем сервере:
$ cap production setup
Все готово! Теперь пришло время настроить Capistrano для выполнения миграции.
Настройка Capistrano для выполнения миграции базы данных
Теперь пришло время настроить Capistrano для выполнения команд, связанных с базой данных.
Гем capistrano-rails, уже включенный в ваш Gemfile, может быть настроен на выполнение миграции при каждом развертывании. Нам просто нужно импортировать его в Capfile:
# Capfile
require "capistrano/rails/migrations"
Но если вы хотите запускать семплы при развертывании, вам нужно создать новую задачу для запуска после миграции:
# config/deploy.rb
namespace :deploy do
desc "Run seed"
task :seed do
on roles(:all) do
within current_path do
execute :bundle, :exec, 'rails', 'db:seed', 'RAILS_ENV=production'
end
end
end
after :migrating, :seed
end
После этого ваше приложение наконец-то готово к развертыванию!
Начало развертывания вашего приложения Ruby on Rails
Давайте посмотрим, как выполнить развертывание с нашей локальной машины, напрямую обновив наш сервер до новой версии нашего приложения.
Когда вы выполните команду развертывания, Capistrano подключится к вашему серверу. Оттуда Capistrano попытается клонировать код из репозитория, определенного в конфигурационном файле (config/deploy.rb
). Затем будут выполняться другие задачи, следуя потоку развертывания.
Команда Capistrano deploy:check
проверяет, что конфигурация Git в порядке и что Capistrano имеет правильный доступ к каталогам, которые будут использоваться в развертывании.
Чтобы использовать ее, передайте окружение. В данном случае мы используем production:
$ cap production deploy:check
Если с конфигурацией все в порядке, вы можете начать развертывание в production:
$ cap production deploy
Кроме того, вы можете проверить все доступные задачи в Capistrano с помощью команды:
$ cap --tasks
Теперь, на последнем этапе, давайте интегрируем наше Ruby on Rails приложение с AppSignal и начнем его мониторинг.
Как интегрировать AppSignal с Capistrano и вашим Rails-приложением
AppSignal — это инструмент мониторинга, поэтому вы можете задаться вопросом, почему он включен в эту статью. Это правильный вопрос, поскольку мониторинг не имеет прямого отношения к развертыванию.
Тем не менее, AppSignal является ценным инструментом, когда речь идет о мониторинге вашего приложения Ruby on Rails и отслеживании развертываний в каждой среде. Итак, давайте посмотрим, как мы можем настроить AppSignal для вашего приложения.
Вам понадобится учетная запись AppSignal, которую вы можете создать на странице регистрации AppSignal. Выберите Ruby в качестве языка и выполните шаги по установке AppSignal в ваше приложение.
После установки будет создан файл для настройки AppSignal. Здесь важно определить ревизию — информацию, которая будет проверяться после развертывания, чтобы узнать, была ли развернута новая версия приложения. В данном случае мы будем использовать журнал Git в качестве информации о ревизии, чтобы гарантировать, что каждое новое развертывание кода будет уведомлять AppSignal.
# config/appsignal.yml
production:
<<: *defaults
active: true
revision: "<%= `git log --pretty=format:'%h' -n 1` %>"
Также хорошей практикой является экспорт переменных окружения AppSignal на ваш рабочий сервер (особенно ключа API, чтобы не хранить его в конфигурационном файле AppSignal).
export APPSIGNAL_PUSH_API_KEY=XXX
И теперь мы можем повторно запустить развертывание. Если все настроено правильно, в конце развертывания вы увидите сообщение, подобное этому:
Notifying AppSignal of deploy with: revision: ee5e626fd31613ef068873f9cddb5f8c91538396, user: monteirobrena
AppSignal has been notified of this deploy!
Теперь вы сможете увидеть ваше приложение в AppSignal! 🎉
И информацию о всех развертываниях:
Посетите страницу документации AppSignal по развертыванию, чтобы узнать больше об интеграции развертывания и других возможностях, доступных для приложений Ruby on Rails.
Подведение итогов и следующие шаги
В этом посте мы рассмотрели, как использовать Capistrano для развертывания приложения Ruby on Rails. Сначала мы добавили Capistrano в приложение, затем настроили и развернули его, после чего настроили мониторинг с помощью AppSignal.
Если вы хотите исследовать дальше, вы можете настроить Capistrano на запуск из интеграции, подключенной к конвейеру вашего хранилища. Такие инструменты, как Bitbucket, GitHub и GitLab, предоставляют настройки для управления этим процессом и могут использоваться совместно с Capistrano.
Счастливого кодинга!
P.S. Если вы хотите читать посты Ruby Magic, как только они выходят из печати, подпишитесь на нашу рассылку Ruby Magic и не пропустите ни одного поста!