Proxmox+LXC+PhotoPrism+NASで写真管理コンテナを作る
mini PCで写真管理サーバを作りたくなったのでPhotoPrismを試してみます。
せっかくなので写真データはNASで管理し、PhotoPrismはコンテナで動かします。
NFSのNAS作成
SynologyのNASを使いました。
まずはPhotoPrism用に共有フォルダを作成します。NFSも設定します。
かなりハマったのですが、この段階では
NFS権限→Squash→マッピングなし
としておくことが重要です (後述)。
Proxmoxでコンテナを作成
写真の解析にCPUをそこそこ使うのでコアは少し多めにします。
適当にこんな感じでコンテナを作成しました。
イメージ: Debian 12
ディスク: 64GB
メモリ: 4GB
コア: 4
コンテナにNASをマウント
ここがハマりポイントです。
コンテナで直接NASをマウントしようと思うと上手くいきません。
非特権コンテナではrootのmountコマンドが正しく実行できないためです。
特権コンテナにすればmountは実行できますが、今度はPhotoPrismのDockerに問題が出ます。
解決策として、Proxmox上でNASをマウントしてコンテナにストレージをアタッチする方法を見つけました。
参考
ProxmoxにNASのマウント
データセンター→ストレージ→追加→NFS
ID: PhotoPrism (Proxmox上のマウントポイントの名前になる)
サーバ: NASのIPアドレス
Export: NASのパス
# ls -ld /mnt/pve/PhotoPrism
drwxrwxrwx 8 root root 4096 Aug 31 23:37 /mnt/pve/PhotoPrism
Proxmoxにマウントされました。簡単!
と思いきや、これだけじゃダメです。
コンテナ上でNASを使うにはProxmox上でオーナーとグループのIDを下記のルールで変更しておく必要があります。
オーナー: 100000+コンテナ上のUID
グループ: 100000+コンテナ上のGID
コンテナ上のアカウントはrootを使います。
IDは0なので、NASのオーナーとグループはどちらも100000に設定します。
ここでハマったのが、NAS側でSquashをマッピングなしにしておかないとchownが実行できないことでした。要注意です。
# chown 100000:100000 /mnt/pve/PhotoPrism
# ls -ld /mnt/pve/PhotoPrism
drwxrwxrwx 8 100000 100000 4096 Aug 31 23:37 /mnt/pve/PhotoPrism
オーナーとグループを変更できました。
Proxmoxでコンテナの設定
NASの準備ができたらコンテナにマウントするのですが、ここでも注意。
コンテナへのNASのマウントはGUIでは設定できません。
こんな感じでCLIで実行する必要があります。
# echo "mp0: /mnt/pve/PhotoPrism,mp=/nas" >> /etc/pve/lxc/10x.conf
/nas はコンテナ上のマウントポイントです。
10xは作成したコンテナのIDです。
上記コマンドを実行するとマウントポイントの情報がGUIで確認できます。
(設定できないのに確認はできるってどうなの??)
コンテナを起動
コンテナを起動するとNASが見えました!
# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/pve-vm--104--disk--1 63G 3.8G 56G 7% /
192.168.10.xxx:/volume1/PhotoPrism 7.3T 6.5T 807G 90% /nas
(略)
# ls -ld /nas
drwxrwxrwx 8 root root 4096 Aug 31 14:37 /nas
しかしまたハマりポイント。このままではNASの読み書きができません。
NAS側にrootユーザがいないためです。
そこでSynology側で再度権限変更を行います。
NFS権限→Squash→全ユーザを admin にマップ
とすることで、コンテナ上でNASの読み書きができるようになりました。
このタイミングで権限変更することが正しいやり方なのかは自信がありません…
NAS側にもrootユーザを作ればいいのだろうか??
時間があるときに試してみます。
ひとまずこれでProxmoxのコンテナ上でNASの読み書きができるようになりました!
Docker Composeの設定
PhotoPrismはDockerのコンテナで配布されています。
そしてDocker Composeで簡単にインストールできるようになっています。
ということでコンテナ上でDocker Composeの環境を作ります。
参考
コマンドは全てrootで実行するので sudo は外しました。
パッケージのインストール
# apt install ca-certificates curl gnupg lsb-release
GPG鍵の追加
# curl -fsSL https://download.docker.com/linux/debian/gpg | gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
リポジトリの設定
# echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/debian \
$(lsb_release -cs) stable" | tee /etc/apt/sources.list.d/docker.list > /dev/null
Docker環境のインストール
# apt update
# apt install docker-ce docker-ce-cli containerd.io docker-compose-plugin
Dockerの動作確認
# docker run hello-world
Hello from Docker!
This message shows that your installation appears to be working correctly.
(略)
確認後にコンテナを削除
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d3af1c8ef649 hello-world "/hello" 50 seconds ago Exited (0) 49 seconds ago nervous_bose
# docker rm nervous_bose
nervous_bose
# docker ps -a
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
確認後にDocker imageも削除
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
hello-world latest d2c94e258dcb 16 months ago 13.3kB
# docker rmi d2c94e258dcb
Untagged: hello-world:latest
Untagged: hello-world@sha256:53cc4d415d839c98be39331c948609b659ed725170ad2ca8eb36951288f81b75
Deleted: sha256:d2c94e258dcb3c5ac2798d32e1249e42ef01cba4841c2234249495f87264ac5a
Deleted: sha256:ac28800ec8bb38d5c35b49d45a6ac4777544941199075dff8c4eb63e093aa81e
# docker images
REPOSITORY TAG IMAGE ID CREATED SIZE
Dockerの動作確認ができました。
Photoprismの設定
Docker Composeの環境さえできてしまえば、PhotoPrismの導入は簡単です。
参考
docker-composeのファイルを入手
# wget https://dl.photoprism.app/docker/docker-compose.yml
docker-compose.ymlの編集
# vi docker-compose.yml
adminユーザのユーザ名とパスワードを任意のものに変更します。
environment:
PHOTOPRISM_ADMIN_USER: "admin" # admin login username
PHOTOPRISM_ADMIN_PASSWORD: "insecure" # initial admin password (8-72 characters)
ファイルの置き場を変更します。
変更前
volumes:
# "/host/folder:/photoprism/folder" # Example
- "~/Pictures:/photoprism/originals" # Original media files (DO NOT REMOVE)
# - "/example/family:/photoprism/originals/family" # *Additional* media folders can be mounted like this
# - "~/Import:/photoprism/import" # *Optional* base folder from which files can be imported to originals
- "./storage:/photoprism/storage" # *Writable* storage folder for cache, database, and sidecar files (DO NOT REMOVE)
変更後
volumes:
# "/host/folder:/photoprism/folder" # Example
- "/nas/Pictures:/photoprism/originals" # Original media files (DO NOT REMOVE)
# - "/example/family:/photoprism/originals/family" # *Additional* media folders can be mounted like this
# - "~/Import:/photoprism/import" # *Optional* base folder from which files can be imported to originals
- "./storage:/photoprism/storage" # *Writable* storage folder for cache, database, and sidecar files (DO NOT REMOVE)
コンテナにマウントしたNAS (/nas) をオリジナルの写真置き場に指定しました。
/nas配下のディレクトリは自動で作成してくれるので予め作る必要はありません。
PhotoPrismの起動
# docker compose up -d --build
コンテナが作成されて立ち上がりました。簡単!
PhotoPrismにアクセス
http://コンテナのIPアドレス:2342
でアクセスできます。
PhotoPrismにアクセスできました。
Docker Compose初めて使ったけど非常に便利ですね。すごい。
一昔前だったらWebサーバとDBを自分で立ててアプリのソースコードをダウンロードしてインストールして…とすごく時間がかかるはずです。