Heroku に Rails アプリをアップ

Created by Terence Lee, @hone02

Heroku の準備

Heroku のアカウントを作成しよう

アカウントの作成はもちろん無料です。

ユーザ登録画面からアカウントを作成しましょう。

「First name」に名前、「Last name」に苗字、「Email」にメールアドレス、「Company name」に勤務先や所属を入力し、国を選択、言語として Ruby を選択して「Create Free Account」ボタンを押します。

しばらくすると入力したメールアドレスに「Confirm your account on Heroku」という件名のメールが届くので、本文中の activate 用の URL をクリックします。

heroku で用いるパスワードを入力してアカウントの作成は完了です。

Heroku CLI をインストールしよう

Heroku でコマンドライン操作を行うためのアプリケーションである、Heroku CLI をインストールします。

Heroku CLI

このページの「Download and install」という段落から、自分のノートパソコンのOSに合わせてインストールしましょう。

Macの場合

Ruby, Railsのインストール時にHomebrewをインストールしているはずなので、Homebrewを使ってインストールできます。

brew install heroku
Windowsの場合

64-bit あるいは 32-bit と書かれたリンクをクリックしてダウンロードしてください。

(自分のWindowsが32bit版64bit版かは、コントロールパネルから確認できます。Microsoftのこちらの記事を参考に、確認してみてください)

ダウンロードが済んだら、heroku-windows-amd64.exe(あるいは、heroku-windows-386.exe) をダブルクリックし、表示される指示に従ってインストールしてください。

(環境により拡張子が表示されませんが、異常ではありません)

Heroku にコマンドラインでログインしよう

Heroku Toolbelt を無事インストールできたら、ターミナル(Mac)またはコマンドプロンプト(Windows)を起動して、次のコマンドを入力しましょう。

heroku login

Enter your Heroku credentials.(heroku の認証情報を入力してください) と言われるので、先ほど登録したメールアドレスとパスワードを入力します。

heroku login
Enter your Heroku credentials.
Email: rails-girls@example.com
Password:

メールアドレスは入力したそのまま画面上に表示されますが、パスワードは画面上に何も表示されません。

入力は正常に受け付けられているので、反応がなくても気にせずに最後まで打ち、エンターキーを押してください。

heroku の準備はこれで終了です。

Coachより: Heroku か、従来のサーバーか、デプロイの利点について話してみましょう。

アプリの準備

バージョン管理システム

作成したコードをバージョン管理システムに追加します。ターミナル上で次のコマンドを入力しましょう。:

git init
echo public/uploads >> .gitignore
git add .
git commit -m "initial commit"

Coachより: バージョン管理システムと git について説明するちょうどいいタイミングです。.gitignore の説明と上記のファイルを管理対象外にしたい理由についても説明しましょう。

データベースのアップデート

まず、 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 "Added pg gem and updated Gemfile.lock"

Coachより: RDBMS とそうでないものについて話してみましょう。Heroku 上の PostgreSQL の制限についても少し取り上げてみてください。

アプリのデプロイ

アプリのcreate

Heroku のアプリを作りましょう。ターミナルで次のコマンドを実行してください。 :

heroku create

次のようなものが見られます。 :

Creating evening-sky-7498... done, stack is cedar
http://evening-sky-7498.herokuapp.com/ | git@heroku.com:evening-sky-7498.git
Git remote heroku added

この場合では、 “evening-sky-7498” がアプリの名前です。

コードをpush

さて、 Heroku にコードを送信しましょう。 ターミナルで次のコマンドを実行してください。 :

git push heroku master

そうすると、こんな出力が見られるはずです。 :

Counting objects: 134, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (115/115), done.
Writing objects: 100% (134/134), 35.29 KiB, done.
Total 134 (delta 26), reused 0 (delta 0)

-----> Ruby app detected
-----> Compiling Ruby/Rails
-----> Using Ruby version: ruby-2.0.0
-----> Installing dependencies using 1.6.3
       Running: bundle install --without development:test --path vendor/bundle --binstubs vendor/bundle/bin -j4 --deployment
       Fetching gem metadata from https://rubygems.org/..........
...
-----> Launching... done, v4
       http://evening-sky-7498.herokuapp.com deployed to Heroku

アプリのプッシュが終わってるのがわかりますか? “Launching…” というテキストのところです。

データベースのマイグレート

そして、ワークショップでローカルにやったように、データベースのマイグレートをする必要があります。 :

heroku run rails db:migrate

そのコマンドが実行されたら、 url でアプリを見ることができます。このアプリの例では、 http://evening-sky-7498.herokuapp.com/ です。もしくは、ターミナルで次のコマンドを実行すれば、そのページを見に行くことができます。

heroku open

おわりに

Heroku のプラットフォームは癖がない訳ではありません。Heroku 上のアプリは ephemeral な(再起動で一部のファイルが揮発する)環境で動作しています。- これは(データベースに保存された情報と push した情報を除く)全てのファイルがアプリの再起動で消えてしまうという事です。(例えば、新しいバージョンのプログラムを push した場合)

Ephemeral ファイルシステム

Each dyno gets its own ephemeral filesystem, with a fresh copy of the most recently deployed code. During the dyno’s lifetime its running processes can use the filesystem as a temporary scratchpad, but no files that are written are visible to processes in any other dyno and any files written will be discarded the moment the dyno is stopped or restarted.

(各 dyno は専用の ephemeral ファイルシステムを取得します。この領域には最新のデプロイしたプログラムもコピーされます。実行中のプロセスが dyno の生存期間にある間は、このファイルシステムを一時的なスクラッチパッドとして扱う事ができます。しかし、dynoが停止か再起動をした瞬間に出力されていたすべてのファイルはプロセスから見えなくなります)

App では、追加した Idea レコードにファイルを添付する事ができます。このファイルはアプリの public/uploads フォルダ以下に配置されます。以下の手順で Heroku での ephemeral ストレージの動作を確認できます:

  1. heroku open を実行してアプリを開きます
  2. 新しい Idea に画像を付けて追加します
  3. heroku restart を実行してアプリを再起動します
  4. 追加した Idea を再度表示し、このページを reload します - 画像は表示されなくなります
Ephemeral ストレージの回避策

これは実際のアプリにとっては明らかに不便ですが、有名なサイトでも使われてる回避策がちゃんとあります。

最も一般的な回避策はAmazon S3(Simple Storage Service)やRackspace CloudFilesのような外部ホストの資源を利用する事です。これらのサービスは(安価な - 通常 0.1$/GB 以下の)アプリから永続的に利用可能なストレージを ‘クラウド上に’ 提供します(つまりファイルをどこへでも提供し得えます)。

この機能は少しだけこのチュートリアルの範囲から外れますが、以下のようなリソースを参考に、目的にあった方法を見つける事ができるでしょう。

いつものように、わからない事がある場合や手助けが必要な場合は担当のコーチが対応してくれます。