はじめに
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
初期セットアップ
- デプロイして起動。 「もし起動時にDBエラーや書き込みエラーが出る場合は、作成したディレクトリの所有権を確認してください」
http://[NASのIPアドレス]:2283にアクセスし、管理者アカウントを作成。Settings > External Librariesから/usr/src/app/external/10_archivesを登録し、スキャンを開始。
Cloudflare Tunnelによる外部公開
- Cloudflare Zero Trust ダッシュボードへ。
ネットワーク->コネクタ-> 作成済みのトンネルを選択して設定。公開されたアプリケーションルート「Public Hostname」タブにてサブドメインを登録。- Service:
HTTP://[NASのローカルIP]:2283
- Service:
- これで、スマホアプリ等からサブドメインでアクセス可能になります。
運用の安定化:バージョン固定
正常動作を確認したら、自動アップデートによるトラブルを避けるためにバージョンを固定します。 Immich管理画面の左下に表示されているバージョン(例:v2.7.5)を確認し、.env を編集します。
# IMMICH_VERSION=release # コメントアウト
IMMICH_VERSION=v2.7.5 # バージョンを明示的に指定
編集後、再デプロイすれば完了です。
