Развертываем свой сайт на Heroku

Здравствуй, Хабрахабр! Недавно у меня возникла необходимость развернуть свое Rails web-приложение на Heroku и я, к своему удивлению, не нашел почти ничего об этом на просторах не только Хабра, но и рунета в целом, поэтому я решил поделиться с вами своим опытом. Подробности о том, что и как я делал находятся под катом!




Сегодня я расскажу о том, как быстро и легко задеплоить свое приложение на Heroku. Если статья вызовет интерес я напишу продолжение о том, как быстро и удобно «перевести» приложение на свой домен и несколько советов о самом приложении, связанных с этим.



Развертывание приложения на Heroku


Регистрация

Первым делом вам будет необходимо зарегистрироваться на Hreoku. После того, как вы подтвердите свой e-mail нужно будет заполнить еще немного данных в своем профиле. В общем, ничего сложного, ничего необычного.

Вход в свой профиль и инициализация git-репозитория

Установка Heroku Toolbelt

Первым делом необходимо установить ПО для командной строки от Heroku на свой компьютер, если вы еще этого не сделали. Для Ubuntu и Debian процесс установки заключается в выполнении следующей команды:

user@host:~/rails/myapp$ wget -qO- https://toolbelt.heroku.com/install-ubuntu.sh | sh


Для остальных дистрибутивов Linux — этой:

user@host:~/rails/myapp$ wget -qO- https://toolbelt.heroku.com/install.sh | sh


Честно говоря, я не знаю отличаются ли эти скрипты чем-либо. Пользователи же Windows и OS X могут скачать установочные файлы здесь.

Вход в профиль с командной строки

После того, как весь необходимый инструментарий установлен, вам необходимо залогиниться в Heroku с командной строки:

user@host:~/rails/myapp$ heroku login

Enter your Heroku credentials.
Email: user@example.com
Password:
Could not find an existing public key.
Would you like to generate one? [Yn]
Generating new SSH public key.
Uploading ssh public key /home/user/.ssh/id_rsa.pub

Если вы еще не генерировали открытый ключ для SSH то вам будет предложено это сделать.

Инициализация git-репозитория

Если вы не используете систему контроля версий или используете, но отличную от git то вам придется создать локальный git-репозиторий на своем рабочем компьютере т.к. Heroku поддерживает только эту систему контроля версий. Все очень просто:

user@host:~/rails/myapp$ git init && git commit -am "init"


Некоторые специфические моменты

Чтобы ваше web-приложение корректно работало необходимо добавить rails_12factor в ваш Gemfile (если вы использует Rails 4) и там же указать версию ruby (для всех версий Rails):

gem "rails_12factor", group: :production

#
# Другие ваши gem-ы
#

# Версию Ruby следует указывать в конце файла
ruby "2.1.2"


Обратите внимание, вы должны использовать эту же версию Ruby и у себя.

Если вы используете web-сервер отличный от WEBrick (Thin в моем случае), что, кстати, рекомендуется самим сервисом Heroku, то вам необходимо будет создать так же Procfile приблизительно следующего содержания:
web: bundle exec thin start -p $PORT


Последние штрихи

Наша работа по запуску web-приложения практически подошла к концу, остались последние штрихи. Далее будет предполагаться что вы используете PostgreSQL в качестве СУБД. Если вы используете MySQL — немного ниже я рассказал о том, как подружить эту СУБД с Heroku. Итак, создадим приложение в Heroku:

user@host:~/rails/myapp$ heroku create myapp

Creating myapp... done, stack is cedar
http://myapp.herokuapp.com/ | git@heroku.com:myapp.git
Git remote heroku added


Вообще говоря, вы можете и не указывать имя приложения при создании, тогда Heroku сама выдумает вам что-то вроде deep-sea-69.
Теперь ваше приложение доступно по адресу myapp.herokuapp.com, но там пока ничего нет. Чтобы это исправить необходимо запушить ваше приложение на сервер Heroku:

user@host:~/rails/myapp$ git push heroku master


Возможно вам понадобится сделать asset precompile чтобы все работало нормально (лично мне пришлось, если кто-то подскажет как заставить Heroku делать все в автоматическом режиме — буду благодарен):

user@host:~/rails/myapp$ rake assets:precompile RAILS_ENV=production


После этого выполните все миграции…

user@host:~/rails/myapp$ heroku run rake db:migrate


…и можете посмотреть что же у вас получилось:

user@host:~/rails/myapp$ heroku open



Дружим Heroku и MySQL

Так сложилось, что для Rails более традиционной является PostgreSQL, эта СУБД является так же «родной» для Heroku. Но может так произойти, что вы используете другую популярную СУБД — MySQL. Тогда для корректной работы вашего приложения необходимо совершить еще несколько телодвижений. Не бойтесь, они достаточно просты!

