Capistrano部署Rails应用遇生产环境密钥解密问题求助
解决Capistrano部署Rails应用时生产环境密钥缺失问题
问题本质
你碰到的是Rails 5.2+多环境凭据管理的核心问题:
- 默认的
credentials.yml.enc对应开发/测试环境,靠根目录的master.key解密 - 生产环境的
production.yml.enc需要专属的config/credentials/production.key解密,或通过环境变量RAILS_MASTER_KEY传入该密钥内容
你现在有生产环境加密文件production.yml.enc,但缺少对应的解密密钥文件,导致部署时系统无法解密配置,抛出错误。
解决方案(两种可选)
方案一:适配多环境凭据配置
- 获取/生成production.key
- 如果是你之前生成的
production.yml.enc,找一下当时自动生成的config/credentials/production.key(注意这个文件不会自动提交仓库,可能在本地或备份里) - 找不到的话,重新生成生产环境凭据:
命令执行后会自动创建rails credentials:edit --environment productionproduction.key和production.yml.enc,编辑时填入生产环境需要的配置(比如secret_key_base),保存退出即可。
- 如果是你之前生成的
- 部署密钥到服务器
- 不要把
production.key提交Git!可以手动上传到服务器的config/credentials/目录,权限设为600(仅服务器用户可读) - 更安全的方式:在服务器环境变量中设置
RAILS_MASTER_KEY,值就是production.key里的字符串内容。
- 不要把
方案二:简化为单凭据文件(适合新手)
如果不想用多环境拆分,直接统一用默认凭据:
- 合并生产环境配置到默认凭据
运行命令打开默认凭据文件:
添加生产环境配置:rails credentials:edit
保存退出。production: secret_key_base: 你的生产环境secret_key_base值 - 更新服务器密钥配置
- 在服务器设置环境变量
RAILS_MASTER_KEY,值为本地根目录master.key里的内容 - 或手动上传
master.key到服务器根目录,权限设为600
- 在服务器设置环境变量
- 调整secrets.yml(可选)
你的secrets.yml生产环境用的是SECRET_KEY_BASE环境变量,可改成读取凭据:
也可以直接删掉production: secret_key_base: <%= Rails.application.credentials.production[:secret_key_base] %>secrets.yml(Rails 5.2+官方推荐用credentials替代secrets.yml)。
关键注意事项
- 所有密钥文件(
master.key、production.key)绝对不能提交到Git仓库,确保.gitignore已包含这些文件 - Capistrano不会自动上传密钥文件,需手动处理或用环境变量传递
- 重新生成凭据后,要保证服务器上的加密文件和本地一致,密钥也要对应
内容的提问来源于stack exchange,提问作者Sabita Nepal
相关产品推荐
相关产品推荐

