Деплой

Введение

Вы прочитали хороший обзор того, как ваш браузер будет взаимодействовать с вашим приложением, но как вы собираетесь разместить его (приложение) в сети? До этого момента вы делали все на своем компьютере, в локальном окружении, получая доступ к приложению в браузере по адресу http://localhost:3000 или как-то вроде этого. Это далеко от ощущения, которое испытываешь, видя свое приложение работающем в интернете, так что в этом уроке мы расскажем о том, как разместить ваше приложение в интернете при помощи сервиса Heroku. Деплой (процесс публикации приложения в интернете посредством размещения его на хостинге) поначалу может быть раздражающим и непонятным, поскольку возникающие ошибки может быть непросто отследить и исправить, но на StackOverflow уже опубликовано огромное количество вопросов (и ответов), которые помогут вам найти способ исправить возникшие ошибки.

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

Кратко о Heroku

Стоит сказать, что Heroku - далеко не единственное место, куда можно задеплоить приложение, но так получилось, что именно этот сервис является наиболее простым и удобным для новичка. Вы так же можете попробовать деплоить на EC2 (об этом рассказано в Startup Engineering course from Coursera).

Heroku очень хорош для новичков тем, что это бесплатная и "простая" система, которую можно охарактеризовать как "пушни-и-задеплой", Сама система Heroku базируется на EC2, но она позволит сохранить вам кучу нервов. Поэтому, когда вы будете готовы перейти на платный тарифный план, Heroku будет намного дороже, чем EC2. Просто помните, что Heroku вам пока будет более чем достаточно. Лучшее в этом сервисе то, что вы получаете бесплатный высококачественный хостинг для определенного количества своих приложений.

Экземпляры и траффик

Heroku предоставляет вам виртуальные "Dyno", которые запускают ваше приложение. Если говорить кратко, то один dyno значит один запущенный экземпляр вашего приложения. Это как если бы вы имели отдельный компьютер для своего приложения. Несколько dyno позволяют запускать несколько копий вашего приложения одновременно, что позволяет обслужить большее количество пользователей. Прелесть Rails в том, что вы можете запускать необходимое количество экземпляров вашего приложения, если получаете слишком много траффика и пользователям приходится подолгу ждать ответа от сервера.

Для большинства ваших приложений одного dyno будет более, чем достаточно. Вы сможете обслуживать большое количество пользователей, используя всего один dyno, и Heroku предоставляет вам первый бесплатно. К сожалению, если вы не будете посещать ваше приложение некоторое время, Heroku "усыпит" dyno, что, фактически, означает остановку работы вашего приложения. Они не хотят тратить ресурсы, поддерживая работу тысяч приложений, которые никто не посещает.

Это значит, что первый посетитель, который зайдет на ваш сайт за долгое время, будет вынужден ждать около 30-40 секунд, чтобы приложение "проснулось". Для этого есть несколько решений - вы можете заплатить за дополнительный dyno, который не будет усыпляться Heroku, или вы можете настроить какой-либо сервис таким образом, чтобы он время от времени обращался к вашему приложению и не давал ему уснуть (например, New Relic, смотрите ниже).

Heroku позволяет вам управлять вашим приложением из командной строки (используя набор команд из "Heroku Toolbelt") или через их сайт, воспользовавшись панелью управления. Большинство функций доступны в обоих случаях, что довольно удобно.

Домены и именование

Heroku даст вашему приложению случайное имя во время первого деплоя, что-то абстрактное, вроде "afternoon-falls-4209". Если вы захотите посетить приложение, вы можете либо ввести в командной строке $ heroku open, либо напрямую перейти по адресу http://afternoon-falls-4209.herokuapp.com. Вы можете изменить имя приложения на любое желаемое, например, "my-cool-app", и оно станет доступно по адресу http://my-cool-app.herokuapp.com.

Замечание: Если вы измените имя приложения на Heroku, вам, скорее всего, придется вручную обновить ваш удаленный адрес Git (Git remote), чтобы Git знал, куда отправлять ваше приложение, когда вы будете деплоить на Heroku.

Этот домен теперь всегда будет вашим на Heroku. Очевидно, что в реальном мире вам скорее всего захочется подключить к нему собственный домен, например http://my-cool-app.com. Вам потребуется приобрести такой домен у регистратора, например NameCheap или другого подобного. Попробуйте использовать сервис Domainr для подбора нового домена, он крутой.

