使用 Capistrano 3 在部署时设置 secret_key_base

Fas*_*wan 4 capistrano ruby-on-rails

因此,我将在 Apache 和 Phusion Passenger 上运行的 Rails 4 应用程序部署到托管在 DigitalOcean 上的 Ubuntu Droplet。部署后,由于 Rails 生产没有找到secret_key_base生产令牌,我得到了 500 秒。但是,如果我运行echo $SECRET_KEY_BASE它,它会返回由我的 deploy.rb 生成的 rake 秘密。

设置它的 deploy.rb 任务是:

namespace :deploy do
  task :start do ; end
  task :stop do ; end

  desc "Setup ENV variables"
  task :env_vars do
    on "root@xxx.xxx.xxx.xx" do
      execute "export SECRET_KEY_BASE=#{`bundle exec rake secret`}"
    end
  end
end

before "deploy", "deploy:env_vars"
Run Code Online (Sandbox Code Playgroud)

然而,Rails 仍然没有接受它。我什至 ssh 进入我的服务器并rails console检查并ENV["SECRET_KEY_BASE"]返回正确的秘密令牌。

我认为使用 Capistrano:default_env会起作用,但这似乎只是为部署任务设置环境变量,但实际上并未在服务器上设置。有什么简单的方法可以解决此解决方案吗?secrets.yml由于回购是私有的,我的后备是将秘密放在其中,但我宁愿不这样做。

Joe*_*ert 5

这个任务有一个宝石:https : //github.com/capistrano-plugins/capistrano-secrets-yml

安装

将此添加到 Gemfile:

group :development do
  gem 'capistrano', '~> 3.2.1'
  gem 'capistrano-secrets-yml', '~> 1.0.0'
end
Run Code Online (Sandbox Code Playgroud)

进而:

$ 捆绑安装

设置和使用

make sure your local config/secrets.yml is not git tracked. It should be on the disk, but gitignored.
Run Code Online (Sandbox Code Playgroud)

在本地 config/secrets.yml 中填充生产机密:

production:
  secret_key_base: d6ced...
Run Code Online (Sandbox Code Playgroud)

添加到 Capfile:

require 'capistrano/secrets_yml'
Run Code Online (Sandbox Code Playgroud)

通过执行以下任务在远程服务器上创建 secrets.yml 文件:

$ bundle exec cap production setup
Run Code Online (Sandbox Code Playgroud)

您现在可以继续执行其他部署任务。