Self-hosting my photos with Immich

Michael Stapelberg

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

原文は Michael Stapelberg により に公開されました。 このブログを購読する

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

完成形はこんな感じです。NixCon 2025で撮った(ライブ)写真をいくつか紹介します:

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

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

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

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

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

「photos」という名前のVMを作成し、ディスク500GB、CPU 4コア、RAM 4GBを割り当てました。

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

このブログ投稿で解説した方法で、そのVMに(宣言的に)NixOSをインストールしました:

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

services.immich = {
  enable = true;
};

この時点でImmichはlocalhostで利用可能になりますが、NixOSではデフォルトでファイアウォールが有効になっているため、ネットワーク経由ではアクセスできません。services.immich.openFirewallオプションを有効にすることもできますが、実際にはImmichをTailscale VPN経由でのみ利用したいと考えているため、ファイアウォールを開ける必要はありません。代わりにtailscale serveを使ってlocalhost: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で明言している通りです。SettingsAppsImmichNotificationsを開き、許可のチェックボックスをオフにしてください:

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

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

そこで、rsyncを定期実行するsystemdタイマーを設定し、/var/lib/immichをPCにコピーするようにしました。この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での自動バックアップの設定は難しすぎると思うので、この点も改善されるとよいでしょう。

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

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

コメント