HANAMI を Heroku にデプロイしてみた

# きっかけ
[RubyKaigi 2018](https://rubykaigi.org/2018) で存在を知った [HANAMI](http://hanamirb.org/)。興味があったので触ってみたかったというのがきっかけ。

# 最初の環境構築

* OS：Debian 9.5 （VirtualBox）
* Ruby： 2.5.1
* hanami： 1.2.0
* DB： MySQL 5.7.23

Ruby は rbenv でインストール。hanami は[ガイド](http://hanamirb.org/guides/1.2/getting-started/)に従ってインストール。なお、MySQL にするのでプロジェクトの作成は

`$ rbenv exec hanami new bookshelf --database=mysql`

とした。これで良さげ。

MySQL のインストールは[こちら](http://wat-aro.hatenablog.com/entry/2016/03/09/023654)を参考にさせてもらった。

# 最初の難関

hanami のデフォルトのポートは 2300 番なのだが、ホスト OS のファイアーウォールは無効にし VirtualBox のネットワークを「NAT + ポートフォワード」もしくは「ホストオンリーアダプター」で試したが一向につながってくれない。SSH で接続はできるのだが、はてさて困った。

**※解決方法をご存知の方、ご一報ください。**

# そうだ、デプロイしよう！

目的は hanami を動かしたいだけである。でも、自前の Macbook にはインストールしたくない。そんなワガママなことを考えていたので、てっとり早くどこかにデプロイしてみようと思った次第である。

デプロイ先はこのご時世なのでいっぱいあるのだが、何となく「無料で Ruby が使えそうなところ」を考えたら [Heroku](https://jp.heroku.com/) が思いついた。特にこだわりもないので Heroku にデプロイしてみる。

# Heroku CLI

Heroku にデプロイするには [Heroku CLI](https://devcenter.heroku.com/articles/heroku-cli) というものが必要らしいが、[snap](https://snapcraft.io/) を用いたインストールをやっても一向にインストールされた気配がない。 `which` しても `whereis` しても見つからない。さっさと諦めて curl を用いてインストール。すぐ出来た。

# やってみる

`$ rbenv exec hanami new sample-bookshelf --database=mysql`
`$ cd sample-bookshelf`
`$ rbenv exec bundle install --path=vendor/bundle`
`$ git add .`
`$ git commit -m "first commit"`
`$ heroku login`
`$ heroku apps:create sample-bookshelf`
`$ git push heroku master`

これだけでデプロイ出来たみたいなので動作確認。

# 第二の難関

ブラウザで確認すると上手く表示されていない。 `$ heroku logs --tail` で確認しろ、というメッセージが出ているので素直に従う。

```
（中略）
bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.4.0/bin/rackup)
KeyError: key not found: "SMTP_HOST"
/app/config/environment.rb:46:in `fetch'
（中略）
```

こんな感じのエラーメッセージが出ていた。該当箇所を確認すると production 環境での mailer の設定のようである。 `ENV` に適当な値を設定してもいいが、まだ mailer に用事はないのでエラー該当箇所をコメントアウトして回避することにした。
commit/push をしてから再デプロイする。

# 第三の難関

再確認するとまだダメである。またも `$ heroku logs --tail` で確認する。

```
（中略）
bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.4.0/bin/rackup)
KeyError: key not found: "DATABASE_URL"
/app/config/environment.rb:21:in `fetch'
（中略）
```

先述の `SMTP_HOST` 同様、 `ENV` に未定義であるために出ているエラーのようである。ここは直前にコメントがあるので分かりやすかった。

```
model do
  ##
  # Database adapter
  #
  # Available options:
  #
  #  * SQL adapter
  #    adapter :sql, 'sqlite://db/sample_bookshelf_development.sqlite3'
  #    adapter :sql, 'postgresql://localhost/sample_bookshelf_development'
  #    adapter :sql, 'mysql://localhost/sample_bookshelf_development'
  #
  adapter :sql, ENV.fetch('DATABASE_URL')

  ##
  # Migrations
  #
  migrations 'db/migrations'
  schema     'db/schema.sql'
end
```

`adapter :sql, ENV.fetch('DATABASE_URL')` を `adapter :sql, 'mysql://localhost/sample_bookshelf_development'` に変更し、commit/push してから再度デプロイする。

# 第四の難関

再々確認すると、まだダメらしい…。　`$ heroku logs --tail` で確認する。

```
（中略）
bundler: failed to load command: rackup (/app/vendor/bundle/ruby/2.4.0/bin/rackup)
Hanami::Model::Error: LoadError: cannot load such file -- mysql
（中略）
```

一番頭を抱えたエラーだった。

* `config/environment.rb` を変更した
* gem はインストールされている

「何がなんだか…」と思っていたところで、インストールしている gem は `mysql` ではなく `mysql2` だと気付いた。分かればなんてことはないが、これに気付くのにえらい時間がかかった。
よって、adapter の設定は　`mysql2://localhost/sample_bookshelf_development'` が正しい設定である。commit/push して再度デプロイする。

# 時は来た

![sample-bookshelf](https://qiita-image-store.s3.amazonaws.com/0/65050/9dea98ae-9f77-920c-73db-2905478bd1b2.png)

なんかそれっぽいもの出たので満足。

# 参考

[[WIP] Hanamiの環境構築（Herokuへのデプロイ、テスト実行環境のセットアップ）](https://qiita.com/mopinfish/items/e1a2b40602b6cb0976a8)