Self-hosting my photos with Immich

Michael Stapelberg

Immichで自分の写真をセルフホストする

使っているクラウドサービスについては、バックアップと自立性のために、すべてのデータをローカルにもコピーを持っておきたいと考えています。残念ながら、gphotos-syncツールはGoogleがOAuthスコープを制限したことにより2025年3月に動作しなくなりました。そのため、既存のGoogle Photos環境に代わる手段が必要になりました。この記事では、セルフホスト可能な写真管理ツールであるImmichをどのようにセットアップしたかを紹介します。

こちらが完成形です。NixCon 2025から、(ライブフォトを含む)写真をいくつかご紹介します:

ウェブブラウザに表示されたImmichのスクリーンショット

ステップ1:ハードウェア

ImmichはRyzen 7搭載ミニPC(ASRock DeskMini X600)で動かしています。アイドル時の消費電力は10W未満で、VM用に十分なリソース(RAM 64GB、ディスク1TB)を備えています。詳しくは2024年7月のブログ記事をご覧ください:

Proxmoxというオープンソースの仮想化プラットフォームをインストールして、このミニサーバーをVMに分割していますが、もちろんImmichをサーバーに直接インストールしても構いません。

ステップ2:Immichのインストール

ディスク500GB、CPU 4コア、RAM 4GBのVM(名前は「photos」)を作成しました。

初回のインポート時にはもう少しCPUやRAMを割り当ててもよいですが、通常の運用であればこれで十分です。

そのVMにはこちらのブログ記事で紹介した方法でNixOSを(宣言的に)インストールしました:

その後、以下の設定でImmichを有効化しました:

services.immich = {
  enable = true;
};

この時点でImmichはlocalhostでは利用できますが、NixOSはデフォルトでファイアウォールを有効にしているため、ネットワーク経由ではアクセスできません。services.immich.openFirewallオプションを有効にすることもできますが、私はImmichをTailscale VPN経由でのみ利用したいと考えています。その場合はファイアウォールを開ける必要はなく、代わりにtailscale servelocalhost:2283へトラフィックを転送しています:

photos# tailscale serve --bg http://localhost:2283

TailscaleのMagicDNSTLS証明書の自動発行を有効にしているので、PCやノートPC、スマートフォンのブラウザからhttps://photos.example.ts.netを開けるようになりました。

ステップ2:写真の初期インポート

最初は公式のImmich CLIを使って写真のインポートを試しました:

% nix run nixpkgs#immich-cli -- login https://photos.example.ts.net secret
% nix run nixpkgs#immich-cli -- upload --recursive /home/michael/lib/photo/gphotos-takeout

残念ながらアップロードは安定して実行されず、タイムアウトが発生するたびに手動で再起動する必要がありました。後で分かったのですが、これはImmichサーバーがサムネイル生成やメタデータ抽出、顔認識といったバックグラウンドジョブを実行しており、それらがアップロードを遅延させ、タイムアウトによる失敗を引き起こしていたためでした。

もう一つの問題は、アップロードが完了した後で気づいたのですが、Google PhotosのGoogle Takeoutアーカイブでは、元画像の横にメタデータが別個のJSONファイルとして格納されていることでした:

Takeout:Google Photosのフォーマット

残念ながら、これらのファイルはimmich-cliでは考慮されません。

幸い、immich-goという優れたサードパーティ製ツールがあり、この2つの問題をどちらも解決してくれます。アップロード前にバックグラウンドタスクを一時停止し、完了後に再開してくれるため、はるかに安定して動作しますし、Google Takeoutアーカイブの解釈にも最善を尽くしてくれます。

次のようにimmich-goを実行したところ、見事にうまくいきました:

% immich-go \
  upload \
  from-google-photos \
  --server=https://photos.example.ts.net \
  --api-key=secret \
  ~/Downloads/takeout-*.zip

ステップ3:Immich iPhoneアプリのインストール

新しい写真の主な入手元はスマートフォンなので、iPhoneにImmichアプリをインストールし、TailscaleのURL経由でImmichサーバーにログインして、右上のアイコンから新しい写真の自動バックアップを有効にしました。

これらの設定が正しいかどうかは100%確信があるわけではありませんが、カメラで撮った写真は基本的にLive Photosに入り、その他のファイルはRecentでカバーされるようです…?!

ご存じの方がいらっしゃれば、説明(またはリンク!)をお寄せください。記事を更新します。

また、Immichの通知はぜひ無効にすることを強くおすすめします。そうしないと、バックグラウンドで画像をアップロードするたびに通知が届いてしまいます。これらの通知はバックグラウンドアップロードの動作に必須ではないと、Immichの開発者がRedditで明言しています。「設定」→「アプリ」→「Immich」→「通知」を開き、許可のチェックを外してください:

ステップ4:バックアップ

バックアップに関するImmichのドキュメントには、参考になる推奨事項が記載されています。Immichの開発者はUPLOAD_LOCATIONの内容全体をバックアップすることを推奨しており、NixOSではそれが/var/lib/immichにあたります。backupsサブディレクトリにはSQLダンプが、uploadlibraryprofileの3つのディレクトリにはユーザーがアップロードしたすべてのデータが格納されています。

そこで、rsyncを実行して/var/lib/immichをPCにコピーするsystemdタイマーを設定しました。このPC自体は3-2-1バックアップの仕組みに組み込まれています。

まだ足りないものは?

Immichには(現時点では?)写真編集機能がないため、画像を回転・切り抜きしたいときはダウンロードしてGIMPを使っています。

画像を共有する際は、相手によっては今でもGoogle Photosにアップロードしています。

なぜImmichを選んだのか…?

セルフホスト型の画像管理ツールの中では、ImmichEnteが最も有望な選択肢のようです。

私の周りではImmichの方が人気がある印象でしたし、Enteは私が求めているものよりもスコープがはるかに大きいと感じました:

Enteは、サービスプロバイダーを信頼する必要なく、データをクラウドに保存するための完全オープンソースかつエンドツーエンド暗号化されたプラットフォームを提供するサービスです。このプラットフォーム上に、これまでに2つのアプリを構築しました。Ente Photos(AppleやGoogle Photosの代替)とEnte Auth(サポートが終了したAuthyの代替となる2FAアプリ)です。

私はエンドツーエンド暗号化されたプラットフォームは必要ありません。転送層(Tailscale)とディスク層(LUKS)ですでに暗号化しているので、これ以上の複雑さは不要です。

まとめ

Immichは素晴らしいアプリです!とても高速で、全体的に快適に動作します。

初期インポートも、適切なツールを使えばスムーズです。理想的には公式のimmich-cliが改善されるとよいのですが、あるいはimmich-goが公式になるのもよいかもしれません。

iPhoneでの自動バックアップの設定は難しすぎると思うので、その点も改善されるとよいでしょう。

ただ、こうした初期のつまずきを除けば、不満はまったくありません。

原文は Michael Stapelberg により に公開されました。

この記事は「muse-spark-1.2-contributor」を使用して翻訳されました。