見出し画像

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を自分で立ててアプリのソースコードをダウンロードしてインストールして…とすごく時間がかかるはずです。

この記事が気に入ったらサポートをしてみませんか?