Самый простой deploy приложения на Ruby on Rails

в 16:28, , рубрики: capistrano, capistrano 3, deploy, deployment, nginx, ruby, ruby on rails, ruby on rails 4, unicorn, Веб-разработка, Настройка Linux
Самый простой deploy приложения на Ruby on Rails - 1

Полгода назад я написал пост Deploy приложения на RoR 4 с помощью Capistrano 3. Прошло время, я получил много положительных отзывов, но были и отрицательные. Из них можно было понять следующее:

  • Инструкция слишком сложная для новичка
  • Очень много всего приходится делать «руками»

Я подумал и написал gem 'capistrano3-ubuntu-server-config', который полностью настраивает Ваш «чистый» Ubuntu сервер. Всё, что Вам нужно сделать руками — создать нового пользователя и дать ему права visudo (причем давать ему права на passwordless sudo ему не надо). Он может:

  • Настроить SSH (Добавить настройки 'PermitRootLogin no', 'UseDNS no', 'AllowUsers username')
  • Создать и настроить swap (размер запрашивается)
  • Сделать
    sudo apt-get update

    и

    sudo apt-get upgrade

  • Установить из исходников и настроить как чистый Nginx, так и с модулем Pagespeed
  • Установить PostgreSQL из репозитория, затем создать суперпользователя БД (имя пользователя и пароль запрашиваются)
  • Установить из исходников и настроить Redis
  • Установить RVM с последней версией Ruby и gem'ами Rails, Bundler
  • Скопировать Ваш приватный ssh ключ (например для доступа к приватному git репозиторию) с локальной машины на сервер и добавить его в ~/.ssh/config
  • Установить imagemagick из репозитория (Необходим для Paperclip, постоянно его забываю ставить)
  • Установить любые дополнительные пакеты из репозитория (Запрашивает какие именно)

Можно запустить конфигурационный wizard, который узнает, что именно из вышеперечисленного необходимо сделать и заранее спросит все настройки, чтобы можно было потом пойти попить кофе, а можно запустить отдельные таски. Данный gem будет полезен не только Rails разработчикам, а всем, кто использует Capistrano для деплоя.

Эта статья раскроет следующие темы:

gem 'capistrano3-ubuntu-server-config'

Что умеет делать этот gem, я уже рассказал. Перейдем непосредственно к работе с ним. Представим, что у нас чистый веб-сервер на Ubuntu (я тестировал на Ubuntu 14.04). Нам необходимо самим выполнить всего лишь две простые вещи: создать нового пользователя с правами sudo и обеспечить беспарольный вход с Вашей локальной машины на сервер по SSH. Начнем с первого, на сервере, залогинившись под root выполняем:

adduser deployer 
echo "deployer ALL=(ALL) ALL" >> /etc/sudoers

Вместо deployer может быть любое имя пользователя. Непомешало бы еще поменять пароль пользователя root коммандой passwd.

Теперь обеспечим беспарольный вход с локальной машины на сервер по ssh. Для этого на локальной машине выполним (где depoyer — имя пользователя, 111.111.111.111 — адрес сервера):

ssh-copy-id deployer@111.111.111.111

На этом вся настройка сервера завершена. В идеальной ситуации, Вам больше не придется заходить по ssh на сервер. Для просмотра логов я рекомендую gem 'tail'.
Приступим к использованию моего gem'a. В Gemfile добавяляем:

group :development do 
    gem 'capistrano' 
    gem 'capistrano3-ubuntu-server-prepare' 
end

Выполняем bundle install, cap install, добавляем строчку

require 'capistrano3/ubuntu-server-prepare'

в Capfile.

Практически все готово к работе. За исключением одного: для настройки Nginx и Redis мой скрипт берет .conf файлы из папок config/production/nginx и config/production/redis. Чтобы быстро скопировать мои конфигурационный файлы в эти папки, просто выполните:

rake ubuntu_server_prepare:copy_config

Бонусом также получаете настроенный конфиг Unicorn. В папке nginx лежат два файла: nginx.conf и nginx_with_pagespeed.conf. Второй используется при выборе установки pagespeed в конфигураторе.

Внимание! мой конфигурационный файл Nginx и Unicorn! настроен на Rails приложение, которое находится в '/var/www/application/current'. Измените все пути в этих файлах или просто добавьте строчку

