最近把 App 从 Rails 5.0.2 升级至 5.1.1,升级过程还算顺利。
既然升级到 Rails 5.1.1,所以就迫不及待的想使用一下这个新的特性。
在 Rails 5.1.1 之前,环境变量的设置在开发环境和生产环境里的设置总是避免不了的一种痛。 尤其是多台服务器部署更甚。
由于我的生产服务器用的是 nginx + passenger,因此无法直接读取环境变量。 后来参照网上一下建议,将一些私密信息直接写在 nginx 配置文件中。
passenger_env_var REDIS_PASSWD YOUR_REDIS_PASSWD;
对于多台服务器部署,一旦这些信息需要修改,就必须登陆每个服务器进行修改。
这严重不符合我们的 DRY 的精神 啊。
因此 Rails 5.1.1 引入了这个加密的 secret 特性。
使用方法:
首先,要安装,在你的 APP 目录下,运行以下命令
$ rails secrets:setup
这条命令会做三件事情:
- 在.gitignore 里添加一条记录,忽略
config/secrets.yml.key
文件。 - 创建config/secrets.yml.key文件, 这个文件保存的是
RAILS_MASTER_KEY
,一旦这个 key 丢失,就是神仙也帮补了你了 - 创建config/secrets.yml.enc, 这个文件保存的是加密的 secret 信息
通常,在生产服务器可以把这个信息保存至你相应的 nginx 配置文件中,如:
# /etc/nginx/sites-enabled/my-site.conf passenger_env_var RAILS_MASTER_KEY YOUR_PASSWD;
后续需要添加新的 secret 时,运行命令:
$ rails secrets:edit
运行命令后会解密config/secrets.yml.enc
文件中的内容,你可以按照普通的 yml 文件进行编辑。
应用:
在需要的时候可以在 APP 中,通过以下方式获取其中的 key 值。
Rails.application.secrets
会返回所有的 secrets,包含 secret.yml 文件中的内容,或者也可以用 YOUR_APP_NAME::Application.secrets
使用某个值:
Rails.application.secrets.my_secret_key
哦对了,别忘了在config/enviroments/production.rb
文件中添加
config.read_encrypted_secrets = true
UPDATE: shared 如果有一部分需要在不同环境中共享的环境变量,可以这样写:
default: &default mykey: value staging: <<: *default production: <<: *default
还有一种更好的方法,使用shared
:
shared: mykey: value staging: other: value production: other_key: value
在 rails 控制台可以试试:
$ RAILS_ENV=production rails c >> Rails.application.secrets => {:secret_key_base=>"3e3", :mykey=>"value"}
PS: 不过在开发环境是看不到 shared 下面的键值的。