カメラで撮った写真の管理をどうにかしたいと思い、セルフホスト型フォト管理アプリの Immich を導入してみました。
最初は Raspberry Pi 5 + 自宅NAS という構成で試してみたのですが、運用に耐えられなかったので、その顛末をメモっておきます。
背景
Google フォトからの脱却を検討していたのですが、スマホ写真というよりはカメラで撮影した写真をまとめて管理したいというのが主な動機でした。
セルフホスト型のフォト管理アプリはいくつかありますが、Immich が機能・UI ともに完成度が高く、ブラウザから写真を一覧・管理できる点が決め手で選択しました。
ストレージについては S3 互換ストレージも検討しましたが、写真データの量を考えるとコストが積み上がりやすく、手元にある自宅 NAS を使うのが一番コスパが良いという結論になりました。
当初の構成
本来であれば NAS 単体で Immich を動かしたかったのですが、手元の ASUSTOR Drivestor AS1102T はメモリが 1GB しかなく、Immich を動かすには厳しいスペックです。
そこで、手元にあった Raspberry Pi 5 をサーバーとして使い、AS1102T はストレージとして有線 LAN で接続する構成にしました。
有線接続ならばレイテンシの心配はないだろうと思っていましたが…
ちなみに、写真のアップロードは PC からブラウザ経由で行うのがメインになります。
| 項目 | 内容 |
|---|---|
| サーバー | Raspberry Pi 5(8GB RAM) |
| NAS | ASUSTOR Drivestor AS1102T |
| ストレージ接続 | NFS マウント |
| アップロード | PC ブラウザ経由 |
| Immich | Docker Compose で構築(全コンテナ同一ホスト) |
NAS への NFS マウントは docker-compose.yml のボリューム定義で行っています。
volumes:
immich-library-data:
driver: local
driver_opts:
type: nfs
o: addr=192.168.11.128,rw,nfsvers=4
device: ":/volume1/Immich/library"
なお、外部公開は cloudflared 経由で行っていますが、Cloudflare Tunnel には 100MB のアップロード制限があります。
RAW ファイルや動画など大きいファイルをまとめてアップしようとするとここで引っかかるので、ローカルネットワーク内から直接アクセスしてアップロードするか、ファイルサイズに注意が必要です。
(分割アップロードに早く対応してくれ!🙏🏻)
immich-upload-optimizer について
アップロード時に JPEG XL の可逆 JPEG トランスコードを行うプロキシ immich-upload-optimizer を Immich の手前に挟んでいます。
これにより保存容量を節約できるのですが、Pi 5 の CPU でトランスコードを行うため、アップロードのたびに負荷がかかります。
既存の docker-compose.yml にサービスを追加するだけで導入できます。immich-server の代わりにプロキシがポート 2283 を受け持つようにします。
services:
immich-upload-optimizer:
image: ghcr.io/miguelangel-nubla/immich-upload-optimizer:latest
environment:
- IUO_UPSTREAM=http://immich-server:2283
depends_on:
- immich-server
networks:
default:
cloudflared:
aliases:
- immich
immich-server:
# ports: はプロキシが受け持つので削除する
# ...既存の設定...
やってみてわかった問題点
アップロードが遅い
一番きつかったのはここで、アップロード自体が遅いという点です。
immich-upload-optimizer によるトランスコード処理が走りつつ、同時に immich-machine-learning による機械学習処理も動くため、CPU がカツカツになります。
数枚であればなんとかなりますが、まとまった枚数をアップロードしようとすると目に見えて詰まる状況でした。
しばらく時間をおくとWebアクセスが重くなる
有線 LAN 接続なのでレイテンシは問題ないと思っていたのですが、しばらく時間をおいてからブラウザでアクセスすると、写真の読み込みが始まるまでに時間がかかるという現象がありました。
NASのディスクのハイバネーションは無効にしているので、NFS マウント特有の何かが影響しているのかもしれません。
ケースのファンがうるさい
Pi 5 はドリームキャス〇っぽい外見の「Dreamcase」というケースに入れて運用していました。
このケース、普段はそれほど気にならないのですが、写真アップロード時に CPU 負荷が上がるとファンがフル回転してかなりうるさいです。(そこもド〇キャス再現!?😱)
さらに、フタを閉めた状態だと排熱が追い付かず、夏場は厳しそうという懸念もありました。
噂に聞いていましたが、Pi 5の発熱量は思った以上に厄介です。
まとめ
| 問題 | 原因 |
|---|---|
| アップロードが遅い | トランスコード+機械学習で CPU が飽和 |
| Web アクセスが重くなる | NFS マウントによるレイテンシ |
| ファンがうるさい・排熱が厳しい | ケースの構造上、高負荷時の冷却が不十分 |
Pi 5 は省電力でコンパクトなのが魅力ですが、Immich のように CPU 負荷の高いアプリを全部載せにするには力不足でした。
また、NFS 越しにストレージを使う構成も、体感に影響が出るくらいのレイテンシがありました。
もしかしたら NFS を Docker のボリュームマウントしてるのが原因かもしれないですが、詳しく調べるには至っていません。
そして、構成を見直した結果については次の記事で書いていきます。
以上!



コメント