読み込み中...
オープンソースの写真・動画閲覧、アップロードアプリケーションであるimmichをdockerを用いて構築し、GooglePhotosのデータを移行しました。その構築手順や移行手順のメモです。

公式サイトのキャッチフレーズは以下のようになっています。
Self-hosted photo and
video management solution
Easily back up, organize, and manage your photos on your own server. Immich helps you
browse, search and organize your photos and videos with ease, without sacrificing your privacy.
日本語訳
セルフホスト型の写真・ビデオ管理ソリューション
自身のサーバー上で、写真を簡単バックアップ、整理、管理できます。Immich は、プライバシーを犠牲にすることなく、写真やビデオを楽に閲覧・検索・整理するお手伝いをします。
名前の通り、写真や動画をタグ付けしたり、アルバムを作成したり、記録された位置情報をもとに地図のピンで閲覧したりすることができるアプリケーションです。
GooglePhotosに非常にUIが似ており、写真を自動で人の顔ごとに分けたり、単語で写真を検索できる機能などもついています。
今回はdocker, docker-composeを使用して構築したいと思います。サーバーの構成は以下です。自宅のサーバーのProxmoxにVMとして構築しています。
まず、dockerおよびdocker-composeのインストールですが、ここはdockerの公式ガイドに沿って行います。
ここに書いてあることは参考にせず、ガイド通りに行うことを強く推奨します。
https://docs.docker.com/engine/install/ubuntu/
aptリポジトリのセットアップ
# Add Docker's official GPG key:
sudo apt update
sudo apt install ca-certificates curl
sudo install -m 0755 -d /etc/apt/keyrings
sudo curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
sudo chmod a+r /etc/apt/keyrings/docker.asc
# Add the repository to Apt sources:
sudo tee /etc/apt/sources.list.d/docker.sources <<EOF
Types: deb
URIs: https://download.docker.com/linux/ubuntu
Suites: $(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}")
Components: stable
Architectures: $(dpkg --print-architecture)
Signed-By: /etc/apt/keyrings/docker.asc
EOF
sudo apt updateインストール
sudo apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-pluginついでに、このサーバーは私しか使わないのでユーザー権限でdockerコマンドを実行できるようにします
sudo usermod -aG docker $(whoami)dockerのインストールが済んだので、immichの公式ガイドに沿ってdocker composeファイルをダウンロードし、起動していきます。
こちらも最新のガイドを見て構築を行うことを強く推奨します。
https://docs.immich.app/install/docker-compose/
immich用のディレクトリを作成します。
mkdir ./immich-app
cd ./immich-appdocker-compose.yamlと.envファイルのサンプルをダウンロードします
wget -O docker-compose.yml https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget -O .env https://github.com/immich-app/immich/releases/latest/download/example.envダウンロードした.envファイルを環境に合わせて変更します(変えるところはほとんどないはずです)。
vi .env起動させます
docker compose up -d起動したか確認します
docker compose ps起動している場合、以下のような表示になるかと思います。
NAME IMAGE COMMAND SERVICE CREATED STATUS PORTS
immich_machine_learning ghcr.io/immich-app/immich-machine-learning:v2 "tini -- python -m i…" immich-machine-learning 32 hours ago Up 32 hours (healthy)
immich_postgres ghcr.io/immich-app/postgres:14-vectorchord0.4.3-pgvectors0.2.0@sha256:bcf63357191b76a916ae5eb93464d65c07511da41e3bf7a8416db519b40b1c23 "/usr/local/bin/immi…" database 32 hours ago Up 32 hours (healthy) 5432/tcp
immich_redis docker.io/valkey/valkey:9@sha256:3b55fbaa0cd93cf0d9d961f405e4dfcc70efe325e2d84da207a0a8e6d8fde4f9 "docker-entrypoint.s…" redis 32 hours ago Up 32 hours (healthy) 6379/tcp
immich_server ghcr.io/immich-app/immich-server:v2 "tini -- /bin/bash -…" immich-server 32 hours ago Up 32 hours (healthy) 0.0.0.0:2283->228
デフォルトの場合だとサーバーの2283ポートにアクセスするとimmichが構築されているのが確認できるはずです。デフォルトの設定ではufwなどの設定を突き抜けて0.0.0.0で公開されてしまうので、VPSなどで作業する場合は特に注意しましょう。
ドメインを繋げる時はNginxなどのリバースプロキシを配置しましょう。私の場合は外部公開用のVMが分かれているのでそちらから参照させています。
私の場合は以下のようなNginx設定を行なっています。
server {
listen 80;
server_name ドメイン名;
location /.well-known/acme-challenge/ { allow all; }
location / { return 301 https://$host$request_uri; }
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name photos.zuiho.moe;
ssl_certificate /etc/letsencrypt/live/ドメイン名/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ドメイン名/privkey.pem;
ssl_session_timeout 1d;
# Enable TLS versions (TLSv1.3 is required upcoming HTTP/3 QUIC).
ssl_protocols TLSv1.2 TLSv1.3;
# Enable TLSv1.3's 0-RTT. Use $ssl_early_data when reverse proxying to
# prevent replay attacks.
#
# @see: https://nginx.org/en/docs/http/ngx_http_ssl_module.html#ssl_early_data
ssl_early_data on;
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384';
ssl_prefer_server_ciphers on;
# HSTS (ngx_http_headers_module is required) (15768000 seconds = six months)
add_header Strict-Transport-Security max-age=15768000;
# OCSP Stapling ---
# fetch OCSP records from URL in ssl_certificate and cache them
ssl_stapling on;
ssl_stapling_verify on;
location / {
client_max_body_size 100M;
proxy_set_header Connection "";
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
proxy_set_header X-Forwarded-Proto $scheme;
proxy_set_header X-Frame-Options SAMEORIGIN;
proxy_buffers 256 16k;
proxy_buffer_size 16k;
proxy_read_timeout 600s;
proxy_http_version 1.1;
proxy_pass http://サーバーのローカルIP:2283;
}
}この設定を/etc/nginx/sites-availableに作成し、certbotで証明書を取ってから、/etc/nginx/sites-enabledにシンボリックリンクを張って、適用させます。
この時点でDNSのレコード設定を行なっておきます。
vi /etc/nginx/sites-available/サイト名.conf
certbot certonly -d ドメイン名 --no-eff-email --agree-tos -m "メールアドレス" --nginx
ln -s /etc/nginx/sites-available/サイト名.conf /etc/nginx/sites-enabled/nginxの設定に誤りがないか確認して、設定をリロードします
nginx -tnginx: the configuration file /etc/nginx/nginx.conf syntax is okとか書いてあればOKです。
nginx -s reloadそうしたら、ドメイン名にアクセスするとimmichがドメイン名から見えるようになると思います。

今回はGoogle Photosからの写真データの移行も行いました。
今回はimmichのアップローダーとしてOSSで開発されているimmich-goを利用してGoogle Photosのデータのアップロードを行います
https://github.com/simulot/immich-go
Google Takeout Photosにアクセスし、エクスポートのリクエストを行います。
しばらくするとエクスポートの準備が完了した旨がメールで届くので、リンクから認証し、ファイルをダウンロードします。
takeout-20260421T021702Z-3-001.zipというようなファイル名だと思います。これをサーバーに転送またはローカルから、immich-goを使ってimmichにインポートしていきます。
GooglePhotosの写真情報はEXIFではなく、JSONに入るので、その情報付きでimmichにアップロードする手段として今回immich-goを利用します。
immich-goのバイナリを配置・実行Immich-GoのReadmeには以下のようにあります。
Immich-Go is an open-source tool designed to streamline uploading large photo collections to your self-hosted Immich server.
⚠️ This is an early version, not yet extensively tested
⚠️ Keep a backup copy of your files for safety
まだ安定版ではないことに留意して進めます。
Githubのリリースページから最新のリリースの自分のサーバーのアーキテクチャにあったバイナリをダウンロードし、解凍します。
wget https://github.com/simulot/immich-go/releases/download/v0.31.0/immich-go_Linux_x86_64.tar.gz
tar -xvf immich-go_Linux_x86_64.tar.gz構築したimmichで設定からAPIトークンを発行します。
google photosのアーカイブファイルからアップロードするモードでzipファイルを選択してアップロードを行います。作成したAPIトークンを--api-key=の後につけ、コマンドを実行します。サーバーとは異なる環境から実行する場合は--serverの値も適宜修正します。
./immich-go upload from-google-photos --server=http://localhost:2283 --api-key=XXXXXXXXXXXXXXXXXXXX ./takeout-*.zip実行すると、アップローダーが起動し、アップロードが始まります。

アップロードが完了すると、メッセージボックスがターミナル上に出現し、「安全にコマンドが終了できます」のような文言が表示されます。
アップロード後、サムネイルやタグ付けがサーバー上で行われるので、しばらく待ちます。
しばらく待つと、Google Photosの写真が引き継がれた高機能なimmichが利用できるはずです。
immichを構築し、GooglePhotosのデータを移行してみました。しばらく様子を見て良さそうなら本格的に移行してみようと思います。
immichは恒久に無料で提供する事を約束しています。ぜひ使ってみて良かったと思ったら、自分もdonateしようと思います。
コメント