【问题标题】:Capistrano and API keys in ENV variables?ENV变量中的Capistrano和API密钥?
【发布时间】:2017-01-30 03:29:46
【问题描述】:

我正在使用 Capistrano 部署我的 rails 应用程序。我想将服务器上的一些 API 密钥保存为环境变量。我使用 Capistrano 部署的 Rails 应用程序应该可以访问这些 API 密钥。那些作为守护进程运行的单独的 ruby​​ 文件也应该可以访问这些 API 密钥。

在环境变量中设置 API 密钥似乎是理想的解决方案,但是,我无法在我的 rails 应用程序中使用 ENV["SOME_KEY"] 访问它们。

根据this post,由于 capistrano 以非交互和非登录方式运行,~/.bashrc~/.bash_profile 没有加载。流程图建议我应该使用$BASH_ENV

我可以在$BASH_ENV 中添加我的api 密钥,然后在我的rails 应用程序和带有ENV["SOME_KEY"] 的守护程序的ruby 文件中访问它们吗?

我还在考虑将 api 密钥添加到服务器某处的文件中,并将其符号链接到 ruby​​ 文件目录和 rails 目录,然后打开并读取它。这可能吗?

【问题讨论】:

  • 在尝试正确传播环境变量后,我个人选择将机密等存储在版本控制系统中未包含的目录中的文件中。小心点!
  • 检查 dotenv gem,它基本上按照@ollpu 所说的去做。 github.com/bkeepers/dotenv
  • @ollpu:所以基本上是在部署后手动将文件添加到 rails 目录?将这些文件添加到目录后如何读取它们?
  • 查看服务器操作系统的文档。几乎总有一种方法可以以独立于 shell 的方式设置 ENV 变量。
  • 例如,您可以将它们添加到/etc/rc.local/etc/environments。请告知您在服务器上使用的操作系统以获取详细说明。

标签: ruby-on-rails ruby api environment-variables capistrano


【解决方案1】:

根据我的经验,有几种方法可以很好地与 Capistrano 配合使用。

rbenv-vars

如果您在服务器上通过 Rbenv 使用 Ruby,那么您很幸运。有一个名为rbenv-vars 的 Rbenv 插件可以自动将环境变量注入到任何 Ruby 进程中,其中包括您的 Rails 应用程序。只需使用KEY=value 语法将您的变量添加到服务器上的~/.rbenv/vars。就是这样。

dotenv

dotenv gem 是一个类似的解决方案,但它可以作为添加到 Rails 应用程序的 gem,不需要 Rbenv 或任何其他支持工具。将dotenv-rails 添加到您的 Gemfile 并部署。 Dotenv 将自动在 Rails 应用程序的根目录中查找 .env.production 文件。对于 Capistrano,在 Capistrano 的 shared 目录内的服务器上创建一个 .env.production 文件,然后将 .env.production 添加到 :linked_files。现在每个部署都将链接到它。使用KEY=value 语法声明变量。

.bashrc

在服务器上~/.bashrc 文件的最顶部使用export KEY=value 语法声明您的变量。在 Ubuntu 上,即使在非交互式 SSH 会话期间也会评估此文件。只需确保将声明放在顶部,在此 case 语句之前:

# If not running interactively, don't do anything
case $- in
    *i*) ;;
      *) return;;
esac

CentOS 可能是另一回事,所以 YMMV。

【讨论】:

  • dotenv 听起来不错,但是在部署之前如何在本地测试呢?
  • dotenv 在本地工作方式相同。只需将 KEY=value 变量放入 Rails 项目根目录的.env.development 中,然后使用rails server 正常启动应用程序。这些变量将通过ENV 加载和使用。您可能需要先运行spring stop 以保证冷启动。
【解决方案2】:

我前段时间制作了一个 Capistrano 插件capistrano-env_config,用于跨 Capistrano 集群管理和同步环境变量,该插件通过修改 /etc/environment 文件以使环境变量在整个系统中可用。它易于使用,类似于使用 Heroku 工具带设置环境变量的方式。以下是一些示例:

cap env:list
cap env:get[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:unset[VARIABLE_NAME, VARIABLE_NAME, ...] 
cap env:set[VARIABLE_NAME=VALUE, VARIABLE_NAME=VALUE, ...] 
cap env:sync

【讨论】:

    猜你喜欢
    • 2020-10-02
    • 2011-11-01
    • 1970-01-01
    • 2016-07-22
    • 2012-03-19
    • 2014-04-26
    • 2021-12-21
    • 2021-03-26
    • 1970-01-01
    相关资源
    最近更新 更多