使用Capistrano 3在部署时设置secret_key_base

时间:2015-02-13 08:54:09

标签: ruby-on-rails capistrano

所以我正在部署到DigitalOcean上托管的Ubuntu Droplet上运行在Apache和Phusion Passenger上的Rails 4应用程序。在部署之后,由于Rails生产没有找到生产的secret_key_base令牌,我已经获得了500s。但是,如果我运行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"

但是,Rails仍然没有提起它。我甚至ssh进入我的服务器并在rails console已检查并ENV["SECRET_KEY_BASE"]返回正确的秘密令牌。

我认为使用Capistrano的:default_env会起作用,但这似乎只为部署任务设置了环境变量,但实际上并没有在服务器上设置。有没有简单的方法来解决这个问题?我的后备是将秘密放在secrets.yml内,因为回购是私有的,但我宁愿不这样做。

4 个答案:

答案 0 :(得分:3)

正是这个任务有一个宝石: 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

然后:

$ bundle install

设置和使用

make sure your local config/secrets.yml is not git tracked. It should be on the disk, but gitignored.

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

production:
  secret_key_base: d6ced...

添加到Capfile:

require 'capistrano/secrets_yml'

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

$ bundle exec cap production setup

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

答案 1 :(得分:2)

您可以在application.yml中名为shared/config的服务器中创建一个文件。

从下面选择任何一种解决方案

在deploy.rb中执行以下代码会自动对您的application.yml

进行符号链接
set :linked_files, %w{config/application.yml}

然后将此application.yml与您的current/config/application.yml进行符号链接,并使用简单的capistrano任务。

答案 2 :(得分:1)

不是在deploy.rb中导出env变量,而是在rails启动时使用dotenv将环境变量从.env[.<staging>]加载到ENV中。

请按照以下步骤操作:

将此行添加到Gemfile的顶部:

gem 'dotenv-rails', :github => "bkeepers/dotenv", :require => 'dotenv/rails-now'

.env.production个文件放入linked_file中的deploy/production.rb

set :linked_files, fetch(:linked_files, []).push('.env.production')

在远程主机上,将.env.production文件添加到包含以下行的shared文件夹中:

SECRET_KEY_BASE=<Your secret>

答案 3 :(得分:0)

放弃环境变量,只需阅读文件即可。在secrets.yml中执行此操作。

production:
  secret_key_base: <%= File.read('/home/me/SECRET_KEY_BASE').strip %>

然后制作秘密文件。

$ rake secret > ~/SECRET_KEY_BASE

在确定此解决方案之前,我尝试从我的.bash_profile,.profile和.bashrc(顶部和底部)导出秘密。我还尝试了PermitUserEnvironment和.ssh / environment。我不知道环境变量如何从“环境”转变为capistrano部署。我跑了ssh example.com printenv并看到了我的vars。我登录后看到了我的变种。但是puma从capistrano开始......它总是拥有它自己的环境。