Docker

Raspberry Pi 5と自宅NASでImmichを動かしたら辛かった話

カメラで撮った写真の管理をどうにかしたいと思い、セルフホスト型フォト管理アプリの Immich を導入してみました。
最初は Raspberry Pi 5 + 自宅NAS という構成で試してみたのですが、運用に耐えられなかったので、その顛末をメモっておきます。

Immich
Self-hosted photo and video management solution. Easily back up, organize, and manage your photos on your own server. Immich helps you browse, search ...

スポンサーリンク

背景

Google フォトからの脱却を検討していたのですが、スマホ写真というよりはカメラで撮影した写真をまとめて管理したいというのが主な動機でした。
セルフホスト型のフォト管理アプリはいくつかありますが、Immich が機能・UI ともに完成度が高く、ブラウザから写真を一覧・管理できる点が決め手で選択しました。

ストレージについては S3 互換ストレージも検討しましたが、写真データの量を考えるとコストが積み上がりやすく、手元にある自宅 NAS を使うのが一番コスパが良いという結論になりました。

当初の構成

本来であれば NAS 単体で Immich を動かしたかったのですが、手元の ASUSTOR Drivestor AS1102T はメモリが 1GB しかなく、Immich を動かすには厳しいスペックです。
そこで、手元にあった Raspberry Pi 5 をサーバーとして使い、AS1102T はストレージとして有線 LAN で接続する構成にしました。
有線接続ならばレイテンシの心配はないだろうと思っていましたが…

ちなみに、写真のアップロードは PC からブラウザ経由で行うのがメインになります。

flowchart TB PC["💻 PC(ブラウザ)"] -->|HTTPS| CF Phone["📱 スマートフォン(自動バックアップ)"] -->|HTTPS| CF CF["Cloudflare Tunnel"] -->|トンネリング| Proxy subgraph Home["自宅ネットワーク"] subgraph RasPi["Raspberry Pi 5"] Proxy["immich-upload-optimizer(プロキシ)"] Immich["Immich"] DB["PostgreSQL"] ML["immich-machine-learning"] Proxy --> Immich Immich --- DB Immich --- ML end NAS["ASUSTOR Drivestor AS1102T"] end Immich -->|NFSマウント| NAS
項目 内容
サーバー 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 でトランスコードを行うため、アップロードのたびに負荷がかかります。

GitHub - miguelangel-nubla/immich-upload-optimizer: Automatically optimize files uploaded to Immich in order to save storage space
Automatically optimize files uploaded to Immich in order to save storage space - miguelangel-nubla/immich-upload-optimizer

既存の 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 のボリュームマウントしてるのが原因かもしれないですが、詳しく調べるには至っていません。

そして、構成を見直した結果については次の記事で書いていきます。

以上!

記事を書いた人

システムえんじにゃー🐈
趣味はエレキギター、自転車など。作曲したい。
World of Warshipsやってます。
記事に関する質問はお気軽にどうぞ。

surface0 (さーふぇす)をフォローする
シェアする
スポンサーリンク

コメント

タイトルとURLをコピーしました