Stan's blog

Ruby on Rails Docker

Rails master.key: что это такое и что с ним делать и при чем тут secret_key_base и Docker

8 января 2024
Kandinsky: Результат генерации по запросу "Docker Ruby on Rails master key", стиль: anime

Что это?

Rails master.key это ключ, который защищает credentials.yml.enc. Получается, что credentials.yml.enc это хранилище для всяких ключей (например для oath или от облачных хранилищ, типа Amazon S3).

В чем смысле?

credentials.yml.enc можно хранить в проекте, но без master.key прочитать его нельзя. master.key не надо хранить в проекте. Его можно передавать как-нибудь по-другому. Между командой разработки хоть по SMS. В docker (compose), как вариант, для него можно сделать свой volume:
./config/master.key:/my_blog/config/master.key
Но, зачем он в проекте, где не надо хранить всякие ключи? Очень просто! Есть ключ secret_key_base, который используется для криптования паролей (если использовать has_secure_password), а также для криптования cookie в котором лежит session.

Как обойти

Чтобы при сборке проекта, а точнее при компиляции assets, обойтись без master.key нужно использовать SECRET_KEY_BASE_DUMMY=1, в Dockerfile, например:
RUN SECRET_KEY_BASE_DUMMY=1 ./bin/rails assets:precompile
В production тоже можно обойтись без master.key. Надо задать переменную окружения SECRET_KEY_BASE

Как работать с master.key и credentials.yml.enc  

Чтобы сгенерировать новую пару master.key - credentials.yml.enc (старый credentials.yml.enc надо удалить)
EDITOR=echo rails credentials:edit
Естественно, после этого все старые сессии становятся невалидными, как и пароли has_secure_password.
Редактировать credentials.yml.enc можно командой (укажите любимый редактор)
EDITOR=vim rails credentials:edit
Просмотреть содержимое можно командой 
rails credentials:show