Rails dotenv 生产问题 [已关闭]

Rails dotenv production issue [closed]

提问人:user199135 提问时间:11/17/2023 更新时间:11/18/2023 访问量:76

问:


想改进这个问题吗?通过编辑这篇文章添加详细信息并澄清问题。

昨天关闭。

[ bin/setup ] [{"RAILS_ENV"=>"test"}, "bin/rails db:reset"] succeeded
[ bin/setup ] Dropping & recreating the test database
[ bin/setup ] Executing [{"RAILS_ENV"=>"production"}, "bin/rails db:reset"]
rails aborted!
ArgumentError: Missing `secret_key_base` for 'production' environment, set this string with `bin/rails credentials:edit` (ArgumentError)

        raise ArgumentError, "Missing `secret_key_base` for '#{Rails.env}' environment, set this string with `bin/rails credentials:edit`"
              ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
/home/mustdos/Ruby Stuff/MUPSA/config/environment.rb:5:in `<main>'
Tasks: TOP => db:reset => db:drop => db:load_config => environment
(See full trace by running task with --trace)
[ bin/setup ] [{"RAILS_ENV"=>"production"}, "bin/rails db:reset"] failed

大家好,我尝试将 dotenv 与 .env.testing、.env.development 和 .env.production 一起使用,但我似乎无法让 .env.production 运行。

我应该如何解决这个问题?

Ruby-on-Rails 红宝石 Dotenv

评论

0赞 user199135 11/17/2023
是的,它位于 .env.production 文件中
0赞 user199135 11/17/2023
我按照教程操作,避免与多组键/环境混淆rm config/database.yml config/credentials.yml.enc config/master.key
1赞 engineersmnky 11/17/2023
您需要添加更多详细信息。这是在哪里发生的?您是如何部署的?你要部署到哪里?
0赞 user199135 11/17/2023
我一直在阅读 David Copeland 的“Sustainable Web Development with rails”一文。我看到了 dotenv 的 github 页面,并说我可以添加 .env.production 并很高兴......事实证明,可能缺少一些东西。我尝试在 .env.production 中添加SECRET_KEY,因为这是我的问题开始的地方,但没有结果。

答:

1赞 tonystrawberry 11/17/2023 #1

根据 Ruby on Rails 文档

在测试和开发中,应用程序获取从应用名称派生secret_key_base。其他环境必须使用 config/credentials.yml.enc 中存在的随机键。

因此,正如您的错误消息所建议的那样,我们需要设置一个 .secret_key_base

  1. 它可以是任何随机字符串,因此让我们使用 .您可以运行此命令来获取 64 个字符的随机字符串。securerandom
require 'securerandom'
SecureRandom.hex(64)
  1. 现在,让我们在加密的密钥中创建并设置它。我使用 VSCode,所以我的命令用于编辑我的机密,所以我的命令是这样的。
EDITOR="code --wait" rails credentials:edit --environment production

这将打开包含机密的加密文件的解密状态。它应该是空的,因为你以前没有设置过。 设置你的喜欢这样:secret_key_base

secret_key_base: xxxxxxxx
other_secret: 123
  1. 保存并关闭文件。这将为您创建两个文件:
  • production.key用于解密机密加密文件的密钥。该文件包含合理的数据,不应是公开的(不会推送到您的 Git 存储库)。如果将应用程序部署在某个位置,则应将其设置为名为 的环境变量。这应该添加到您的文件中。RAILS_MASTER_KEY.gitignore
  • production.yml.enc这是机密加密文件。

现在,您应该能够在代码中访问您的机密:

Rails.application.credentials.secret_key_base
Rails.application.credentials.other_secret
Rails.application.credentials.{secret_key}
  1. 并且您应该能够执行环境操作,例如 或 。productionrails consolerails db:migrate

PS:在您的环境中,如果您没有使用上述步骤设置任何内容,它实际上正在使用自动生成的。 参考资料在这里developmentsecret_key_basetmp/development_secret.txt

1赞 mechnicov 11/17/2023 #2

你不需要 dotenv 来声明秘密库

删除 ,也不是个好主意config/database.ymlconfig/credentials.yml.encconfig/master.key

你试图与系统相反

使用内置凭据。如果您需要对不同的环境使用不同的凭据 - 使用它!

重新生成凭据:

EDITOR=vim rails credentials:edit

对于生产:

EDITOR=vim rails credentials:edit --environment production

仔细检查,您是否在生产凭据中拥有。如果不存在 - 手动添加secret_key_base

还要检查 和 are gitignored,都不是 gitignoredconfig/credentials/*.keyconfig/master.key*yml.enc

对于将 ERB 语法与凭据一起使用,如下所示database.yml

0赞 user199135 11/18/2023 #3

谢谢大家,我不得不重做新的rails才能正确地重新创建database.yml

评论

0赞 Lajos Arpad 11/18/2023
请不要添加“谢谢”作为答案。相反,请接受您认为最有帮助的答案。- 从评论
0赞 mechnicov 11/20/2023
无需为此重新创建应用