目的
Googleフォトを含め、Googleドライブの無料枠が15GBの制限になってます。
他のオンラインストレージで月々課金をするとランニングコストがかかるし、NAS(Network Attached Storage:ネットワーク接続ストレージ)はイニシャルコストがかかります。
なのでコストパフォーマンスに優れ、かつ勉強がてら自身でストレージを整備して利用することを目的に、自作でオンライン写真サーバーを導入するものです。
また今回は忘備録としてまとめ、初心者の方でも実践できるように考慮しながら記録します。
ちなみに様々な資料を参照しましたが、正直いうと初心者向けに書かれているものではありませんでした。
ただ諸先輩方が残してくれた資料を参考にしつつ、今回はGemini(Gemini3 思考モード)にロードマップを提示してもらうようプロンプトを作り、制作しました。
完成イメージ
・Googleフォトのように外出先からもアクセス出来る写真サーバー
今回は一人のみで利用できるものをイメージしています。
各種構成
・ハードウェア構成
Raspberry Pi4B 8GB
SSD 128GB(OS用)
3.5インチHDD 6TB(ストレージ用)
・システム構成
OS:Raspberry Pi OS
コンテナ:Docker
写真サーバー:PhotoPrism
VPN:Tailscale
バックアップ:PhotoSync
構成機器の注意点
・Raspberry Pi(以下、ラズパイ)
通常のPCよりも安価で、また消費電力も低いため、イニシャル・ランニングコストに優れています。
またOSは64bitで構成してください。
32bitは滅多に設定しないと思いますが、念の為の忠告です。
・SSD
通常ラズパイを利用する場合は、通常はmicroSDカードで起動させますが、長期利用を鑑みて耐久性を考慮し、SSDで構成しました。
容量はOS+α分のデータ量で十分だと思いますが、今回は余っていたSSDを利用したため128GBにしました。
またOSの設定はSDカードと遜色なく実施できました。
※中古SSDを利用する場合は、必ずフォーマットをしてからインストールしてください。
・3.5インチHDD
今回安価な3.5インチHDDを利用しましたが、3.5インチのものはラズパイから供給される電力が足らず、電力低下のエラーが発生します。
そうなるとラズパイ上でHDDを認識できなくなるため、3.5インチHDDと接続する際は電源を供給できるセルフパワー式(別途コンセント等から電源供給する方式)である必要があります。
※こちらも中古HDDの場合は必ずフォーマットをしてください。
今回セルフパワー式のケーブルは以下のものを準備いたしました。
ちなみにですが、2.5インチハードディスクはノートPCなどにも使われるため、SATA-USB変換ケーブルのみで大丈夫のようです。
※セルフパワー(外部電源あり)、バスパワー(外部電源なし)
参考までに以下のようなケーブルです。
ただし、そもそもラズパイは小さなPCであることから、電力供給は弱いです。
できればセルフパワーでそろえましょう。
・ネットワーク環境
今回はラズパイのWi-Fiで接続しました。
有線接続が可能なら、無論それがベストです。
ラズパイのWi-Fiはそんなに強力ではない印象なため、接続時はルーターとの見通しの良い場所で設置するのが良いでしょう。
あとは別途USBドングルのアンテナを増設する方法もありますが、この方法はドライバのインストールが必要になります。
↓こんなものとかです。
インストールができない場合がありますので、購入前にラズベリーパイに使用できるかしっかり確認してください。
※基本的にこの手のものはWindowsかMacに接続することを前提としているので、ドライバがラズパイに対応できていない可能性があります。
構成ロードマップ
以下について、生成AI(Gemini3 思考モード)を活用してロードマップを作成してもらいました。
1.ラズベリーパイの準備
2.土台作り
3.PhotoPrism(Docker)の導入
4.外出先からのアクセス(Googleフォト化)
1.ラズベリーパイの準備
何はともあれハードウェアを準備しましょう。
ラズパイの導入方法については以下を参照してください。
※ HDDはまだ接続しないでおきましょう。
上記にてラズパイを起動できるようになったら、2.土台作りに入りましょう。
2.土台作り
OSのビット数確認(重要)
おまじないでもあり、とても重要です。
a)コマンド入力
ラズパイが起動できたら、ターミナルを起動し、以下コマンドを入力しましょう。
uname -m
b)結果確認
aarch64 と出力されればOK(64bit)です。
armv71と出た場合は32bitですので、それはインストールがミスっています。
HDDの接続と識別
OSが入っているSSDとHDDを取り違えないように確認します。
a)HDDを接続
それではここでHDDをラズパイに接続しましょう。
前述の通り、3.5インチHDDはセルフパワー式の変換ケーブルに接続しないと、ラズパイに「電圧低下」のエラーが発生します。
b)コマンド入力
ドライブがしっかり接続されたかを確認しましょう。
lsblk
このコマンドで各ドライブの容量が表示されるようになります。
c)ドライブ名の特定
上記のコマンドで各ドライブの容量が表示されます。
今回の構成だと
SSDが120GBならば119G程度(通常は/dev/sdaと表示されることが多い)で表示
HDDが6TBなら5.5Tや6Tと表示(例:/dev/sdb)
※接続順位として、sda、adb、sdcと、sdの後がabcと続きます。
パーティション作成とフォーマット(GPT形式)
以下の操作を行うことで、HDD内のデータは全て消え、使用できるようになります。
a)パーティション作成ツール(parted)の起動
「HDDの接続と識別」の c)でHDDが表示されたドライブ名が「sdb」であることを前提に進めていきます。
※ここの名前が違っていたら、その都度変更してね。
sudo parted /dev/sdb
(parted)というプロンプトに変わります。
b)GPTラベルの作成(2TB以上に対応させるため)
mklabel gpt
もし確認が出たら「Yes」と入力
c)パーティションの作成
mkpart primary ext4 0% 100%
d)ツールの終了
quit
e)ext4形式でフォーマット
少し時間がかかります。(数分〜数十分)
sudo mkfs.ext4 /dev/sdb1
※/dev/sdbではなく、作成されたパーティション/dev/sdb1を指定します。
もちろんここのsdb1は、前述の通り名前が違っていたら都度変えてね。
自動マウント設定
再起動しても必ず同じ場所にHDDが読み込まれるように設定します。
これにより停電等でシャットダウンしてしまっても、起動した時に自動的にHDDへ記録できるようにします。
a)マウント用ディレクトリ(フォルダ)の作成
今回は/mnt/dataとしました。
sudo mkdir /mnt/data
b)HDDのUUID(固有ID)を調べる
sudo blkid /dev/sdb1
これにより「UUID="xxxx-xxxx-..."」と表示されます。
そのの引用符の中身(英数字の羅列)をコピーしておいてください。
c)追記内容
ファイルの末尾に以下の1行を追加しましょう。
(UUID=... の部分は先ほどコピーした値に置き換えましょう)
UUID=調べたUUID /mnt/data ext4 defaults,noatime 0 2
保存方法:Ctrl + O → Enterで保存
Ctrl + Xで終了。
d)テストと確認
エラーがないか確認し、マウントします。
sudo mount -a
df -h | grep /mnt/data
エラーが出ず、HDDの容量が表示されれば成功です。
IPアドレスの固定
サーバーとして使うため、IPアドレスが変わらないように固定させましょう。
a)設定ツールの起動
sudo nmtui
b)操作手順
・Edit a connection(接続の編集)を選択。
・現在接続しているネットワーク(Wired connection 1 または SSID名)を選択して Edit(編集)。
今回はWi-Fiで接続していたので、接続されているWi-FiのIDを選択していきます。
・IPv4 CONFIGURATION(IPv4 設定) を Automatic(自動) から Manual(手作業) に変更。
・(表示)を押し、Addressesに希望のIPを追加。
(例: 100.100.0.100/24)
☆IPアドレスの調べ方
ラズベリーパイでの調べ方は、ターミナルを別タブやウィンドウで開いて、以下のコマンドを入力しましょう。
hostname -I
例:100.100.0.100. ...
と英数字が羅列されます。
最後の.以降の…は、いっぱい英数字が続きますが、/24と書いておけばOK。
もちろん最初の数字もそれぞれ異なっていると思うので、都度変更しましょう。
・Gateway(ゲートウェイ)にルーターのIPを入力。
上記で調べたIPアドレスの左側の4セクション(今回の例なら、100.100.0.1となります。)
・DNS servers(DNSサーバー)に今回調べたルーターのIP、または 8.8.8.8 を入力。
特に異論がなければルーターIPで良いでしょう。
・画面下の [OK] を選択して終了し、Back -> Quit で抜けます。
c) 再起動して反映
以下コマンドで再起動します。
sudo reboot
これにて土台作りは完成です。
続いてはいよいよ本丸に入りましょう。
3.PhotoPrism(Docker)の導入
さてお待ちかねのPhotoPrismを導入しましょう。
と、その前にDocker環境をインストールする必要があるので、順番に実施していきましょう。
Dockerについては以下を参照してみてください。
Docker環境のインストール
まずはラズベリーパイにDockerエンジンと、複数のコンテナを管理するプラグインをインストールしましょう。
a)インストールスクリプトの実行
以下のコマンドを実行しましょう。
(公式のインストールスクリプトです。)
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
※処理に数分かかることもあります。
b)ユーザー権限の設定
毎回sudoを打たなくて済むように、現在のユーザーをDockerグループに追加しましょう。
sudo usermod -aG docker $USER
c)設定の反映
以下のコマンドでグループ設定を即時反映させます。
newgrp docker
d)動作確認
バージョンが表示されればOKです。
docker compose version
保存用フォルダの作成(HDD上)
マウントしたHDD(/mnt/data)の中に、PhotoPrism用の部屋を作ります。
・Originals:写真そのものを保存する場所
(スマホ等からアップロードした写真はここに入ります。)
・Storage:データベースやサムネイル、設定ファイルなどの保存場所
a)フォルダ作成コマンド
sudo mkdir -p /mnt/data/photoprism/originals
sudo mkdir -p /mnt/data/photoprism/storage
b)アクセス権限の変更
PhotoPrismが書き込み出来るように、権限を調整します。
(現在のユーザーを所有者にします。)
sudo chown -R $USER:$USER /mnt/data/photoprism
設定ファイル(docker-compose.yml)の作成
PhotoPrismの設計図であるymlファイルを作成します。
ホームディレクトリに作業用フォルダを作って、そこに設定ファイルを置きます。
a)作業フォルダ作成と移動
まずは以下コマンドでPhotoPrism用の部屋を作ってあげます。
mkdir ~/photoprism
続いて作った部屋に入りましょう。
cd ~/photoprism
b)ファイルの作成・編集
続いてPhotoPrismを動かすため、ymlファイルを編集します。
nano docker-compose.yml
上記でymlファイルを編集する場所に入ります。
c)記述する内容
以下の内容を一部編集し、貼り付けていきます。
また#の部分は削除してくださいね。
services:
photoprism:
image: photoprism/photoprism:latest
container_name: photoprism
restart: unless-stopped
security_opt:
- seccomp:unconfined
- apparmor:unconfined
ports:
- "2342:2342"
environment:
PHOTOPRISM_ADMIN_PASSWORD: "password123" # 【変更してください】ログイン用パスワード
PHOTOPRISM_SITE_URL: "http://###.###.#.###:2342/" # 【変更してください】設定した固定IP
PHOTOPRISM_ORIGINALS_LIMIT: 5000 # 一度に処理する枚数制限(性能確保のため)
PHOTOPRISM_HTTP_COMPRESSION: "none" # Pi4のCPU負荷軽減のため圧縮オフ
PHOTOPRISM_DEBUG: "false"
PHOTOPRISM_PUBLIC: "false"
PHOTOPRISM_READONLY: "false"
PHOTOPRISM_UPLOAD_NSFW: "true" # 誤判定でアップロード拒否されるのを防ぐ
PUID: 1000 # ユーザーID(通常piユーザーは1000)
PGID: 1000
volumes:
# 写真の保存場所(HDD上のフォルダを指定)
- "/mnt/data/photoprism/originals:/photoprism/originals"
# データベース・設定の保存場所(HDD上のフォルダを指定)
- "/mnt/data/photoprism/storage:/photoprism/storage"
保存方法:Ctrl + O → Enterで保存
Ctrl + Xで終了。
起動と動作確認
いよいよ起動です!
a)コンテナの起動
同じフォルダ(~/photoprism)で以下を実行します。
初回はイメージのダウンロードがあるので、ちょっと時間がかかります。
docker compose up -d
Creating photoprism ... done と出れば起動成功です。
b)ログの確認(任意)
エラーが出ていないか、リアルタイムでログを見てみましょう。
docker compose logs -f
文字がたくさん流れて、「Server running at...」のような表示が出ていれば動いています。
確認を終える時はCtrl + Cを押します。
(コンテナは止まらないので、安心してね。)
ブラウザからアクセス
a)URL http://###.###.#.###:2342
(#の部分はみなさんが設定したIPv4アドレスを入れましょう。)
b)ユーザーID
admin
※現状ではユーザーIDは変更できません。
c)パスワード
「設定ファイル(docker-compose.yml)の作成」c)で設定したパスワード
これで「同じWi-Fi上からのアクセスが可能」になりました。
つまり、家にいる時ならスマホなどの他の端末からアクセス可能な状態です。
4.外出先からのアクセス(Googleフォト化)
ここまではあくまで「同じネットワーク環境下」であれば使用できる、つまり「有線接続もしくは同じWi-Fi環境下でないと利用できない」状態です。
またGoogleフォトのように自動バックアップができません。
(いちいちアップロードする必要がある)
これではちょっと不便ですよね?
なので外出先からのアクセスを実施できるようにしていきます。
項目としては、
・Tailscaleの導入
・PhotoSyncアプリの設定
となります。
早速やっていきましょう。
Tailscaleの導入
Tailscaleというツールをラズパイ側とスマホ側にインストールします。
TailscaleとはVPNで、今回のように自作のサーバーにスマホから接続しようとすると、ブラウザが「安全ではないよ!」と警告してきます。
これではうまく接続できません
なので仮想の専用線としてVPNを設定すれば、安全に外出先からPhotoPrismと接続できるようにするものです。
これをラズパイとスマホにインストールし、それぞれを紐づけることで外出先からアクセスできるようになります。
まず以下はVPNについての説明
こちらはTailscaleの公式
a)ラズパイへのインストール
以下コマンドを実行
(Tailscale公式の自動インストールスクリプト)
curl -fsSL https://tailscale.com/install.sh | sh
b)Tailscaleを起動
インストールできたら、以下コマンドを実行
sudo tailscale up
するとターミナルに以下のようなURLが表示されます。
例:https://login.tailscale.com/a/xxxxxxxx
このURLをコピーして、PCのブラウザで開いてみてください。
・ログイン画面
Tailscaleを利用するためのログイン画面です。
Google、Microsoft、Appleなどのアカウントでログインを求められます。
これはご自身が使いやすいアカウント(例:Googleアカウント)でログインして認証を完了させてください。
・成功
ブラウザに「Success」と表示されれば、ラズパイ側の準備は完了です。
c)スマホへのインストール
スマホのアプリストアから、「Tailscale」を検索してインストールします。
アプリを起動し、先ほどラズパイで使ったのと同じアカウント(Googleなど)でログインします。
「Install VPN Profile」(VPN設定の許可)を求められたら許可します。
画面上のリストに、今回ご使用しているラズパイ(通常は raspberrypi という名前)が表示されているはずです。
d)接続テスト
これでうまくできていれば、外出先からもつながるようになります。
・スマホの Wi-Fi を OFF にして、モバイル回線にします。
・Tailscaleアプリを開き、左上のスイッチを Active(ON) にします。
・リストにある raspberrypi をタップして、IPアドレスをコピーするか、ブラウザにIPアドレスをベタ打ち。
・スマホのブラウザ(Chromeなど)を開き、以下のURLを入力します。
http://[Tailscaleで表示されたIPアドレス]:2342
一応以下の方法でも実施できますが、これはTailscaleの「MagicDNS」という機能が効いている時のみです。
※今回は紹介していません。
http://raspberrypi:2342
PhotoSyncアプリの設定
ここまでで「外出先でもPhotoPrismに接続できる」環境ができました。
続いては自動バックアップについて説明します。
PhotoPrismのバックアップは、フォルダもしくは写真ファイルを一つずつしかアップロードができません。
PhotoSyncは一部有料プランがあり、自動バックアップは有料プランになります
ですが、このアプリによって写真を選択してアップロードができるようになります。
※投稿時点では買い切り課金になっているようです。
以下はPhotoSyncの公式
※注意※
今回PhotoSyncというアプリをスマホでインストールしますが、厄介なことに同じ名称のアプリが2つ存在します。
インストールするのは、開発元が「touchbyte GmbH」になります。
a)アプリのインストール
「touchbyte GmbH」が開発しているPhotoSyncになります。
b)転送先(ターゲット)の設定
アプリを開いて、PhotoPrismを保存先として登録します。
・右下の「設定」をタップ
・「設定」→「ターゲット」→「PhotoPrism」を選択
・「新しい構成を追加」をタップ
c)以下のように入力しましょう。
| 項目 | 設定値 | 備考 |
|---|---|---|
| 接続タイトル | PhotoPrism (Home) | 好きな名前でOK |
| サーバー/URL | http://###.###.##.### | 今回PhotoPrismで設定したIPv4アドレス |
| ログイン | admin | PhotoPrismのユーザー名 |
| パスワード | (設定したパスワード) | PhotoPrismのパスワード |
| ポート | 2342 | 重要(左の通り) |
| ディレクトリ | /originals/Mobile | ※後述 |
| SSLを使用 | OFF | オンにすると繋がりません |
※ディレクトリについて:
/originals だけでも動きますが、スマホの写真と他の写真を整理しやすくするために、/originals/Mobile や /originals/iPhone のようにサブフォルダを指定することをお勧めします。
(フォルダは自動で作られます)
またサーバー/URLは、http:を省いて入力して大丈夫です。
d)上記入力後、「完了」をタップ。
そして接続テストを行ってみましょう。
e)手動転送のテスト
まずは1枚、手動で送ってみましょう。
・ホーム画面に戻り、「カメラロール」 などから写真を1枚タップして選択。
・右上の 赤い転送ボタン(円形の矢印)をタップ。
・「選択済み(Selected)」 > 「PhotoPrism(先ほど作った設定)」 を選択。
・転送が始まり、「完了」と出れば成功!
f)PhotoPrism側での確認(インデックス)
写真はHDDに送られましたが、PhotoPrismの画面にはまだ出ない場合があります。
(データベースへの登録が必要なため)。
・PhotoPrismのWeb画面(PCなど)を開きます。
・左メニューの 「Library」 > 「Index」 を開きます。
・「Start」 を押します。
これでHDDの中身がスキャンされ、先ほど送った写真が「Search」や「Browse」に表示されます。
あとは数分時間が経てば、PhotoPrismで表示されるようになります。
時間がかかる理由としては、今回はHDDへの記録をしているので書き込みとデータスキャンに時間がかかるためです。
まとめ
ここまでいかがだったでしょうか?
PhotoPrism実装できましたか?
私は初めてのラズパイで構成してみましたが、どこから初めて良いかわからず、だいぶ四苦八苦しました。
なのでこの記事を読んで、みなさん(特に初心者)にはあまり苦労せず、スムーズに実装できることを祈ります。
余談1
また今回の実装ではadmin(管理者アカウント)のみしか使用できません。
また、有料プランに加入してもGoogleフォトのように複数のアカウントが利用できるようになるわけではありません。
PhotoPrism全プラン比較表
| 機能・特徴 | Community (無料) | Essentials | PLUS | Pro / Enterprise |
|---|---|---|---|---|
| ターゲット | 個人 | 少人数 | 高度な個人・共有 | 法人・プロ |
| 主な月額費用 | 0円 | 2ユーロ | 6.5ユーロ | 25ユーロ |
| ユーザー役割 | Adminのみ | 全役割 解放 | 全役割 解放 | 全役割 解放 |
| セキュリティ | パスワードのみ | 基本的な保護 | 2FA (二要素認証) | SAML / OIDC SSO |
| 管理ツール | なし | なし | 高度な管理UI | 高度な管理UI |
| RAW/動画対応 | 基本対応 | 基本対応 | 高度な変換設定 | 最高優先度処理 |
| サポート | コミュニティ | コミュニティ | 優先チャット | 専任サポート |
| その他 | ー | ー | ベクトル画像対応 | カスタムブランディング |
※1ユーロ=180円とした場合、
Essentials=360円
PLUS=1080円
Pro/Enterprise=4500円
なので今回は無料版のCommunityで実装したので、使えるアカウントはadminのみとなります。
余談2
ちなみにGoogleフォト(Google One)の月々料金ですが、以下の通りまとめます。
(2026年2月時点)
| 料金\サービス | 無料枠 | ベーシック | Google AI PLUS | プレミアム |
|---|---|---|---|---|
| 料金 | 0円/月 | 290円/月(3,480円/年) | 1,200円/月(12,000円/年) | 1450円/月(17400円/年) |
| 容量 | 15GB | 100GB | 200GB | 2TB |
ベーシック (100GB): 月額290円(年払いの場合は2,900円程度)
スタンダード (200GB): 月額440円
プレミアム (2TB): 月額1,450円
今回のように構成する場合、長期目線でコスパが良いか確認するのが良いでしょう。
私の場合は、おおよそ20,000円弱で構成することができましたので、1年強でGoogleフォトのプレミアム分をペイすることができます。
またアカウントを増やしてそれぞれの写真サーバーのように構築する方法は、以下でまとめましたので参考にどうぞ。
以上、ここまで読んでいただきありがとうございました。
ぜひ実践してみて、皆さんと「便利」を共有できれば幸いです。