Измените путь загрузки Carrierwave, чтобы он соответствовал конфигурации Cloud 66

Развернутое приложение rails с Cloud 66 для digitalocean.com. Все работает нормально, за исключением некоторых ошибок разрешения при попытке загрузки изображений.

 Errno::EACCES (Permission denied - /var/deploy/anabol/web_head/releases/20130608104347/public/uploads/tmp): 

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
...
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end
...
end

Есть описание, как решить проблему здесь: https://www.cloud66.com/help/permission_denied_errors

Я изменил путь store_dir:

  def store_dir
    "#{Rails.root}/tmp/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

Но это не помогло. Я все еще получаю эту ошибку:

 » 13:49:25.696 Errno::EACCES (Permission denied - /var/deploy/anabol/web_head/releases/20130608114659/public/uploads/tmp): 

Я что-то пропустил?

Редактировать:

Upload работает с этой частью в image_uploader.rb:

  def cache_dir
    # should return path to cache dir
    Rails.root.join 'tmp/uploads/cache'
  end

  def store_dir
    "#{Rails.root}/tmp/uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

Но теперь я получаю:

ActionController::RoutingError (No route matches [GET] "/var/deploy/anabol/web_head/releases/20130608164223/tmp/uploads/profile/image/3/thumb_Screenshot_from_2013-06-05_17_27_54.png"):

На виде отображается только путь к изображениям.

2 ответа

Решение

Есть способы заставить это работать на хостах, где вы можете загружать файлы. Здесь описаны два способа, но были некоторые ошибки, которые теперь исправляются: https://www.cloud66.com/help/permission_denied_errors

Рабочий пример для ловушки развертывания, использующей carrierwave для загрузки изображения:

#! /bin/bash
#load environment variables
source /var/.cloud66_env
#assign desired permissions
sudo chmod 0777 -R $RAILS_STACK_PATH/public/uploads

И лучшее решение

(таким образом вы не потеряете изображения при повторном развертывании): используйте это в вашем xy_uploader.rb:

  def store_dir
    "system/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

Я проверил Cloud66:

Этот пользователь (nginx) не имеет повышенных разрешений и не имеет права на запись в вашу файловую систему (кроме явного указания в папки / tmp и $RAILS_STACK_PATH/tmp)

Это означает, что вы не можете загружать файлы для последующего использования в Cloud66 - вам нужно настроить Fog для загрузки на S3 (или любого из провайдеров облачных файлов fog).

Это довольно стандартно для облачных провайдеров. Учебники:

Другие вопросы по тегам