Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Creating temporary files in Heroku

I have an app hosted @ Heroku. The app depends on some feeds which are fetched using a socket listener. The socket listener gets one line of XML per second. Once I detect the end of file signal from the listener, I upload the file to Amazon S3 servers. But, until the end of file signal is received, is it possible to save the file content as a temporary file in Heroku?

like image 289
Satya Kalluri Avatar asked Jul 12 '11 08:07

Satya Kalluri


People also ask

Can you create files in Heroku?

Heroku has an “ephemeral” hard drive, this means that you can write files to disk, but those files will not persist after the application is restarted. By default Active Storage uses a :local storage option, which uses the local file system to store any uploaded files.

How Temporary files are created?

Temporary files, also called temp or tmp files, are created by Windows or programs on your computer to hold data while a permanent file is being written or updated. The data will be transferred to a permanent file when the task is complete, or when the program is closed.

Where does Heroku store files?

Files are uploaded directly to the cloud from your user's browser, without passing through your application. Adding direct uploads to your app allows you to offload the storage of static files from your app. This is crucial on Heroku, because your app's dynos have an ephemeral filesystem.

Does Heroku offer storage?

Heroku Postgres provides a managed SQL database as a service that is easily accessible from your Heroku applications to persist and manipulate data. All plans feature automatic health checks, off-premises storage, daily backups, SSL-protected access, dataclips, Postgres extensions, and a web Ul.


1 Answers

You may be able to use the #{RAILS_ROOT}/tmp/ directory or Rails.root.join('tmp').to_s:

Aspen & Bamboo
[...]
There are two directories that are writeable: ./tmp and ./log (under your application root).
[...]

Cedar
Cedar offers an ephemeral writeable filesystem. You can write out to disk anywhere you would like. Your changes will be lost on dyno restart and spin-up.

RAILS_ROOT is for older Rails versions, Rails.root is for newer versions.

You can't depend on anything surviving across requests of course, there's no guarantee that you'll even be working with the same dyno.

As long as you stay within the same process or request, Rails.root.join('tmp') should be usable. If you need the temporary data to survive across requests or processes then you're better off using something else (such as MongoDB or PostgreSQL) as a collecting ground for your data on its way to S3.


Thanks to Benjamin Wheeler for the heads up about the RAILS_ROOT to Rails.root change.

like image 103
mu is too short Avatar answered Sep 27 '22 16:09

mu is too short