【问题标题】:Using Paperclip, Fog, and Ceph使用回形针、雾和 Ceph
【发布时间】: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


【解决方案1】:

错误只是来自配置不正确的 Ceph 集群。对于找到此主题的任何人,只要您:

  1. 为您的 Ceph 前端正确设置通配符 DNS;
  2. Ceph 配置为这样识别
  3. :fog_credentials 中传入:host,这将是 Ceph 前端的 FQDN
  4. :fog_host,显然需要是您的存储桶的 URL,例如https://bucket.ceph-server.foobar.com.

回形针开箱即用。我认为它没有记录在您可以使用:host 的任何地方,但它确实有效。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-21
    • 2014-08-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多