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构建过程:
- 修改Dockerfile的预编译步骤,添加构建参数引用:
# 在precompile前添加ARG声明 ARG RAILS_MASTER_KEY RUN RAILS_MASTER_KEY=$RAILS_MASTER_KEY ./bin/rails assets:precompile
- 在
fly.toml中配置构建参数,关联已有的RAILS_MASTER_KEYSecret:
[build.args] RAILS_MASTER_KEY = "${RAILS_MASTER_KEY}"
- 确认Secret已存在:
fly secrets list # 若不存在,执行:fly secrets set RAILS_MASTER_KEY=你的真实密钥
- 重新执行
fly deploy即可。
方法2:让Assets预编译不依赖加密凭据
如果你的assets构建完全不需要用到加密凭据里的内容,可以修改Rails配置,跳过预编译时的凭据加载:
- 在
config/environments/production.rb中添加:
# 预编译assets时跳过凭据加载 if ENV['RAILS_PRECOMPILE'] == 'true' config.credentials.content_path = Rails.root.join('config', 'credentials', 'dummy.yml.enc') end
- 创建一个空的虚拟加密凭据文件(避免报错):
# 生成虚拟密钥和凭据 echo "dummy_key" > config/master.key.dummy rails credentials:edit --environment dummy --key config/master.key.dummy # 保存退出即可,不需要添加任何内容
- 修改Dockerfile的预编译命令:
RUN RAILS_MASTER_KEY=$(cat config/master.key.dummy) RAILS_PRECOMPILE=true ./bin/rails assets:precompile
- 确保
.dockerignore里没有排除config/master.key.dummy(仅测试环境使用,生产环境不推荐)。
方法3:直接将master.key打包进镜像(不推荐)
仅用于测试环境,将config/master.key加入Docker镜像:
- 从
.dockerignore中移除config/master.key - Dockerfile中无需额外修改,直接执行
fly deploy
注意:此方法会将密钥暴露在Docker镜像中,生产环境绝对禁止使用。
内容的提问来源于stack exchange,提问作者Phil-6
相关产品推荐
相关产品推荐

