36
35

More than 3 years have passed since last update.

Rails 6でCapistranoでデプロイする際のCredentials関連エラーに対処する

Last updated at Posted at 2019-12-06

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.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を参照するためのシンボリックリンクを貼る記述を追加する。

config/deploy.rb
append :linked_files, 'config/credentials/production.key'

※appendはCapistrano 3.5以降可能な書き方。それ以前のバージョンならsetを使えば良い。

今回の動作環境では、下記は設定しなくても正しく動いたが、下記設定はmaster.key(今回はproduction.key)を使うことを保証するため、設定することが推奨されてるらしい。

config/environments/production.rb
config.require_master_key = true

上記を設定した上でCapistranoのデプロイコマンドを実行すると、失敗していたassets:precompileが通るようになる!

36
35
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
36
35