91s

プログラミング関係、日記などを書きます

Rails6 staging環境でunicornが動かないときに確認すること

  • 結論
    • database.ymlにrubyを埋め込む時は<%= =%>で囲うのを忘れないようにする!!
    • ymlの中にruby埋め込んだら使われずとも実行されるので全ての環境でcredentials:editで該当項目を設定しておくこと

それは、unicornの謎エラー、「master failed to start, check stderr log for details」と格闘していたときのこと...

credentialsではこのように設定しており、

db:
    host: db_host
    username: root
    password: password

こうやって取得しようとしたら....

staging:
  <<: *default
  database: db_staging
  host: Rails.application.credentials.db.host
  username: Rails.application.credentials.db.username
  password: Rails.application.credentials.db.password

サーバー側で以下のエラー発生

Unknown MySQL server host 'Rails.application.credentials.db.host' (-2) (Mysql2::Error::ConnectionError)

ネット記事を参考に以下のように修正

staging:
  <<: *default
  database: db_staging
  host: Rails.application.credentials.db[:host]
  username: Rails.application.credentials.db[:username]
  password: Rails.application.credentials.db[:password]

しかしこれでもなお動かない。。

Unknown MySQL server host 'Rails.application.credentials.db[:host]'

rails cの中で確認した時は動いたのに... あれ...?

よく見たら上の方に

pool: <%= ENV.fetch("RAILS_MAX_THREADS") { 5 } %>

こんな表記があるぞ...?? erbでもないのになんで囲っているんだろう...??

... ... ... ......あ!!!!

このファイル.rbじゃない、.ymlだ!!!!!!

staging:
  <<: *default
  database: db_staging
  host: <%= Rails.application.credentials.db[:host] %>
  username: <%= Rails.application.credentials.db[:username] %>
  password: <%= Rails.application.credentials.db[:password] %>

これでとりあえず取得することはできるっぽい。

その後、試しにrspecを実行したところ、以下のエラーが出た。

Failure/Error: require File.expand_path('../config/environment', __dir__)

NoMethodError:
  Cannot load database configuration:
  undefined method `[]' for nil:NilClass

あれ、credentials使ったの、staging環境だけなのに... と思ったのですが、調べたところどうやら呼ばれなくても実行されるみたいです。

なので、test, staging, developmentの環境で

rails credentials:edit --environment ●● (●●は各環境) でstagingと同様に設定を行いました(値は仮のもので問題ないです)

ここまでして無事にローカル環境で動きました。

この後、CircleCIでまた少し詰まったのですがrailsとはあまり関係ないので別記事にしようと思います。

最後までお読みいただき、ありがとうございます。