You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Fly.io部署Rails 7应用失败:已存master key仍提示缺失加密密钥

Rails 7 Fly.io部署:assets:precompile因Master Key失败的解决方案

核心原因

Fly.io的构建阶段(Docker Build)默认无法访问你设置的运行时环境变量/Secrets,哪怕你已经通过fly launch创建了RAILS_MASTER_KEY,预编译assets时也拿不到这个值;另外如果你的应用在assets构建过程中依赖了加密凭据里的内容(比如helper、配置里引用了Rails.application.credentials的值),虚拟密钥方案自然会失效。

可行解决方法

方法1:构建阶段传入真实Master Key(推荐)

通过Fly.io的构建参数将RAILS_MASTER_KEY传递到Docker构建过程:

  1. 修改Dockerfile的预编译步骤,添加构建参数引用:
# 在precompile前添加ARG声明
ARG RAILS_MASTER_KEY
RUN RAILS_MASTER_KEY=$RAILS_MASTER_KEY ./bin/rails assets:precompile
  1. 在fly.toml中配置构建参数,关联已有的RAILS_MASTER_KEY Secret:
[build.args]
  RAILS_MASTER_KEY = "${RAILS_MASTER_KEY}"
  1. 确认Secret已存在:
fly secrets list
# 若不存在,执行:fly secrets set RAILS_MASTER_KEY=你的真实密钥
  1. 重新执行fly deploy即可。

方法2:让Assets预编译不依赖加密凭据

如果你的assets构建完全不需要用到加密凭据里的内容,可以修改Rails配置,跳过预编译时的凭据加载:

  1. 在config/environments/production.rb中添加:
# 预编译assets时跳过凭据加载
if ENV['RAILS_PRECOMPILE'] == 'true'
  config.credentials.content_path = Rails.root.join('config', 'credentials', 'dummy.yml.enc')
end
  1. 创建一个空的虚拟加密凭据文件(避免报错):
# 生成虚拟密钥和凭据
echo "dummy_key" > config/master.key.dummy
rails credentials:edit --environment dummy --key config/master.key.dummy
# 保存退出即可,不需要添加任何内容
  1. 修改Dockerfile的预编译命令:
RUN RAILS_MASTER_KEY=$(cat config/master.key.dummy) RAILS_PRECOMPILE=true ./bin/rails assets:precompile
  1. 确保.dockerignore里没有排除config/master.key.dummy(仅测试环境使用,生产环境不推荐)。

方法3:直接将master.key打包进镜像(不推荐)

仅用于测试环境,将config/master.key加入Docker镜像:

  1. 从.dockerignore中移除config/master.key
  2. Dockerfile中无需额外修改,直接执行fly deploy

注意:此方法会将密钥暴露在Docker镜像中,生产环境绝对禁止使用。

内容的提问来源于stack exchange,提问作者Phil-6

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.24 23:32:51