Для достижения цели мы будем использовать дополнение ClearDB. Установим его и получим данные о выделенной нам БД:

user@host:~/rails/myapp$ heroku addons:add cleardb:ignite
-----> Adding cleardb to sharp-mountain-4005... done, v18 (free)

user@host:~/rails/myapp$ heroku config | grep CLEARDB_DATABASE_URL
CLEARDB_DATABASE_URL => mysql://adffdadf2341:adf4234@us-cdbr-east.cleardb.com/heroku_db?reconnect=true


Далее просто установим полученный адрес в качестве DATABASE_URL в Heroku, при необходимости изменив протокол на mysql2:

user@host:~/rails/myapp$ heroku config:set DATABASE_URL='mysql2://adffdadf2341:adf4234@us-cdbr-east.cleardb.com/heroku_db?reconnect=true'


Вот и все! На этом мое повествования заканчивается. Это мой первый пост на хабре, так что я буду очень благодарен за любые замечания по стилю и оформлению и, конечно же, я буду рад ответить на ваши вопросы в комментариях!
Поделиться публикацией
Похожие публикации
Ой, у вас баннер убежал!

Ну. И что?
Реклама
Комментарии 11
  • +3
    У меня только один вопрос: зачем? Всё же уже давно расписано в рельсовых туториалах railstutorial.ru/chapters/4_0/beginning#sec-deploying
    • +3
      Не учите людей плохому. Ассеты отлично компилятся, УРЛ для БД не нужно устанавливать вручную, «Версию Ruby следует указывать в конце файла» – кто Вам такое сказал?

      Про rails_12factor могли рассказать подробнее, если понимаете, конечно, для чего он нужен. Ну и про foreman ни слова, хотя рассказываете про Procfile…
      • 0
        Если честно, информацию о том, что нужно указать URL для БД я взял из официальной документации ClearDB. По идее все-таки нужно, ведь иначе будет использоваться дефолтный PostgreeSQL.
        • 0
          Посыпаю пеплом и извиняюсь за дезу, мускуль на хероке не готовил, думал, что они без костылей реализовали подключение.
          • 0
            Если Вам нужна помощь с компиляцией ассетов – скиньте мне в личку лог происходящего при деплое. Но обычно всё решается опцией initialize_on_precompile.
            • 0
              Судя по ману на heroku опция initialize_on_precompile выпилена в rails 4 за ненадобностью. Так что там проблем уже не должно наблюдаться.
        • НЛО прилетело и опубликовало эту надпись здесь
          • –1
            Уважаемые специалисты, скажите пожалуйста, а какие плюшки дает Heruky в сравнение с классическим развертыванием на своих серверах?
            • 0
              «Heruky» — это вы имели в виду Heroku? Если да, то за что же вы его так обижаете?
              Вообще довольно странный вопрос. Heroku — это PaaS. Свой сервер — это голое железо в виде VPS и ему подобным. Разница между администрированием своей машины и развёртыванием приложения за пару минут без финансовых вложений должна всё прояснить.
              • 0
                > развёртыванием приложения за пару минут
                Звучит здорово. Я правильно понимаю, что я могу взять любой свой проект и за пару минут развернуть на Heroku? Последний мой проект работал на связке Apache2 + Nginx + ElasticSearch + MySQL + Redis + PHP + Java.
                1. Я смогу за пару минут развернуть и настроить все это счастье на Heroku?
                2. Я могу быть уверенным в том, что если понадобиться установить дополнительные приложения, на пример, для мониторинга стореджей, что я не упрусь в ограничения Heroku?
                3. Я могу быть уверенным в том, что Heroku предоставит мне возможность настроить Apache2 и Nginx так, чтоб они помогали, а не мешали друг другу?
                4. Вообще у меня много вопросов, касательно тонкостей настроки инструментов т.к. зачастую быстро установить — это не проблема. Проблема настроить так, чтоб инструмент выполнял поставленные задачи максимально эффективно. Но я думаю, что 3 вышеизложенных вопроса дадут мне общую картину.

                > без финансовых вложений
                Я бегло изучал их прайс и мне показалось, что их ценник значительно привосходит ценник обычного VPS-хостинга. Я куда-то не туда смотрел?
                • 0
                  Прайс у них действительно есть, альтруизмом никто не страдает. Другое дело, что есть возможность даром поднять веб-приложение на урезанном стеке технологий и со всяческими ограничениями по мощности и размерам приложения/БД/etc. Вот самый базовый пример. Поднял несколько лет назад ради обучающих целей, не заплатил ни копейки и крутится по сей день.
                  По поводу доступных веб-серверов, БД и прочих сходите непосредственно на Heroku. Там в личном кабинете узнаете всё, что нужно. Есть калькуляторы цен на любое сочетания ПО и железа и много много чего ещё. В комментариях бесполезно описывать то, что есть на офф.сайте.

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

            Самое читаемое