開発環境ではCarrierWave画像の保存場所はpublic/uploads/*となり、その中に下記のパスに保存される。
app/loader/*.rbの中身
def store_dir "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" end
しかし、本番環境ではpublicディレクトリそのものがGit管理下にあるため、Deployするたびにpublic/uploadが削除されてしまう。
回避するためにはまず、public/uploadをGit管理下から除外する。
git rm -r --cached public/uploads
.gitignoreにも追記
/public/uploads
本番環境でアップロードされたファイルの上書きを避けるために保存される場所をsharedフォルダに変更する設定。
deploy.rbに追記。Capistrano3.*〜。
set :linked_dirs, %w(public/uploads)
これでDeploy時にシンボリックリンクが作成されるようになる。
$ bundle exec cap production deploy … ln -s /www/rails/project/shared/public/uploads /www/rails/project/releases/2020XXXXXXXXXX/public/uploads …
Deployが完了したら本番環境で画像をアップロード後、再度Deployを行い画像が消えないことを確認できれはOK。
Capistranoのバージョンが2以下の場合の設定。
set :shared_children, shared_children + %w{public/uploads}
Capistranoのバージョンの確認。
bundle exec cap --version
参考)
Capistrano バージョン確認 : やっぱり生が好き
How to get Capistrano to ignore upload directories (Carrierwave) – (via @AstonJ)