Когда вы получите собственный домен, вам будет необходимо направить его на ваш поддомен на herokuapp.com, измегив соответствующие записи в CNAME. Куда будут вести адреса mail.yourapp.com, www.yourapp.com или calendar.yourapp.com? В записях CNAME, которые редактируются на сайте регистратора, можно определить, куда будут направляться входящие запросы. Эти настройки довольно просты в изменении, но требуют прошествия нескольких часов, чтобы вступить в силу.

Так же вам будет необходимо сообщить Heroku о том, что вы направляете на ваше приложение собственный домен. Прочтите Heroku Custom Domains Help File для более детальной инструкции.

Аддоны

Еще одной классной особенностью Heroku являются аддоны. Это приложения, разработанные сторонними разработчиками. Их можно удобно встроить в ваше собственное. Вы можете посмотреть установленные у вас аддоны, выполнив в терминале команду $ heroku addons или добавить новый, используя команду вроде такой: $ heroku addons:add newrelic:standard. Так же вы можете работать с ним и через веб-интерфейс. Эта статья рассказыват о том, как работать с аддонами.

Вот несколько самых полезных:

  1. New Relic - это приложение, которое мониторит и анализирует ваше приложение, так что вы в любой момент можете узнать его узкие места и будете уведомлены, если оно вдруг перестанет работать. У NewRelic есть бесплатный тарифный план, в котором доступна только аналитика, но они так же позволяют "пинговать" ваше приложение, что предотвратит его от "засыпания". Прочтите эту статью на Coderwall, в ней кратко описан процесс настройки NewRelic на пингование.
  2. PGBackups - этот аддон позволяет вам делать бэкапы вашей базы данных. Нет ничего хуже, чем терять данные, так что pgbackups сделает вашу жизнь намного проще. Бесплатный тариф позволит вам вручную скачивать бэкапы или настраивать rake-задачи, которые будут делать это за вас.
  3. SendGrid является почтовым сервисом, о котором мы подробнее поговорим позднее. Вы не сможете отправлять почту без помощи и это действительно очень сложный процесс. Этот аддон облегчает вам жизнь, делая большую часть работы за вас.
  4. Посетите Heroku Addons Center, чтобы узнать больше о доступных аддонах.

Обратите внимание, что вам, вероятно, придется ввести платежную информацию при установке аддонов (или, возможно, перед ней), поскольку они должны иметь возможность взимать плату, когда вы превышаете бесплатный лимит.

Деплой на Heroku

Если вы еще не деплоили на Heroku ранее, и это ваш первый раз, можете просто пролистать этот раздел. Он будет полезен в качестве справочника позднее.

Детали деплоя мы оставим Майклу Хартлу в проекте, но все же стоит вкратце рассказать о том, как это работает. Это не пошаговый гайд. Если вам нужно пошаговое руководство по деплою, обратитесь к руководству Heroku "Getting Started with Rails 4". Типичное условие для команд Heroku заключается в том, что перед выполнением команы обычно нужно писать еще $ heroku run или просто $ heroku, так что запуск миграций на Heroku будет выглядеть так: $ heroku run rake db:migrate, а запуск консоли так: $ heroku run console.

  • Скачайте и установите Heroku Toolbelt. Скорее всего, вам потребуется корректная настройка SSL, чтобы ваш компьютер мог безопасно перемещать файлы с Heroku и обратно.
  • Установите специальные гемы Heroku: в Rails 4 есть несколько изменений, которые могут нарушить работу Heroku, так что они сделали очень простой гем, который вам нужно добавить в ваше приложение.

  • Установите корректный гем базы данных - если вы использовали SQLite3 как базу данных для разработки, вам нужно будет установить PostgreSQL для продакшена, поскольку это единственная база данных, которую использует Heroku. Это значит, что вам необходимо добавить гем pg в Gemfile вашего приложения и правильно заполнить поля в файле database.yml.

  • Создайте новое приложение Heroku, используя команду $ heroku create. Это так же добавит новый удаленный сервер к вашим настройкам Git, так что он (Git) будет знать, куда отправлять ваше приложение (и вам не придется об этом беспокоиться).

  • Готовы? Пушните, используя команду $ git push heroku master.

  • Постойте, это еще не все! Последний шаг, который вам нужно сделать, заключается в том, чтобы вручную настроить базу данных. Каждый раз, когда вы запускаете миграции или как-то иначе изменяете вашу базу данных, помните о том, что вам нужно проделать то же самое на Heroku. Если это ваша первая база данных, вам, скорее всего, придется выполнить что-то вроде $ heroku run rake db:migrate. Если у вас есть заполненный файл seeds.rb, вы можете так же запустить и его, наполнив базу.

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

