【发布时间】:2014-06-19 17:03:51
【问题描述】:
我正在编写一个 Rails 3 应用程序,它使用 Paperclip 将视频文件附件转码为一堆其他格式,然后存储生成的文件。这一切都适用于本地存储,但我正在尝试使用 Paperclip 的 Fog 支持将文件存储在我们自己的 Ceph 集群上的存储桶中。但是,我似乎找不到正确的配置选项来让 Fog 与我的 Ceph 服务器通信。
这是我的 Rails 课程中的一个 sn-p:
has_attached_file :videofile,
:storage => :fog,
:fog_credentials => { :aws_access_key_id => 'xxx', :aws_secret_access_key => 'xxx', :provider => 'AWS'},
:fog_public => true,
:url => ":id/:filename",
:fog_directory => 'replay',
:fog_host => 'my-hostname',
使用此设置写入失败,因为 Paperclip 尝试保存到 Amazon S3 而不是我提供的主机。我有一个非 Rails / 非 Paperclip 玩具脚本工作得很好:
conn = Fog::Storage.new({
:aws_access_key_id => 'xxx',
:aws_secret_access_key => 'xxx',
:host => 'my-hostname',
:path_style => true,
:provider => "AWS",
})
这会正确连接到我的本地 Ceph 服务器。所以我怀疑有些东西我没有在 Paperclip 中正确配置——但是什么?
以下是来自 fog.rb 的相关大块,我认为它导致连接仅转到 AWS:
def host_name_for_directory
if @options[:fog_directory].to_s =~ Fog::AWS_BUCKET_SUBDOMAIN_RESTRICTON_REGEX
"#{@options[:fog_directory]}.s3.amazonaws.com"
else
"s3.amazonaws.com/#{@options[:fog_directory]}"
end
end
【问题讨论】:
-
阅读fog.rb,似乎有硬编码假设只有AWS S3将被:fog数据存储使用——至少,我认为这是正在发生的事情。所以我正在评估是否更明智地修补fog.rb或为Paperclip编写一个新的存储模块(或使用替代品,如Dragonfly)
-
两者都可以。您也许可以只创建现有子类的子类,该子类返回此方法所需的内容(但否则委托给父类)。那应该是相对干净的(希望不太容易破损)。
-
事实证明,来自 fog.rb 的大块与亚马逊的特定性关系不大。我发现我可以在 :fog_credentials 中传递 :host,并且它通过就好了。但是,我仍在尝试追查 Nil 类错误。
-
很高兴听到一些进展。如果您在此处(或在问题中)发布 nil 类错误,我很乐意尝试提供帮助。谢谢!
标签: ruby-on-rails ruby-on-rails-3 paperclip fog ceph