Herokuにプロジェクト載せてサービス公開

ローカル環境で作成した`Rails`プロジェクトを`Heroku`に載っけて公開するときの作業メモ。

[Heroku について](https://qiita.com/ntkgcj/private/6942697f5cf5f30505cc)
[Heroku操作 CLI](https://qiita.com/ntkgcj/private/9e812220881d671b6bff)
[Herokuエラーメッセージへの対処](https://qiita.com/ntkgcj/private/0d14b1368cf9f2c9ca10)

---
**簡易的な流れ**

- Heroku用にPostgreSQLをインストール
- config/database.ymlを少し変更
- Herokuにサーバーを作成

**プロジェクトによって都度設定確認が必要そうなファイル**

- config/environments/production.rb 
- config/database.yml   
            

>[WebサイトをHerokuで公開してドメイン取得とSSL化までの全手順](https://qiita.com/jellyfish21/items/008f65cfdc9a0239c218)
[HerokuにRailsアプリをデプロイする手順](https://qiita.com/NaokiIshimura/items/eee473675d624a17310f)
[Heroku PostgresをRailsアプリで利用する手順](https://qiita.com/NaokiIshimura/items/550ca82e8e57aaea5582)
[Rails初学者がつまずきやすい「アセットパイプライン」](https://www.transnet.ne.jp/2016/02/28/rails初学者がつまずきcolnr「アセットパイプライン/)
[Rails Production環境でプリコンパイルする時の留意点](https://web-atelier-midori.com/blog/ruby/226/)
[画像が表示されないからfogとかS3とか使う。](http://song-of-life.hatenablog.com/entry/2017/03/26/215542)
[RAILS画像投稿アプリをHEROKUで動かすときの写真保存方法](http://mutipuro.xyz/rails-heroku-gazou/)
[`gem install pg` が失敗するときの対処法](https://qiita.com/tdrk/items/812e7ea763080e147757)
[RailsアプリをHerokuへデプロイするときの手順まとめ | 2015](http://totutotu.hatenablog.com/entry/2015/08/21/RailsアプリをHerokuへデプロイするとき)


#以下作業だよ

###postgresqlが無ければ
先にインストールしておく（`homebrew`から）

```zsh
brew install postgresql
```

### herokuにログイン

```zsh
heroku login
#Emailを入力
#パスワードを入力
```
### プロジェクトディレクトリ内に移動

```zsh
cd プロジェクトディレクトリ名
```

###**まだgit管理していない場合**は
`git init`コマンドでローカルリポジトリを作成してからコミットしておく
`Rails5系は最初からgit管理状態なので「git init」は不要`
>
[これでもう怖くない！？Rails 4.1からRails 5.0にアップグレードする手順を動画付きで解説します](https://qiita.com/jnchito/items/fa680e104d4bf49ae06f)

```zsh
# 初期化
git init
# ディレクトリ配下ファイルをコミット対象に
git add .
# コミット
git commit -m "Git on"
```

### Gemfile修正
:exclamation:`元からPostgresを使っている場合は作業不要`

データベースに`sqlite`を使用している場合、`gem 'sqlite3'`の行を修正＋追記

```rb:Gemfile
# gem 'sqlite3'
gem 'sqlite3', group: [:development, :test]
gem 'pg', group: :production
```
ファイル修正したら`bundle`実行しとく

```zsh
bundle
```
### Postgresql(DB) の利用設定

```zsh
#コマンドでDATABASE_URLを確認
heroku config
```
DATABASE_URLが表示されればOK

>[database.ymlで環境変数DATABASE_URLを参照するように設定する](https://qiita.com/NaokiIshimura/items/550ca82e8e57aaea5582)

```yml:config/database.yml
production:
#  <<: *default
#  database: db/production.sqlite3
  adapter: postgresql
  url: <%= ENV['DATABASE_URL'] %>
  pool: 5
  timeout: 5000
```
###コミット作業
本番環境実行に必要なファイルを編集したら
コミットしておく。

```zsh
# コミット
git commit -m "Release to heroku"

# --- #

# ついでにGithubにあげるなら
git push origin master
```

**Herokuアプリ作成**
Herokuにリモートのアプリケーションを作成

```zsh
heroku create <アプリ名>

 #https://xxxxx-xxxxx-xxxxx.herokuapp.com/ | https://git.heroku.com/xxxxx-xxxxx-xxxxx.git

# HerokuアプリのURL、Gitリポジトリが表示される

#確認
git remote
 #heroku
```

## デプロイ
ローカルの`master`ブランチをリモートリポジトリ（heroku）へpushする

```zsh
git push heroku master
```

### 確認

```zsh
#ウェブアプリをブラウザで開く
heroku open
```
<img width="604" alt="スクリーンショット 2018-06-21 20.54.55.png" src="https://qiita-image-store.s3.amazonaws.com/0/23248/6d945060-6d73-6927-528e-f3b9d0fcdb96.png">
**ようこそ**:joy:

DBを作成していないのでheroku側でマイグレーションを実行する

### マイグレーション

```zsh
# DBのマイグレーション
heroku run rake db:migrate

# dynoの再起動
heroku ps:restart

# アプリを開く
heroku open
```
DBが作成されて見れるようになったはず

### タイムゾーン設定
```zsh
# タイムソーンを日本時間に変更
heroku config:add TZ=Asia/Tokyo
```

### 環境変数の設定

```zsh
# 環境変数一覧 表示
heroku config

# 環境変数名を指定して参照
heroku config:get ENV_NAME

# 環境変数 追加
heroku config:set ENV_NAME="value"

# 環境変数 削除
heroku config:unset ENV_VAR_NAME
```

#herokuにデプロイ後の操作
>
[【herokuコマンド】createからdestroyまで](https://qiita.com/chihiro/items/5c3ff400f6cb99deb945)


---

###アプリを更新する

```zsh
git add .
#コメントは適宜変更
git commit -m "Fix config/environments/production.rb"

git push heroku master
```

###アプリを削除する

```zsh
#アプリ名の確認
heroku apps:info

#削除
heroku apps:destroy --app アプリ名
#アプリ名を入力すると削除完了

#確認なしで1発で削除
heroku apps:destroy --app アプリ名 --confirm アプリ名
```

---

# うまくいかないパターンまとめ


###**誤ってローカルリポジトリ作成前に`heroku create`してしまった場合**

>[リモートリポジトリherokuが存在しない場合は、heroku create <アプリ名>コマンド実行時に払い出されたgitリポジトリをリモートリポジトリherokuとして登録する](https://qiita.com/NaokiIshimura/items/eee473675d624a17310f)

`Gitリポジトリ`のURLを登録する

```zsh
# リモートリポジトリを追加

git remote add heroku https://git.heroku.com/xxxxx-xxxxx-xxxxx.git
```

###**Heroku Postgres(DB) の　アドオン追加**

`heroku config`コマンドで
DATABASE_URLが表示されない場合、アドオンの追加を行う。
`<PLAN_NAME>`にはherokuでの契約プラン名が入る
>
[Heroku Postgres | Heroku Dev Center](https://devcenter.heroku.com/articles/heroku-postgresql#provisioning-the-add-on)

```zsh
#heroku addons:create heroku-postgresql:<PLAN_NAME>
heroku addons:create heroku-postgresql:free-dev


#作業完了まで待ってから 確認
heroku config
```
---

# さらに理解を深めるために...

[[Ruby] RailsをHerokuへデプロイする時の７つの注意事項 [Heroku]](https://qiita.com/sho7650/items/3cb243a0ffc2a77f0793)