RailsアプリケーションをHerokuでホスティングする方法（開発用にvagrant&virtualBoxを利用する）

# Vagrant & VirtualBox Heroku & Railsでアプリケーションを作るまでの道のり

## 目次
 - はじめに
 - システム構成
 - 開発環境構築（Vagrant & VirtualBox）

## はじめに
RailsアプリをHerokuでホスティングする方法に加えて開発環境
Pushした時にエラー地獄にあったので開発環境構築からHeroku反映までの手順を忘れない用に自分にメモしておく。

基本は[この流れ](http://qiita.com/hirolog/items/6b3ff1a19c3d5471a5b9)にそっています（RVMではなくrbnevを使うとか細かいところで違いはありますが）  
実際にやってみて幾つか詰まったところがあったので追記あり

下記の記事から手順を参考にさせてもらいましたm(_ _)m
 
- [MacOS XでVagrantにCentOS入れ、Railsアプリ制作、Heroku公開](http://qiita.com/hirolog/items/6b3ff1a19c3d5471a5b9)
- [rbenv を使って ruby をインストールする(CentOS編)](http://qiita.com/inouet/items/478f4228dbbcd442bfe8)
- [Vagrantのsynced_folderはrsyncで](http://lealog.hateblo.jp/entry/2016/04/16/145107)
- [Getting Started with Rails 5.x on Heroku - Heroku dev center](https://devcenter.heroku.com/articles/getting-started-with-rails5#local-workstation-setup) 

## システム構成
本番はHeroku、ローカルはVagrantとVirtualBox使ってVMたてる。
あとで詳しく書く。

## 開発環境構築
インストールが必要なアプリケーション
 
- [Vagrant](https://www.vagrantup.com/downloads.html)  
- [VirtualBox](https://www.virtualbox.org/wiki/Downloads)

##### 1: CentOSのboxを追加して仮装マシンを作成する
```
vagrant box add centos65-x86_64-20140116 https://github.com/2creatives/vagrant-centos/releases/download/v6.5.3/centos65-x86_64-20140116.box
```
##### 2: 追加されたboxの確認
```
vagrant box list
centos65-x86_64-20140116 (virtualbox, 0)
```

##### 3: vagrantの初期化
初期化は初回のみ

```
vagrant init centos65-x86_64-20140116
```

##### 4: Vagrantfile修正
railsで利用するためVagrantfileを書き換える

```
vim Vagrantfile

// 3000番ポートへのアクセスを許可
config.vm.network "forwarded_port", guest: 3000, host: 3000  
// 下記のIPでアクセスできる用にする
config.vm.network "private_network", ip: "192.168.33.10"
// vagrant内のデータを./data以下に展開する（エディタで作業し易いように）
config.vm.synced_folder "~/path/to/your/git/folder", "/home/vagrant/path/to/synced",
    type: "rsync",
    rsync__args: ["--verbose", "--archive", "--delete", "--copy-links", "--times", "-z"],
    rsync__exclude: [".git/"]
```

##### 5: 仮想サーバー操作でよく使うコマンドたち
ここではサーバの起動とssh接続までやっておく

```
// サーバー起動
vagrant up

// ローカルのデータとrsyncさせる（watch状態になる）
vagrant rsync-auto

// サーバーへのssh接続
vagrant ssh

// サーバーシャットダウン(Mac側からやる場合は下記。VMにsshした状態でshutdownしてもおｋ)
vagrant halt
```

##### 6: 仮想サーバーの基本設定
ホストのMacからしかアクセスしないため、VMにsshした状態でiptablesを止める。（作業し易いため）

```
sudo service iptables stop
sudo chkconfig iptables off
```

yum最新化

```
sudo yum -y update
```

サーバーの時間合わせる

```
date
//時間がズレていたら、以下を実行
sudo cp -p  /usr/share/zoneinfo/Japan /etc/localtime
```

必要最低限の設定追加

```
sudo yum -y install vim wget
sudo yum install -y curl-devel openssl-devel readline-devel zlib-devel expat-devel gettext-devel perl-ExtUtils-MakeMaker sqlite-devel
```

※ gitはyum経由で入れるとバージョンが古いため、リポジトリから直接持ってくる  
[git-core リポジトリ](https://www.kernel.org/pub/software/scm/git/)

```
wget https://www.kernel.org/pub/software/scm/git/git-2.9.4.tar.gz
sudo tar -zxf git-2.9.4.tar.gz
rm git-2.9.4.tar.gz

cd git-2.9.4
sudo make prefix=/usr/local all
sudo make prefix=/usr/local install

git --version
git version 2.9.4

// 右記のエラー出たとき: -bash: /usr/bin/git: No such file or directory
hash -r
```

bitbucketとかと接続するために鍵作っとく  
ツール側に鍵の登録忘れずに

```
ssh-keygen -t rsa -f id_rsa -b 4096
```

##### 7: rbenv経由でrubyを追加
gitからrbenvとruby-buildを落としてパスを通しておく

```
git clone https://github.com/sstephenson/rbenv.git ~/.rbenv
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build

// 環境変数系
echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
exec $SHELL -l
```

現在rbenv経由でインストールできるrubyのversionをチェックしておく

```
rbenv install --list
```

※ Herokuが現状2.3.1っぽいのでそれを使っておく

```
rbenv install -v 2.3.1
```

環境読み込み

```
rbenv rehash
```

インストールされているruby一覧を確認

```
rbenv versions
 2.3.1
```

globalに指定する

```
rbenv global 2.3.1
```

rubyのバージョンチェック

```
ruby -v
ruby 2.3.1p112 (2016-04-26 revision 54768) [x86_64-linux]
```

##### 8: rails導入
インストールとバージョン確認

```
gem install rails

rails -v
Rails 5.1.0
```

※ アプリ作成は後ほど

##### 9 :Heroku導入
CLIインストール

```
sudo wget -qO- https://toolbelt.heroku.com/install.sh | sh
echo 'PATH="/usr/local/heroku/bin:$PATH"' >> ~/.profile
echo 'source .profile' >> ~/.bash_profile

// 初回のみ.profileを読み直す
source .profile

// インストール確認
heroku version
heroku-cli: Installing CLI... 23.85MB/23.85MB
heroku-toolbelt/3.99.1 (x86_64-linux) ruby/2.3.1
heroku-cli/5.9.2-2622131 (linux-amd64) go1.7.5

// ログインチェック
heroku login
Email: herokuにログインしているemail
Password: herokuにログインしているパスワード

// アプリ作成 myappの部分は好きな名前に
heroku create myapp
```

※ HerokuのApp名とrailsのApp名は合わせる必要がある

##### 10: railsアプリ作成
```
// vm上にsqliteがないので先に追加しておく
gem install sqlite3 -v '1.3.13'

// myappの部分はherokuのapp名と合わせる
rails new myapp
```

Gemfileの書き換え

```
// devではsqlite、prodではpostgresをつかう
# Use sqlite3 as the database for Active Record

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

// 表示確認用に追加
gem 'therubyracer', platforms: :ruby

// Gemfile.lock作成
bundle install --without production
```

サーバー起動するか確認

```
rails s

// これでwelcomeの画面でるはず
http://localhost:3000/
```

herokuにPushした際にpublic以下にhtmlファイルが必要なため作っておく

```
vim public/index.html
// 中身はよしなに
```

##### 11: HerokuにPushする
初回のみherokuのリモートにあるアプリと紐付ける

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

プッシュする

```
git push heroku master
```

これでHeroku側のURLにアクセスすればpublic/index.htmlが表示されます