コレグレーデギネード

WindowsとかUbuntuとかRubyとかRailsとか

Rails + CarrierWave + Capistranoの環境でDeployすると画像が消えてしまうので

開発環境では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)