うたカモ技術ブログ

ネットワーク

Googleフォトのようなアプリ! Immichの導入と使い方   

post: 
Immichタイトル画像

今回は、写真・動画を自己ホストで管理できるImmich(イミッチ)を紹介します。

Immichは、急速に人気が高まっている自己ホスト型の写真・動画管理ソフトです。

Immichは、スマートフォンの写真自動バックアップやWeb UIでの閲覧をローカル環境で運用できるフォト管理ソフトになります。 クラウド依存を減らしつつ、複数端末で同じ画像・動画ライブラリを扱いたい場合に向いています。

この記事ではUbuntuなどのLinux環境を前提に、Docker ComposeでImmichを導入し、初期設定と運用時の確認ポイントまでまとめて紹介します。

目次

  1. Immichとは
  2. この記事で試した実施環境について
  3. インストール前準備
  4. Immichのインストール
  5. 初期設定
  6. クライアント接続と基本操作
  7. バックアップと更新運用
  8. トラブルシュート
  9. セキュリティ運用メモ
  10. 用途別の実行例
  11. おわりに
  12. 参考文献

Immichとは

Immichは、写真・動画の保存、検索、共有を自己ホストで行えるオープンソースソフトウェアです。

Googleフォトのような感覚で写真や動画をスマートフォンと同期して管理することができます。そのため、界隈ではGoogleフォト代替とも 言われており、サブスクリプション費用を抑えたい人や大企業にプライバシーデータを管理させたくないと考える人たちの間で近年人気になっています。

なお、Immichは宅内のLAN環境内での利用が前提ですが、Tailscale のようなVPNを併用すれば、自宅外から自分の Immich サーバーへ接続して利用することもできます。

Immichの基本構成

Immich は 1 つの画面だけで完結しているように見えますが、実際には Web UI を含むサーバー本体、データベース、Redis、機械学習用コンポーネントが分かれて動作します。

要素 役割
Immich Server Web UI と Web API の中核
PostgreSQL メタデータ(ユーザー情報・ライブラリ情報など)保持
Redis キュー処理・キャッシュ処理
Machine Learning 顔認識や検索補助などの機能を担当

公式のDocker Compose構成では、上記コンポーネントが分かれて起動します。 そのため、バックアップ対象も「画像データ」と「DBデータ」を分けて管理する前提で考えると整理しやすいです。

システム構成と導入手順概要

システム構成としては、次の図に示すようにImmich本体であるImmichサーバーを宅内LAN上に構築し、PCやスマートフォン側の専用アプリをインストールすることで利用可能になります。

Immichの導入手順概要

少々手間かもしれませんが、今どきのユーザービリティに富んだアプリなので、Immichサーバーを構築した時に流れで専用アプリのインストールが案内されます。 そのため、迷うことなく導入することができます。

今回はそんなImmichを構築して使ってみたいと思います。

この記事で試した実施環境について

上の図に示すように、この記事はUbuntu(Linux)にImmich(サーバー)をインストールし、PCのWebブラウザとAndroidスマホの専用アプリを介してログインした結果を基に作成しています。

項目 サーバー側 クライアント側
環境 Ubuntu 24.04 Windows 11 / Android 14
実行方式 Docker Compose Webブラウザ / Immichモバイルアプリ
公開範囲 宅内LAN(外部公開なし)

それでは導入方法の説明に入ります。

インストール前準備

まず Docker を準備します。ここで重要なのは、Immich 用には Ubuntu 標準の docker.io ではなく、Docker 公式パッケージの Docker Engine と Docker Compose plugin を使うことです。

結論だけ先に書くと、Docker については次の方針で進めてください。

  1. Ubuntu 標準の docker.io や旧来の docker-compose を前提にしない
  2. Docker 公式ドキュメントの Docker Engine install 手順に沿って、Docker Engine と Docker Compose plugin を入れる
  3. すでに docker.io を入れている場合は、そのまま使わず、Docker 公式ドキュメントの Uninstall old versionsInstall using the apt repository を実施して入れ替える

Immich 公式 Docs でも、docker.io パッケージ環境では docker compose up -d 実行時に問題が出ることがあると案内されています。ここでは、Docker の公式リポジトリから導入した Docker Engine と Compose plugin が入っている状態を前提に進めます。

Ubuntu では、次の流れで導入すると分かりやすいです。

1) 古い Docker 関連パッケージを外す

immich-server@kamo:~$ for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove -y $pkg; done

Ubuntu 標準の docker.io や、競合する古い Docker 関連パッケージを外します。何も入っていなければ、そのまま何も削除されないだけです。

immich-server@kamo:~$ sudo apt update

パッケージ一覧を更新します。

2) Docker 公式リポジトリを追加する準備

immich-server@kamo:~$ sudo apt install ca-certificates curl

