コードロード

エラー討伐

【Rails×Capistrano】自動デプロイしようとしたら「ArgumentError: Missing `secret_key_base` for ‘production’ environment, set this string with `rails credentials:edit`」

エラー

ArgumentError: Missing `secret_key_base` for ‘production’ environment, set this string with `rails credentials:edit`

結論

この記事通りにやればうまく行った。

qiita.com

原因

上の記事でも述べられているように、私も同じく下記の記事通りにCapistranoの実装を進めていたところ、タイトルのエラーが出た。

qiita.com

解決までの流れ

ArgumentError: Missing secret_key_base for ‘production’ environment, set this string with rails credentials:edit でググってみた

qiita.com

いろいろ調べてみても、本番環境(サーバー)で設定したcredentials.yml.enc と master.key と、ローカルで設定したcredentials.yml.enc と master.key とが合致していないから、鍵と鍵穴がマッチしていなくこのタイトルのエラーがでるよ、という記事ばかりだった。

言われた通り、

[サーバーのappディレクトリ]$ rm config/credentials.yml.enc 
[サーバーのappディレクトリ]$ rm config/master.key

とやってみて、一度削除してから

[サーバーのappディレクトリ]$ EDITOR=vim rails credentials:edit

を打って再度生成。

そして生成されたcredentials.yml.enc と master.keyを、ローカルにコピペして、再度githubにプッシュした後、bundle exec cap production deployをするも、エラー内容は変わらず。

解決の兆しを発見

shikiyura.com

こちらの記事の下部に、Capistranoでデプロイ自動化するときに発生したエラーがいくつかまとめられていた。

よーくみると、

「secrets.yml」にかけ! 「master.key」をセキュアな方法でデプロイ先の「app_dir/shared/config」においてあげると動きます。 https://shikiyura.com/2018/05/ruby_rails-automate-deployment-by-capistrano/

との記載されている。

そういえば、Capistranoはshared配下に置かれるように、 config/deploy.rb で設定したような・・・

そして解決してくれる記事を発見!

Railsが標準でsecrets.ymlを見に行くので、ファイル名はsecrets.ymlになっていないといけないとのこと。

ローカルで設定したコードを下記の通り訂正。

# 訂正前
set :linked_files, fetch(:linked_files, []).push('config/settings.yml')

# 訂正後
set :linked_files, fetch(:linked_files, []).push('config/secrets.yml')

そしてサーバー側のファイル名も訂正。

$ cd /var/www/app名/shared/config
$ mv settings.yml secrets.yml

再度、 bundle exec cap production deploy を実行。

進んだ!!!

ちなみにサーバーの/shared/config/secrets.yml内にはrake secretコマンドを打って出てきたセキュアな値を貼り付ける。

[サーバーのappディレクトリ]$ rake secret
11111111111111122222222222223333333333333

[サーバーのappディレクトリ]$ vi shared/config/secrets.yml
production:
    secret_key_base: 11111111111111122222222222223333333333333