每次部署后回形针文件都会被删除

Paperclip files get deleted after each deploy

我使用 Paperclip gem 来存储图片,在本地主机上它工作得很好。但是,我添加到实时应用程序中的所有图片在每次部署后都会被删除。

我使用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')

导致回形针完全损坏。之前我有一个问题,没有权限使用回形针添加图像,导致这个错误:

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"错误。

所以那个问题没有为我的问题提供有效的解决方案。

存储图像的最佳方式是 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 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'

希望对您有所帮助。

快乐黑客

我假设您使用的是 capistrano,如何设置共享子项:

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

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

cap deploy:setup

Source

你在这里做什么:

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

实际上是将您的 "public/system" 文件夹从 /rails_apps/website/releases/20150807211111/public/system 符号链接到 /rails_apps/website/shared/public/system ,以便图片始终存储在共享目录中,并且不会在部署时丢失。所以你实际上应该做的是为共享文件夹设置适当的权限。

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

Heroku 之类的服务只会让你将文件暂时存储到内存中的系统中,任何更新、重启、重新部署都会清楚地消除这一点。我敢肯定,许多其他服务也是如此。

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


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