每次部署后,Paperclip文件都会被删除

我使用Paperclip gem来存储图片,而在localhost上它可以很好地工作。 但是,我添加到我的实时应用程序的任何图片都会在每次部署后被删除。

我使用Git进行部署。 这是我的部署过程:

$ bundle exec cap production deploy $ ssh root@xx.xxx.xx.xxx $ chmod -R 777 /rails_apps/app/releases $ cd /rails_apps/app/current $ cp config/database.yml.sample config/database.yml $ RAILS_ENV=production bundle exec rake assets:precompile $ /etc/init.d/apache2 restart 

有没有其他人遇到这样的事情?


更新:

这不是重复,因为这个问题的答案是将此行添加到我的deploy.rb:

 set :linked_dirs, fetch(:linked_dirs, []).push('public/system') 

导致Paperclip完全破裂。 以前我遇到过没有使用Paperclip添加图像的权限的问题,导致此错误:

 Errno::EACCES in UsersController#update Permission denied - /rails_apps/website/releases/20150807211111/public/system/users/avatars/000/000/562 

但是在我的服务器上运行此命令会修复权限:

 chmod -R 777 /rails_apps/website/releases 

但是,如上所示修改我的deploy.rb文件会导致chmod -R 777命令不再起作用,并且我再次无权添加图像,从而导致相同的“Permission denied”错误。

所以这个问题不能为我的问题提供有效的解决方案。

你在这做什么:

 set :linked_dirs, fetch(:linked_dirs, []).push('public/system') 

实际上是将你的“公共/系统”文件夹从/rails_apps/website/releases/20150807211111/public/system符号链接到/rails_apps/website/shared/public/system ,这样图片总是存储在共享目录中,而不会丢失在部署。 所以你应该做的是为共享文件夹设置适当的权限。

存储图像的最佳方式是像SWS Secure,Durable和Highly-Scalable Object Storage这样的地方

设置它真的很简单

 # Gemfile gem 'paperclip' gem 'aws-sdk 

在config / environments / production.rb中

 # config/environments/production.rb config.paperclip_defaults = { :storage => :s3, :s3_credentials => { :bucket => ENV['S3_BUCKET_NAME'], :access_key_id => ENV['AWS_ACCESS_KEY_ID'], :secret_access_key => ENV['AWS_SECRET_ACCESS_KEY'] } } 

如果您在上传图片时遇到问题,请阅读以下两个配置部分。

如果仍有问题,请参阅Paperclip文档页面以获取详细的配置选项。

要覆盖默认URL结构并将存储桶的名称“domain-style”放在URL中(例如your_bucket_name.s3.amazonaws.com)。 这些选项可以放在上面显示的paperclip_defaults配置哈希中,也可以放在初始化程序中。

 #config/initializers/paperclip.rb Paperclip::Attachment.default_options[:url] = ':s3_domain_url' Paperclip::Attachment.default_options[:path] = '/:class/:attachment/:id_partition/:style/:filename' Paperclip::Attachment.default_options[:s3_host_name] = 's3-us-west-2.amazonaws.com' 

我希望这个对你有用。

快乐的黑客

我假设你正在使用capistrano,如何设置共享的孩子:

 #config/deploy.rb set :shared_children, shared_children + %w{public/uploads} 

然后告诉capistrano正确设置共享文件夹运行:

 cap deploy:setup 

资源

您可能正在将应用程序托管在堆栈上,该堆栈不允许您在运行时将文件直接存储到文件系统。

诸如Heroku之类的服务只允许您在内存中临时存储文件到系统,任何更新,重新启动,重新部署都会清除这些内容。 我确信这也是许多其他服务的情况。

如果使用此类服务​​,则需要将动态资产存储在单独的服务上,例如AWS-S3(亚马逊的简单存储服务)。 您可以在那里存储文件,并将数据库中的信息存储到数据库中


如果您确定了托管应用的位置,我可以在解决方案中更详细。