Heroku每次应用程序关闭时都会删除图像,并在x分钟不活动后重新启动?

时间:2016-02-08 09:13:16

标签: ruby-on-rails heroku

我看到了这个问题:After git push heroku - uploaded files on Heroku are lost

  

每次应用程序关闭并在非活动状态后重新启动   对于x分钟),您的应用程序将被重新创建,并且所有存储的数据都是   丢失。(C)

现在我有用户可以上传两张照片。我收到了新用户的电子邮件确认。所以我可以检查用户注册并上传4和14小时前的照片。 我做了最后一次提交,并在19个小时前将其推送到了heroku。这4张图片,即新上传的用户现在已经丢失了。但是如果我现在注册用户,我可以看到图片。因此,我的应用程序在x分钟内处于非活动状态,然后重新启动并删除图像似乎确实如此。

我读了一些这样的问题Rails] Images erased after a new commit on heroku 它说我应该使用像aws s3这样的外部服务器(我不知道它是什么,它将花多少钱以及如何连接它) 这是真的吗?我的其他选择是什么?可能我应该简单地使用数字海洋(不会有同样的问题?)或其他东西。这个问题会在付费帐户中继续吗?

我使用rails并使用carrierwave gem上传文件,我无法上传代码,因为我是从另一台笔记本电脑上写的。

3 个答案:

答案 0 :(得分:2)

Heroku的文件系统是只读的。你不能指望你上传的任何内容在那里存在,你需要使用外部存储机制,例如亚马逊的S3。

有关详细信息,请参阅链接。

https://devcenter.heroku.com/articles/s3 https://devcenter.heroku.com/articles/dynos#isolation-and-security

答案 1 :(得分:1)

运行Heroku实例的文件系统不是只读的,但它是暂时的 - 即在实例重新启动后存储在那里的文件不会保留。

这是Heroku的一项深思熟虑的设计决定,迫使您考虑存储数据的位置以及它对可伸缩性的影响。

你问的是数字海洋 - 我还没有使用它们,但我从你的问题中假设它们允许你存储到持久的本地文件系统。

您需要问的问题是:如果您想运行多个应用实例,会发生什么?他们共享相同的持久文件系统吗?他们可以访问彼此的文件吗?当多个应用程序实例使用相同的文件系统时,如何处理文件锁定以避免竞争条件?

Heroku的模型强迫您将内容放入数据库或使用某些外部服务存储它。通常,这些类型的系统中的任何一个都可以合理地扩展 - 您可以拥有多个Heroku实例(可能在不同的机器上运行,不同的数据中心等),并且它们都可以很好地进行交互。

我同意,对于一个简单的用例,你只想在开发期间运行一个应用程序的实例,这可能会很不方便,但我认为这是它背后的原因 - 强迫你设计这种类型的事情,而不是开发你的整个应用程序,假设它可以在本地存储所有内容,然后发现你需要完全重新设计,使其可扩展。

答案 2 :(得分:1)

你所看到的是Heroku中的ephemeral file system

  

每个dyno都有自己的ephemeral filesystem,并附有最近部署的代码的新副本。 在dyno的生命周期期间,其运行进程可以将文件系统用作临时暂存器,但是任何其他dyno中的进程都不会看到所写的文件,并且所写的任何文件都将被丢弃。 dyno停止或重新启动

简而言之,这意味着您上传的任何文件只会持续dyno运行的时间。当dyno关闭时,文件将被移除,除非它们是local git repo的一部分。

解决此问题的方法是将文件存储在第三方服务上 - 通常为S3。这将把文件存储在独立于Heroku的系统上。

Paperclip& Carrierwave支持S3(简单存储服务) - 通过名为fog的gem。 S3为您提供"free" tier,允许您免费存储一定数量的数据(我已经忘记了多少)。

我强烈建议您设置一个S3帐户并将其链接到您的Heroku应用程序。这样,您上传的任何文件都将存储在异地。