I'm using rails 3.2 with asset and carrierwave for upload some images, they store in /public/uploads/photo/..... but when I do a cap:deploy (with capistrano) my current directory application doesn't contain the files I uploaded, because capistrano make a new version ....
=== Update ===
After all I use this :
inside :deploy namespace
task :symlink_uploads do
run "ln -nfs #{shared_path}/uploads #{release_path}/public/uploads"
end
and after:
after 'deploy:update_code', 'deploy:symlink_uploads'
=== Re Update ===
The solution of @tristanm is the best way to solve this.
Capistrano creates new directory for every deploy.
There are some exceptions to it. For example, the log files are shared between the deployment directories because they are just symlinks. You have to create a symlink for public/uploads as well.
Here is the command:
How about this:
:shared_children
defaults to%w(public/system log tmp/pids)
so we're just expanding this list.EDIT:
Don't forget to run
cap deploy:setup
after changing:shared_children
so that the new targets are created undershared
.EDIT Capistrano 3:
Capistrano 3 uses the
linked_dirs
setting and doesn't specifypublic/system
as a default anymore.set :linked_dirs, fetch(:linked_dirs) + %w{public/system public/uploads}
With Capistrano 3 and without needing to redeploy.
Like @tristanm mentioned add this to your config/deploy.rb
To have capistrano create shared/public/uploads
cap deploy:check:linked_dirs
Now cap can create the symlink
cap deploy:symlink:shared
Finally, if you have backups of the uploads you can put them in shared/public/uploads/ and they should work without needing to redeploy.
Go to your app server shared folder and create an uploads directory.
mkdir uploads
In your deploy.rb file insert these codes under deploy namespace
task :symlink_uploads do
run "rm -rf #{latest_release}/public/uploads && ln -nfs #{shared_path}/uploads #{latest_release}/public/uploads"
end
after 'deploy:update_code', 'deploy:symlink_uploads'
Now delete the old files present already as they won't work. Upload a new file and cap deploy your app again. It should work now.
Using Capistrano 3, I just added this line to my config/deploy.rb
Then, run: