Что такое Heroku и как это работает?

Heroku - это облачная платформа как услуга (PaaS), поддерживающая несколько языков программирования. Одна из первых облачных платформ Heroku находится в разработке с июня 2007 года, когда она поддерживала только язык программирования Ruby, но теперь поддерживает Java, Node.js, Scala, Clojure, Python, PHP и Go. По этой причине Heroku считается платформой для полиглотов, поскольку в ней есть функции, позволяющие разработчикам создавать, запускать и масштабировать приложения одинаковым образом на большинстве языков. Heroku была приобретена Salesforce.com в 2010 году за 212 миллионов долларов.

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

Хотя Heroku взимает с вас плату за дино, на самом деле они не размещают ваше приложение. Фактически, вся платформа Heroku, а также все приложения, созданные на Heroku, развернуты в Amazon Web Services (AWS).

Итак, зачем использовать Heroku при наличии AWS?

AWS является поставщиком инфраструктуры как услуги (IaaS), что означает, что они несут ответственность за управление большими общими центрами обработки данных. Эти центры обработки данных - это то, что мы называем «облаком». Такие компании, как AWS, Azure и Google, создали IaaS, чтобы разработчики могли платить за размещение своих приложений в этих центрах обработки данных, а не создавать сами серверы.

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

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

Как развернуть ваше приложение за пять минут.

  • Создайте учетную запись Heroku.
  • Установите Heroku (для MacOS):

$ brew tap heroku/brew && brew install heroku

  • После установки интерфейса командной строки выполните команду heroku login. Вам будет предложено ввести любой ключ для перехода в веб-браузер и завершения входа в систему. Затем интерфейс командной строки автоматически войдет в систему.
$ heroku login
// => 
heroku: Press any key to open up the browser to login or q to exit
 ›   Warning: If browser does not open, visit
 ›   https://cli-auth.heroku.com/auth/browser/***
heroku: Waiting for login...
Logging in... done
Logged in as [email protected]

Бэкэнд Rails

  • Добавьте pg gem

Если вы используете существующее приложение, которое было создано без указания --database=postgresql, вам необходимо добавить гем pg в свой проект Rails. Отредактируйте свой Gemfile и измените эту строку:

gem 'sqlite3'

К этому:

gem 'pg'

Теперь переустановите свои зависимости (чтобы создать новый Gemfile.lock):

$ bundle install
  • Создайте Procfile

Измените команду, используемую для запуска вашего веб-процесса, создав файл с именем Procfile в корневом каталоге вашего приложения.

В файле Procfile напишите:

web: bundle exec puma -t 5:5 -p ${PORT:-3000} -e ${RACK_ENV:-development}
  • Храните свое приложение в Git

Heroku полагается на Git для развертывания вашего проекта. Если ваш проект еще не находится в Git, запустите эти команды в каталоге вашего приложения Rails, чтобы инициализировать и зафиксировать ваш код в Git:

$ git init
$ git add .
$ git commit -m "init"
  • Разверните свое приложение в Heroku

Убедитесь, что вы находитесь в каталоге, в котором находится ваше приложение Rails, затем создайте приложение на Heroku:

$ heroku create my-app-backend
// =>
Creating app... done, my-app-backend
https://my-app-backend.herokuapp.com/ | https://git.heroku.com/my-app-backend.git

Разверните свой код:

$ git push heroku master
// =>
remote: Compressing source files... done.
remote: Building source:
...
...
remote: Verifying deploy... done.
To https://git.heroku.com/my-app-backend.git
 * [new branch]      master -> master

Всегда полезно проверить, нет ли в выводе каких-либо предупреждений или ошибок. Если все прошло хорошо, вы можете перенести свою базу данных.

  • Перенести вашу базу данных

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

$ heroku run rake db:migrate

Если нужно:

$ heroku run rake db:seed

Вот и все. Давайте развернем наш интерфейс.

Интерфейс JavaScript

Heroku допускает веб-хостинг, но они не размещают статические веб-сайты с HTML, CSS и JS.

Первоначальная попытка сделать это, я столкнулась со следующей ошибкой журнала сборки:

!     No default language could be detected for this app.HINT: This occurs when Heroku cannot detect the buildpack to use for this application automatically.See https://devcenter.heroku.com/articles/buildpacks!     Push failed

Что такое buildpack?

Пакеты сборки состоят из набора сценариев в зависимости от используемого языка программирования. Эти сценарии отвечают за преобразование развернутого кода перед его выполнением в диспетчере динамиков. (Скрипты собирают зависимости, которые затем выводят сгенерированный код. При отправке в Heroku код получает компилятор слага, который преобразует репо в слаг и отправляет на динамометрический стенд для выполнения).

На справочной странице Heroku перечислены поддерживаемые пакеты сборки: Ruby, Node.js, Clojure, Python, Java, Gradle, Grails, Scala, Play, PHP, Go. Эти пакеты сборки ищутся в развернутом репо на основе указанного используемого языка. Однако пакеты сборки не предлагаются для типичных языков HTML, CSS, Javascript. Это объясняет полученную вами ошибку: «Не удалось определить язык по умолчанию для этого приложения».

Не волнуйтесь, это легко исправить для вашего портфолио или личного блога. Небольшой трюк, позволяющий Heroku распознавать файлы вашего статического веб-сайта, - это заставить его превратить его в приложение Node.js.

  • Прежде всего не забудьте изменить url в своем Fetch

Если вы разрабатывали в своей локальной среде, вы, вероятно, получали данные API с y нашего локального хоста. Измените все URL-адреса для получения с вашего локального хоста (http://localhost:3000/songs) на новый адрес Heroku (https://my-app-backend.herokuapp.com/songs)

  • Добавьте package.json файл в корневой каталог.

Добавьте этот код в свой package.json файл:

{
  "name": "project_name",
  "version": "1.0.0",
  "description": "Project Description",
  "scripts": {
    "start": "serve"
  },
  "dependencies": {
    "serve": "^10.0.1"
  },
  "author": "Your Name"
}
  • !!! Если вы уже пытались развернуть свой проект перед добавлением package.json файла, вам необходимо создать новую папку и скопировать и вставить в нее проект.
  • Зафиксируйте свой код в Git:
$ git init
$ git add .
$ git commit -m "heroku workaround"
  • Разверните свой интерфейс на Heroku
$ heroku create my-app
// =>
Creating app... done, my-app
https://my-app.herokuapp.com/ | https://git.heroku.com/my-app.git

Разверните свой код:

$ git push heroku master
// =>
remote: Compressing source files... done.
remote: Building source:
...
...
remote: Verifying deploy... done.
To https://git.heroku.com/my-app.git
 * [new branch]      master -> master

Бум! Выполнено! Поздравляем, вы развернули свое приложение!