【问题标题】:Using Carrierwave and Capistrano with Rails在 Rails 中使用 Carrierwave 和 Capistrano
【发布时间】:2017-05-24 18:05:16
【问题描述】:

我无法让载波和 capistrano 相互配合。

首先,我使用this method 来使用公共目录和专用控制器处理目录进行下载。 Tl;博士,carrierwave 的根实际上是Rails.root,而不是public。但是,我通过为所有非私有文件定义一个设置公共根的基类来解决 url(因为 Rails 在 url 中不使用 public)。

无论如何,我终于开始尝试将代码推送到生产环境。一切顺利!我的上传显示很好。但是,当我推送另一个部署时,我丢失了公共目录中的所有图像。

这是一个有据可查的 capistrano 案例 - 它只涉及设置 :linked_dirs。就我而言,我使用了以下行。

set :linked_dirs,  %w{public/assets public/uploads downloads}

public/assets 是我的通用 css/js 文件,public/uploads 是我的多媒体文件,downloads 是我的受保护文件。

很遗憾,这并没有解决我的问题。无论出于何种原因,所有图片都得到了404,尽管显示在正确的路径中。

更奇怪的是,受保护的 downloads 文件夹工作正常!也许这与在 Carrierwave 中设置根有关?在这一点上,我很想为我的公共文件拿起回形针,为私人文件拿起载波。

我已经做了 7 个小时了,但我仍然不知道该怎么做。

我的deploy.rb 文件

我有问题的image uploader 文件

我的工作 product file uploader 文件

我的nginx.conf 文件

【问题讨论】:

  • 与您尝试完成我的 capistrano 部署相同,我已完成 99%,但仍有一些小问题,我没有指定 root,我只有 def store;"system/ckeditor/pictures/#{model.id}";end;,所以我假设在您的如果你可以尝试评论def root
  • 您是否将carrierwave 设置为默认使用Rails.root 而不是公共目录?不幸的是,我试过了,但没有用。
  • 我添加了我的files here,我注意到你和我的nginx.conf 文件发生了变化,可能是因为你使用的是 puma 而我使用的是phusion passenger,你有location ^~ /assets/ {,其中我有location ^~ /system/ {,然后在文件root /home/deploy/apps/x/current/public; 中再次定义了root。我能够通过 nginx.conf 中的最终更改完成我的 capistrano 部署,因为直到某个时候,我发现 public/system 中存在的图像找不到 404。
  • 如果这是一个新项目,那么我建议使用 aws s3 存储并将carrierwave 中的storage 选项更改为storage :fog,因为我们一直在使用 s3 和存储的组合服务器上本地的文件。将存储选项设置为file,这是一个很大的错误,它让 s3 挂载会被频繁卸载,这很痛苦(可以通过脚本修复)。直接将文件上传到 s3 为您提供了使用expiring download URLs优势,而且您不必担心同步本地文件夹,我想这会在private downloads 的情况下为您提供帮助。跨度>
  • 您确认文件确实被写入 /public/uploads 了吗?如果是这样,这些文件的权限是什么?

标签: ruby-on-rails capistrano carrierwave production


【解决方案1】:

查看other question & answer you posted,您已对 CarrierWave 上传目录和文件设置了限制性权限:

# Broken permissions
CarrierWave.configure do |config|
  config.permissions = 0600
  config.directory_permissions = 0700
  config.storage = :file
end

06000700 权限仅授予拥有文件或目录的用户访问权限。这是因为第三和第四位“group”和“everyone”都设置为0。

nginx、Puma 和 Capistrano 可能并非都在同一个用户下运行,这意味着这些仅限用户的权限会阻止 nginx 读取文件(上传后导致 403 错误)并阻止 Capistrano 链接public/uploads 目录(新部署后导致 404 错误)。

改为使用更多开放权限,例如CarrierWave README 中列出的权限:

# Fixed permissions
CarrierWave.configure do |config|
  config.permissions = 0666
  config.directory_permissions = 0777
  config.storage = :file
end

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-24
    • 2016-07-23
    • 1970-01-01
    • 2012-04-14
    • 1970-01-01
    • 2012-04-13
    相关资源
    最近更新 更多