我正在使用 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/