HTTPS 経由で Docker 公式リポジトリを登録するための基本ツールを入れます。

immich-server@kamo:~$ sudo install -m 0755 -d /etc/apt/keyrings

GPG キー保存用ディレクトリを作成します。

immich-server@kamo:~$ sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc

Docker 公式の GPG キーを取得します。

immich-server@kamo:~$ sudo chmod a+r /etc/apt/keyrings/docker.asc

取得したキーを APT が参照できるようにします。

immich-server@kamo:~$ printf "Types: deb\nURIs: https://download.docker.com/linux/ubuntu\nSuites: %s\nComponents: stable\nArchitectures: %s\nSigned-By: /etc/apt/keyrings/docker.asc\n" "$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")" "$(dpkg --print-architecture)" | sudo tee /etc/apt/sources.list.d/docker.sources > /dev/null

Docker の公式 APT リポジトリを登録します。

immich-server@kamo:~$ sudo apt update

Docker 公式リポジトリを含めた状態で、もう一度パッケージ一覧を更新します。

3) Docker Engine と Compose plugin をインストール

immich-server@kamo:~$ sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin

Docker Engine 本体、CLI、containerd、Buildx、Compose plugin をまとめて導入します。

4) Docker が動くか確認

一般ユーザーで docker compose を使えるようにするため、まず現在のユーザーを docker グループへ追加します。

注意:dockerグループへの追加は必ず必要な作業ではない

docker グループは強い権限を持つため、家庭内の個人運用を前提にし、不特定のユーザーを安易に所属させないようにしてください。

docker グループにユーザーを所属させたくない場合、以降の説明で出てくるdockerコマンドの前にsudo付ければ実行が成功します。

immich-server@kamo:~$ sudo usermod -aG docker $USER

現在のユーザーを docker グループへ追加します。

その後、いったんログアウトして再ログイン(またはシステム再起動)し、グループ追加を反映させてから次を確認します。

immich-server@kamo:~$ docker --version

Docker 公式パッケージとして導入した Docker Engine が利用できることを確認します。

immich-server@kamo:~$ docker compose version

Docker Compose plugin が利用できることを確認します。ここで確認したいのは docker compose が使えることです。旧来の docker-compose コマンドを使う前提ではありません。

immich-server@kamo:~$ groups

出力結果に docker が含まれていることを確認します。含まれていなければ、ログアウト/ログインがまだ反映されていません。

immich-server@kamo:~$ docker run hello-world

テスト用コンテナを実行して、Docker Engine 自体が正常に動作し、かつ一般ユーザーで Docker を実行できることを確認します。

# 以下の表示結果であれば、Docker Engineが正常に動作しています。
immich-server@kamo:~$  docker run hello-world

Hello from Docker!
This message shows that your installation appears to be working correctly.

To generate this message, Docker took the following steps:
 1. The Docker client contacted the Docker daemon.
 2. The Docker daemon pulled the "hello-world" image from the Docker Hub.
    (amd64)
 3. The Docker daemon created a new container from that image which runs the
    executable that produces the output you are currently reading.
 4. The Docker daemon streamed that output to the Docker client, which sent it
    to your terminal.

To try something more ambitious, you can run an Ubuntu container with:
 $ docker run -it ubuntu bash

Share images, automate workflows, and more with a free Docker ID:
 https://hub.docker.com/

For more examples and ideas, visit:
 https://docs.docker.com/get-started/

Immichのインストール

1) 作業ディレクトリの作成

immich-server@kamo:~$ mkdir -p ~/apps/immich

Immich 用の作業ディレクトリを作成します。

immich-server@kamo:~$ cd ~/apps/immich

以降の設定ファイルをまとめて扱うため、作業ディレクトリへ移動します。

2) 公式Composeファイルと環境変数テンプレートの取得

immich-server@kamo:~/apps/immich$ wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml

公式の docker-compose.yml を取得します。

immich-server@kamo:~/apps/immich$ wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.env

環境変数のひな形になる .env を取得します。

3) .envを編集

少なくとも次の値は自分の環境に合わせて設定します。

例として、次のような値を設定します。

UPLOAD_LOCATION=./library
DB_DATA_LOCATION=./postgres
TZ=Asia/Tokyo
IMMICH_VERSION=v2
DB_PASSWORD=yourdbpassword

特に DB_PASSWORD は、Immich が内部で PostgreSQL に接続するときに使うパスワードです。Immich のログインパスワードとは別物なので、デフォルト値のままではなく、自分で決めた文字列へ変更してください。

公式Docsでは、Docker の解釈で問題が出にくいよう、DB_PASSWORD には英数字だけを使う形が案内されています。また、TZ はコメントアウトを外して自分のタイムゾーンへ変更する形です。

4) 起動

Immich の各コンテナをバックグラウンドで起動します。

immich-server@kamo:~/apps/immich$ docker compose up -d

