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 帖子,其中每一个似乎都有效。
感谢大家的帮助。欢迎提问或了解更多信息!
我发现您的选项存在一些问题,我将在下面相应地列出它们:
环境变量名称区分大小写,这意味着您正在导出 aws_access_key_id
,但是您引用的是载波代码 ENV['AWS_ACCESS_KEY_ID']
.
您的 capistrano 正在尝试 link secrets.yml
,您实际需要的是 config/secrets.yml
,尝试将该行更改为:
set :linked_files, %w{config/database.yml config/application.yml config/secrets.yml}
假设您已经安装了 post 中提到的 figaro gem,我假设(根据您提供的详细信息)问题很可能与案例有关-灵敏度(转到 1。)
选一个再试一次!
我的堆栈是 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 帖子,其中每一个似乎都有效。
感谢大家的帮助。欢迎提问或了解更多信息!
我发现您的选项存在一些问题,我将在下面相应地列出它们:
环境变量名称区分大小写,这意味着您正在导出
aws_access_key_id
,但是您引用的是载波代码ENV['AWS_ACCESS_KEY_ID']
.您的 capistrano 正在尝试 link
secrets.yml
,您实际需要的是config/secrets.yml
,尝试将该行更改为:set :linked_files, %w{config/database.yml config/application.yml config/secrets.yml}
假设您已经安装了 post 中提到的 figaro gem,我假设(根据您提供的详细信息)问题很可能与案例有关-灵敏度(转到 1。)
选一个再试一次!