Самый простой 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 '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'.