補足:エラーが発生した場合の対処法

ここで unable to get image 'ghcr.io/immich-app/immich-server:v2': permission denied while trying to connect to the docker API at unix:///var/run/docker.sock のようなエラーが出る場合は、現在のユーザーに docker グループがまだ反映されていない可能性が高いです。その場合は、前段の sudo usermod -aG docker $USER を実行したうえで、ログアウト/ログイン(またはシステム再起動)を行い、groups コマンドで docker が含まれていることを確認してから再実行してください。

次に各コンテナが起動しているかを確認します。

immich-server@kamo:~/apps/immich$ docker compose ps

コンテナ起動が確認出来たら、ip aコマンドなどを使ってIPアドレスを調べます。

今回、私の環境ではUbuntu(Linux)のIPアドレスは192.168.3.18でした。

通常、Immichサーバーにはブラウザや専用アプリを介してhttp://<server ip address>:2283でアクセスできますので、 私の場合はhttp://192.168.3.18:2283でアクセスできることになります。

図にするとこんな感じです。

Immich環境構成例

それでは次節では初期設定について説明します。

初期設定

docker compose up -d の実行後は、まずブラウザで管理者アカウントを作成し、その後にクライアント接続へ進む流れで確認すると整理しやすいです。

Immich 初回ログイン画面1 - 「immichへようこそ」

最初に表示されるのはようこそ画面です。Immich のロゴとともに開始ボタンが表示されるので、ここから初期セットアップを進めます。

Immich 初回ログイン画面2 - 「管理者登録」

次に管理者ユーザーの登録画面が表示されます。最初のユーザーは管理者として扱われるため、メールアドレス、パスワード、名前を入力して登録します。

Immich 初回ログイン画面3 - 「ようこそ、utakamoさん」

管理者登録が終わると、初期設定ウィザードが始まります。ここからテーマ、言語、プライバシー関連の初期値を順に確認していきます。

Immich テーマ設定画面

テーマ設定では、Light と Dark を選べます。ここは後から変更できるので、まずは見やすい方を選べば十分です。

Immich 言語設定画面

言語設定では、UI に使う表示言語を選択します。特段の理由がない限り、日本語(母国語)を選んでおけば良いと思います。

Immich サーバープライバシー設定画面

サーバープライバシー設定では、地図表示機能やバージョンチェックのように外部サービスへ依存する機能を有効にするか確認できます。後から管理画面で変更できるので、最初は既定値のままでも構いません。

Immich ユーザープライバシー設定画面

ユーザープライバシー設定では、Google Cast のような追加機能を有効にするかを選びます。使う予定がなければ無効のままでも問題ありません。

Immich ストレージテンプレート設定画面

ストレージテンプレート設定では、アップロードされたファイルをテンプレートに従って自動整理する機能を有効にできます。まずは標準状態で始めて、運用に慣れてから使うかどうかを決めてもよいです。

Immich バックアップ設定画面

バックアップ設定では、Immich の写真・動画データとデータベースを合わせて保護する必要があること、また 3-2-1 バックアップ戦略が推奨されることが案内されます。

Immich モバイルアプリ選択画面

初期ウィザードの終盤では、モバイルアプリの導線も表示されます。ここからアプリストアや Obtainium 向け設定へ進めます。

Immich アプリのダウンロードリンクリスト

ダウンロードリンク一覧では、Google Play、App Store、F-Droid などの入手先がまとめて表示されます。ここまで終われば、ブラウザ側の初期設定はひとまず完了です。

ここまで確認できたら、次はブラウザとモバイルアプリから接続し、実際に写真や動画を扱える状態になっているかを確認します。

クライアント接続と基本操作

ここではAndroidスマホに専用アプリをインストールする方法と初回ログインについて説明します。

インストール

次のストアからインストールすることができます。

初回ログインと簡単な使い方

Android アプリを起動すると、まずサーバーのエンドポイント URL を入力する画面が表示されます。ここでは http://サーバーのアドレス:ポート番号 の形で、Immich サーバーの接続先を指定します。

Immich(Androidアプリ)- サーバーエンドポイントURL入力画面(初期状態)

例えば、今回の私の環境ではImmichサーバーのUbuntu(Linux)のIPアドレスが192.168.3.18でしたので、http://192.168.3.18:2283 のようにサーバー IP とポート番号を入力します。入力後に次へ進み、ログイン画面へ移動します。

Immich(Androidアプリ)- サーバーのエンドポイントURL設定画面

次に、ブラウザ側で作成したメールアドレスとパスワードを入力してログインします。ここでは Web 画面で作成した管理者アカウント、または追加した一般ユーザーアカウントを使います。

Immich(Androidアプリ)- ログイン画面

初回ログイン後は、端末内の写真と動画へのアクセス許可を求められます。自動バックアップまで使う場合は、ここで許可しておく必要があります。

