MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開 vol.08

# Railsアプリ作成から、Herokuにプッシュまで

MacOS X Yosemite で Heroku にアプリを公開するまでの環境構築を何回かに分けて書きます。

vol.01 [VirtualBox インストール編](http://qiita.com/hirolog/items/560ce489dce08f555876) 
vol.02 [Vagrant インストール編](http://qiita.com/hirolog/items/79c294da5225827f3f75)
vol.03 [Vagrant box作成編](http://qiita.com/hirolog/items/a57692eae892e7cdb6a7)
vol.04 [VagrantのCentOS 6.5 仮想マシン(box）起動まで](http://qiita.com/hirolog/items/0603c0b8a8c7b89a0cd4)
vol.05 [Rails 開発環境準備](http://qiita.com/hirolog/items/759f15ce91ce4e783091)
vol.06 [Git 環境を整備](http://qiita.com/hirolog/items/b2a117402c6cc0d02829)
vol.07 [Heroku 公開するまでの事前準備](http://qiita.com/hirolog/items/eefda94756f547ea08f2)

も合わせてお読み下さい。（というか、先にこれらの操作が必要です）

## 必要なものが揃ってるか、確認

仮想マシンを落としている人は、Vagrant を立ち上げて、sshで接続しましょう。

仮想マシンを常に立ち上げっぱなしでも良いのですが、意外とバッテリーを消耗するような気がするのでしばらく使わないのであれば halt で落としておくと良いです。

```
vagrant up
vagrant ssh
```

準備が終わっているか、確認します。
ぼくは ssh で仮想マシンに接続し忘れて「あれ、rails入ってない？」とビビることがあるので、いま Mac なのか Vagrant なのかは確認するようにしてください。

```
rails -v
ruby -v
git version
heroku version
```

上記3コマンドですべてバージョンが表示されれば、準備完了です！
特に git バージョンが古いと heroku に対応してないので要注意です。

## アプリ仕様

今回のアプリ仕様は次のようにします。

* DBは Vagrant の仮想マシン内では SQLite、Heroku内では PostgreSQL
* Heroku は無料の個人向けアカウントで、アドオンは使用しない

## Heroku用 Railsアプリ作成

以下の4ステップで、完了です。

1. Heroku上にアプリ（の箱）を用意し、
2. Vagrant内で同名の Rails アプリを作成し、
3. Gitの管理下にソースファイルを置き、
4. コマンドで heroku へ push する

ここでは**アプリ名を heroku-app とします**。
ですが、heroku ではアプリ名がユニークである必要があり、以下のコマンドを実行したら **Name is already taken**   というメッセージが表示された場合、他のアプリ名にしてください。

```
heroku create heroku-app
```

```
Creating heroku-app... done, stack is cedar-**
https://heroku-app.herokuapp.com/ | https://git.heroku.com/heroku-app.git
```

のようなメッセージが返ってくれば成功です。
念のため、ブラウザで heroku のサイトにアクセスし、Dashboardを開いて Personal Apps に heroku-app が追加されたか確認すると良いと思います。

次にここでいよいよ、**同名**の railsアプリ を作成します。

```
rails new heroku-app
```

**railsアプリ名は heroku で作成したアプリ名と同じ**にします。

さて heroku にアップルすために最小限、修正が必要だと思うのは次の4つです。

1. Gemfile
2. データベース情報
3. .gitignore

本当の最小限という意味では、2.と3.すら必要ないのですが、さすがにそこまで切り詰めなくても良いかなと。

### Gemfileの修正

Gemfileで最低限、修正が必要なのは2ヶ所。

```
cd heroku-app
vim Gemfile
```

ローカル側では SQLite、Heroku側では PostgreSQL を使うための記載。

```
# Use sqlite3 as the database for Active Record
gem 'sqlite3'
という 1行 を削除し、以下のように変更

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

ローカル側で railsサーバ を使って動作確認などをするために、1ヶ所のコメントアウトを削除。

```
# コメントアウトを削除
gem 'therubyracer', platforms: :ruby
```

この2つを修正したら、bundle installしておきます。必ず --without production を付けておきましょう。仮想マシン内に PostgreSQL 環境が入っていれば良いのですが、入っていない場合はエラーとなるためです。

```
bundle install --without production
```

### database.yml の修正

Herokuのデータベース情報を設定しておく必要あります。
ただ、ここで紹介する方法は推奨しづらいやり方です。この後、Gitの管理下に置くことになるのですが、.gitignoreなどに記載漏れがあるとデータベース情報までも保存されることになります。もし今後、GitHub にあげることになった場合など、ネットにデータベース情報が公開されかねません。
できれば環境変数（env）に情報を記載し、Git管理外にデータベース情報を置くようにしてください。

と前置きしつつ、ここでは話を簡単にするため、database.ymlに情報を直接書きます。

Heroku のデータベース情報を確認する必要があるのですが、以前はアプリを create すると自動的に PostgreSQL のデータベースが用意されていた気がするのですが、コマンドを叩かないと作成されなくなってるようです。

```
heroku addons:add heroku-postgresql --app heroku-app
```

のように打って、データベースを作成しましょう。最後の heroku-app はアプリ名ですので、ご自身で作成したアプリ名を入力してください。

データベース情報はブラウザで Heroku のダッシュボードにアクセスし、左上のメニューから Databases に移動します。
アプリ名に該当するデータベースがあると思うので、ここに記載されている Connection Settings の

* Database
* User
* Password

の3つをメモしておきます。では、railsの database.yml ファイルを修正します。

```
vim config/database.yml
```

```
production:
  <<: *default
  database: db/production.sqlite3
```

と書かれているのを削除し、以下のように修正して上書き保存します。もちろん、database、username、password 上でメモした情報に書き換えてください。

```
production:
  adapter: postgresql
  encoding: utf8
  database: your_database
  port: 5432
  username: your_username
  password: your_password
```

### .gitignore の修正

Gitの管理下に置かないファイルを指定しておきます。
アプリの動作に致命的ではないので後回しにできなくもないですが、やはり最初に指定しておくのが良いでしょう。

```
vim .gitignore
```

ここでは下記の3つを追記して、データベース情報を記載したファイルと、Macなどで操作した場合にできるファイルなどを管理下から外しておきます。

```
config/database.yml
*.DS_Store
*.swp

```

## アプリ動作確認から、Herokuにプッシュまで

ここまでで Rails の空アプリが完成しました。
Railsサーバを立ち上げて動作確認と、Herokuにプッシュまで行います。

ここで Rails 4.2 を使っている場合は要注意です。通常は

```
rails s
```

というコマンドでRailsサーバが立ち上がります（rails serverと打っても同じです）。
ところが、Rails 4.2.0 からはサーバを立ち上げてもアクセスできなくなっているようです。

```
bundle exec rails server -b 0.0.0.0
```

というコマンドでRailsサーバを起動してください。
サーバが立ち上がれば、ブラウザで http://localhost:3000/ （または、http://192.168.33.10:3000/ ）にアクセスします。3000番ポート や 192.168.33.10 というIPアドレスは、Vagrantfile で設定したものです。もしRailsサーバは立ち上がってるのにアクセスできない場合、Vagrantの設定を見なおしてください。

```
Welcome aboard
You’re riding Ruby on Rails!
```

という表示をブラウザで確認できれば成功です。

Railsサーバは Control+c で停止できます。

あとは Git の管理下にファイルを置き、Heroku にプッシュします。
まずは Git の登録ですが、詳細は省略します。最初の2つは初回のみ必要なコマンドです。


```
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
```

```
git init
git add .
git commit -m "Initial commit"
```

git status などで確認して問題なさそうなら、Herokuにプッシュします。

初回のみ、git remote を Heroku に指定します。

```
heroku git:remote --app heroku-app
```

全て準備が整いました、Herokuにプッシュします。このコマンドは完了まで少し時間がかかります。

```
git push heroku master
```

エラーらしきメッセージが表示されなければ成功したと思って良いと思います。
Herokuのダッシュボードにアクセスし、該当のアプリを開いて上部の Open Application のリンクを開いてみましょう。
URLを直接入れても良いですが、少なくとも初回だけは打ち間違えなどを考えるとダッシュボード経由が良いです。

いかがでしょうか？

```
The page you were looking for doesn't exist.

You may have mistyped the address or the page may have moved.
```

と表示されれば、実は成功（している可能性が高い）です。
というのも、Railsでルートの指定（/でアクセスした際に何を表示するかの指定）をしていません。
あえて最もシンプルな形でのアップをしたので、あとは Railsアプリ を作りこんでいけば良いです。

### キーワード

* MacOS X
* VirtualBox
* Vagrant
* CentOS
* Ruby on Rails
* RVM (Ruby Version Manager)
* Heroku