書くところ

自宅 NAS の写真管理として Immich を導入してみる

インフラ勉強しつつ趣味をやる

動機

自前のミラーレス一眼で撮った写真を自宅 Samba 鯖で管理しているが、 そろそろ Google Photo みたいないい感じの管理システムを入れたいなと思い立った。 いろいろ探してみると、どうやら Immich という OSS がある模様。 UI がいい感じ、 MapView が使える、 モバイルアプリが使える という点を類似 OSS に比べ強みに感じたので、 今回導入してみた。

作業環境

デプロイする

自宅で k8s クラスタを建てているので、そこに載っけてみる。 今回、 Immich およびその関連コンポーネントは Helm 経由でデプロイした。

Quick start | Immich

Helm Chart のリポジトリはこちら

immich-charts/charts/immich/values.yaml at main · immich-app/immich-charts

作業の流れは大まかに以下の通り。

  1. cloudnative-pg をデプロイする
  2. Immich が使う PV/PVC をデプロイする
  3. Immich 本体をデプロイする
  graph LR
    immich[Immich Server]

    subgraph 2. pv/pvc
        pvc --> pv
    end


    subgraph 1. cloudnative-pg
        postgres[Postgres] --> pvc1[pvc]
        pvc1 --> pv1[pv]
    end

    subgraph 3. immich
        direction LR
        immich --> Redis
        immich --> postgres
        immich --> pvc
    end

デプロイ順概略図

なお、 Immich のアーキテクチャはこのページで紹介されている。これを読んでおくと、マニフェストを書くときに全体像がイメージしやすいかもしれない。

Architecture | Immich

immich-app/immich-charts のリポジトリにサンプルマニフェストが置いてあり、作業の参考とした。

https://github.com/immich-app/immich-charts/tree/7399dda6c34f0853c78e1f0e6596e727340cd54b/local

1. cloudnative-pg をデプロイする

まずは immich-charts に用意されていたサンプルマニフェストに乗っかるぞということで、 Postgres を浮かべようとしたら、どうやら CloudNativePG を使っている模様。 CloudNativePG について詳細は把握していないが、とりあえず Postgres を走らせる Kubernetes Operator らしいので、まずはこれを使えるようにしたい。

CloudNativePG is the Kubernetes operator that covers the full lifecycle of a highly available PostgreSQL database cluster (後略) CloudNativePG - PostgreSQL Operator for Kubernetes

Chart のリポジトリはこちら

cloudnative-pg/charts: CloudNativePG Helm Charts

Chart のインストールには特に難しい点はなかった。 README にあるこちらのコマンドを参考にオペレーションを行うことで、 CloudNativePG Operator がクラスタにインストールされる。

helm repo add cnpg https://cloudnative-pg.github.io/charts
helm upgrade --install cnpg \
  --namespace cnpg-system \
  --create-namespace \
  cnpg/cloudnative-pg

Operator のインストールが完了したら、あとは CloudNativePG Cluster をデプロイすればよい。 immich-charts のサンプルマニフェスト を apply する。 apply すると諸々のリソースが生えるが、そのなかに PersistentVolumeClaim も含まれるので、 自前で別途適切な PersistentVolume を生やす必要があるだろう。 Cluster が生やす PersistentVolumeClaim を調整したい場合はこちらの CloudNativePG ドキュメントを参照のこと。

2. Immich が使う PV / PVC をデプロイする

メディアライブラリ用の永続ボリュームをデプロイする。 PersistentVolumeClaim は次のデプロイ工程で使用する。

apiVersion: v1
kind: PersistentVolumeClaim
metadata:
  name: immich-library-pvc
spec:
  accessModes:
    - ReadWriteOnce
  resources:
    requests:
      storage: 10Gi

PVC の例

3. Immich をデプロイする

immich-chart をインストールすれば OK。 values にメディアライブラリ用の PVC を指定する必要があるので、 2 で作成した PVC を values に記載する。

helm install \
    --create-namespace \
    --namespace immich \
    immich \
    oci://ghcr.io/immich-app/immich-charts/immich \
    -f values.yaml
server:
  controllers:
    main:
      containers:
        main:
          env:
            DB_HOSTNAME:
              valueFrom:
                secretKeyRef:
                  name: immich-database-app
                  key: host
            DB_USERNAME:
              valueFrom:
                secretKeyRef:
                  name: immich-database-app
                  key: user
            DB_PASSWORD:
              valueFrom:
                secretKeyRef:
                  name: immich-database-app
                  key: password
            DB_DATABASE_NAME:
              valueFrom:
                secretKeyRef:
                  name: immich-database-app
                  key: dbname

valkey:
  enabled: true

immich:
  persistence:
    library:
      existingClaim: immich-library-pvc  # 2 で作成した PVC を使用する

values.yaml の例. 一部改変

デプロイが成功すると 2283 ポートで WebUI が起動する。 あとは WebUI 上の操作で完成。

使ってみる

WebFrontend、モバイルともに (Google Photo っぽい) 使いやすいクライアントが提供されている。

モバイルアプリは各種ストアから入手可能。ストアリンクは Immich のトップページ にもある。自動バックアップにも対応していて非常に優秀。

Google Photos からの移行

immich-go が便利そう。 Google Photos からエクスポートしたデータを、メタデータの紐付けを行った上で Immich にアップロードしてくれる。 実行コマンドはこんな感じ。

immich-go upload from-google-photos --server=http://your-ip:2283 --api-key=your-api-key ./Takeout

所感

撮った写真を振り返りやすくなったので、さらに撮るのが楽しくなりそう。 そしてインフラの勉強にもなるので、今後もちょくちょく自宅サーバを育てていきたい。