Immich(Androidアプリ)- 写真と動画へのアクセス許可画面

ログインが終わると、Android アプリのメイン画面が表示されます。最初は空に見えても問題ありません。まだ同期されていないだけなので、次はライブラリ画面から端末内の写真フォルダを確認します。

Immich(Androidアプリ)- メイン画面

ライブラリ画面では、お気に入り、アーカイブ、共有リンク、撮影場所に加えて、端末内の項目も確認できます。バックアップ対象を選ぶときは、この画面から端末内の項目を開きます。

Immich(Androidアプリ)- ライブラリ画面

端末内の項目を開くと、Pictures、Camera、Download など、バックアップ候補になるフォルダが一覧表示されます。ここで、どのフォルダを Immich に同期するかを選びます。

Immich(Androidアプリ)- デバイス上の項目一覧

フォルダ(例:Pictures)を 1 つ開くと、中にある画像や動画の一覧が表示されます。まずはここで手動アップロードや同期対象の確認を行い、その後に自動バックアップを有効にすると切り分けしやすいです。

Immich(Androidアプリ)- Pictures フォルダ画面

(ちなみに、上のスマホ画面のキャラは私が最近始めたガジェット記事の看板キャラクタ(名前はまだ無い)です。)

以上がImmichのログインと簡単な使い方になります。色々弄っていけば、細かな使い方についてどんどん分かってくるかと思います。

バックアップと更新運用

バックアップ対象

Immich では、写真や動画ファイルだけを残しても完全な復旧はできません。ライブラリ情報やユーザー情報、設定内容も別の場所に保持されるため、少なくとも次の 3 つをセットでバックアップしたいです。

  1. UPLOAD_LOCATION配下(写真・動画データ)
  2. DB_DATA_LOCATION配下(DBデータ)
  3. docker-compose.yml / .env(構成情報)

補足

上記の1番と2番は.envに記載されいてる情報になります。

UPLOAD_LOCATION 配下には、実際の写真や動画ファイルが保存されます。ここが失われると、ライブラリ本体を失うことになります。

DB_DATA_LOCATION 配下には、PostgreSQL のデータが保存されます。ここにはユーザー情報、アルバム情報、サムネイルや検索に必要なメタデータの管理情報が含まれるため、失われると写真ファイルが残っていても運用の復旧が難しくなります。

docker-compose.yml.env は、コンテナ構成や保存先パス、Immich のバージョン、データベース接続用パスワードといった設定情報です。再構築時に同じ構成を再現するため、これらも一緒に残しておきたいです。

更新手順の基本形

immich-server@kamo:~/apps/immich$ docker compose pull

最新のコンテナイメージを取得します。

immich-server@kamo:~/apps/immich$ docker compose up -d

取得した新しいイメージでコンテナを再作成し、更新を反映します。

immich-server@kamo:~/apps/immich$ docker compose logs --tail=100

更新直後のログを確認し、エラーが出ていないかを見ます。

トラブルシュート

1) Web画面にアクセスできない

immich-server@kamo:~/apps/immich$ docker compose ps

まずコンテナが停止していないかを確認します。

immich-server@kamo:~$ ss -tulpn | grep :2283

Immich の待受ポート 2283 が開いているかを確認します。

2) 起動はしているが処理が不安定

immich-server@kamo:~/apps/immich$ docker compose logs --tail=200

直近のログを確認し、エラーや再起動ループの有無を調べます。

3) 更新後に問題が出た

まずリリースノートを確認し、Composeファイルや環境変数の変更点がないかを確認してください。 変更点を反映せずに更新すると、起動しても機能が不完全になる場合があります。

セキュリティ運用メモ

運用に関しては大体、以下の3つを気を付けてください。

  1. LAN内運用を基本にし、外でも使いたいときはVPNサービスの利用を検討する(例:Tailscale
  2. 弱いパスワードを使わない
  3. 定期的にバックアップを取って復元テストを行う

用途別の実行例

1) スマホの写真を自宅サーバーへ自動保存したい

モバイルアプリの自動バックアップを有効化し、撮影データをLAN経由で自宅サーバーへ集約します。

2) 家族ごとにライブラリを分けたい

ユーザーを分けて運用し、必要な範囲だけ共有設定を行います。管理者アカウント常用は避けると安全です。

3) クラウド依存を減らしたい

まずは宅内LANの自己ホスト運用から始め、必要に応じてVPN経由アクセスへ拡張するのが現実的です。

上手く活用して従来のクラウドサービスの完全代替と見なすことができれば、お金の節約になります。

おわりに

この記事では、Immichの導入手順をDocker Compose前提で整理しました。

実運用では「データ保存先の設計」と「更新前確認」が重要です。導入後はバックアップ方針までセットで整備してください。

参考文献