Розгортання проекту на Heroku

Created by Terence Lee, @hone02

Встановлення інструментів Heroku та налаштування доступу

Перейди на інструкцію [Getting Started on Heroku with Ruby][heroku-guide] та виконай кроки “Introduction”, кроки від “Set up”до “Sign up”, крок “install the Heroku CLI”, та “login”.

Підготуємо проект

Ми повинні додати систему контролю версій до твого коду. Ти можеш це зробити, виконавши наступні команди у терміналі:

git init
git add .
git commit -m "initial commit"

Ментор: Це добрий час, щоб поговорити про систему контролю версій та git.

Зміна конфігурації бази даних

Спочатку нам потрібно, аби наша база даних запрацювала на Heroku, який використовує базу даних, що відрізняєтся від нашої. Будь ласка, заміни у Gemfile:

gem 'sqlite3'

на наступний фрагмент:

group :development do
  gem 'sqlite3'
end
group :production do
  gem 'pg'
end

Далі слід виконати команду bundle install --without production, щоб завантажити та встановити необхідні бібліотеки.

Не забудь зробити git add . та git commit -m "Use postgres as production database" на master вітці перед пушем на heroku.

Ментор: Тут можна поговорити про RDBMS та різницю між ними, плюс додай трохи деталей про залежність Heroku від PostgreSQL.

Розгортання проекту

Створення нового застосунку на Heroku

Ми повинні створити наш Heroku застосунок набравши heroku create у терміналі і маємо побачити подібне:

Creating app... done, ⬢ young-reaches-87845
https://young-reaches-87845.herokuapp.com/ | https://git.heroku.com/young-reaches-87845.git

У даному випадку “young-reaches-87845” назва твого застосунку.

Публікуємо код

Далі, ми повинні запушити наш код на heroku, набравши git push heroku master. Ти побачиш у терміналі наступне:

Counting objects: 115, done.
Delta compression using up to 8 threads.
Compressing objects: 100% (97/97), done.
Writing objects: 100% (115/115), 25.62 KiB | 0 bytes/s, done.
Total 115 (delta 10), reused 0 (delta 0)
remote: Compressing source files... done.
remote: Building source:
remote:
remote: -----> Ruby app detected
remote: -----> Compiling Ruby/Rails
remote: -----> Using Ruby version: ruby-2.2.4
remote: -----> Installing dependencies using bundler 1.11.2
remote:        Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
remote:        Fetching gem metadata from https://rubygems.org/..........
remote:        Fetching version metadata from https://rubygems.org/...
remote:        Fetching dependency metadata from https://rubygems.org/..
remote:        Installing concurrent-ruby 1.0.2
...
remote: -----> Launching...
remote:        Released v5
remote:        https://young-reaches-87845.herokuapp.com/ deployed to Heroku
remote:
remote: Verifying deploy... done.
To https://git.heroku.com/young-reaches-87845.git
 * [new branch]      master -> master

Коли з’явиться рядок “Launching… done”, це означає, що твій додаток опублікований. Ура!

Міграція бази даних

Далі слід мігрувати базу даних - щось подібне ти вже робила на локальному середовищі. Зараз ця команда виглядатиме так: heroku run rake db:migrate.

heroku run rails db:migrate

Коли команда закінчить виконувати, ти можеш отримати доступ до застосунку по url. У даному випадку, ти може перейти до https://young-reaches-87845.herokuapp.com/. Також ти можеш набрати heroku open у терміналі, що відкриє твій додаток у браузері.

На сам кінець

Платформа Heroku не без своїх примх. Проекти, що живуть на Heroku працюють у “ефемерному” середовищі - мається на увазі, що (окрім інформації, що зберігається у твоїй базі даних) будь-який файл, що буде створений твоїм застосунком зникне при перезавантаженні проекту (наприклад при пуші нових змін)

Ефемерна файлова система

Коже dyno (контейнер) отримує свою ефемерну файлову систему, із свіжим кодом, що був недавно задеплоєний. Протягом життя dyno, його процеси можуть використовувати файлову систему як тимчасове сховише, і всі файли, що були записані, є невидимими для інших процесів у інших dyno і кожен файл буде видалений у момент видалення чи перезапуску dyno. Для прикладу, це трапляється кожного разу, коли dyno міняється через деплой застосунку і як правило раз на день як частина нормального управління dyno.

У App посібнику є можливість прикріпляти файли до Idea записів, в результаті чого нові файли записуються у папку твого застосунку public/uploads. Ефемерна файлова система у Heroku може бути побачена за допомогою наступних кроків:

  1. Запусти додаток у браузері heroku open
  2. Додай нову Idea із зображенням
  3. Перезапусти додаток за допомогою heroku restart
  4. Вернись назад до Idea та перезавантаж сторінку - зображення повинне пропасти
Як жити із Ефемерною файловою системою?

Звісно, це виглядає не дуже круто, якщо ти маєш реальний проект, але є шляхи для вирішення цієї проблеми, яку використовує багато веб-сайтів.

Найбільш поширений метод - використовувати зовнішнє сховище асетів(файлів) наприклад Amazon S3 (Simple Storage Service) чи Rackspace CloudFiles. Ці сервіси (за низьку ціну - зазвичай менше $0.10 за GB) це сховища “у хмарі” (мається на увазі, що файли потенційно можуть хоститись буть-де), які твій застосунок може використовувати для зберігання файлів.

Оскільки ця функціоналість трішки виходить за межі даного посібника, є ресурси, де ти можеш знайти інформаію, як реалізувати подібне:

Звісно, якщо тобі потрібна допомога чи більше інформації, твої ментори будуть готові допомогти.