自宅 NAS の写真管理として Immich を導入してみる
インフラ勉強しつつ趣味をやる
動機
自前のミラーレス一眼で撮った写真を自宅 Samba 鯖で管理しているが、 そろそろ Google Photo みたいないい感じの管理システムを入れたいなと思い立った。 いろいろ探してみると、どうやら Immich という OSS がある模様。 UI がいい感じ、 MapView が使える、 モバイルアプリが使える という点を類似 OSS に比べ強みに感じたので、 今回導入してみた。
作業環境
- charts
- immich-0.10.3
- cloudnative-pg-0.27.0
デプロイする
自宅で k8s クラスタを建てているので、そこに載っけてみる。 今回、 Immich およびその関連コンポーネントは Helm 経由でデプロイした。
Helm Chart のリポジトリはこちら
immich-charts/charts/immich/values.yaml at main · immich-app/immich-charts
作業の流れは大まかに以下の通り。
- cloudnative-pg をデプロイする
- Immich が使う PV/PVC をデプロイする
- 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 のアーキテクチャはこのページで紹介されている。これを読んでおくと、マニフェストを書くときに全体像がイメージしやすいかもしれない。
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
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 を使用する
デプロイが成功すると 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
所感
撮った写真を振り返りやすくなったので、さらに撮るのが楽しくなりそう。 そしてインフラの勉強にもなるので、今後もちょくちょく自宅サーバを育てていきたい。