在生产

时间:2016-09-15 21:44:40

标签: ruby-on-rails ruby

Rails 4 In Action Book中,它指出在进行其他一些设置后:在生产模式下启动rails应用程序的最终设置(使用web brick)是在终端输入此命令:

SECRET_KEY_BASE='rake secret' rails s -e production

我正在尝试查看SECRET_KEY_BASE的环境变量的存储位置。

/app/config/secrets.yml中,它表示secret_key_base变量是一个环境变量:

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

但我在.bashrc.bash_profile内查看,而变量SECRET_KEY_BASE不在那里。

最终我想知道:环境变量及其价值在哪里?它存储在我的rails应用程序中的某个位置吗?如果我把这个应用程序推送到github,我希望不是出于安全目的。我认为它不是存储在应用程序中,而是存储在我的计算机系统中。在不同的终端窗口中,我echo $SECRET_KEY_BASE但没有返回任何内容。

提前感谢您帮助我理解丢失的部分。

作为旁注:我知道this question,但问题并不详细,也没有提供答案。

1 个答案:

答案 0 :(得分:1)

运行时:

SECRET_KEY_BASE='rake secret' rails s -e production

你实际上并没有“拯救”#39;未来你的秘密钥匙。您一次性定义它。无论何时运行Ruby命令,都可以设置临时环境变量:

# from shell
KEY="VAL" OTHER_KEY=OTHER_VAL ruby my_command.rb

# from the ruby script
puts ENV["KEY"] # => "VAL"
puts ENV["OTHER_KEY"] # => "OTHER_VAL"

要保留环境变量,您有几个选项。您可以在源代码中对它们进行硬编码,但这可能不是一个好主意,因为如果您将代码推送到Github,任何人都可以看到它。无论如何,这是环境变量的一种,你可以让它们保持系统特定。

选项A

您可以在.bashrc.bash_profile

中进行设置

首先得到rake secret的结果(将是一个随机字符串)并设置一个shell变量:

KEY=`rake secret` # uses backticks to get command result

然后在bashrc中添加一行以将其导出:

echo -e "export SECRET_KEY_BASE=$KEY" >> ~/.bashrc

选项B

我建议您这样做,您可以使用dotenvfigaro以特定于应用的方式管理您的环境变量,即不会弄乱您的bashrc

例如,使用dotenv,您需要创建一个.env文件,其中包含:

# change this to the result of rake secret  
SECRET_KEY_BASE=j3e2dd293d 

将其添加到gitignore,将其从源代码管理中排除。

然后在你的ruby应用程序中调用

require 'dotenv'
Dotenv.load

并且您的ENV["SECRET_KEY_BASE"]将被设置。

如果需要,可以创建一个.env.example文件(包含在源代码管理中),该文件显示需要定义哪些环境变量。然后,当克隆应用时,您可以运行mv .env.example .env并自定义.env