他のホスティングサービスにホストしている既存のRails4アプリをHerokuにdeploy

とあるWEBサービスを運営しているが、使わせてもらっているホスティングサービス自体が終了するそうなので、Herokuに移行した。その手順をサラッとメモしておく。

### git でブランチを切る
必須ではないが、それなりに大改造になるので、git で新しいブランチを切って作業する。

```
$ git checkout -b task-deploy-heroku
```

### 新しい group を定義
:production を使い回せない場合、新しい group を作る。
ここでは `:production_heroku` とする。
ちなみに `:production-heroku`（ハイフン） とした場合、Gemfileのパースでエラーが発生する。

また、GitHub上の野良gem(?)を使っている場合、記述方法によっては[Herokuへのpush時にエラーになる](http://stackoverflow.com/questions/11557759/gem-file-with-git-remote-failing-on-heroku-push)ので注意。

```rb:Gemfile
ruby '2.2.4'  # Herokuの場合、rubyバージョンを明示していないとWARNINGが出る。

# 野良gemは git: ではなく、github: で指定するように変更。
# gem 'mongoid-rspec', git: "git@github.com:chocoken517/mongoid-rspec.git"
gem 'mongoid-rspec', github: "chocoken517/mongoid-rspec"

group :production_heroku do
  # for Heroku
  gem 'pg'
  gem 'rails_12factor'
end
```

```yaml:database.yml
production_heroku:
  <<: *default
  adapter: postgresql
  encoding: unicode
  pool: 5
```

```yaml:secrets.yml
production_heroku:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>
```


```rb:config/environment.rb
case Rails.env
  # when 'development' then
  # when 'staging' then
  when 'production' then
    xxx 
  when 'production_heroku' then
    # もし何か定義していたら追加
    xxx 
  else
end
```

```rb:config/environments/production_heroku.rb
# 中身は production.rb をコピーして、必要な部分だけを変更する。。
```

gitにコミットする。

### Heroku で新しいAppを登録する

GUIで出来るので詳細は割愛。



### デプロイ

##### git remote の追加
参考: [Creating a Heroku remote](https://devcenter.heroku.com/articles/git#creating-a-heroku-remote)

```bash
$ heroku git:remote -a アプリケーション名　[-r リモート名（デフォルトはheroku）]
$ git remote -v     ★以下が追加されていることを確認
heroku  https://git.heroku.com/アプリケーション名.git (fetch)
heroku  https://git.heroku.com/アプリケーション名.git (push)
```

##### 環境変数の設定
GUIでも出来るが、コマンドラインで設定する方が簡単。※GUIで行うなら、Settings の `Config Variables` から。

`production_heroku`グループで動かすための設定。

```bash
$ heroku config:add RACK_ENV=production_heroku
$ heroku config:add RAILS_ENV=production_heroku
```

日本向けRailsアプリケーションなら以下を。
参考: [日本向けRailsアプリケーションをHerokuで走らせるためのまとめ](http://qiita.com/ytkt/items/c3788cbdbaf954d68f22)


```bash
$ heroku config:add TZ=Asia/Tokyo
$ heroku config:set LANG=ja_JP.UTF-8
```
※正直これらの設定の効果が分からない…（2016/10/05現在）

##### git push の実行
最初の手順でブランチを切っているので、そのブランチを master として push する。参考: [Advanced: Linking local branches to remote apps](https://devcenter.heroku.com/articles/multiple-environments#advanced-linking-local-branches-to-remote-apps)

```bash
$ git push heroku task-deploy-heroku:master
```
※ほとぼりが冷めて、masterにマージした暁には、`git push heroku master` でOK。
※そもそもmasterブランチのまま作業している場合は `git push heroku master` でOK。

##### DBのセットアップ

```bash
$ heroku run rake db:migrate
```

##### アプリをOPENしてみる
何も問題なければ正常に動作するはず。


### その他
herokuコマンドについてこちらを参考に。[Heroku コマンド・設定 メモメモ](http://qiita.com/pugiemonn/items/0e69b7a29a384b356e65)

##### ログ参照（tail）

```bash
$ heroku logs -t [-a <application name>]
```

##### アプリをメンテナンスモードにする
アプリページにアクセスすると、「メンテナンス中です」的なstaticページが表示される。参考: [Maintenance Mode](https://devcenter.heroku.com/articles/maintenance-mode)

```bash
$ heroku maintenance:on   # メンテナンスモードに
$ heroku maintenance:off  # 復旧
```

##### psqlでDBを参照・操作
※前提: git remote に heroku が定義されていること。そして、psqlにPATHが通っていること。

```bash
$ heroku pg:psql
```

----

### Herokuに移行してみて

- ~~USリージョンはやはり体感速度（レイテンシー）が遅い~~
そうでもなかった(~_~;) ただし、アクセスがない状態で一定時間経過するとアプリがスリープするので、そのあとの復帰には数秒かかってしまう。
 
- 無料だとDB（PostgreSQL）に10000行しか格納できない。
PostgreSQLをやめて、無料版でも500MBまで格納できるMongoDBに移行した。[（移行手順はこちら。）](http://qiita.com/leon-joel/items/4f91a33529ba6233e8f4) ActiveRecordと完全に互換性があるわけではないので、ある程度のコード修正は必要だったが、ちゃんとMongoDBに移行できた。