Capistrano Devise.secret_key 未设置

Capistrano Devise.secret_key not set

当我尝试使用 Capistrano 进行部署时,它到达 assets:precompile 并且我收到此消息:

01:08 deploy:assets:precompile
      01 ~/.rvm/bin/rvm default do bundle exec rake assets:precompile
      01 rake aborted!
      01 Devise.secret_key was not set. Please add the following to your Devise initializer:
      01
      01   config.secret_key = 'xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx'
      01
      01 Please ensure you restarted your application after installing Devise or setting the key.

我不想将我的密钥添加到 devise.rb 中,因为我不想在版本控制中使用它。我正在为 secret_key_base 使用环境变量,Devise.secret_key 应该依靠它。事实上,当我 ssh 进入服务器时,手动导航到失败的版本并进入 rails 控制台,我发现 Devise.secret_key 工作正常。似乎它唯一不起作用的时间是在 Capistrano 部署期间。

编辑:我也可以通过 ssh 手动 运行 bundle exec rake assets:precompile 就好了。问题似乎是 Capistrano,但我的环境变量在 /etc/environment 中,因此应该加载它们。

原因

Capistrano 使用 non-loginnon-interactive shell 模式,不会加载环境变量。 当你对服务器执行 ssh 时,它使用 logininteractive shell 模式,加载你的环境变量

解决方案

使用其他方式设置环境变量。我经常使用 Figaro,它适用于 Capistrano。

为防止 Git 中包含敏感信息,请将 config/application.yml 添加到 Capistrano 的 linked_files 并将正确的敏感信息填写到服务器

上的 <shared directory>/config/application.yml

您需要在您的 capistrano 生产文件中声明 ENV 变量。 在您的计算机(或调用 deploy 的计算机或虚拟机)上设置一个 env 变量,然后将以下代码添加到您的 capistrano 生产文件中。

在 config/deploy/production.rb

set :default_env, {
  "SECRET_KEY_BASE" => ENV['PRODUCTION_SECRET_KEY'],
 ....
}

在使用 capistrano 时,您应该始终像这样设置 env 变量,因为有时根据您设置 capistrano 的方式,服务器上的 env 变量将不起作用,您可能正在使用不同的用户进行部署,或者您可能正在使用 rbenv 或 rvm。不管是什么原因,这是使用 capistrano 时设置环境变量的最佳方式。而且您不必在服务器上设置它们或将它们保存在版本控制中。