几周以来,我一直在游泳数字海洋管理应用程序。到目前为止,一切都完美无缺。今天,我使用以下配置在本地环境中成功实现了带 Spaces 的 Active Storage:
存储.yml
test:
service: Disk
root: <%= Rails.root.join("tmp/storage") %>
local:
service: Disk
root: <%= Rails.root.join("storage") %>
digital_ocean:
service: S3
endpoint: https://ams3.digitaloceanspaces.com
access_key_id: <%= Rails.application.credentials.dig(:digital_ocean, :access_key_id) %>
secret_access_key: <%= Rails.application.credentials.dig(:digital_ocean, :secret_access_key) %>
bucket: my-servername
region: unused
生产.rb / 开发.rb
config.active_storage.service = :digital_ocean
credentials.yml中digital_ocean
的配置看起来像这样(在被加密之前)通过EDITOR=VI rails credentials:edit
digital_ocean:
access_key_id: the_key
secret_access_key: the_secret
...
在本地,一切都像一个魅力,所以我假设它不是关于配置本身,而是更多关于 DO 托管应用程序中的部署阶段。
数字海洋部署:
[2022-02-13 23:34:45] /layers/heroku_ruby/gems/vendor/bundle/ruby/3.1.0/gems/aws-sigv4-1.4.0/lib/aws-sigv4/signer.rb:627:in `extract_credentials_provider': missing credentials, provide credentials with one of the following options: (Aws::Sigv4::Errors::MissingCredentialsError)
[2022-02-13 23:34:45] - :access_key_id and :secret_access_key
[2022-02-13 23:34:45] - :credentials
[2022-02-13 23:34:45] - :credentials_provider
由于整个 S3/Space 通过相同的 :access_key_id / :secret_access_key 机制在本地完美运行,并且我可以从 localhost 与空间进行交互,我假设这个问题发生在部署期间,因为 rails 无法解密credentials.yml.enc
文件,所以我尝试了3件事没有成功:
- 在应用程序级别添加
RAILS_MASTER_KEY
环境变量 - 通过在 DO 设置中添加构建命令,在构建阶段添加 master.key
echo "${RAILS_MASTER_KEY}" > config/master.key
- 通过在运行命令前添加 master.key 在运行阶段,例如
echo "${RAILS_MASTER_KEY}" > config/master.key && rails server -p $PORT -e ${RAILS_ENV:-production}
我已经浏览互联网几个小时了,即使我按照所有步骤操作,我也无法理解为什么它会出错。我注意到的是RAILS_MASTER_KEY
Env var 似乎不可用,因为当我echo $RAILS_MASTER_KEY
在控制台中运行时它没有出现,即使它似乎是在 App Spec env vars 中设置的:
envs:
- key: RAILS_MASTER_KEY
任何输入都无限感激