Никакой магии. Когда вы создаете новое приложение на Heroku, вы также актоматически устанавливаете удаленную точку 'heroku', которая ведет на ваше приложение. Когда вы выполняете $ git push heroku master, Git просто отправляет ваш код на Heroku.

Начиная с этого момента Heroku выполняет действия, более или менее похожие на то, что вы делаете на своем компьютере. Во-первых, берет загруженный вами код, определяет версию Ruby, которую вы установили для своего приложения, и запускает $ bundle install. Далее создает соединение с базой данных и затем запускает Asset Pipeline.

Мы подробнее поговорим об Asset Pipeline в одном из будущих уроков, так что не беспокойтесь, если вы еще не чувствуете себя комфортно при работе с этой частью Rails. Если вы... В девелопмент-среде Rails работает лишь с частью Asset Pipeline - он запускает все препроцессоры, но обслуживает файлы как css и js индивидуально (посмотрите в логи вашего локального сервера и увидите там кучу отдельных файлов). В продакшене Heroku завершит эту работу не только выполнением препроцессоров, но и сбором всех ваших файлов стилей и js в большие файлы (один большой css и один большой js соответственно) и наделением их именами с временными метками (посмотрите исходный код этой страницы, например - вы увидите что-то вроде assets/application-1fc71ddbb281c144b2ee4af31cf0e308.js).

Таким образом, Heroku не приходится выполнять компиляцию ассетов каждый раз, когда кто-то посещает страницу (к тому же, они не изменяются между визитами). Heroku "прекомпилирует" ассеты и отдает их из кэша.

Когда прекомпиляция завершается, Heroku запускает dyno с вашим приложением на нем, и оно становится доступно уже в течение 30 секунд через выполнение команды $ heroku open или просто ввод адреса приложения в адресной строке браузера.

Основные команды Heroku

Краткий список команд Heroku, которые вам следует знать:

  • $ heroku run rake db:migrate
  • $ heroku run console запускает для вас консоль Rails в продакшен-режиме (так что не сломайте ничего, это реальные данные!)
  • $ heroku logs -t показывает вам логи сервера (такие же, какие вы видите, когда запущен $ rails server), стримя их в ваш терминал (это достигается добавлением флага -t, который означает "tail"). Прочтите этот пост, чтобы получить больше информации о логах.
  • $ heroku restart - на случай, если ваше приложение перестало работать и не запускается. Прочтите этот пост на StackOverflow, чтобы узнать больше.

Учимся любить Heroku: Ошибки

Вы будете получать ошибки. Два основных места, где вы будете их видеть - в процессе деплоя и когда вы пытаетесь непосредственно открыть ваше приложение (например, получив 500 ошибку). Главное, как обычно, не паниковать и спокойно следовать процессу поиска багов. Когда вы впервые будете открывать ваше приложение и получите ошибку, проблема, вероятнее всего, не будет сложной, так что достаточно будет взглянуть в логи и поискать в Google текст ошибки, чтобы найти полезные посты на StackOverflow.

Если вы уже несколько раз деплоили и что-то сломалось, вернитесь к вашему последнему удачному деплою и посмотрите, что вы изменили, прежде чем все испортилось. Иногда это неизбежно, но если вы не поняли, почему возникла проблема, она может еще попортить вам нервы в будущем.

Мы обсудим несколько типичных случаев ниже, но посмотрите краткий гайд Heroku по диагностированию ошибок, это будет хорошим стартом. В нем так же говорится о создании собственных сообщений об ошибках, которые могут использоваться Heroku.

Во время деплоя

Ваши самые первые несколько раз вы, скорее всего, будете получать относительно понятные ошибки. Некоторые могут столкнуться с некорректной настройкой Heroku, она должна отвечать чем-то вроде очевидных ошибок: "we can't actually find this command that you typed" или "you're not authorized to do this".

Другая распространенная ошибка заключена в забывании включить нужный гем (или не включении его в нужный раздел вашего Gemfile - помните, мы в разделе production, а не development).

