きっかけ
RubyKaigi 2018 で存在を知った HANAMI。興味があったので触ってみたかったというのがきっかけ。
最初の環境構築
- OS:Debian 9.5 (VirtualBox)
- Ruby: 2.5.1
- hanami: 1.2.0
- DB: MySQL 5.7.23
Ruby は rbenv でインストール。hanami はガイドに従ってインストール。なお、MySQL にするのでプロジェクトの作成は
$ rbenv exec hanami new bookshelf --database=mysql
とした。これで良さげ。
MySQL のインストールはこちらを参考にさせてもらった。
最初の難関
hanami のデフォルトのポートは 2300 番なのだが、ホスト OS のファイアーウォールは無効にし VirtualBox のネットワークを「NAT + ポートフォワード」もしくは「ホストオンリーアダプター」で試したが一向につながってくれない。SSH で接続はできるのだが、はてさて困った。
※解決方法をご存知の方、ご一報ください。
そうだ、デプロイしよう!
目的は hanami を動かしたいだけである。でも、自前の Macbook にはインストールしたくない。そんなワガママなことを考えていたので、てっとり早くどこかにデプロイしてみようと思った次第である。
デプロイ先はこのご時世なのでいっぱいあるのだが、何となく「無料で Ruby が使えそうなところ」を考えたら Heroku が思いついた。特にこだわりもないので Heroku にデプロイしてみる。
Heroku CLI
Heroku にデプロイするには Heroku CLI というものが必要らしいが、snap を用いたインストールをやっても一向にインストールされた気配がない。 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 して再度デプロイする。
時は来た
なんかそれっぽいもの出たので満足。