Railsアプリケーションで、デプロイする度にアップロードした画像が表示されなくなる事象が発生したので、その時の解決策を残します。
Capistrano3で自動デプロイをしていて、画像のアップデートにはminimagickを使用。
画像のアップロードに関することなので、Active Storageの設定を修正します。
共有フォルダに画像ファイルを保存し、デプロイ時にデータが上書きされないようにします。
やることは2つだけです。
①Active Storageの画像の保存先を変更し、
②共有フォルダへシンボリックリンクを貼る。
##開発環境
・Rails 5.2.3
・Ruby 2.5.1
・ConoHa VPS
・CentOS 7.6
・Capistrano3
・Nginx
・Unicorn
##①Active Storageの画像保存先の変更
Active Storageの画像の保存先はstorage.ymlで設定します。
保存先がrootディレクトリ直下のstorageだったのを”public/storage”に変更します。
local:
service: Disk
root: <%= Rails.root.join("public/storage") %> # 元は "storage"
これでアップデート先が、/var/www/hoge_app/current/storageから、
/var/www/hoge_app/current/public/storageになりました。
その結果、共有フォルダ(sharedフォルダ)にも画像ファイルが保存されます。
共有フォルダにファイルを入れておくことで、デプロイ時にファイルの上書きを避けることができます。
##②共有フォルダへシンボリックリンクを貼る
capistranoでデプロイをしているので、capistranoの設定を修正します。
画像ファイルが保存されている共有フォルダへ、デプロイ時にシンボリックリンクを貼る設定をします。
append :linked_dirs, "log", "tmp/pids", "tmp/cache", "tmp/sockets", "vendor/bundle", "public/system", "public/storage" # “public/storage"を加える
これでデプロイ時に/var/www/hoge_app/shared/public/storageへのシンボリックリンクが貼られます。
これで設定は完了です。
この設定にしてからアップロードした画像は、デプロイ後もきちんと表示されました。
##参考
https://railsguides.jp/active_storage_overview.html
https://lab.unicast.ne.jp/2015/07/02/capistrano3%E3%81%A7%E3%81%AFshared_children%E3%81%A7%E3%81%AF%E3%81%AA%E3%81%8Flinked_dir%E3%81%AB%E3%81%AA%E3%82%8A%E3%81%BE%E3%81%97%E3%81%9F%E3%80%82/
https://qiita.com/okjnag/items/ee55fd0f214466a4d3c8
https://qiita.com/hmmrjn/items/7cc5e5348755c517458a#active-storage-%E3%81%A8%E3%81%AF