【问题标题】:Missing `secret_key_base` for 'production' environment on Ubuntu 18.04 server (Rails 6.0), multiple topics triedUbuntu 18.04 服务器(Rails 6.0)上的“生产”环境缺少“secret_key_base”,尝试了多个主题
【发布时间】:2019-12-08 22:30:24
【问题描述】:

该主题的末尾嵌入了一个解决方案

问题

我第一次在 Ubuntu 18.04 的 VPS 上部署 Rails 应用程序。与 Nginx。 我遵循了Gorails“在 2019 年将 Ruby on Rails 部署到生产环境”的好教程。 一切正常,直到我看到“从应用程序收到不完整的响应”页面。

我检查了/var/log/nginx/error.log上的nginx日志,看到了典型的消息“缺少secret_key_base for 'production' environment, set this string with rails credentials:edit

由于 Gorails 的方法似乎不起作用(在他的控制台应用程序端的 bundle exec rails secret 之后,他添加了一个文件 /my_website/.rbenv-vars 与 SECRET_KEY_BASE 行,填充生成的密钥) ,我决定按照多个主题回答这个问题。 东西是这样的,不知道下面的步骤是不是货。

  1. 我以部署用户身份在服务器端控制台上运行bundle exec rails secret。所以我有我的 GENERATED_KEY_1
  2. 我添加到~/.bashrcexport SECRET_KEY_BASE="GENERATED_KEY_1"
  3. source ~/.bashrc
  4. 我使用 echo $SECRET_KEY_BASE 检查我的密钥,并显示了正确的密钥 (GENERATED_KEY_1)
  5. 我将我的凭据文件编辑为
development:
  secret_key_base: ORIGINAL_KEY

test:
  secret_key_base: ORIGINAL_KEY

production:
  secret_key_base: <%= ENV["SECRET_KEY_BASE"] %>

并将 Dotenv 添加到我的 Gemfile 中,在 application.rb 中需要它

但是在重新启动 nginx 服务器后,这些都不起作用。 所以我用 root 用户重新开始了上一步。

但又一次失败了。 我的问题是:

  • 我错过了什么?
  • 我怎么知道它是否在正确的地方搜索密钥,因为我总是收到相同的错误消息?
  • 我应该生成哪个密钥?应用端?服务器端 ?作为 root 用户还是部署用户?
  • 我在 /etc/nginx/sites-available/default 中还有什么要配置的吗? (我在 topic 上看到这家伙改了 rails_env production; to rails_env development; 但我没有任何铁路线)

谢谢你,我有点绝望了^^

解决方案

在我的许多测试中,我使用 root 用户登录,并运行 EDITOR="vim" rails credentials:edit。此命令生成了一个 master.key,但您的 Github 存储库中不存在该文件。

但首先,我没有修改它。我认为这是主要问题,因为应用程序使用它来解密您的 credentials.yml.enc 文件。当我理解它时,我在我的电脑应用程序上用master.key 的内容编辑了master.key

即使在编辑 credentials.yml.enc&lt;%= ENV["SECRET_KEY_BASE"] %&gt; 之后,此解决方案仍然有效。这对应Lyzard Kyng的答案,虽然有点不一样。

我无法使用部署用户运行EDITOR="vim" rails credentials:edit,它不起作用。

【问题讨论】:

  • Nginx 有自己的 shell 环境,它不会读取你的配置文件的~/.bashrc。因此,如果您使用 Dotenv,您应该将 SECRET_KEY_BASE="GENERATED_KEY_1" 放在应用程序根目录下的 .env.production 文件中。

标签: ruby-on-rails nginx capistrano ubuntu-18.04


【解决方案1】:

在您的本地机器上运行rake secret,这将为您生成一个密钥

制作config/secrets.yml文件

在此处添加生成的密钥

production:
 secret_key_base: asdja1234sdbjah1234sdbjhasdbj1234ahds…

并在提交后重新部署应用程序

我遇到了同样的问题,用这个方法解决了。

