Docker

UGREEN NAS DXP2800とOracle Cloud Always FreeでImmichを快適に運用する

以前、Raspberry Pi 5 + 自宅NASでImmichを動かそうとして断念した話を書きました。
その後、構成を見直して UGREEN NAS DXP2800 と Oracle Cloud Always Free の組み合わせに移行したところ、かなり快適になった話です✨

前回の記事はこちらをご覧ください。

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

スポンサーリンク

構成の概要

今回の構成では、Immich 本体は UGREEN NAS DXP2800 上で動かし、機械学習処理だけ Oracle Cloud の Always Free インスタンスに切り出すというアプローチを取りました。

flowchart TB PC["💻 PC(ブラウザ)"] -->|HTTPS| CF Phone["📱 スマートフォン(自動バックアップ)"] -->|HTTPS| CF CF["Cloudflare Tunnel"] -->|トンネリング| Proxy subgraph Home["自宅ネットワーク"] subgraph NAS["UGREEN NAS DXP2800"] Proxy["immich-upload-optimizer(プロキシ)"] Immich["Immich"] DB["PostgreSQL"] Storage["📂 内蔵ストレージ"] Proxy --> Immich Immich --- DB Immich --- Storage end end Immich -->|Tailscale| TS["Tailscale"] subgraph OCI["Oracle Cloud Always Free"] ML1["immich-machine-learning #1\n(ARM 2ocpu / 12GB)"] ML2["immich-machine-learning #2\n(ARM 2ocpu / 12GB)"] end TS --> ML1 TS --> ML2
項目 内容
メインサーバー UGREEN NAS DXP2800 (Intel N100 4コア / 8GB RAM)
ストレージ DXP2800 内蔵 HDD
機械学習 Oracle Cloud Always Free × 2台(Ampere A1 / ARM 2ocpu / 12GB RAM)
Immich Docker Compose で構築
Docker 管理 Portainer(別サーバー)+ Edge エージェント
外部公開 Cloudflare Tunnel(cloudflared)

UGREEN NAS DXP2800を選んだ理由

NAS 単体で Immich が動くスペックのものを探していたのですが、一番の決め手はメモリ搭載量(8GB)の割に低価格であることでした。
メモリが高騰している昨今、後から増設するとかなり割が合わないので、最初から十分な量を積んでいるモデルを選びたかったというのがあります。
(増設も可能なので、将来性もある)

CPU については機械学習を OCI に任せることにしたので、Intel N100 で十分という判断です。

UGREEN は NAS メーカーとしては新参で、ソフトウェアの成熟がまだ十分とは言えない部分もあります。とはいえ、価格面では他社と比べてかなり優位なので、コスパを重視するなら十分に選択肢に入ると思います。

前回使っていた ASUSTOR Drivestor AS1102T はメモリが 1GB しかなく Immich が動かせなかったので、DXP2800 への買い替えでその問題も解消されました。

Oracle Cloud Always Free について

機械学習処理は OCI の Always Free 枠の Ampere A1 インスタンスを 2 台使って運用しています。
Always Free 枠では Ampere A1 は合計 4 ocpu / 24GB RAM まで無料で使えるので、2ocpu / 12GB RAM のインスタンスを 2 台構成にしました。

ブートイメージは Canonical-Ubuntu-24.04-Minimal を使用しています。

なお、Always Free 枠では x86 の VM.Standard.E2.1.Micro インスタンスも使えますが、メモリが少なく機械学習には力不足なので今回は採用していません。

さすがに他に仕事が無くて、ほとんどアイドリングしてるだけなのはもったいないので、Immich の機械学習処理がないときは、BOINC でグリッドコンピューティングをさせています。

ストレージはブートボリュームのみで最低容量の 50GB にしています。Always Free 枠ではストレージスペックに制限がないため、最高性能のものを選択しています。(今回の構成ではあまり関係ないけど)

なぜOCIだけで完結させないのか

OCI のスペックは Immich 全体のワークロードに耐えうるものですが、ストレージが問題です。
Always Free 枠ではブートボリュームの上限が 200GB となっており、数 TB 級の写真ライブラリを置くには足りません。
かといって有料のブロックストレージやオブジェクトストレージを追加すると、ランニングコストがかなり高くつくので断念しました。

