我正在使用Capistrano部署我的rails应用程序。我想在服务器上保存一些API密钥作为环境变量。使用Capistrano部署的rails应用程序应该可以访问这些API密钥。这些API密钥也应该可以作为守护程序运行的单独ruby文件访问。
在环境变量中设置API密钥似乎是理想的解决方案,但是,我无法使用sapply
在我的rails应用中访问它们。
根据this post,因为capistrano以非交互式和非登录方式运行,因此未加载ENV["SOME_KEY"]
和~/.bashrc
。该流程图表明我应该使用~/.bash_profile
。
我可以在$BASH_ENV
中添加我的api密钥,并在我的rails应用程序和带有$BASH_ENV
的守护程序的ruby文件中访问它们吗?
我还想到将api密钥添加到服务器上的某个文件中并将其符号链接到ruby文件dir和rails目录,然后打开并阅读它。这有可能吗?
答案 0 :(得分:15)
根据我的经验,有几种方法可以很好地与Capistrano配合使用。
<强> rbenv-VARS 强>
如果您在服务器上使用Ruby via Rbenv,那么您很幸运。有一个名为rbenv-vars的Rbenv插件会自动将环境变量注入任何Ruby进程,其中包括您的Rails应用程序。只需使用~/.rbenv/vars
语法将变量添加到服务器上的KEY=value
即可。那就是它。
<强> dotenv 强>
dotenv gem是一个类似的解决方案,但它可以作为您添加到Rails应用程序的gem,并且不需要Rbenv或任何其他支持工具。将dotenv-rails
添加到您的Gemfile并进行部署。 Dotenv会自动在Rails应用程序的根目录中查找.env.production
文件。对于Capistrano,在Capistrano的.env.production
目录中的服务器上创建一个shared
文件,然后将.env.production
添加到:linked_files
。现在每个部署都将链接到它。使用KEY=value
语法声明变量。
<强>的.bashrc 强>
使用export KEY=value
语法在服务器上~/.bashrc
文件的最顶部声明变量。在Ubuntu上,即使在非交互式SSH会话期间也会评估此文件。只需确保在此case语句之前将声明放在顶部:
# If not running interactively, don't do anything
case $- in
*i*) ;;
*) return;;
esac
CentOS可能是一个不同的故事,所以YMMV。
答案 1 :(得分: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