Rails 3. получение Errno:: Разрешение EACCES Отказано при загрузке файлов на производство

Приложение отлично работает в разработке, но в производстве я получаю сообщение об ошибке Errno:: EACCES Permission Denied при попытке загрузить файл с помощью Carrierwave. Я уверен, что это имеет какое-то отношение к разрешениям. Как я могу установить разрешения для разрешения загрузки файлов?

pdf_uploader.rb

def store_dir
  "#{Rails.root}/uploads/#{model.id}"
end

def cache_dir
  "#{Rails.root}/tmp/uploads/cache/#{model.id}"
end

Ответ 1

chmod -R 777 PATH_TO_APP/uploads 
chmod -R 777 PATH_TO_APP/tmp 

Ответ 2

Ух, у меня была такая же проблема с сервером ubuntu. Загрузите файл с несущей, а затем попытайтесь прочитать его с помощью roo (жемчужина для файлов excel).

Errno::EACCES in IngestionController#upload
Permission denied

Разрешения были chmod-ed до 777 в этом каталоге, и файл создается нормально. Я считаю, что проблемы возникают при чтении пути к хранилищу.

excelx_file = params[:excel_file]
filex = MetadataUploader.new
filex.store!(excelx_file)
workbook = Excelx.new("#{filex.store_path}") <- This is the actual line throwing the error.

Хотя все работает нормально при выполнении того же приложения на моем mac.

Ответ 3

Насколько я знаю, есть две вещи, которые могут быть здесь:

1) Каталог, в котором вы сохраняете свои изображения, не имеет прав на чтение и запись для других пользователей.

Чтобы исправить:

терминал

$ cd [my_app]
$ chmod -R 666 tmp
$ chmod -R 666 public/uploads

или если вы сохраняете свои изображения в частной папке:

$ chmod -R 666 private/uploads

Мы используем 666 по 777. 666 разрешает права на чтение и запись в каталог, а несущей - писать свои изображения. 777 позволяет читать, записывать привилегии и выполнять исполняемые файлы!. Другими словами, неприятная программа может быть загружена на ваш сервер, замаскированный под изображение, если вы используете 777. Несмотря на то, что расширение несущей полосы белого -list решает эту проблему, вы всегда должны использовать 666 по 777.

2) Вы не используете строки с двойными кавычками в методе store_dir.

Чтобы исправить:

приложение/example_uploader.rb

class BaseUploader < CarrierWave::Uploader::Base
  # other methods removed for brevity

  def store_dir
    "#{Rails.root}/private/" # works perfectly. Many thanks to @RGB
  end

end

Просто хочу указать, насколько это тонкое. Вам нужны двойные кавычки и Rails.root! Я делал это:

def store_dir
    Rails.root + '/private' # raises Errno::EACCES error
end

и он вообще не работал. Настолько тонко. Община должна решить эту проблему.

Ответ 4

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

sudo chmod 777 -R your_project_directory_to_be_access

Из соображений безопасности просто держитесь в голове:

chmod 777 дает каждому возможность читать, писать и исполнять права, которые для большинства проблем являются слишком значительными.