ruby-on-rails - ENV 变量中的 Capistrano 和 API key ?

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

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

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

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

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

我也在考虑将 api key 添加到服务器上某处的文件并将其符号链接(symbolic link)到 ruby​​ 文件目录和 rails 目录,然后打开并读取它。这可能吗?

最佳答案

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

rbenv-变量

如果您在服务器上通过 Rbenv 使用 Ruby,那么您很幸运。有一个名为 rbenv-vars 的 Rbenv 插件它会自动将环境变量注入(inject)到任何 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 添加到 :链接文件。现在每个部署都将链接到它。使用 KEY=value 语法声明您的变量。

.bashrc

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

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

CentOS 可能是一个不同的故事,所以 YMMV。

关于ruby-on-rails - ENV 变量中的 Capistrano 和 API key ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39624035/

相关文章:

ruby - 为什么你会 `replace` 而不是将新对象分配给同一个变量?

ruby - 如何确定 Ruby 脚本的 shell 执行上下文?

laravel - 如何将图像从 Laravel Controller 发送到 API Rest

PHP - 404 视频未找到(视频 : PUT) YouTube API

javascript - 无法访问 JSON 数组中的项目?

ruby-on-rails - 使用引擎时如何找到模型中的资源路径?

ruby-on-rails - Ruby 和 CSS 代码

ruby-on-rails - 如何创建由 validates_inclusion_of 设置的有效值的下拉列表?

mysql - Ruby on Rails/Activerecord mySQL 建模

ruby - 将成功和失败处理程序传递给 ActiveJob