逆に言えば、200GB に収まる量であれば OCI だけで完結させる構成も十分アリです。その場合は自宅 NAS を用意するより冗長性の面でも有利になります。

ネットワーク構成について

今回の構成で一番特殊な点がネットワーク周りです。

immich-machine-learning には認証機能が組み込まれていないため、インターネットに直接公開するわけにはいきません。
そこで、Tailscale で NAS と OCI インスタンスをプライベートネットワークでつなぎ、機械学習サーバーへの通信は Tailscale 経由に限定しています。

外部公開の構成は前回と同様で、cloudflared によるトンネリング経由です。

compose のネットワーク構成

前回と同じく、プロキシは cloudflared ネットワークに接続して Cloudflare Tunnel からのトラフィックを受け取ります。
ただし今回は tailscale コンテナをネットワークのハブとして使っており、tailscalenetwork_mode: "service:server" で server コンテナのネットワークに相乗りする形になっています。

services:
  tailscale:
    image: tailscale/tailscale:latest
    cap_add:
      - NET_ADMIN
      - NET_RAW
    devices:
      - /dev/net/tun:/dev/net/tun
    network_mode: "service:server"
    # ...

  proxy:
    image: ghcr.io/miguelangel-nubla/immich-upload-optimizer:latest
    environment:
      - IUO_UPSTREAM=http://server:2283
    networks:
      default:         
      cloudflared:
        aliases:
          - immich
    # ...

  server:
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    dns:
      - 100.100.100.100
      - 1.1.1.1
# machine-learning はコメントアウト(OCI側で稼働)

プロキシからは暗黙のデフォルトネットワークを経由して Immich サーバーに到達できる構成になっています。
また、Immich サーバーから OCI 上の機械学習サーバーへの通信は、tailscale のネットワーク経由で行われます。

server コンテナは tailscale の MagicDNS を利用して機械学習サーバーのホスト名 (例 machine-learning.example.ts.net)が解決できるよう、プライマリDNSサーバーに 100.100.100.100 を設定しています。

実際に使ってみて

サムネイル生成・トランスコードの速度は Pi 5 と比べて大幅に改善しました。
機械学習処理は OCI に任せているため、NAS 側の CPU 使用率は安定しており、Web UI の操作感も快適です。

前回問題になっていたアップロードの遅さも解消されており、まとまった枚数を投入してもストレスなく処理されるようになりました。

まとめ

項目 Pi 5 + NAS(以前) DXP2800 + OCI(今回)
アップロード速度 詰まる 快適
UI の快適さ もっさり 快適
機械学習 CPU に重い OCI 2台に分離して安定
コスト 電気代のみ(NAS + Pi5) 電気代のみ(NAS)

Immich をちゃんと使いたいなら、それなりのスペックのマシンで動かすのが正解でした。
機械学習を OCI に逃がす構成は少し手間ですが、無料で快適に動くのでおすすめです。

OCI は Always Free だけで完結するので、有料アカウントにする必要は無いのですが、非常に人気が高い為、優先順位の低い Free Tier アカウントでは、相当運が良くないとインスタンス作成ができません。数カ月単位で延々とリトライしつづける覚悟がなければ、最初から有料アカウントにしてしまった方が無難です。

いずれの課題

NAS 自体が火災などで物理的に失われた場合、写真データがすべて消失してしまいます。
オフサイトバックアップの仕組みも検討しなければと思っています。

やっぱりコスパで言うと AWS S3 の Glacier Deep Archive ですかね🤔

余談:Intel Optane メモリを試してみた

DXP2800 は M.2 スロットが 2 つあり、NVMe SSD を増設できます。(低価格なのにすごい!)
数百円で安売りされていた 16GB の Intel Optane メモリを取り付けてみたのですが、認識されたのが 13.4GB にとどまり、最低条件の 16GB を満たせず結局使えませんでした。
安かったのでダメ元ではありましたが、残念でした😭
同じこと考えてる人はいると思いますので、参考にしてください…


ご意見・ご質問はお気軽にどうぞ😊

記事を書いた人

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

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

コメント

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