rails5.1でproductionモード起動したんだけど、
すぐにrails5.2でやることになったので続編
<Rails5.1の時の話>
railsをproductionモードで起動する[Rails 5.1]
内容
- rails5.2でproductionモード起動した時の手順
- rails5.1の時と同様、railsとmysqlのコンテナをdocker-composeで起動する
手順
config/credentials.yml.encを生成する
Rails5.1では「secrets.yml.enc」を生成したが、
Rails5.2では「credentials.yml.enc」を使う
以下のコマンドで生成する
エディタにvimを指定しているが、他のエディタでも大丈夫
EDITOR="vim" rails credentials:edit
dockerコンテナにvimがない場合、コンテナ内でインストールが必要
(コンテナdownすると消えてしまうけど、一時的なので問題なし)
apt-get update
apt-get install vim
vimが起動されてsecret_key_baseを編集できるようになる
今回は編集を行わずに終了する(":q"でOK)
config/credentials.yml.enc
に暗号化後の内容が保存される
暗号の複合キーであるconfig/master.key
が生成される
セキュリティの観点からこのファイルはバージョン管理システムに保存しないこと
(.gitignore
に自動追加されるが変更しないこと)
config/environments/production.rb を変更
productionモードに合わせて設定を変更する。
config.eager_load = false
config.assets.compile = true
config.require_master_key = true
config.serve_static_files = true
config.assets.js_compressor = Uglifier.new(harmony: true)
ハマったポイントは
config.eager_load = false
この部分。
railsでプロジェクトを作成した時に設定される標準は
config.eager_load = true
となっている。
このままだと、"link_to"などでルーティングのprefix("rails routes"で表示される一番左の項目)を遷移先を指定した場合に、「そんなルーティングないんだよ!」って怒られる。
app配下をアプリケーション起動時に全部読み込んでクラスの存在確認をするみたい?
viewがroutes.rbより先に読み込まれてるんかな・・・。
railsをproductionモードで起動させる
今回はdocker-composeでコンテナ起動させているので、
docker-compose.ymlで起動モードを指定する。
以下は対象の行だけ。
command: bundle exec unicorn -c config/unicorn.rb -E production -l 3000
environment:
RAILS_ENV: 'production'
RACK_ENV: 'production'
最後に
config.eager_load
がtrueの場合にエラー終了することにかなりハマった。
クラス検証の順番がイケてないのは、rails5.2だから?
うーん。深く追ったらいいのかなぁ。と思いつつ・・・おっけーかな。
そろそろ溜まってるネタを吐き出していかなければー