Деплой Rails приложения на Heroku

(автор текста Александр Мастеров)

!!! Первым делом необходимо зарегистрироваться на heroku

!!! Ваше приложение должно находится под версионным контролем Git.

Редактируем Gemfile :

Это необходимо т.к. мы используем базу PostgreSQL , так же Unicorn
.
Гем rails_12factor heroku использует для работы со статическими ассетами, такими, как изображения или таблицы стилей.
Так же желательно указать точные версии используемых гемов и ruby.

Пример:

source 'http://rubygems.org'
ruby '2.1.2'

gem 'rails', '4.1.5'
gem 'bootstrap-sass', '3.2.0.1' 
gem 'pg', '0.15.1'

group :development do
  gem 'rspec-rails', '3.1.0'

end

group :test do

  gem 'selenium-webdriver', '2.43.0'
  gem 'capybara', '2.4.1'

end

gem 'sass-rails', '5.0.0'
gem 'uglifier', '2.5.3'
gem 'coffee-rails', '4.0.1'
gem 'jquery-rails', '3.1.2'
gem 'turbolinks', '2.3.0'
gem 'jbuilder', '2.1.3'
gem 'unicorn', '4.8.3'

group :doc do

  gem 'sdoc', '0.4.1', require: false

end

group :production do

  gem 'rails_12factor', '0.0.2'

end

Для установки запускаем bundle со специальным флагом:
$ bundle install --without production

Далее коммитим изменения:
$ git commit -a -m "Update Gemfile.lock for Heroku"

Настраиваем PostgreSQL

Установка:
$ sudo apt-get install postgresql
$ sudo apt-get install libpq-dev
$ sudo apt-get install postgresql-9.3-postgis-2.1 -f

Далее настроим юзера:
$ sudo -u postgres psql
ALTER USER postgres PASSWORD 'ВашПароль';

Создаем шаблон:
CREATE EXTENSION IF NOT EXISTS postgis WITH SCHEMA public;
CREATE EXTENSION IF NOT EXISTS postgis_topology WITH SCHEMA topology;

Ctrl+D для выхода

Далее вы можете начать новый проект сразу с базой pg применяя команду:
$ rails new MyApp –database=postgresql

Но наш проект уже создан, поэтому заходим в MyApp/Config/database.yml
проекта, заменяем наши development и test настройки на :

development:
adapter: postgresql
encoding: unicode
database:  название вашей базы для режима (my_app_development)
pool: 5
username: postgres
password: ВашПароль
host: localhost

test:
adapter: postgresql
encoding: unicode
database: название вашей базы для режима (my_app_test)
pool: 5
username: postgres
password: ВашПароль
host: localhost

ВашПароль - пароль который вы установили

Далее в терминале удаляем старую базу, создаем новую и делаем миграции:

$ bundle exec rake db:drop:all

$ bundle exec rake db:create:all

$ bundle exec rake db:migrate

Далее коммитим изменения:

$ git add .
$ git commit –a –m “Creating PostgreSQL DB”

Настраиваем Unicron

Unicron - HTTP сервер для приложений Rack, предназначенный только для быстрых клиентов с низкой задержкой, соединений с высокой пропускной способностью и пользуется преимуществами функций в / Unix-подобных ядер Unix. Медленные клиенты должны обслуживаться только путем размещения обратного прокси-сервера, наделенного полной буферизации как запроса, так и ответа между Unicronoм и медленным клиентом.

Используем стандартную конфигурацию, предлагаемую Heroku:

Создаем файл unicorn.rb в каталоге MyApp/Config

Заполняем :

#config/unicorn.rb

worker_processes Integer(ENV["WEB_CONCURRENCY"] || 3)
timeout 15
preload_app true

before_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn master intercepting TERM and sending myself QUIT instead'
    Process.kill 'QUIT', Process.pid
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.connection.disconnect!
end

after_fork do |server, worker|
  Signal.trap 'TERM' do
    puts 'Unicorn worker intercepting TERM and doing nothing. Wait for master to send QUIT'
  end

  defined?(ActiveRecord::Base) and
    ActiveRecord::Base.establish_connection
end

Далее коммитим изменения:

$ git add .
$ git commit –a –m “Creating Unicorn.rb”

Procfile

Procfile нужен для объяснения heroku, как запускать разные части вашей программы. Через него вы можете запускать различные процессы, для различных решений. Например тест на старте.

Синтаксис: <process>: <command>

Специальный процесс – Web
Heroku будет направлять HTTP запрос таким процессам.

Процесс - Worker
Нужен для запуска какого-либо процесса в фоновом режиме, контролируя его с помощью команды heroku pc.

Остальные процессы в можете называть, как хотите.

Создаем в директории проекта текстовый файл Procfile

Делаем так, что бы наш web процесс работал через unicron:

# Sample Procfile
web: bundle exec unicorn -p $PORT -c ./config/unicorn.rb

Коммитим изменения:

$ git add .
$ git commit –a –m “Creating Procfile”

Деплоим

1.)логинимся в heroku:

$ heroku login

2.)Далее создаем место для нашего проекта в heroku:

$ heroku create
Created http://boiling-taiga-6950.herokuapp.com/ | - boiling-taiga-6950 Имя нашего приложения на heroku
:boiling-taiga-6950.herokuapp.com
Git remote heroku added

3.)Далее отправляем наше приложение на heroku:

$ git push heroku master

Возможно потребуется локальная перекомпиляция ассетов:

# Это должно быть использовано только если вы не можете задеплоить на Heroku.
$ rake assets:precompile
$ git add .
$ git commit -m "Add precompiled assets for Heroku" 

4.)Если в программе используется база данных, то необходимо ее переместить вручную:

$ heroku run rake db:migrate

5.)Любуемся результатом:

$ heroku open

6.)Функционал heroku

$ git config --list | grep heroku - проверяет какой ремоут был дабавлен heroku в ваш проект
remote.heroku.url=:boiling-taiga-6950.git
remote.heroku.fetch=+refs/heads/*:refs/remotes/heroku/*

$ heroku ps:scale web=1 - убеждаемся, что один Dyno работает с процессом типа web
Dyno - легкий контейнер, который является основной единицей композиции на Heroku.

$ heroku ps - проверяем состояние всех Dyno приложения, команда показывает список работающих dyno

$ heroku logs - логи

$ heroku logs --tail - трансляция логов в терминале

Если у вас есть один dyno, после одно часа не активности он "уйдет спать",
что создаст задержку первого запроса пока он не "проснется".
Чтобы этого избежать, вы можете добавить более одного web Dyno командой:
$ heroku ps:scale web=2
(услуга платная, heroku предоставляет бесплатно только 750 бесплатных часов)

Прикрепляю примеры: unicron.rb, Procfile и Gemfile

Procfile (58 байта) Александр Дмитриев, 21.03.2015 01:15

Gemfile (676 байта) Александр Дмитриев, 21.03.2015 01:15

unicorn.rb Magnifier (601 байта) Александр Дмитриев, 21.03.2015 01:15

trans_app.tar.gz (651,239 КБ) Александр Дмитриев, 21.03.2015 01:15

Добавить изображение из буфера обмена (Максимальный размер: 20 МБ)