Ubuntu 18.04 服务器(Rails 6.0)上的“生产”环境缺少“secret_key_base”,尝试了多个主题

OBr*_*oks 5 capistrano ruby-on-rails nginx ubuntu-18.04

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

问题

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

我检查了 nginx 登录/var/log/nginx/error.log并看到了典型的消息“缺少secret_key_base‘生产’环境,将此字符串设置为rails credentials:edit

由于Gorails的方法似乎不起作用(bundle exec rails secret在他的控制台应用程序端之后,他添加了一个带有SECRET_KEY_BASE行的文件/my_website/.rbenv-vars,其中填充了生成的密钥),我决定遵循回答这个问题的多个主题。这是事情,我不确定以下步骤是否是货物之一。

  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"] %>
Run Code Online (Sandbox Code Playgroud)

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

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

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

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

谢谢,我有点绝望^^

解决方案

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

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

即使使用 编辑credentials.yml.enc<%= ENV["SECRET_KEY_BASE"] %>,此解决方案也有效。这对应于Lyzard Kyng的答案,即使它有点不同。

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

Abh*_*dan 6

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

\n\n

制作config/secrets.yml文件

\n\n

在这里添加生成的密钥

\n\n
production:\n secret_key_base: asdja1234sdbjah1234sdbjhasdbj1234ahds\xe2\x80\xa6\n
Run Code Online (Sandbox Code Playgroud)\n\n

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

\n\n

我有同样的问题并通过这种方法解决了。

\n

  • 感谢您的回答,不幸的是,Rails &gt; 5.0 没有任何 Secrets.yml,因为它现在是加密的 credential.yml.enc,可以使用 ```railscredentials:edit``` 进行编辑。但无论如何,您是在服务器端还是应用程序端编辑它?用哪把钥匙?原始的,还是服务器上生成的? (2认同)
  • @OBrooks 如果您的存储库是公开可见的,那么它绝对是。 (2认同)

Lyz*_*yng 6

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

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

RAILS_MASTER_KEY="your_master-key_content"
Run Code Online (Sandbox Code Playgroud)

不要忘记,以确保宝石dotenv-rails之内没有限制Gemfile开发测试的Rails环境。

顺便说一下,从passenger模块版本开始。5.0.0您可以设置shell环境变量直接从nginx.conf