set :application, 'application'

в Ваш deploy.rb для деплоя в эту папку.

В 'config/deploy/production.rb' необходимо прописать Ваш сервер, а также проследить, чтобы в Capfile строчка

require 'capistrano/rvm'

была закомментирована.

Теперь приступаем к самому вкусному:

cap production ubuntu_server_prepare

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

Есть возможность запускать отдельные таски, например, выполнив

cap production ubuntu_server_prepare:nginx_conf

вы скопируете конфигурационный файл nginx.conf на сервер и перезагрузите nginx. Это удобно, чтобы быстро менять конфиг: поменяли что-то прямо в папке проекта и отправили на сервер одной командой.

gem 'capistrano3-git-push'

Маленький таск для Capistrano 3, выполняющий

git add -A
git commit -m "#{сообщение}"
git push

только в случае, если есть изменения. Если ввести «skip» в поле для запроса сообщения о коммите, то ничего не будет выполнено, что удобно, когда надо сделать deploy, но заливать в репозиторий изменения не надо.
Подключить проще простого. В Gemfile:

group :development do
	gem 'capistrano3-git-push'
end

В Capfile:

require 'capistrano3/git-push'

В deploy.rb:

before :deploy, 'git:push'
Моя текущая конфигурация Capistrano

Если вспомнить мою предыдущую статью, то мой deploy.rb был просто огромен. Теперь же моя конфигурация проста до безумия.

Gemfile

group :development do
	gem 'capistrano'
	gem 'capistrano-rails'
	gem 'capistrano-bundler'
	gem 'capistrano3-unicorn'
	gem 'capistrano-rvm'
	gem 'capistrano3-ubuntu-server-prepare'
	gem 'capistrano3-delayed-job'
end

group :production do
	gem 'unicorn'
end

Capfile

# Load DSL and set up stages
require 'capistrano/setup'
require 'capistrano/deploy'
require 'capistrano3/ubuntu-server-prepare'
require 'capistrano3/unicorn'
require 'capistrano3/git-push'
require 'capistrano/rvm'
require 'capistrano/bundler'
require 'capistrano/rails'

deploy.rb


set :application, 'application'
set :repo_url, "#{ВАШ_АДРЕС_РЕПО}"
set :unicorn_config_path, "#{current_path}/config/production/unicorn/unicorn.rb"
set :linked_dirs, fetch(:linked_dirs, []).push('bin', 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system') # Строчка есть по умолчанию в deploy.rb, ее просто надо откомментировать
namespace :deploy do
  task :setup do
    before "deploy:migrate", :create_db
    invoke :deploy
  end
  task :create_db do
    on roles(:all) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:create"
        end
      end
    end
  end
  task :restart do
    invoke 'unicorn:legacy_restart'
  end
end
before :deploy, 'git:push'
before 'deploy:setup', 'git:push'

То есть сначала надо выполнить все то, что я описывал в начале статьи, затем один раз выполнить

cap production deploy:setup

для создания базы данных. Все последующие разы выполняем

cap production deploy

Стоит наверное объяснить, что тут происходит.

Что тут происходит?

set :unicorn_config_path, "#{current_path}/config/production/unicorn/unicorn.rb"

Задает местоположения конфига unicorn для gem'а 'capistrano3-unicorn'.

set :linked_dirs, fetch(:linked_dirs, []).push('bin', 'log', 'tmp/pids', 'tmp/cache', 'tmp/sockets', 'vendor/bundle', 'public/system')

Создает симлинки на указанные папки из папки current в папку shared.

task :setup do
    before "deploy:migrate", :create_db
    invoke :deploy
  end

Вызывает таск :create_db, перед выполнением 'db:migrate' при первом деплое (deploy:setup).

task :create_db do
    on roles(:all) do
      within release_path do
        with rails_env: fetch(:rails_env) do
          execute :rake, "db:create"
        end
      end
    end
  end

Тот самый таск :create_db, который вызывает 'rake db:create' при первом деплое.

 task :restart do
    invoke 'unicorn:legacy_restart'
  end

перезапускаем unicorn при каждом деплое.

P.S. Если используете resque, стоит посмотреть на gem 'capistrano-resque', если используете delayedjob, стоит посмотреть на gem 'capistrano3-delayed-job'.

Автор: goooseman

Источник

* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js