Capistrano and Uploaded Documents

I have an application I'm working on which allows me to upload files. The files are stored somewhere in the public directory so that they can be accessed directly. When I deploy an update with Capistrano, I 'lose' the files because of the current symlink points to the new checked out version.

Before I start working on a solution, has anyone else already solved this problem?

Stephen Gerstacker


If you store your uploaded files in public/system they won’t get overwritten with every code update.



put them in the shared dir, or any other dir outside of those releases dir. You can do this to your app like so:

create a directory in the deploy_to/shared dir, let's call it file_storage. Copy all your current files to this /shared/file_storage dir. now, remove the dir and create a symlink to it.

Now, to make sure that dir gets symlinked everytime during a depoy, create a task called after_update_code. In it, symlink the dir, like so:

desc "Tasks to execute after code update" task :after_update_code, :roles => [:app, :db] do # uploaded file record storage run "rm -Rf #{release_path}/file_storage" run "ln -s #{uploaded_files_path}/file_storage #{release_path}/file_storage" end

The rm removes the symlink and the ln -s relinks it back.

in this case, uploaded_files_path could be: deploy_to/shared/files or just a dir /upload on your server root.

hope this helps. cheers!

Thanks, that worked like a charm.

Stephen Gerstacker