我使用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
有没有其他人碰到这样的事情?
更新
这不是重复,因为this question的答案是将此行添加到我的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
命令不再起作用,并且我再次无权添加图像,从而导致相同的“权限被拒绝”错误
因此,该问题无法为我的问题提供有效的解决方案。
答案 0 :(得分:5)
存储图片的最佳方式是像SWS Secure, Durable & Highly-Scalable Object Storage
这样的地方设置它非常简单
# Gemfile
gem 'paperclip'
gem 'aws-sdk
# 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文档页面以获取详细的配置选项。
要覆盖默认的网址结构,请将存储桶的名称“domain-style”放入网址(例如your_bucket_name.s3.amazonaws.com)。这些选项可以放在上面显示的paperclip_defaults configuration哈希中,也可以放在初始化程序中。
#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'
我希望这会有所帮助。
快乐黑客
答案 1 :(得分:4)
你在这里做什么:
set :linked_dirs, fetch(:linked_dirs, []).push('public/system')
实际上将您的“公共/系统”文件夹从/rails_apps/website/releases/20150807211111/public/system
符号链接到/rails_apps/website/shared/public/system
,以便图片始终存储在共享目录中,而不会在部署时丢失。所以你应该做的是为共享文件夹设置适当的权限。
答案 2 :(得分:1)
我假设您正在使用capistrano,如何设置共享子项如:
#config/deploy.rb
set :shared_children, shared_children + %w{public/uploads}
然后告诉capistrano正确设置共享文件夹:
cap deploy:setup
答案 3 :(得分:0)
您可能正在将应用程序托管在不允许您在运行时将文件直接存储到文件系统的堆栈上。
诸如Heroku之类的服务只允许您临时将文件存储到内存中的系统,任何更新,重新启动,重新部署都会清除这一点。我确信这也是许多其他服务的情况。
如果使用此类服务,则需要将动态资产存储在单独的服务上,例如AWS-S3(亚马逊的简单存储服务)。您可以在那里存储文件,并将数据库中的信息存储到数据库
中如果您确定托管应用的位置,我可以在解决方案中更加详细。