Rails 8.0, три окружения: development, staging и production. Сейчас все ключи лежат в одном credentials.yml.enc, внутри разложены по staging: и production:, а в коде везде credentials.dig(Rails.env.to_sym, :payments, :key). Один раз уже перепутали ключ стейджа и прода. Как вы раскладываете? И кто у вас держит master.key, у нас он у троих в заметках.
«У троих в заметках» это то, от чего у меня дёргается глаз. Ключ должен жить в двух местах: в секретах CI и в переменной RAILS_MASTER_KEY на сервере. Разработчику для локалки нужен только ключ development, и то не всегда. Как только ключ прода оказался на ноутбуке, считай, что он уже в чьей-то резервной копии.
С Rails 6 есть отдельные файлы на каждое окружение, так и делай:
bin/rails credentials:edit --environment staging
bin/rails credentials:edit --environment production
# появятся config/credentials/staging.yml.enc и staging.key,
# config/credentials/production.yml.enc и production.key
Rails сам выбирает файл по RAILS_ENV, а в коде остаётся просто:
Rails.application.credentials.dig(:payments, :api_key)
# если ключ обязателен, пусть падает при загрузке, а не на первом платеже
Rails.application.credentials.fetch(:payments).fetch(:api_key)
Перепутать уже не получится: в production.yml.enc физически нет ключей стейджа. Файлы *.key генератор сам добавляет в .gitignore, но проверь. На сервер RAILS_MASTER_KEY своего окружения. Вариант с fetch хорош в инициализаторе: приложение не стартует без ключа, и это видно сразу на деплое, а не в три часа ночи.
И когда кто-то уходит из команды, а ключ у него был, перевыпускайте и master key, и сами секреты внутри
Ключ на сервер лучше отдавать через секреты оркестратора, а не класть в .env рядом с приложением, иначе он уедет в бэкап вместе с конфигом