Rails 上限生产部署问题

Rails issue on cap production deploy

我的堆栈是 AWS EC2 上的 Puma + Nginx + PostgreSQL。我正在使用 Capistrano 3.4 部署 Rails 4.2.4 应用程序。一段时间以来,我一直在黑暗中试图解决这个问题,所以我想看看我是否能得到一些帮助来阐明这个问题。这在概念上并不困难,我只是不知道为什么我尝试过的方法不起作用。

这是 Capistrano 输出的内容:

...
DEBUG [f85d7a84] Command: cd /home/deploy/my_app/releases/20151210184710 && ( export RVM_BIN_PATH="~/.rvm/bin" aws_access_key_id="<MY_AWS_ACCESS_KEY_ID>" aws_secret_access_key="<MY_AWS_SECRET_ACCESS_KEY>"  RAILS_ENV="production" ; ~/.rvm/bin/rvm default do bundle exec rake assets:precompile )
DEBUG [f85d7a84]    RVM used your Gemfile for selecting Ruby, it is all fine - Heroku does that too,
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    you can ignore these warnings with 'rvm rvmrc warning ignore /home/deploy/my_app/releases/20151210184710/Gemfile'.
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    To ignore the warning for all files run 'rvm rvmrc warning ignore allGemfiles'.
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    rake aborted!
DEBUG [f85d7a84]    
DEBUG [f85d7a84]    ArgumentError: Missing required arguments: aws_access_key_id, aws_secret_access_key
...

请注意,在第一行中,Bash 命令尝试设置所需的参数,但显然无法在 rake assets:precompile 中访问它们。所以我的问题是如何正确设置 'required arguments' aws_access_key_id 和 aws_secret_access_key。

我尝试过的:

1) 在 config/deploy.rb 中设置它们(灵感来自 this

为此我使用了:

set :default_env, {
  rvm_bin_path: '~/.rvm/bin',
  'aws_access_key_id' => '<MY_AWS_ACCESS_KEY_ID>',
  'aws_secret_access_key' => '<MY_AWS_SECRET_ACCESS_KEY>'
 }

2) 在 shared/secrets.yml 中将它们设置在我的 EC2 服务器上:(受 this 启发)

aws_access_key_id: '<MY_AWS_ACCESS_KEY_ID>',
aws_secret_access_key: '<MY_AWS_SECRET_ACCESS_KEY>'

我在 config/deploy.rb 中链接到这些

set :linked_files, %w{config/database.yml config/application.yml secrets.yml}

目前这就是我尝试在 config/initializers/carrierwave.rb:

中输入密钥的方式
CarrierWave.configure do |config|
    config.fog_credentials = {
      :provider              => 'AWS',
      #:aws_access_key_id     => ENV['AWS_ACCESS_KEY_ID'], # I still get the same error when I use these two lines instead
      #:aws_secret_access_key => ENV['AWS_SECRET_ACCESS_KEY']
      :aws_access_key_id     => Rails.application.secrets.aws_access_key_id,
      :aws_secret_access_key => Rails.application.secrets.aws_secret_access_key
    }
    config.fog_directory    = ENV['AWS_S3_BUCKET']
end

3) 在 config/application.yml 中设置它们(受 this 启发)如

aws_access_key_id: "<MY_AWS_ACCESS_KEY_ID>"
aws_secret_access_key: "<MY_AWS_SECRET_ACCESS_KEY>"

那么为什么这些方法都不起作用呢?我在设置环境变量方面不是很有经验,更不用说在远程服务器上了,但我看过 threads/blog 帖子,其中每一个似乎都有效。

感谢大家的帮助。欢迎提问或了解更多信息!

我发现您的选项存在一些问题,我将在下面相应地列出它们:

  1. 环境变量名称区分大小写,这意味着您正在导出 aws_access_key_id,但是您引用的是载波代码 ENV['AWS_ACCESS_KEY_ID'].

    详细了解 assigning environment variables here

  2. 您的 capistrano 正在尝试 link secrets.yml,您实际需要的是 config/secrets.yml,尝试将该行更改为:

    set :linked_files, %w{config/database.yml config/application.yml config/secrets.yml}

  3. 假设您已经安装了 post 中提到的 figaro gem,我假设(根据您提供的详细信息)问题很可能与案例有关-灵敏度(转到 1。)

选一个再试一次!