我无法在现有的Heroku生产环境中使用Alchemy v3.6和Dragonfly S3。
我正在将Alchemy CMS 3.2生产环境(部署在Heroku上)升级到Alchemy CMS 3.6。我的Alchemy CMS生产安装使用Dragonfly和S3存储。
我关注的领域是v3.5 Dragonfly初始化程序,以及它如何与Alchemy Heroku部署指南(https://guides.alchemy-cms.com/edge/deploy_on_heroku.html)互动/冲突。
v3.5升级程序为Alchemy安装了一个股票模板Dragonfly初始化程序,该初始化程序现在使用Dragonfly中间件渲染所有图片(v3.5升级程序将在此处复制Dragonfly配置:https://github.com/AlchemyCMS/alchemy_cms/blob/3.5-stable/lib/alchemy/upgrader/three_point_five.rb)。
我一直试图将其重构为单个初始化程序,该初始化程序既可以在使用S3的Heroku上运行,也可以在本地进行开发。到目前为止,我的配置如下。
下面的初始化程序在大多数情况下都适用。但是最重要的是,它不允许渲染存储在S3上的现有生产图像或渲染刚刚上传到S3的新图像。
在v3.2生产图像中,获得了URL,例如:
/content/pictures/191/show/my-image.jpg?sh=1c4dbd224d95fab4
升级到v3.6后,这些图片的URL会变成这样(但它们会收到404响应):
/ W1siZiIsIjIwMTgvMDgvMjgvMDUvNDgvNTMvMGY3YmI2ZTctYWIxNS00M2E3LTkzN2UtMGI5ZTNjMzQ1ZTVjL2Nob2NvbGF0ZS10cmVlLWJhbm5lci5wbmciXSxbInAiLCJlbmNvZGUiLCJqcGciLCItcXVhbGl0eSA4NSJdXQ /我的图像?SHA = 2cd4ba612a2ad88a
我组合的Dragonfly.rb配置是(我尝试修改Heroku指南部署配置的方法是上半部分):
if Rails.env.production?
require 'dragonfly'
require 'dragonfly/s3_data_store'
aws_defaults = {
access_key_id: Rails.configuration.aws_access_key_id,
secret_access_key: Rails.configuration.aws_secret_access_key,
region: 'eu-west-1',
storage_headers: {'x-amz-acl' => 'public-read'},
url_scheme: 'https'
}
Dragonfly.app(:alchemy_pictures).configure do
plugin :imagemagick
secret ENV['DRAGONFLY_SECRET']
url_format '/pictures/:job/:name.:ext'
datastore :s3,
{ bucket_name: Rails.configuration.aws_images_directory }.merge(aws_defaults)
end
# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware, :alchemy_pictures
Dragonfly.app(:alchemy_attachments).configure do
datastore :s3,
{ bucket_name: Rails.configuration.aws_attachments_directory }.merge(aws_defaults)
end
else
Dragonfly.app(:alchemy_pictures).configure do
dragonfly_url nil
plugin :imagemagick
plugin :svg
secret ENV['DRAGONFLY_SECRET']
url_format '/pictures/:job/:name.:ext'
datastore :file,
root_path: Rails.root.join('uploads/pictures').to_s,
server_root: Rails.root.join('public'),
store_meta: false
end
# Mount as middleware
Rails.application.middleware.use Dragonfly::Middleware, :alchemy_pictures
# Attachments
Dragonfly.app(:alchemy_attachments).configure do
datastore :file,
root_path: Rails.root.join('uploads/attachments').to_s,
store_meta: false
end
end
我应该在生产模块中为现有的Heroku生产安装指定url_format
吗?
我还应该在生产区中安装蜻蜓中间吗?
我在Heroku S3配置中添加了secret
行,对吗?
非生产版块是从安装程序复制到我的应用程序的v3.5安装程序dragonfly.rb
文件中批发的。
在不合并初始化程序的情况下,现有的生产配置被覆盖(存储在名为initializers/alchemy.rb
的{{1}}文件中),从而覆盖了Heroku Dragonfly配置。
我感觉这差不多了,因为现有的和新的图片都可以在dev localmachine上运行,并且使用Heroku,新的上载内容会到达生产环境中的S3存储桶中。它正在渲染失败的图片。
我收到的错误是404,如下所示:
2018-08-27T23:36:15.068230 + 00:00 heroku [router]:at = info method = GET 路径= “/ W1siZiIsIjIwMTYvMDMvMDkvMjEvMzYvMjQvNmE3NDA1ZTItOWU3Yi00NThiLWE2MjAtN2U3MWRmYzFiZjhjL2Nob2NvbGF0ZS10cmVlLWxvZ28ucG5nIl0sWyJwIiwidGh1bWIiLCIxNjB4MTIwXHUwMDNlIl0sWyJwIiwiZW5jb2RlIiwianBnIiwiLXF1YWxpdHkgODUgLWZsYXR0ZW4iXV0 /我的图像?莎= 55745937790605fd” host = xyz.herokuapp.com request_id = xxxxxxx fwd =“ xx.xx.xx.xx” dyno = web.1 connect = 1ms服务= 114ms状态= 404字节= 4420协议= https