Ubuntu 18.04 服务器 (Rails 6.0) 上的 'production' 环境缺少 `secret_key_base`,尝试了多个主题

Missing `secret_key_base` for 'production' environment on Ubuntu 18.04 server (Rails 6.0), multiple topics tried

本主题末尾嵌入了解决方案

问题

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

我检查了 /var/log/nginx/error.log 上的 nginx 日志,看到了典型的消息“'production' 环境缺少 secret_key_base,用 rails credentials:edit 设置这个字符串”

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

  1. 我 运行 bundle exec rails secret 在我的服务器端控制台上,作为部署用户。所以我有我的 GENERATED_KEY_1
  2. 我添加到 ~/.bashrc : export 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 服务器后,none 可以正常工作。 所以我用root用户重新开始了上一步。

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

谢谢,我有点绝望^^

解决方案

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

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

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

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

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

制作config/secrets.yml文件

在此处添加生成的密钥

production:
 secret_key_base: asdja1234sdbjah1234sdbjhasdbj1234ahds…

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

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

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

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

  1. 作为 root 用户,导航到 # 目录(可能只使用 cd ..
  2. 输入 nano home/<yourAppUser>/.bash_profile 导航到(并创建)用于存储 ENV
  3. 的文件
  4. 如您所见,只需在文件中写入:export SECRET_KEY_BASE="GENERATED_KEY_1"

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

Rails 5.2 及更高版本使用加密凭据来存储敏感应用程序的信息,默认情况下包括 secret_key_base。这些凭据使用存储在 master.key 文件中的密钥进行加密。 Git 存储库,默认生成 Rails 应用程序设置,包括 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 不受 开发 限制在 Gemfile 内测试 Rails 环境。

顺便说一下,自 passenger 模块版本。 5.0.0 你可以 set shell environment variables 直接从 nginx.conf

1_ 设置凭据

rails credentials:edit

2_上传master.key文件到您的生产服务器。

如果使用 capistrano 部署,将 master.key 复制到共享文件夹 (shared_path),然后将其添加到 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'

就我而言,在 rails credentials:edit 上,文件缩进不准确,导致部署出错。所以在部署之前确保缩进在你的本地是正确的。