0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Heroku再起動で画像が消える理由

Posted at

解決したいこと

Herokuにデプロイしたアプリケーションについて、
なぜ画像だけが消え、その他データは消えずに残るのか。

調べた内容 & 立てた仮説

Herokuは、24時間に一度再起動される。
また、その際ローカルファイルシステムへの変更が削除される。

dyno の自動再起動

再起動後に実際のアプリ挙動を確認すると、
確かに画像は表示されなくなっている。

しかし、ユーザーログインは過去に作成したデータで可能で、
その他テーブルのデータは問題なくビューに表示されている。
つまり、DBが削除される、という意味ではないと解釈した。

書き込まれたファイルはdynoが停止または再起動された瞬間に破棄されます。
https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem

書き込まれたファイルとは、
アップロード形式、つまり拡張子が存在するデータ系を指すのか?と考えた。

質問した結果

結論として、書き込まれたファイルないし、ローカルファイルシステムとは、
Gitで管理していないファイルを指している。

では、なぜ画像は消えたのか?
Sequel Proで見てみると、DBはもちろん消えていない。

しかし、そのDB、
つまりActiveStorageのテーブルである
・active_storage_attachments
・active_storage_blobs
に存在するデータは、画像そのものではない。

ここには鍵のようなものが保存されていて、
自際の画像データはstorageディレクトリに存在する。

そして、このstorageディレクトは、
.gitignoreに指定されている。

# Ignore uploaded files in development.
/storage/*

つまり、実際の画像データはGitで管理していない。
そのため、Heroku再起動時に削除されてしまう。
そして、DBに鍵だけが残り、表示されない、ということだった。

気づいたこと

「ローカル」ファイルシステムという単語から、
ローカルについて、もう少し考えるべきだった。

また、HerokuがGit管理のレポジトリをHerokuへ反映するという
仕組みをきちんと理解していなかったな、と反省。

この点を思い出して、理解すれば、
ローカルじゃない、つまりgitに管理されないファイルなのでは?
と考えられたかもしてない。

あとは、Heokuの再起動に、思考を囚われすぎていた。
ActiveStrorageのファイル保存の仕組み、という観点からも
調べるべきだった。

理解していないくても、便利な機能が使えてしまうが、
理解していないがゆえに、この様なことがおきると痛感した。

ActiveStorageを確認

この機会に確認してみると、しっかり記載されていた。

Active Storageのサービスはconfig/storage.ymlで宣言します。
2 セットアップ

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>

test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

デフォルトで、storageに保存する用になっている。

そしてこの利用するサービスをActiveStorageに認識させるには
config/environments/development.rbで
下記を記述。

config.active_storage.service = :local

production環境なら、config/environments/production.rbに
test環境なら、config/environments/text.rbに記述する。

外部ストレージサービスの記述方法は、
storage.ymlにコメントアウトで記載されていた。
もちろんドキュメントにも記述あり。

# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
# amazon:
#   service: S3
#   access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
#   secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
#   region: us-east-1
#   bucket: your_own_bucket

# Remember not to checkin your GCS keyfile to a repository
# google:
#   service: GCS
#   project: your_project
#   credentials: <%= Rails.root.join("path/to/gcs.keyfile") %>
#   bucket: your_own_bucket

# Use rails credentials:edit to set the Azure Storage secret (as azure_storage:storage_access_key)
# microsoft:
#   service: AzureStorage
#   storage_account_name: your_account_name
#   storage_access_key: <%= Rails.application.credentials.dig(:azure_storage, :storage_access_key) %>
#   container: your_container_name

# mirror:
#   service: Mirror
#   primary: local
#   mirrors: [ amazon, google, microsoft ]

今探している情報は何か、どこに乗っているのか?

Railsドキュメントか?→ActiveStorageの保存場所
S3か?→何を設定したか
Herokuか?→再起動の仕様

と、脳内分岐する事も
欲しい情報にたどり着くのに必要だと感じた。

0
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?