所以我正在部署到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
内,因为回购是私有的,但我宁愿不这样做。
答案 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开始......它总是拥有它自己的环境。