【讨论】:

  • 感谢您的回答,不幸的是,Rails > 5.0 没有任何 secrets.yml,因为它现在是经过加密的 credential.yml.enc,可以使用 rails credentials:edit 进行编辑。但无论如何,你是在服务器端还是在应用端编辑它?用哪个键?原创,还是在服务器上生成?
  • 版本没问题,如果没有文件,只需在您的配置文件夹中创建secrets.yml,我也在 rails 5 中做过,我做了一些编辑,请尝试
  • 它应该在服务器应用程序上有一个 master.key 吗?它是哪把钥匙?原来的还是新的?
  • 好的,会试试,但是哪个键? ^^ 原来的还是生成的?
  • @OBrooks 如果您的仓库是公开可见的,那么它绝对是。
【解决方案2】:

在服务器上生成您的密钥并在那里使用它会更安全,而不是从本地机器将其推送到您的存储库。

代替~/.bashrc 这样做是为了使用环境变量;

  1. 作为root 用户,导航到# 目录(可能只使用cd ..
  2. 输入nano home/&lt;yourAppUser&gt;/.bash_profile 导航到(并创建)文件以存储ENV
  3. 正如您已经完成的那样,只需在文件中写入:export SECRET_KEY_BASE="GENERATED_KEY_1"

您也可以在此处存储您的数据库密码。

【讨论】:

  • 您好,谢谢您的回答。我尝试了一个不同的解决方案,与我的编辑相关,在服务器上创建了一个 master.key。即使在&lt;%= ENV["SECRET_KEY_BASE"] %&gt; 中编辑了我的credentials.yml.enc,我也不会再遇到同样的问题了,我不知道为什么。但是下次我会继续尝试您的解决方案!再次感谢您
【解决方案3】:

Rails 5.2 及更高版本使用加密凭据来存储敏感应用程序的信息,默认情况下包括secret_key_base。这些凭据使用存储在master.key 文件中的密钥进行加密。默认 Rails 应用程序设置生成的 Git 存储库包含 credentials.yml.enc,但忽略 master.key。部署后,通常涉及git pushRails 生产环境应该以某种方式增加这个密钥。

所以你有两个选择。您可以通过scpsftp 安全地将master.key 上传到生产主机。或者您可以在运行rails server 进程的用户上下文中建立shell 环境 变量RAILS_MASTER_KEY。前一个选项是首选,但由于您已安装 dotenv-rails gem,您将在应用程序的根目录下创建 .env.production 文件并在那里放置一行

RAILS_MASTER_KEY="your_master-key_content"

不要忘记确保 gem dotenv-rails 不受 开发test Rails 环境限制在 Gemfile 内。

顺便说一句,因为passenger 模块版本。 5.0.0 你可以直接从nginx.confset shell environment variablesnginx.conf

【讨论】:

  • 您好,谢谢您的回答!在您回答之前,我尝试使用创建了 master.key 的 root 用户运行 EDITOR="vim" rails credentials:edit 。这也许是主要问题。 1 小时后我回来了,并在我的计算机上使用我的应用程序的 master.key 编辑了文件。似乎它解决了这个问题,因为即使在编辑了 credentials.yml.enc 文件之后,我也不能再遇到同样的问题了。但是下次我会保留您的第二个答案!再次感谢您
【解决方案4】:

1_ 设置凭据

rails credentials:edit

2_ 将 ma​​ster.key 文件上传到您的生产服务器。

如果使用 capistrano 部署,请将 ma​​ster.key 复制到共享文件夹 (shared_pa​​th),然后将其添加到 deploy.rb

namespace :config do
   task :symlink do
      on roles(:app) do
        execute :ln, "-s #{shared_path}/master.key #{release_path}/config/master.key"
      end
   end
end

after 'deploy:symlink:shared', 'config:symlink'

【讨论】:

    【解决方案5】:

    在我的情况下,在rails credentials:edit 上,文件缩进不准确,导致部署错误。因此,在部署之前,请确保您本地的缩进是正确的。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-01-12
      • 2017-05-03
      • 2014-06-23
      • 2016-11-05
      • 2014-07-06
      • 2015-07-12
      相关资源
      最近更新 更多