Rails应用部署Fly.io失败:Stripe密钥为nil导致预编译报错
解决Fly.io部署Rails时assets:precompile无法读取Stripe凭证的问题
问题根源
Fly.io执行assets:precompile构建环节时,默认不会加载RAILS_MASTER_KEY对应的credentials文件,导致config/initializers/stripe.rb里调用Rails.application.credentials.stripe时返回nil,触发NoMethodError。
可行修复方案
方案1:让资产预编译任务强制加载credentials
在项目根目录的Rakefile中添加这段代码,增强assets:precompile任务的执行逻辑:
Rake::Task["assets:precompile"].enhance do Rails.application.load_credentials end
方案2:拆分密钥与公钥的加载方式(推荐)
资产预编译通常只用到Stripe公钥,这个密钥无需保密,可以直接用环境变量传递:
- 在Fly.io控制台配置
STRIPE_PUBLISHABLE_KEY环境变量 - 前端引用公钥时直接读取环境变量:
<%= tag.meta name: "stripe-publishable-key", content: ENV["STRIPE_PUBLISHABLE_KEY"] %> - 后端初始化Stripe密钥的逻辑保留,同时兼容环境变量(防止极端情况):
Stripe.api_key = Rails.application.credentials.dig(:stripe, :secret) || ENV["STRIPE_SECRET_KEY"]
方案3:在Fly.io构建阶段注入RAILS_MASTER_KEY
修改fly.toml的[build]区块,让构建过程能访问到密钥:
[build] [build.args] RAILS_MASTER_KEY = "${RAILS_MASTER_KEY}"
验证方法
- 本地模拟生产环境预编译:
RAILS_ENV=production RAILS_MASTER_KEY=你的密钥字符串 bundle exec rails assets:precompile,确认无报错 - 部署后通过
fly logs查看应用启动日志,确认Stripe初始化正常
内容的提问来源于stack exchange,提问作者blainefreestone
相关产品推荐
相关产品推荐

