4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ラズパイ + SSD/HDDハイブリッド構成でNASを構築して子供の動画を家族で共有できるようにしたよ

Last updated at Posted at 2025-12-21

この記事は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)

  1. PCに Raspberry Pi Imager をインストールして起動します。
  2. デバイス: Raspberry Pi 5 を選択。
  3. OS: Raspberry Pi OS (64-bit) Lite を推奨(サーバー用途に最適)。
  4. ストレージ: 接続したSSDを選択。
  5. 設定を編集する (重要): 右下の歯車アイコンから以下を設定します。
  • ホスト名: immich-server
  • ユーザー名とパスワード: 任意のものを設定
  • SSHを有効化する: 「パスワード認証」を選択

2.2 USB起動(SSD起動)の設定

Raspberry Pi 5はデフォルトでUSB起動に対応していますが、起動しない場合は以下の手順でブートローダーを更新してください。

  1. 余っているmicroSDカードに一旦OSを焼き、ラズパイを起動します。
  2. ターミナルで以下を実行し、設定ツールを起動します。
sudo apt update && sudo apt upgrade -y
sudo raspi-config

  1. Advanced Options -> Boot Order -> USB Boot を選択して保存。
  2. シャットダウン後、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へのドメイン登録

  1. Cloudflare にサインアップ。
  2. 「サイトを追加」 から取得済みドメインを入力し、Freeプランを選択。
  3. 画面の指示に従い、ドメイン管理会社(お名前.com等)側のネームサーバーをCloudflare指定のものに書き換えます。

5.2 Tunnel の作成とトークンの取得

  1. Cloudflare ダッシュボードの左メニュー Zero Trust -> Networks -> Tunnels を選択。
  2. Add a tunnel をクリックし、トンネル名(例:immich-pi)を入力。
  3. 表示されるコマンド内の eyJh... で始まるトークンをコピーし、先ほどの docker-compose.yml に貼り付けます。

5.3 Public Hostname (ルーティング) 設定

  1. 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を超えるファイルアップロードをブロックします。
これを回避するため、モバイルアプリで以下の設定を行います。

  1. アプリの App Settings -> Advanced -> "Preferred Server Address" を開く。
  2. 以下のように設定:
  • Server Endpoint URL: https://immich.your-domain.com(外出先用)
  • Local Network Settings: 自宅Wi-Fiを指定し、アドレスを http://[ラズパイのIP]:2283 に設定。
  1. 効果: 自宅Wi-Fi接続時のみCloudflareをバイパスするため、100MBを超えるファイルアップロード可能になります。

image.png

ちなみに:コスト面でのメリット

これまでiCloud(200GBプラン)に課金していましたが、Immichへの移行に伴い解約しました。これにより月額450円の固定費削減に成功しました! :tada:

おわりに

ハードウェア構成(SSD/HDD分離)とCloudflare Tunnelを組み合わせれば、自宅に最強のフォトクラウドを構築できます。

今回はHDD1台構成です。故障に備え、RAID化やクラウドへの二次バックアップも今後検討が必要です。

この記事が、大切な思い出を自分の手で管理したい方の助けになれば幸いです。


弊社では随時エンジニアを募集中です!
エンジニア求人一覧


さらに詳しい設定や、データの冗長化(バックアップ戦略)について追記が必要な場合は、いつでもお知らせください。

4
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?