【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`
結論
この記事通りにやればうまく行った。
原因
上の記事でも述べられているように、私も同じく下記の記事通りにCapistranoの実装を進めていたところ、タイトルのエラーが出た。
解決までの流れ
ArgumentError: Missing secret_key_base for ‘production’ environment, set this string with rails credentials:edit
でググってみた
いろいろ調べてみても、本番環境(サーバー)で設定した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をするも、エラー内容は変わらず。
解決の兆しを発見
こちらの記事の下部に、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