Rails密钥管理
什么是master.key
即Web应用中的对称加密,即加密用同一个密钥,解密也用同一个密钥。举例JWT加密解密需要一个key1,Sesion ID加密解密需要一个key2。
Rails解决了通过master.key + keys => encrypted
,encrypted + master.key => key
。即开发者在临时文件中写好了key,用master.key
把key加密,得到加密后的文件(.enc),删除临时文件后,key就无法被查看了,然后rails把.enc
存到git里,在把master.key排除git。
- 读取key
打开控制台输入bin/rails console
或bin/rails c
,会开启一个rails控制台。然后在控制台内输入Rails.application.credentials.secret_key_base
,Rails.application.credentials.[:key]([:key]为keyname)
,查看全部keyRails.application.credentials.config
。
- 写key
可以发现key所在的文件会自动销毁,.enc文件自动更新。
创建和编辑密钥:EDITOR="code --wait" bin/rails credentials:edit
或EDITOR="vim" bin/rails credentials:edit
Rails还支持多环境密钥
命令行EDITOR="code --wait" rails credentials:edit --environment production
,会得到两个文件config/credentials/production.key(被加入 .gitignore)
、config/credentials/production.yml.enc
,然后可以在控制台切换至prod环境查看RAILS_ENV=production rails c
,Rails.application.credentials.secret_key_base
。
- 开发环境
使用master.key
和credentials.yml.enc
,master.key
被git ignore
。如果.enc
不被 git ignore
,那就多人共用master.key
;如果.enc
要被git ignore
,那就每个人创建自己的master.key
。
- 生产环境
使用production.key
和production.yml.enc
,prodcution.key
被git ignore
,内容写到环境变量,.env
不被git ignore
,则读取key代码和开发环境一致。
然后需要将key写到环境变量中,打开set_up_host.sh
然后在docker run
命令中间添加-e RAILS_MASTER_KEY=$RAILS_MASTER_KEY
,然后在宿主机终端运行命令RAILS_MASTER_KEY=xxxxxxxxxxxxxxx mangosteen_deploy/setup_host.sh
。
解决数据库报错问题
修改database.yml
文件
production:
<<: *default
database: mangosteen_production
username: mangosteen
password: <%= ENV["DB_PASSWORD"] %>
host: <%= ENV["DB_HOST"] %>
更新执行脚本set_up_host.sh
# setup_host.sh 是启动docker环境
DB_PASSWORD=123456
# 容器密码
container_name=mangosteen-prod-1
# 容器名称
version=$(cat mangosteen_deploy/version)
# 部署版本
echo 'docker build ...'
docker build mangosteen_deploy -t mangosteen:$version
if [ "$(docker ps -aq -f name=^mangosteen-prod-1$)" ]; then
echo 'docker rm ...'
docker rm -f $container_name
fi
echo 'docker run ...'
docker run -eDB_HOST=$DB_HOST -e RAILS_MASTER_KEY=$RAILS_MASTER_KEY -e DB_PASSWORD=$DB_PASSWORD -d -p 3000:3000 --network=network1 --name=$container_name mangosteen:$version
echo 'DONE!'
在宿主机执行时候要运行参数DB_HOST=db-for-mangosteen DB_PASSWORD=123456 RAILS_MASTER_KEY=xxxxxxx mangosteen_deploy/set_up_host.sh
,然后还需要创建数据表docker exec -it mangosteen-prod-1 bin/rails bash
,bin/rails db:create db:migrate
。