Rails 6環境で、Capistranoでデプロイしようとすると、assets:precompile
のところでエラーが発生する現象が起きた。
エラーログをみると、下記のようにある。
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `rails credentials:edit`
production用の設定がうまくいかず、これを解決するまでに結構ハマったので、解決方法を書いておく。
動作環境
macOS 10.14.6
Rails 6.0.0
Ruby 2.6.2
Capistrano 3.11.2
デプロイ先 AWS Amazon Linux2
解決方法
production環境用にCredentialsの設定をする。
- Credentialsについては下記参照
Credentialsについて説明している多くの記事でcredentials.yml.encにdevelopmentとproductionの階層を作っているが、これはうまくいかなかった。
理由は、上記リンクに書いてあるように、Rails 6からは1つのCredentialsファイルに階層を作って管理するやり方ではなく、環境ごとに個別にファイルを作成するフラットな構造に変わったためだ。
Credentialsの設定はターミナルから次のように実行する。
EDITOR=vim rails credentials:edit --environment production
なお、環境変数EDITOR
が事前に設定してある場合は指定する必要はない。
--environment
については、bin/rails credentials:edit --help
に書いてある。
(helpがあるのに気づかずに随分遠回りした...)
上記を実行すると、編集画面が立ち上がるので、下記を設定して保存する。
secret_key_base: 任意の文字列を設定
環境を指定しないでrails credentials:edit
のように実行するとsecret_key_base
がデフォルトで設定されるが、今回のようにproduction等の環境を指定するとデフォルトでは設定されていないので、secret_key_base
を項目を記述し、任意の文字列を設定する。
上記設定を完了するとproduction用のmaster.keyであるproduction.keyと、それに対応するcredentials.yml.encであるproduction.yml.encがconfig/credentials配下に作成される。
その後、生成されたproduction.keyをデプロイ先のサーバにコピーする。
ここでのポイントは、デプロイ先はshared/config直下ではなく、credentialsディレクトリをconfigの下に作成してそこにproduction.keyを入れることだ。
(config直下ではうまくいかなかった。)
scpでコピーする場合は、下記のような形で実行。
scp -i SSHの鍵ファイル user@XXX.XXX.XXX.XXX:デプロイ先のRailsのroot/shared/config/credentials
次に、deploy.rbに、Railsがproduction.keyを参照するためのシンボリックリンクを貼る記述を追加する。
append :linked_files, 'config/credentials/production.key'
※appendはCapistrano 3.5以降可能な書き方。それ以前のバージョンならsetを使えば良い。
今回の動作環境では、下記は設定しなくても正しく動いたが、下記設定はmaster.key(今回はproduction.key)を使うことを保証するため、設定することが推奨されてるらしい。
config.require_master_key = true
上記を設定した上でCapistranoのデプロイコマンドを実行すると、失敗していたassets:precompile
が通るようになる!