найпростіший deploy програми на Ruby on Rails


Півроку тому я написав пост 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 'хвіст'.
Приступимо до використання мого 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/pid', '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/pid', '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'.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.