使用 .env 文件在生产环境中设置 SECRET_KEY_BASE

3
在我的生产环境根目录下有一个名叫`.env`的文件,其中定义了`SECRET_KEY_BASE`,该密钥用于配置文件`config/secrets.yml`中。问题是,在加载`config/secrets.yml`之前,我无法成功加载`.env`文件。我尝试使用`dotenv` gem,但没有成功。
在生产环境中有什么解决办法吗?
我不想为生产服务器上的`webmaster`用户全局设置它。`SECRET_KEY_BASE`值应该只能由应用程序访问。
我正在使用Rails 4.1。

你尝试过在你的 Gemfile 中使用 gem 'dotenv-rails' 吗? - house9
1
@house9 是的,那是我正在使用的宝石。 - Linus Oleander
你使用什么来部署你的应用程序? - user1724295
3个回答

4
我也使用dotenv宝石。在几乎所有情况下,它都能正常工作。
这是我的dotenv宝石配置(是的,我将dotenv放在了Gemfile中)。我只创建了一个名为aaaaa.rb的初始化文件。
config/initializers/aaaaaa.rb
#obscure name because rails load initializers/* files based on alphabets 
 require 'dotenv'
 Dotenv.load  

而且,如果没有的话,我会在config/boot.rb文件中最终执行此操作。

ENV["SECRET_KEY_BASE"] = "foobar"

你介意展示在生产环境中加载 dotenv 的代码吗?我无法在 config/secrets.yml 文件加载之前及时加载它。 - Linus Oleander
@Oleander,好的,我已经添加了相关信息。 - Paritosh Piplewar
在生产环境中使用初始化文件加载 dotenv 是可行的。我之前尝试过在 application.rb 文件中加载,但不知何故并未成功。谢谢! - Linus Oleander
使用您的解决方案后,我收到了“无法加载文件--dotenv”的错误。 - Alexander Ulitin
我认为你在将dotenv放入Gemfile后忘记运行bundle install了。 - Paritosh Piplewar

2

我也遇到了这个问题。这是我解决的方法。我按照文档说明尽早初始化dotenv

# config/application.rb
Bundler.require(*Rails.groups)

Dotenv::Railtie.load

HOSTNAME = ENV['HOSTNAME']

但是我遇到了这个错误(问题 #155)

gems/dotenv-rails-1.0.2/lib/dotenv/rails.rb:17:in `load': undefined method `join' for nil:NilClass (NoMethodError)

解决方法(也在问题 #155中有记录)是将 Dotenv::Railtie.load 替换为:

Dotenv.load(File.expand_path("../../.env.#{Rails.env}", __FILE__))

显然,这只是在使用Rails 4.1时出现的问题。


-2

我之前也遇到了这个问题,但是通过在我的secrets.yml文件中添加以下内容,我成功解决了它:

production:
  secret_key_base: ENV["SECRET_KEY_BASE"]

删除<%= %>后,它就正常工作了。


4
实际上,它只是将密钥设置为'ENV["SECRET_KEY_BASE"]'字符串。这并不是特别安全的。 - Dmitry Sokurenko
不要跟随这个答案。请阅读上面的评论。 - Jey Geethan

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接