我看到了这个问题:在git推送heroku之后,Heroku上上传的文件丢失了。
每次应用程序关闭并在不活动x分钟后重新启动时,您的应用程序都会被重新创建,并且所有存储的数据都会丢失。
现在我有用户可以上传两张照片,我收到了新用户的电子邮件确认。所以我可以检查用户注册和上传照片4和14小时前。我做了最后一次承诺,并在19小时前把它推给了heroku。而这4张图片,上传的新用户都是丢失的now.But,如果我刚刚注册用户,我可以看到图片。因此,我的应用程序在x分钟内处于不活动状态,然后重新启动和删除图像,这似乎是真的。
我读到了一些问题,比如在heroku(https://stackoverflow.com/questions/13597837/rails-images-erased-after-a-new-commit-on-heroku)上重新提交后删除的这个Rails映像(它说我应该使用像aws s3这样的外部服务器(我不知道它是什么,它将花费多少钱,以及如何连接它),那么它真的是真的吗?我还有别的选择吗?也许我应该简单地使用数字海洋(不会有同样的问题吗?)或者别的什么。这一问题是否会继续存在于付费账户中?
我使用rails和上传文件使用载波创业板,我不能上传代码在这里,因为我是从另一台笔记本编写。
发布于 2016-02-08 09:16:23
Heroku的文件系统是只读的。您不能期望上传的任何内容都会在那里持久存在,您需要使用外部存储机制,比如亚马逊的S3。
有关详细信息,请参阅链接。
https://devcenter.heroku.com/articles/s3 https://devcenter.heroku.com/articles/dynos#isolation-and-security
发布于 2016-02-08 09:59:54
Heroku实例运行的文件系统不是只读的,但它是短暂的,也就是说,在重新启动实例之后,存储在那里的文件不会持久存在。
这是Heroku深思熟虑的设计决定,它迫使您考虑存储数据的位置以及它对可伸缩性的影响。
你在问数字海洋-我没有使用它们,但是我从你的问题中假设它们允许你存储到一个持久的本地文件系统中。
接下来你必须问的问题是:如果你想运行你的应用程序的多个实例,会发生什么?它们是否共享相同的持久文件系统?他们能访问对方的文件吗?当几个应用程序实例使用相同的文件系统时,如何处理文件锁定以避免竞争条件?
Heroku的模型迫使您要么把东西放到数据库中,要么使用外部服务存储它。通常,任何这类系统都具有合理的可伸缩性--您可以有多个Heroku实例(可能运行在不同的机器、不同的数据中心等上),并且它们都会很好地交互。
我确实同意,对于一个简单的用例--你只想在开发过程中运行一个应用程序的一个实例--这可能不方便,但我认为这是它背后的原因--强迫你设计这类东西,而不是假设它可以在本地存储所有东西,然后发现你需要完全重新设计才能使它具有可伸缩性。
发布于 2016-02-08 10:22:03
你现在看到的是赫洛库的ephemeral file system:
每个dyno都有自己的
ephemeral filesystem,有一个最新部署的代码的新副本。在dyno的生命周期中,它正在运行的进程可以使用文件系统作为临时的便签,但是任何其他dyno中的进程都看不到写入的文件,并且在dyno停止或重新启动时,写入的任何文件都将被丢弃。
简而言之,这意味着您上传的任何文件只会持续到dyno运行的时间。当dyno关闭时,文件将被删除,除非它们是local git的一部分。
解决这个问题的方法是将文件存储在第三方服务(通常是S3 )上。这将把文件存储在一个独立于Heroku的系统上。
Paperclip和Carrierwave都支持S3 (简单存储服务)--通过一个名为fog的gem。S3为您提供了一个“自由”层,允许您免费存储一定数量的数据(我已经忘记了)。
我强烈建议设置一个S3帐户,并将其链接到您的Heroku应用程序。这样,您上传的任何文件都将被存储在场外.
https://stackoverflow.com/questions/35265886
复制相似问题