この記事はLITALICO Engineers Advent Calendar 2025 カレンダーシリーズ 1の22日目の記事です。
背景:家族写真の共有と「2分の壁」
我が家には2人の子供がいます。子供の写真や動画を親戚と共有するために、MIXI社が提供している「みてね」を利用しています。
非常に便利なサービスですが、無料プランでは動画の長さが2分まで、月額590円のプレミアムプランでも10分までという制限があります。運動会や発表会などの行事では10分を超える動画も珍しくなく、これらをアップロードできないのは大きな悩みでした。
「それなら、自宅にNASを構築して自分たちで管理してしまおう!」と思い立ち、今回の構築に挑戦しました。
1. はじめに
本記事では、Raspberry Pi 5を使用し、 「OSはSSD、データはHDD」 というハイブリッド構成でフォト管理プラットフォーム「Immich」を構築します。
IPv6プラス環境でもポート開放不要で外部公開できるCloudflare Tunnelの導入までを、コマンドのコピー&ペーストで完結できるよう解説します。
用意するもの
- Raspberry Pi 5
- 今回はスターターキット(冷却ファンやケース付き)を購入しました
- SSD(250GB)
- HDD(4TB)
2. SSDへのOSインストールと初期設定
2.1 OSの書き込み (Raspberry Pi Imager)
- PCに Raspberry Pi Imager をインストールして起動します。
- デバイス: Raspberry Pi 5 を選択。
-
OS:
Raspberry Pi OS (64-bit) Liteを推奨(サーバー用途に最適)。 - ストレージ: 接続したSSDを選択。
- 設定を編集する (重要): 右下の歯車アイコンから以下を設定します。
-
ホスト名:
immich-server - ユーザー名とパスワード: 任意のものを設定
- SSHを有効化する: 「パスワード認証」を選択
2.2 USB起動(SSD起動)の設定
Raspberry Pi 5はデフォルトでUSB起動に対応していますが、起動しない場合は以下の手順でブートローダーを更新してください。
- 余っているmicroSDカードに一旦OSを焼き、ラズパイを起動します。
- ターミナルで以下を実行し、設定ツールを起動します。
sudo apt update && sudo apt upgrade -y
sudo raspi-config
- Advanced Options -> Boot Order -> USB Boot を選択して保存。
- シャットダウン後、microSDを抜き、SSDを**USB 3.0ポート(青色)**に挿して再起動します。
3. システムとストレージの最適化
3.1 SSD上に高速スワップ(4GB)を作成
Immichの機械学習処理によるフリーズを防ぐため、SSD上に仮想メモリを作成します。
sudo swapoff -a
sudo fallocate -l 4G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
3.2 データ用HDDのマウント
大容量のデータは外付けHDDに保存するように設定します。
lsblk # HDDのデバイス名を確認(例: /dev/sdb1)
sudo mkfs.ext4 /dev/sdb1 # フォーマット(中身が消えるので注意!)
sudo mkdir -p /mnt/storage
sudo mount /dev/sdb1 /mnt/storage
# 自動マウント設定
sudo blkid /dev/sdb1 # 表示されるUUIDをメモ
sudo nano /etc/fstab
# 末尾に追記: UUID=あなたのメモしたUUID /mnt/storage ext4 defaults,nofail 0 0
3.3 権限設定
sudo mkdir -p /mnt/storage/immich/library
sudo mkdir -p /mnt/storage/immich/postgres
sudo chown -R 1000:1000 /mnt/storage/immich/library
4. Immichの導入(Docker Compose)
4.1 Dockerインストール
curl -fsSL https://get.docker.com -o get-docker.sh
sudo sh get-docker.sh
sudo usermod -aG docker $USER # 実行後、一度ログアウトして再ログイン
mkdir -p ~/immich-app && cd ~/immich-app
4.2 設定ファイルの取得
wget https://github.com/immich-app/immich/releases/latest/download/docker-compose.yml
wget https://github.com/immich-app/immich/releases/latest/download/example.env -O .env
4.3 ファイルの編集
.env の編集 (nano .env)
UPLOAD_LOCATION=/mnt/storage/immich/library
DB_DATA_LOCATION=/mnt/storage/immich/postgres
IMMICH_MICROSERVICES_TIMEOUT=1800
IMMICH_MACHINE_LEARNING_TIMEOUT=600
DB_PASSWORD=your_secure_password # 任意の強力なパスワードに変更
docker-compose.yml の編集
Cloudflare Tunnelコンテナを追加し、ネットワークを定義します。
services:
immich-server:
# ...既存設定...
environment:
- NODE_OPTIONS=--max-old-space-size=4096
- FFMPEG_TRANSCODE_THREADS=2
networks:
- immich_network
# (他の全サービス:immich-microservices, immich-machine-learning等にも networks を追記)
cloudflared:
container_name: cloudflared
image: cloudflare/cloudflared:latest
command: tunnel --no-autoupdate run --token <YOUR_TOKEN>
networks:
- immich_network
networks:
immich_network:
driver: bridge
5. 外部公開:Cloudflare Tunnel のセットアップ
IPv6プラス環境でも、 「ポート開放不要・HTTPS化込み」 で解決できるのが Cloudflare Tunnel の強みです。
5.1 Cloudflareへのドメイン登録
- Cloudflare にサインアップ。
- 「サイトを追加」 から取得済みドメインを入力し、Freeプランを選択。
- 画面の指示に従い、ドメイン管理会社(お名前.com等)側のネームサーバーをCloudflare指定のものに書き換えます。
5.2 Tunnel の作成とトークンの取得
- Cloudflare ダッシュボードの左メニュー Zero Trust -> Networks -> Tunnels を選択。
-
Add a tunnel をクリックし、トンネル名(例:
immich-pi)を入力。 - 表示されるコマンド内の
eyJh...で始まるトークンをコピーし、先ほどのdocker-compose.ymlに貼り付けます。
5.3 Public Hostname (ルーティング) 設定
- Tunnel設定画面の Public Hostnames タブで以下を入力。
-
Subdomain:
immich - Domain: 登録したドメインを選択
-
Service Type:
HTTP -
URL:
immich-server:2283(※localhostではなくサービス名を指定)
6. 初期セットアップと「100MBの壁」対策
6.1 管理者アカウントの作成
https://immich.your-domain.com にアクセスし、最初の管理者ユーザーを作成します。
6.2 【重要】Cloudflareの制限を回避するアプリ設定
Cloudflare Tunnel(無料版)は、100MBを超えるファイルアップロードをブロックします。
これを回避するため、モバイルアプリで以下の設定を行います。
- アプリの App Settings -> Advanced -> "Preferred Server Address" を開く。
- 以下のように設定:
-
Server Endpoint URL:
https://immich.your-domain.com(外出先用) -
Local Network Settings: 自宅Wi-Fiを指定し、アドレスを
http://[ラズパイのIP]:2283に設定。
- 効果: 自宅Wi-Fi接続時のみCloudflareをバイパスするため、100MBを超えるファイルアップロード可能になります。
ちなみに:コスト面でのメリット
これまでiCloud(200GBプラン)に課金していましたが、Immichへの移行に伴い解約しました。これにより月額450円の固定費削減に成功しました! ![]()
おわりに
ハードウェア構成(SSD/HDD分離)とCloudflare Tunnelを組み合わせれば、自宅に最強のフォトクラウドを構築できます。
今回はHDD1台構成です。故障に備え、RAID化やクラウドへの二次バックアップも今後検討が必要です。
この記事が、大切な思い出を自分の手で管理したい方の助けになれば幸いです。
弊社では随時エンジニアを募集中です!
エンジニア求人一覧
さらに詳しい設定や、データの冗長化(バックアップ戦略)について追記が必要な場合は、いつでもお知らせください。
