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

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

### 調べた内容 & 立てた仮説
Herokuは、24時間に一度再起動される。
また、その際ローカルファイルシステムへの変更が削除される。
>[dyno の自動再起動](https://devcenter.heroku.com/ja/articles/dynos#restarting "タイトル")

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

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


> 書き込まれたファイルはdynoが停止または再起動された瞬間に破棄されます。
[https://devcenter.heroku.com/articles/dynos#ephemeral-filesystem](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 セットアップ](https://railsguides.jp/active_storage_overview.html#%E3%82%BB%E3%83%83%E3%83%88%E3%82%A2%E3%83%83%E3%83%97)

```
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にコメントアウトで記載されていた。
もちろん[ドキュメント](https://railsguides.jp/active_storage_overview.html#amazon-s3%E3%82%B5%E3%83%BC%E3%83%93%E3%82%B9)にも記述あり。

```
# 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か？→再起動の仕様

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