user3334207
user3334207

Reputation: 155

secrets.yml environment variable not working in Rails 4.1.4

I am in the process of deploying a Rails app.
I get errors missing secret_key_base in the nginx log file when I have secret_key_base: <%= ENV["SECRET_KEY_BASE"] %> in the secrets.yml file.
I have generated the secret using rake secret in the console and placed in ~/.bashrc as
export SECRET_KEY_BASE="secret" From the console I run echo $SECRET_KEY_BASE and copy secret to secrets.yml replacing <%= ENV["SECRET_KEY_BASE"] %> with secret.
Then everything works fine and the application runs fine in production environment.
I would rather not keep secret in secret.yml and I do not know how to correct this or what I am doing wrong.
Does anyone have any suggestions?

Upvotes: 1

Views: 1632

Answers (3)

mabako
mabako

Reputation: 1183

If you use passenger, add

passenger_set_cgi_param SECRET_KEY_BASE "yoursecret";

to your nginx configuration in the relevant section. See this section in the passenger user guide.

Upvotes: 3

Jay Mitchell
Jay Mitchell

Reputation: 1240

In production ~/.bashrc might not be read - e.g., you run as a different user, nginx might not read ~/.bashrc before starting, etc. Lots of people run into this issue.

A common approach to this is to handle environment configuration like Rails handles database configuration. Create a config/something.yml file with settings for each environment, then read that yaml in a config/initializers/something.rb initializer and use the values for the specific environment. The rails_config and figaro gems automate this approach. I've often just done it without a gem, as it's not terribly difficult. The key, as with database.yml, is that you never want to check this into source control - use .gitignore with git.

If you want to stick with setting your secret key base using an environment variable, then how you do that depends on your production machine, and how you provision it and deploy your code. With Heroku, it's simple enough to just pop into the Heroku console and set it. For other situations, you could use something like Chef/Puppet/Ansible to set the environment variable for your server. Another approach would be to push that information using Capistrano.

Upvotes: 0

Ian M
Ian M

Reputation: 731

You can put the secret base in /config/initializes/secret_token.rb:

SampleApp::Application.config.secret_key_base = 'Your_Base_here'

EDIT: This is kind of discouraged in many cases, so edit your .env file and set your key base:

SECRET_KEY_BASE=Your_base_here

and put your secrets.yml back to:

<%= ENV["SECRET_KEY_BASE"] %>

You could alternatively use /config/initializes/secret_token.rb:

SampleApp::Application.config.secret_token = ENV['SECRET_TOKEN']

Which will give you the same result, being more secure. If you are then planning on pushing this to Heroku:

heroku config:set SECRET_KEY_BASE=$SECRET_KEY_BASE

Upvotes: -1

Related Questions