背景
Productionモードで起動するときにはconfig/credentials.yml.enc
の中身を復号して環境変数”SECRET_KEY_BASE”として使用するけど、”SECRET_KEY_BASE”ってRailsで暗号化とかするときのキーとして使用されるからそもそもconfig/credentials.yml.enc
ってコミットしたくなくね?って話。
バージョン管理に登録する/しないは別の議論にするとして、config/credentials.yml.enc
を使用しないで起動する方法を試してみることにした。
前提
- Docker上でRailsが起動している(ローカルで起動している方は読み替えてください)
- ローカルPCで動作させる
- 1度credentials.yml.encを生成している("rails credentials:edit"実行済み)
手順
config/credentials.yml.encを削除する
以下のファイルを削除する
- config/credentials.yml.enc
- config/master.key
環境変数にSECRET_KEY_BASEを追加する
今回はDocker上でRailsを起動させているため、docker-compose.ymlに環境変数を追加する
version: '3'
services:
・
・
web:
environment:
SECRET_KEY_BASE: ${SECRET_KEY_BASE}
・
・
ここでハッシュ値を書くと秘匿情報が丸見えで意味がないため、外部ファイルから設定する
**${SECRET_KEY_BASE}**の部分について、docker-compose.ymlの階層(基本はRailsのルートディレクトリ)と同じ階層に".env"ファイルを配置しておくと、そこに記載されている変数に設定された値を設定してくれる
# docker-compose.ymlの${}と同じ変数名にすること
SECRET_KEY_BASE=xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx
これにより秘匿情報をコミットすることはなくなる(ただし、.envファイルは別の管理方法で管理することになる)
master_keyを使用しないようconfigを定義する
master_keyを使用する/しないの設定項目があるので、「使用しない」を定義しておく
定義されていない場合は定義する。trueが定義されている場合はfalseにする。
config.require_master_key = false
RailsをProductionモードで起動する
「config/credentials.yml.enc」が存在しない状態でProductionモードでの起動ができればOK
最後に
環境変数にハッシュ値が設定されているだけで良いのはびっくりした。が、特に難しいこともなくできることがわかった
実は"SECRET_KEY_BASE"はハッシュ値であればなんでも起動できたりする(なにかのファイルをmd5コマンドでハッシュ値を出したものでも)