はじめに
Hanamiの設計は良いですね。
Hanamiを使うことで、RubyでDDD(ドメイン駆動設計)を実践できるようになった感があります。
はじめてHanamiを使って本番環境構築をした時に環境変数周りで詰まったので、後続の方のためにここにメモを残します。
バージョン情報
cat .ruby-version
# 2.5.1
cat Gemfile.lock | grep hanami\
# hanami (1.1.1)
# hanami (~> 1.1)
TL;DR
-
HANAMI_ENV=production
だと、dotenvファイルを読み込まない件-
/etc/environment
なり、環境変数に諸々入れておいてください
-
何が起きたか
Hanamiをnewするとわかるのですが、development環境、test環境ではdotenvというgemを使って環境変数を管理しているのです。
見てみましょう。
mkdir tmp && cd tmp
rbenv local 2.5.1
bundle init
echo "gem 'hanami'" >> Gemfile
bundle install
bundle exec hanami new my_first_hanami -d mysql2 --application-name=web --test=rspec --template=slim
# create .hanamirc
# create .env.development
# create .env.test
# create README.md
# ~~~~~~~~~~~~~~~~(略)~~~~~~~~~~~~~~~~~~~~~~
# append .env.development
# append .env.test
cat .env.development
# # Define ENV variables for development environment
# DATABASE_URL="mysql2://localhost/my_first_hanami_development"
# SERVE_STATIC_ASSETS="true"
# WEB_SESSIONS_SECRET="f76e2a0ea820350436c3fe95fdd1b4999969fbad993fe112baae4e480d784839"
.env.development
、.env.test
というファイルが作られ、DATABASE_URL
などの変数が定義されているのがわかるかと思います。
起動してアクセスしてみましょう。
bundle exec hanami s
curl http://localhost:2300 -D - -s -o /dev/null # Responseヘッダーのみを取得する
# HTTP/1.1 200 OK
# Content-Length: 14911
# Server: WEBrick/1.4.2 (Ruby/2.5.1/2018-03-29)
# Date: Sat, 31 Mar 2018 14:06:04 GMT
# Connection: Keep-Alive
無事、200 OK
が返ってきていることがわかるかと思います。
では、この調子で本番で動かすとどうなるでしょうか。HANAMI_ENV=production
で動かしてみます。
HANAMI_ENV=production bundle exec hanami s
curl http://localhost:2300 -D - -s -o /dev/null
# HTTP/1.1 500 Internal Server Error
# Content-Type: text/html;charset=utf-8
# Server: WEBrick/1.4.2 (Ruby/2.5.1/2018-03-29)
# Date: Sun, 01 Apr 2018 03:30:37 GMT
# Content-Length: 7453
# Connection: Keep-Alive
500 Internal Server Error
が返ってきました。どういうことでしょうか。
Boot Error
Something went wrong while loading /Users/shinse/go/src/github.com/mrdShinse/my_first_hanami/config.ru
Hanami::Model::Error: LoadError: cannot load such file -- sequel/adapters/
起動時のエラーで、Hanami::Model
あたりでsequel/adapters/
というファイルがない??なんのこっちゃ?
これ、実はproductionで動かすことで環境変数DATABASE_URL
が空になり、DB接続するsequelというgemが吐いたエラーをHanami::Modelがキャッチしているのですが...
メッセージが判りづらい笑
これは結構ハマりましたw
Hanamiはdotenvを使ってるので.env
とか.env.local
とか.env.production
とか試したのですが、僕が使っているバージョンのHanamiはproductionの場合に.env
を読んでいなかったのもハマりポイントでした。
DATABASE_URL
さえ渡してあげれば解決するので、
HANAMI_ENV=production DATABASE_URL="mysql2://localhost/my_first_hanami_production" bundle exec hanami s
とかでも解決するのですが、後々capistranoでdeployする場合にbundler経由で環境変数を渡す方法が面倒だったこともあり、僕は/etc/environment
に環境変数を定義することにしました
こちらからは以上です!