【问题标题】:Where is SECRET_KEY_BASE environment variable located when I start Rails app in Production当我在生产中启动 Rails 应用程序时,SECRET_KEY_BASE 环境变量位于哪里
【发布时间】:2016-09-16 06:01:43
【问题描述】:

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

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,但问题没有那么详细,也没有提供答案。

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

    当你运行这个时:

    SECRET_KEY_BASE='rake secret' rails s -e production
    

    您实际上并没有为将来的您“保存”密钥。您正在一次性定义它。每当您运行 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

    【讨论】:

    • 感谢您的回复。在SECRET_KEY_BASE='rake secret' rails s -e production 上跟进问题。我仍然对实际设置的位置感到困惑?它设置在我的计算机系统中的某个地方,但无法访问?我不太明白它是如何设置的,但随后无法访问。那么设置它有什么意义呢?我知道为什么需要设置它以及它的作用,但是如果我自己无法访问它,我只是不知道系统如何访问它。
    • 当你这样做时(使用命令行参数)它只存储在内存中。
    猜你喜欢
    • 2013-03-06
    • 1970-01-01
    • 2014-10-17
    • 2011-10-25
    • 1970-01-01
    • 1970-01-01
    • 2013-06-27
    • 1970-01-01
    • 2016-10-27
    相关资源
    最近更新 更多