UGREEN NASync DXP480T Plus 構築ログ:プライベート写真管理環境(Immich + Cloudflare Tunnel)構築

はじめに

Googleフォトの容量制限やプライバシーを考慮し、自前で最高の写真管理環境を構築しました。 使用したのは、NAS 「UGREEN DXP480T Plus」。 Cloudflare Tunnelで安全に外部公開するまでの手順をまとめます。

システム設計のこだわり

  • I/Oの最適化: 頻繁にアクセスされるDB(Postgres)はシステム用NVMe(Volume 3)に配置し、肥大化する写真データはデータ用ストレージ(Volume 1)に切り分ける設計。
  • 安全性: Cloudflare Tunnelを採用し、自宅のポート開放なしでサブドメイン公開。
  • 保守性: 初期構築後はバージョンを固定し、勝手なアップデートによる破壊的変更を防止。

事前準備:ディレクトリ構造の作成

まず、NAS内の各ボリュームにデータを配置するフォルダを作成します。 volumeは私の環境の話なので、適宜読み替えてください。

# Volume 3: アプリ・DB用
/volume3/docker/immich/
/volume3/docker/immich/postgres

# Volume 1: 写真データ用
/volume1/share/photo/01_immich_upload # 新規アップロード用
/volume1/share/photo/10_archives      # 過去の資産アーカイブ

環境設定 (.env)

.env ファイルを作成します。この段階では最新版を取得するため release 指定とします。 .envファイルはsmb経由等でyamlと同じ階層に作成ください。

# .env
# Immich Version (初期は最新を取得)
IMMICH_VERSION=release

# データの保存先 (Volume 1: 大容量ストレージ)
UPLOAD_LOCATION=/volume1/share/photo/01_immich_upload
EXTERNAL_PATH=/volume1/share/photo/10_archives

# DB・アプリ設定の保存先 (Volume 3: 高速ストレージ)
DB_DATA_LOCATION=/volume3/docker/immich/postgres
DB_PASSWORD=yourpassword
DB_USERNAME=postgres
DB_DATABASE_NAME=immich

インフラ構成 (docker-compose.yml)

過去資産を ro (Read-Only) でマウントし、Immich側から物理ファイルを操作させない安全策をとっています。

version: "3.8"

services:
  immich-server:
    container_name: immich_server
    image: ghcr.io/immich-app/immich-server:${IMMICH_VERSION:-release}
    restart: always
    volumes:
      - ${UPLOAD_LOCATION}:/usr/src/app/upload
      - ${EXTERNAL_PATH}:/usr/src/app/external/10_archives:ro # 過去資産を安全にマウント
      - /etc/localtime:/etc/localtime
    env_file:
      - .env
    ports:
      - 2283:2283
    depends_on:
      - redis
      - database

  database:
    container_name: immich_postgres
    image: tensorchord/pgvecto-rs:pg14-v0.2.0
    restart: always
    environment:
      POSTGRES_PASSWORD: ${DB_PASSWORD}
      POSTGRES_USER: ${DB_USERNAME}
      POSTGRES_DB: ${DB_DATABASE_NAME}
    volumes:
      - ${DB_DATA_LOCATION}:/var/lib/postgresql/data
    healthcheck:
      test: ["CMD-SHELL", "pg_isready -d $${POSTGRES_DB} -U $${POSTGRES_USER}"]
      interval: 10s
      timeout: 5s
      retries: 5

  redis:
    container_name: immich_redis
    image: redis:6.2-alpine
    restart: always
    healthcheck:
      test: ["CMD", "redis-cli", "ping"]
      interval: 10s
      timeout: 5s
      retries: 5

初期セットアップ

  1. デプロイして起動。 「もし起動時にDBエラーや書き込みエラーが出る場合は、作成したディレクトリの所有権を確認してください」
  2. http://[NASのIPアドレス]:2283 にアクセスし、管理者アカウントを作成。
  3. Settings > External Libraries から /usr/src/app/external/10_archives を登録し、スキャンを開始。

Cloudflare Tunnelによる外部公開

  1. Cloudflare Zero Trust ダッシュボードへ。
  2. ネットワーク -> コネクタ -> 作成済みのトンネルを選択して 設定
  3. 公開されたアプリケーションルート 「Public Hostname」タブにてサブドメインを登録。
    • Service: HTTP://[NASのローカルIP]:2283
  4. これで、スマホアプリ等からサブドメインでアクセス可能になります。

運用の安定化:バージョン固定

正常動作を確認したら、自動アップデートによるトラブルを避けるためにバージョンを固定します。 Immich管理画面の左下に表示されているバージョン(例:v2.7.5)を確認し、.env を編集します。

# IMMICH_VERSION=release  # コメントアウト
IMMICH_VERSION=v2.7.5     # バージョンを明示的に指定

編集後、再デプロイすれば完了です。


タイトルとURLをコピーしました