ラズパイで写真管理をするようになって、1年経った
公開日:
最終更新日:
自宅サーバの様子(ラズパイ・HDD・ルータ)
2024年6月から、自宅サーバを作って「おうちGoogleフォト」的な写真・動画管理環境を運用しています。
スマホで撮影した写真・動画をほぼ無制限にバックアップし、タイムライン・アルバムなどの機能で快適に閲覧できます。
遠方の両親には孫専用アルバムを共有しています。
運用開始から約1年、安定稼働しているので、構築手順やハマりどころなどを振り返ってみます。
2024年前半に第一子が生まれ、写真・動画が一気に増えました。
それまで Google フォト のフリープランで運用していましたが無制限が終了したことで容量が 16GB ほどに制限されてしまいおり、さすがに限界を迎えました。
この記事での「写真」は「写真と動画」 を意味しています。
息子の写真を撮るたびに容量が気になります…。長時間の動画も気にせず撮りたい…。容量問題は解決しなければならない課題でした。
この課題の達成条件は👇️の5つです
- 事実上、無限に写真と動画が保存できること
- スマホから保存・閲覧できること
- サブスクはしないこと
- Google フォトに保存した大量のコンテンツを引き継げること
- 息子の写真を、遠方の両親にラクにシェアできること
- ラインで逐次送るのが面倒なので「このアプリのここをタップすれば孫の写真が見られるよ!」という状態にしたい
「サブスクしないこと」は写真を削除しない限り永続的に課金し続ける必要があるからです。私の現在(2025/08)の写真・動画データは合計265.6GBあります。
この量をサブスクで運用すると…
Googleでも年で ¥17,400 かかかりますし、それが永続的に続くと想像しながら暮らすのはストレスです。
個人的には、むしろHDDを買って手元で管理するほうが精神衛生的に良いです。
この記事では、
- 容量無制限フォトストレージの構築(1.2.3.4.)
- 遠隔地の写真をシェアする(5.)
という2つのゴールに分けて解説していきます。
左から、ラズパイ・ルータ・HDD・ONU
graph LR
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
cloudflared
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
cloudflared <--> immich-server
cloudflared <--> |"Cloudflare Tunnel"|cloudflare["Cloudflare"]
cloudflare <--> |"サービストークン"|mobile["Mobile App"]
cloudflare <--> |"ワンタイムパスワード / SSO認証"|web["Web App"]
上の図では、LAN 内の Immich サーバが Cloudflare を通じて外部公開される流れを示しています。モバイルアプリからはトークン、WebアプリからはSSO認証を通じてアクセスします。
-
登場人物
- Immich: 写真・動画管理用のOSSアプリケーション
- Raspberry Pi: Immichをホストするサーバ
- HDD・ケース: DB,写真の保存領域
- Cloudflare: LAN外との通信用のドメイン、トンネリング
自宅内で写真の保存・閲覧を可能にするため、👇️の環境を構築します
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
写真管理用のアプリケーションとそれをホストするサーバ、そして保存領域が必要です。
OSSのフォトアプリケーションはたくさんありますが、我が家はスマホでのみ写真を撮影するためモバイルアプリの存在が重要です。
👇️の比較表から見たときにモバイルアプリとアルバム機能がある Immich を採用しました。
GitHub - meichthys/foss_photo_libraries: Free and Open Source Photo Libraries
Free and Open Source Photo Libraries. Contribute to meichthys/foss_photo_libraries development by creating an account on...
github.com
Home | Immich
Self-hosted photo and video management solution
immich.app
これはGoogleフォトライクな写真・動画管理アプリです。別のツールを使用することでGoogle フォトからのデータ移行(後述)もサポートしています。
サーバは Raspberry Pi 4 にしました。
メインの目的ではありませんが、クリアケースに入れて基盤が見えている無骨な姿にしたかったんですよね。
昔、ゲームボーイ や NINTENDO64 にあったスケルトンモデルが好きでした…
ラズパイなら小さくて扱いやすいし、クリアケースもよく売っているので選びやすいのです。
Amazon.co.jp: ラズベリーパイ 4 コンピューターモデルB 8GB Raspberry Pi 4 ラズパイ 4 TELEC認定取得済み (Raspberry Pi 4 8GB) : パソコン・周辺機器
Amazon.co.jp: ラズベリーパイ 4 コンピューターモデルB 8GB Raspberry Pi 4 ラズパイ 4 TELEC認定取得済み (Raspberry Pi 4 8GB) : パソコン・周辺機器
amzn.to
Amazon | KIOXIA(キオクシア) 旧東芝メモリ microSD 64GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA064G | KIOXIA | microSDカード 通販
KIOXIA(キオクシア) 旧東芝メモリ microSD 64GB UHS-I Class10 (最大読出速度100MB/s) Nintendo Switch動作確認済 国内サポート正規品 メーカー保証5年 KLMEA064G...
amzn.to
OSのインストール用に必要
Amazon.co.jp: Miuzei 最新 Raspberry Pi 4 ケース ラスベリー パイ4 5.1V 3A USB-C 電源アダプター+冷却ファン+ヒートシンクラズパイ 4 Model B対応(Raspberry Pi 4 本体含まりません)PSE取得 : パソコン・周辺機器
Amazon.co.jp: Miuzei 最新 Raspberry Pi 4 ケース ラスベリー パイ4 5.1V 3A USB-C 電源アダプター+冷却ファン+ヒートシンクラズパイ 4 Model B対応(Raspberry Pi 4 本...
amzn.to
Immichの必須要件をクリアしている必要はあるので注意。
Requirements | Immich
Hardware and software requirements for Immich:
immich.app
容量については物理HDDを2つ(1つはバックアップ用)用意。
Amazon.co.jp: WESTERN DIGITAL 3.5インチ内蔵HDD 1TB SATA6.0Gb/s 7200rpm 64MB WD10EZEX : パソコン・周辺機器
Amazon.co.jp: WESTERN DIGITAL 3.5インチ内蔵HDD 1TB SATA6.0Gb/s 7200rpm 64MB WD10EZEX : パソコン・周辺機器
amzn.to
Amazon.co.jp: ロジテック HDD SSD コピー スタンド デュプリケーター クローン 換装 usb対応 SATA 【 エラースキップ機能 / 3.5インチ / 2.5インチ / Win/Mac/テレビ 】 国内メーカー LHR-2BDPU3ES : パソコン・周辺機器
Amazon.co.jp: ロジテック HDD SSD コピー スタンド デュプリケーター クローン 換装 usb対応 SATA 【 エラースキップ機能 / 3.5インチ / 2.5インチ / Win/Mac/テレビ 】 国内メーカー...
amzn.to
玄人志向のスタンドに裸のHDDを立てて(いわゆる裸族)、クリアケースに入れたラズパイを隣においておく…
これもやりたかったんですよね…。
さて、必要なものが揃ったら次にラズパイをセットアップします
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
style rapy fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
style hdds fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
基本的には公式の手順に従います。OSを入れたSDカードをラズパイに指してbootする流れです。
Getting started - Raspberry Pi Documentation
The official documentation for Raspberry Pi computers and microcontrollers
www.raspberrypi.com
ラズパイが起動したらローカルIPを固定します。今後ラズパイにログインしたり、自宅から Immich にアクセスしたりするとき、このIPを使うためです。DHCPによる自動割り当てだとIPが変わってしまうことがあるので、固定化しておきましょう。
ルータのDHCP設定画面で、 ラズパイの有線LANのMACアドレス と任意のIPアドレスを手動設定します。
バッファローのルータ管理画面
画像の一番下の行で、ラズパイの有線LANのMACアドレスに対して任意のIPアドレスを紐づけています。
MACアドレスは以下の手順で調べられます
- ラズパイでコマンドラインを開く
ip a
を打ち込む
eth0:
の link/ether
の後に書いてある
wifiを使うなら wlan0
を探すと良いですが、速度を考えると有線がおすすめです。
なお、使いたいIPアドレスが別の機器に設定されている場合、そのままでは手動割り当てできません。どうしても特定のIPアドレス(今回の例では 11.14)を使いたい場合は、以下の手順に従います。
- 特定のIPアドレスを使用中の機器をネットワークから切断する
- ルータを再起動してIPアドレスの割り当てをリセットする
- 手動設定する
家庭用ルータのDHCPサーバは「利用可能な番号から順に」割り当てることが多く、結果として若い番号から埋まっていく傾向があります(機種や設定で変わる)。そのため、若い番号を使いたい場合は、多くの機器を切断したうえでルータを再起動しなければならないと思われます。
また、『ラズパイ ip 固定』で検索すると、 /etc/dhcpcd.conf
を編集したり NetworkManager
を設定したりと様々な方法が紹介されています。しかし私の環境ではどれもうまくいかず…。最終的にはルータ側で設定することによって成功しました。ちなみにラズパイ公式も、この方法を推奨しているようです。
ラズパイのセットアップが終わったら、いちいちモニタに接続するのも面倒なので遠隔で操作できるようにしておきたいです。
VNCでRaspberry Piにリモートデスクトップ接続 (Windows/Mac/Linux対応) – Indoor Corgi
www.indoorcorgielec.com
ラズベリーパイをリモート操作(SSHコマンド)
使い慣れたMacやWindows PCから、ラズベリーパイのターミナルを遠隔操作するSSHコマンドの紹介、使用準備の解説です。
raspi-school.com
また、sshしたときにパスワードを要求されるのも面倒なので、公開鍵認証できるようにしておくと楽ちん
SSH接続 WinからRaspberryPi 最低限のラズパイセキュリティ設定等 - Qiita
背景 RaspberryPiを使う時、メインPCのディスプレイに繋ぐと切り替えだったりが面倒するので、 多くの場合はリモートデスクトップやVNC等で無線接続して使うことが多いと思います。 ただ、VNC等のGUIでの接続だと動きが遅かったり、...
qiita.com
次に、HDDケースにHDDを設置して、ラズパイとHDDケースをつなげます。
床で作業している様子
2台目を接続
その後、以下を参考に2つのHDDをマウントします。
Raspberry PiでHDDをマウントする - Qiita
# HDDが認識されているかを確認する。(デバイス名を確認) sudo fdisk -l # 新しいストレージをマウントする場合は以下のコマンドでフォーマットする sudo mkfs -t ext4 /dev/sda # HDDをマウントす...
qiita.com
私の場合、メインは /mnt/hdd1
、バックアップ用は /mnt/hdd2
にマウントしました。
ここまでで、ラズパイにOSを入れ、ローカルIPを固定し、HDDをマウントするところまで完了しました。
次はいよいよ Immich の導入です。
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
style immich-server fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
公式のクイックスタートと同じくDockerで立ち上げるのが楽です。
Quick start | Immich
Here is a quick, no-choices path to install Immich and take it for a test drive.
immich.app
なお .env
ファイルのうち写真アップロード先と・DB保存先は、先程マウントした hdd1
にします。
UPLOAD_LOCATION=/mnt/hdd1/immich/images
DB_DATA_LOCATION=/mnt/hdd1/immich/postgres
docker compose up -d
によってコンテナ立ち上げが成功すると、 http://<machine-ip-address>:2283
でImmichにアクセスできます。アクセス後はadminユーザの作成をします。
アクセス後の画面
adminユーザなら一般ユーザアカウントも作成できるので、そのまま私・妻用のアカウントを作ってしまいます
User Management
Immich supports multiple users, each with their own library.
immich.app
また、ここでStorageTemplateの設定を確認しておくとよいです
Storage Template | Immich
immich.app
これは写真や動画の保存先・フォルダ構造やファイル名の付け方を設定できる機能です。
私は UPLOAD_LOCATION/library/ユーザ名/2022/2022-02-03/IMAGE_56437.jpg
のような形式で保存されるように設定しています。
この設定は、設定変更以降に追加した写真から反映されます。変更前に追加済であったものは、 ジョブ → ストレージテンプレートの移行
ボタンを押すことで反映可能です。
Immich ストレージテンプレートの移行
私の場合、Google フォト から大量の写真を移動してきたあとに設定をしたので、反映にかなりの時間がかかりました。好みがあればあらかじめ設定しておくことをおすすめします。
ここまでで、ラズパイ・HDD・Immich のセットアップが完了しました。
次は Googleフォト にある写真・動画を Immich 経由でHDDに保存していきます。
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
GoogleTakeout -->|"immich-go"| immich-server
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
%% ノードスタイル
style immich-server fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
style GoogleTakeout fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
style hdd1 fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
%% 矢印スタイル (index は上から数えた順)
%% GoogleTakeout --> immich-server が最初のエッジ (0)
%% immich-server --> hdd1 が次のエッジ (1)
linkStyle 0 stroke:#008080,stroke-width:4px,color:008080
linkStyle 1 stroke:#008080,stroke-width:4px,color:008080
immich-go
を使います。Google フォトの 写真をImmichで管理する保存領域に移行できるコマンドラインツールです。
必要な材料は👇️です
- immich-go
- Google Takeout
- Google アカウントに保存されているデータをエクスポートしたもの
- ユーザアカウントごとのImmich API キー
- Immichに対してアプリケーション外から操作をする際に必要な鍵
具体的には、
./immich-go -server=http://<machine-ip-address>:2283 -key=<Immichで作成したAPI キー> upload -create-albums -google-photos <ダウンロードしたGoogle Photo Takeout のパス>
とコマンドを実行することで、Googleから落としてきたコンテンツをImmichの任意ユーザのコンテンツとして取り込むことが出来ます。
バックアップ前に“写真がどこにあるか”を整理しておく必要があります。過去のすべての写真がスマホに入っていれば Immich のモバイルアプリを起動して、スマホからバックアップするだけで済みます。
しかし実際には「Googleフォトだけにある写真」「スマホだけにある写真」「両方にある写真」が混在しています。
// Google フォトに保存された写真と、スマホに保存された写真が一部重なってるイメージ
時系列: 2008 ------2017-------2023----------> 新しい
Googleフォト: [===========++++++++++]
スマホ : [++++++++++==========]
同じ写真がバックアップされてしまう容量がもったいないです。今回の方針では、2008〜2023年は Google フォトから移行し、それ以降はスマホから直接バックアップすることにしました。
厳密に分けることは難しく2024年前後に重複が発生しますが、Immich には重複検出・削除機能があるため、多少は許容範囲としています。
Immichの重複検出・削除機能
GitHub - simulot/immich-go: An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its best for importing google photos takeout archives.
An alternative to the immich-CLI command that doesn't depend on nodejs installation. It tries its best for importing...
github.com
では immich-go をダウンロードします。 <> Code
押下 > Download ZIP
でOK。
immich-goのリポジトリ
PC内の好きな場所においておきます
Takeout は以下から出力できます。
Google データ エクスポート
takeout.google.com
Google フォトのみチェックボックスをONにして 次のステップ
を押下
Google データ エクスポート
次に エクスポートを作成
を押下
しばらく待つとGoogleからメールが届きます
Googleから届くメール
メールを開き、メール内リンクに飛ぶと、件数ごとにダウンロードボタンが設置されているので順次押下してダウンロードしていけばOKです。
zipファイルがダウンロードされるはず。
もし件数が多すぎて面倒であれば、エクスポート時のファイルサイズ設定を大きめにしましょう。
私の場合は、自分と妻の2アカウント分をダウンロードしました。
お次に API キー
を発行します。 immich-go
から Immich のユーザアカウントに対して操作をする際に必要な鍵です。ユーザアカウント事に発行します。
手順
- Immichにログイン
- アカウント設定
- APIキー
- 新しいAPIキー
- 任意の名前をつけて作成押下
- 新しいキーが発行されるのでコピーしておく
apiキーの作成
作成を押すとapiキーが表示されるのでコピーしておきましょう。
こちらも私のアカウントと、妻のアカウントの2つ分を作成。
コマンドを実行する前に、 Google Takeout
の zip を解凍して中身を確認します。今回は 2024年以降の写真はスマホからバックアップする方針のため、その期間を含む zip は不要です。
例:Takeout が14分割で、11/14 以降の zip に 2024年のデータが含まれる場合は、11〜14を使用しませんのでどこかに移動しておきます。
必要な zip ファイルを準備ができたら、 immich-go
をダウンロードしたディレクトリへ移動して、次のコマンドを実行します。
./immich-go -server=http://<machine-ip-address>:2283 -key=<Immichで作成したAPI キー> upload -create-albums -google-photos /takeoutがあるディレクトリ名/takeout-*.zip
なお --dry-run
オプションをつけることで、実行される処理を事前に確認できます。
コマンド実行後、しばらく待てば Immich に画像や動画が取り込まれているはずです。私のアカウントは写真が多かったのでコマンドを実行して寝ました🛌。翌朝には終わっていた記憶です。
私と妻の2アカウント分実行しました
次に Immich モバイルアプリをダウンロードしてセッティングしましょう。
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
style mobile_in_lan fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
ダウンロード・ログイン・バックアップ、すべて以下のドキュメントに従えばOKです👍️
https://immich.app/docs/features/mobile-app/
immich.app
アプリ起動直後は、 http://<machine-ip-address>:2283
を打ち込みます。
Immichモバイルアプリ起動直後
その後、作成したユーザのメールアドレスとパスワードを打ち込めばログイン完了!
ログイン画面
次にスマホのローカルに入っている写真・動画のバックアップ設定を行います。
Mobile App | Immich
immich.app
自動バックアップ設定もしておくと良い
Automatic Backup | Immich
immich.app
これで、スマホで取った写真をImmich経由でHDDに保存し、そのまま閲覧できるようになります。
Immichモバイルアプリ タイムラインの様子
最後にHDD1のデータをHDD2にも保存しておきたいです。HDD1がだめになったらすべての資産が消えてしまうので
graph
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
%% ノードスタイル
style hdd1 fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
style hdd2 fill:#E6FFFA,stroke:#008080,stroke-width:3px,color:black
HDD1からHDD2へのバックアップには、 Borg
を使います。差分バックアップツールです。
BorgBackup – Deduplicating archiver with compression and authenticated encryption
www.borgbackup.org
BorgBackup簡易解説(ver1.1.7) - Qiita
はじめに 圧縮率が高く、高速にバックアップが行えるツール「borg」について、公式のドキュメントを翻訳しながら抜粋してまとめます。 Borg: https://borgbackup.readthedocs.io/en/1.1.7/ ※この翻...
qiita.com
Immich公式でも borg
によるバックアップ方法がドキュメントとして整備されているため採用。
Backup Script | Immich
Borg is a feature-rich deduplicating archiving software with built-in versioning. We provide a template bash script that...
immich.app
手順は公式ドキュメントに従えばOK。ドキュメント中の “Borg backup template” をベースにしたスクリプトを immich-borg.sh として保存し、毎週土曜の午前1:00に実行されるよう crontab を設定しています。
0 1 * * 6 /immich-borg.sh
これで、スマホから Immich にログインし、撮影した写真や動画をそのまま HDD にバックアップできる環境が整いました。
当初掲げていた条件もすべてクリアしています。
当初の条件もクリアです
週に一度は別のHDDにもバックアップを行うことで、データの冗長性も確保しています。
加えて Immich のアルバム機能を使えば、「息子用アルバム」や「旅行用アルバム」を作成し、私と妻がそれぞれ写真を追加できます。これまで Google フォトや LINE で行っていた共有のスタイルも、そのまま実現できています。
これにて
はクリアです
さて、これで夫婦間の写真管理は解決しました。しかし次の課題は 両親への共有 です。
これまで私と妻は、それぞれの両親にLINEで写真を送っていました。これがかなり面倒…😇
『一箇所にまとめておけば、好きなときに見てもらえる仕組み』がどうしても欲しいです。
幸いImmichであれば複数アカウントが作成できます。アルバム機能もありますし、アルバム事に権限の管理もできます。そのため、親用のアカウントを作り、特定のアルバムに閲覧権限を付与すればよいです。両親はアプリを開いてアルバムをタップすれば、愛孫のかわいい〜👶写真を眺めることができます。
アルバム機能
しかし、自宅ホストのサーバである以上、外部(遠方の両親)からの 安全なアクセス手段 が必要です。
この課題を解決するために、 Cloudflare Tunnel
を用います。
Cloudflare Tunnel は、軽量ツール( cloudflared )をサーバに入れるだけで、公開IPやポート開放なしに外部公開できる仕組みです。通信はすべてCloudflare経由になるので安全に扱えます。
Cloudflare Tunnel
Cloudflare Tunnel provides you with a secure way to connect your resources to Cloudflare without a publicly routable IP...
developers.cloudflare.com
実際、2023年6月ごろに Immich公式Discord でも「どうやってインターネットに公開するのがよいか?」という議論があり、一定数のユーザーが Cloudflare Tunnel を採用しているようです。
Discord - Group Chat That’s All Fun & Games
Discord is great for playing games and chilling with friends, or even building a worldwide community. Customize your own...
discord.com
なお注意点として Cloudflare Tunnel にはアップロード制限があります。100MB以上のファイルをアップロードする際には注意が必要です(今回は閲覧オンリーなので問題はなし)
また、 Cloudflare Access
による認証を組み合わせれば限定公開も容易です。
それではセットアップしていきます
graph LR
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
cloudflared
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
cloudflared <--> immich-server
cloudflared <--> |"Cloudflare Tunnel"|cloudflare["Cloudflare"]
cloudflare <--> |"サービストークン"|mobile["Mobile App"]
cloudflare <--> |"ワンタイムパスワード / SSO認証"|web["Web App"]
style cloudflared stroke:#008080,stroke-width:3px
style cloudflare stroke:#008080,stroke-width:3px
style mobile stroke:#008080,stroke-width:3px
style web stroke:#008080,stroke-width:3px
linkStyle 5 stroke:#008080,stroke-width:3px
linkStyle 6 stroke:#008080,stroke-width:3px
linkStyle 7 stroke:#008080,stroke-width:3px
Cloudflareにサインアップし、ダッシュボードから ドメインの登録 > ドメイン登録
に遷移して任意のドメインを取得します
ドメインの購入が完了したらトンネルを作成します。
手順
ダッシュボード
サイドメニュー
Zero Trust
ネットワーク
Tunnels
トンネルを作成する
Cloudflare Zero Trustの管理画面
Cloudflaredを選択する
任意の名前をつけて保存
次へ
トンネルの作成
次に、 Debian
を選択して、表示されるコマンドをサーバで実行しましょう。
Cloudflare Tunnel コネクタのインストール・実行
サーバ側でのコマンドが成功すると、このようにコネクタIDと接続済みステータスが表示されるので次へ押下
コネクタ接続完了
以下を入力して保存を押下
- サブドメイン: 任意の名前
- ドメイン: Cloudflareで購入したドメインがプルダウンで表示されるため選択
- サービス: HTTP
- URL: localhost:2283
トンネルのパブリックホスト名を入力
これで、自宅サーバをCloudflare経由で外部公開可能となりました。設定したURLを打ち込むことで、アクセス可能となっているはずです。
しかし、このままだとアクセス制限がついてなくて危険です。特定の人物しかアクセスできないように設定していきます。
graph LR
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
cloudflared
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
cloudflared <--> immich-server
cloudflared <--> |"Cloudflare Tunnel"|cloudflare["Cloudflare"]
cloudflare <--> |"サービストークン"|mobile["Mobile App"]
cloudflare <--> |"ワンタイムパスワード / SSO認証"|web["Web App"]
style cloudflared fill:#008080,stroke:#008080,stroke-width:3px,color:white
style cloudflare fill:#008080,stroke:#008080,stroke-width:3px,color:white
style web fill:#008080,stroke:#008080,stroke-width:3px,color:white
linkStyle 5 stroke:#008080,stroke-width:3px
linkStyle 7 stroke:#008080,stroke-width:3px
まずはLAN外からブラウザで Immich へアクセスしたときに、Email認証ができるようにを設定します。
ポリシーの追加画面に移動します
Access
ポリシー
ポリシーを追加する
ポリシーの追加
お次にポリシーを設定
- ポリシー名に任意の名前を設定
- セレクターで Emails を選択
- 認証時にSSO対象となるメールアドレスを追加する
- 保存
ポリシーを追加
以下のように追加されます
作成されたポリシー
続いて、作成したポリシーをアプリケーションに設定します。
Access
アプリケーション
アプリケーションを追加する
アプリケーションの追加
次にアプリケーションの種類を選びます
セルフホスト
選択する
アプリケーションの種類を選択
アプリケーションの情報を入力します
- 任意のアプリケーション名を追加
- パブリックホスト名を追加をクリック > パブリックホストの入力欄が出てくる
- サブドメイン・ドメインは先程のTunnelと同様のものを入力
- Access ポリシー欄で、
既存のポリシーを選択
を押下
アプリケーション情報の入力画面
- 先ほど作成したポリシーがでてくるのでチェックして確認
- 次へ で進んでいくと、保存ボタンが出てくるので保存します
作済みのポリシーが表示される
以上です。
再び、設定したURLにブラウザでアクセスしてみると、SSO認証画面が表示されるはずです
Cloudflareの認証画面
ここでポリシーに追加した Email を入力すればメールが届き、メールに書いてあるパスコードを入力することで認証を突破できます。突破後はImmichのログイン画面に遷移します。
(画像ではGoogle のOAuthでも認証できるようにしています)
パスコード入力画面
ブラウザから利用する場合は以上です。実家に帰ったとき、PCをTVにつなげて大画面で孫の画像を見ることがあるので、この設定は必須です
graph LR
subgraph lan["LAN"]
subgraph rapy["Raspberry Pi 4"]
immich-server
cloudflared
end
subgraph hdds["HDDケース"]
hdd1
hdd2
end
web_in_lan
mobile_in_lan
end
immich-server -->|"DB / 写真"| hdd1["HDD 1"]
hdd1 -->|"バックアップ"| hdd2["HDD 2"]
mobile_in_lan["Mobile App"] <--> immich-server
web_in_lan["Web App"] <--> immich-server
cloudflared <--> immich-server
cloudflared <--> |"Cloudflare Tunnel"|cloudflare["Cloudflare"]
cloudflare <--> |"サービストークン"|mobile["Mobile App"]
cloudflare <--> |"ワンタイムパスワード / SSO認証"|web["Web App"]
style cloudflared fill:#008080,stroke:#008080,stroke-width:3px,color:white
style cloudflare fill:#008080,stroke:#008080,stroke-width:3px,color:white
style mobile fill:#008080,stroke:#008080,stroke-width:3px,color:white
linkStyle 5 stroke:#008080,stroke-width:3px
linkStyle 6 stroke:#008080,stroke-width:3px
次に、Immichモバイルアプリからアクセスする方法です。モバイルアプリではブラウザのように認証画面に遷移できないので、そのままではログインできません。そこで Cloudflareの Service Token
と、Immichモバイルアプリの設定 カスタムプロキシヘッダ設定
を活用します。
Service Token
は、アプリやプログラムから Cloudflare の制限されたリソースへとアクセスするための鍵です。
Immich モバイルアプリには、サーバへアクセスする際のリクエストに任意の値を含めることができる カスタムプロキシヘッダ
設定があります。こちらにトークンを設定することで、認証を突破できるという寸法です。
では、さっそく Service Token を作成していきましょう
Cloudflare Zero Trustホーム
Access
サービス認証
サービストークンを作成する
Service認証画面
- 任意のトークン名を入力
- 任意の期限を入力
- トークンを生成する
サービストークン作成画面
すると、以下のように クライアントID
と クライアントシークレット
が表示されるのでコピーしておきます。
生成されたトークン
お次は再びポリシーを作成します
次に、再びポリシーを作成します。セレクターから Service Token を選び、先ほど作成したトークンをプルダウンから選択します。
セレクターでService Tokenを選択肢、値のフォームをクリックするとプルダウンで作成済みのサービス認証が表示される
ポリシーを保存し、先ほど作成したアプリケーションにこのポリシーを設定します
Access
アプリケーション
- 作成したアプリケーション名の三点ドット
編集
アプリケーションにポリシーを追加します
タグ: ポリシー
既存のポリシーを選択
- 作成した Service Tokenのポリシーを選択
確認
アプリケーションを保存
作成したポリシーが選択できる
これでCloudflare側の設定は完了です。
お次はImmichのモバイルアプリで、アクセス時にトークンを含めるように設定します。
- Immichモバイルアプリのログイン画面を開く
- 歯車マークをタップ
- カスタムプロキシヘッダをタップ
- プロキシヘッダに以下を入力します
- 生成したクライアントIDのヘッダーと値
- クライアントシークレットのヘッダーと値
カスタムプロキシヘッダの設定
設定は以上です👍️
これで、Immichモバイルアプリから外部向けURLにアクセスしても認証を通過でき、作成済みアカウントでログインすれば写真を閲覧できます。
ドメインを打ち込めば、ログイン画面に遷移できる!
つまり、以下の手順を4人分実施すれば良いわけです。
- Immichで両親のアカウントを作成する
- 両親のアカウントに、息子のアルバムへの閲覧権限を付与する
- 両親のスマホにモバイルアプリをダウンロードする
- モバイルアプリでカスタムプロキシヘッダを設定
- 各自のアカウントでログイン
これで、両親は自分のアカウントでログインし、アルバムをタップするだけで、いつでも孫の写真を見られるようになりました
これにて、
クリアです。
今回の構築で、
- 事実上、無限に写真と動画が保存できること
- スマホから保存・閲覧できること
- サブスクはしないこと
- Google フォトに保存した大量のコンテンツを引き継げること
- 息子の写真を、遠方の両親にラクにシェアできること
といった条件をすべて満たすことができました。
費用とメリデメを振り返ってみます
項目 |
単価 |
数量 |
小計 |
Raspberry Pi 4 (8GB) |
¥12,000 |
1 |
¥12,000 |
HDD 1TB |
¥7,000 |
2 |
¥14,000 |
HDDケース(スタンド) |
¥4,000 |
1 |
¥4,000 |
雑費(SD・ケーブル) |
¥600 |
1 |
¥600 |
合計 |
|
|
¥30,600 |
項目 |
単価 |
数量 |
小計 |
ドメイン代 |
¥1,000 |
1 |
¥1,000 |
年額合計 |
|
|
¥1,000 |
Google One (2TB) は ¥17,400/年。
初期費用はかかるものの、2年弱運用できればおとく…?!
メリット
- サブスク費用が不要(HDD増設すれば容量は実質無限)
- エンジニアとしての勉強になる
デメリット
- 初期構築の手間(Docker, Cloudflare などの理解が必要)
- HDDが壊れたときのリスクが大きい。クラウドと比べてリスク分散も難しい
- Immich のアップデート時、破壊的な変更がたまにあるため、しっかり調べて対応しなければならない
あれ…あんまりメリットがない…?🧐
エンジニアの勉強・趣味としてはとても良いですが、とにかくたくさん写真・動画を保存したいならサブスクするのが早いですね。
- もう一箇所バックアップを用意したい
- 週1のバックアップ用にもかかわらず、HDD2が常時接続&回転しっぱなし。
- 必要な時間だけ起動・それ以外はスリープできるようにできないか
- iPhoneでImmichを開くと最初に1分ほどフリーズする
- おそらくスマホのローカルに入っている写真が多すぎるため、「バックアップ済みかどうかの確認」に時間がかかっている可能性がある
- 余裕があれば調査したい
コメント
comments powered by Disqus