Когда первые ошибки побеждены, настает время для другого типа частых ошибок - они относятся к Asset Pipeline. Я не буду утверждать, что понимаю, откуда они все берутся - у меня возникали проблемы с Asset Pipeline десятки раз, и вы, вероятнее всего, тоже с ними встретитесь. По некоторым причинам, часть гемов и конфигураций не умеют работать с тем, как Heroku прекомпилирует ассеты. Вы можете встретить ошибку ассетов когда деплой заканчивается неудачей или если ваше приложение неспособно обнаружить файлы стилей или изображений (это так же проявляется в виде ошибок в консоли вашего браузера).

Ошибки деплоя, включая ошибки прекомпиляции ассетов, часто могут быть исправлены изменением конфигурационных файлов вашего приложения. Два основных файла, которые вам, вероятнее всего, понадобятся, это config/environments/production.rb и config/initializers/some_gem.rb (если гем требует настройки). Ответы, которые вы прочтете на StackOverflow, чаще всего подскажут вам, что необходимо добавить или отредактировать одну из настроек, например, config.assets.compile = false. Смиритесь с этим.

Для исправления проблемы прекомпиляции от вас так же может потребоваться вручную прекомпилировать ассеты и затем отправить на Heroku результат прекомпиляции. Иногда это работает... это не универсальное решение и приносит боль, поскольку в таком случае вам придется прекомпилировать ассеты перед каждым деплоем самостоятельно (если вы внесли в них изменения).

500 ошибки во время работы приложения

Никому не нравится получать сообщение "We're sorry but something went wrong" от Heroku. Они отдают 500 статус вне зависимости от того, какую именно ошибку отдало ваше приложение, что делает процесс диагноза еще более раздражающим. Вам придется открыть логи Heroku ($ heroku logs -t), чтобы посмотреть, что говорит сервер.

Если это ваш первый деплой и самая первая ваша страница отдала 500, убедитесь, что вы запустили ваши миграции на Heroku. Это одна из наиболее типичных ошибок.

Остальные 500-е придется отслеживать через логи. Это должно мотивировать вас создать полезные сообщения об ошибках для логов вашего приложения!

Еще один типичный вид ошибок относится к переключению от базы данных на SQLite3 в разрабокте на PostgreSQL в продакшене (еще одна причина отказаться от SQLite3 и начать использовать PG в девелопменте как можно раньше). Существуют совсем небольшие различия, особенно, если вы используете SQL-код или true/false в ваших запросах ActiveRecord (в PG это t/f). Ошибки PostgreSQL может быть трудно определить, так что лучше работать с ними в девелопменте (где вы можете действовать намного быстрее), чем смешивать их с другими ошибками, которые вы можете получить в процессе деплоя.

Помните Переменные Окружения (так же известные как "переменные конфига")? Если вы используете гемы или аддоны, которые требуют специальных токенов или кодов API, которые вам не следует напрямую вставлять в код вашего приложения, вам придется сообщить Heroku, что это за переенные. Это еще один непростой момент, поскольку зачастую такие гемы не кричат о своих ошибках и вы можете долго гадать, почему они не работают. Мы поговорим об этом подробнее в уроке, посвященном работе с API.

Чтобы передать ваши переменные окружения на Heroku, вам стоит использовать гем вроде figaro (почитайте документацию здесь) или напрямую загрузить их при помощи команды $ heroku config:set YOUR_VARIABLE=some_value. Это сделает переменную доступной всем экземплярам вашего приложения, запущенным на Heroku (вам не придется отправлять её для каждого по отдельности).

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

Возвращаясь к локальному окружению, существует несколько поленых вещей, которые помогут сделать вашу работу на локальной машине более эффективной:

  • Используйте $ rails server -p 3001, чтобы запустить сервер Rails на другом порте (в этом примере он запускается на 3001 порте). Таким образом вы сможете запускать несколько приложений одновременно. Просто перейдите по адресу http://localhost:3001 и попадете на ваше приложение.

Задание

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

  1. Прочтите Heroku Deployment Guide для пошагового руководства по деплою.
  2. Прочтите How Heroku Works, чтобы лучше понять инструменты, которые вы использовали.

Заключение

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

Самое лучшее в этом то, что когда вы задеплоили приложение в сеть, вы официально готовы выйти в мир и создавать собственные приложения.

Дополнительные ресурсы

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

Поделиться уроком: