Rails 7.0.6通过Capistrano部署时遇Missing `secret_key_base`错误求助
Rails 7.0.6 + Ruby 3.2.2 部署时缺失secret_key_base的解决方案
问题描述
使用Rails 7.0.6和Ruby 3.2.2,通过Capistrano执行cap production deploy部署到远程服务器时,触发如下错误:
rake stdout: Nothing written
rake stderr: rake aborted!
ArgumentError: Missingsecret_key_basefor 'production' environment, set this string withbin/rails credentials:edit
参考Ubuntu 20.04的Rails部署教程,已尝试以下无效方案:
- 在服务器应用目录添加
.rbenv-vars文件:
DATABASE_URL = postgresql://username:pass@127.0.0.1/myapp_production SECRET_KEY_BASE = secret key here by typing in local machine "bundle exec rails secret"
- 执行
nano bin/rails credentials:edit,修改了bin目录下的rails脚本文件,添加secret_key_base = secret_key_here ******,问题未解决。
可行解决方案
方案一:使用Rails官方Credentials加密机制
你之前错误编辑了bin/rails脚本,正确的credentials配置需要操作加密的config/credentials.yml.enc文件:
- 本地生成并配置生产环境密钥
在本地项目根目录执行:
bundle exec rails credentials:edit
首次执行会自动生成config/credentials.yml.enc(加密配置文件)和config/master.key(解密密钥)。在打开的YAML编辑界面中添加:
production: secret_key_base: 此处填入本地执行`bundle exec rails secret`生成的密钥
保存退出后,Rails会自动加密配置文件。
- 部署解密密钥到服务器
master.key是解密配置的核心,选择以下一种方式部署:
- 方式A:将本地的
config/master.key上传到服务器应用目录的config文件夹(注意:该文件默认在.gitignore中,禁止提交到Git) - 方式B:在服务器上设置环境变量
RAILS_MASTER_KEY,值为本地master.key的内容
- 配置Capistrano同步加密配置文件
在config/deploy.rb中添加:
append :linked_files, "config/credentials.yml.enc"
确保Capistrano将加密配置文件部署到服务器。
方案二:直接设置服务器环境变量
若不想使用加密机制,可直接在服务器全局环境变量中配置:
- 登录服务器,编辑shell配置文件(如
~/.bashrc、~/.zshrc或/etc/profile) - 添加环境变量:
export SECRET_KEY_BASE="填入本地`bundle exec rails secret`生成的密钥"
- 重新加载配置文件:
source ~/.bashrc # 对应你使用的shell配置文件
- 配置Capistrano传递环境变量(可选)
在config/deploy.rb中添加:
set :default_env, { 'SECRET_KEY_BASE' => ENV['SECRET_KEY_BASE'] }
内容的提问来源于stack exchange,提问作者John Sall
相关产品推荐
相关产品推荐

