kajibo.com

オブジェクトストレージとNextCloudとJellyfin

要約

ConoHaのVPSの容量が足りなくなってきたので下記のことをした。

  1. ConoHaのオブジェクトストレージ契約
  2. Nextcloudにオブジェクトストレージ追加
  3. Jellyfinとオブジェクトストレージ連携

ConoHaのオブジェクトストレージ契約

100GBのVPSを契約しているのだが、95GB使用していた。 その内50GBが音楽データ。JellyfinがNextcloudの音楽データを読み込むことをしていた。

まあ、何をするにしても容量が怪しく、ストレージを追加で契約することを決意。 転送量を計算する元気はなかったのでそこは無制限で絞って検索。 ConoHaが100GBで月450円、Wasabiが1TBで月6ドルぐらい。 とりあえず50GBを移せばいいのでConoHaに決定。200GBになったらWasabiの方が安いので切り替えかも。

Nextcloudにオブジェクトストレージ追加

NextCloudの外部ストレージとしてConoHaのオブジェクトストレージを使うを参考。 ところで、自分がNextCloudをインストールしたときsnap版を利用していたのだが、snap版でphpファイルを直接書き換えることはできなかった。 そのためDocker版を再インストール。 その上で、Docker版のNextCloudから/entrypoint.shを抜き出し、

sed -i -e "s/'swift'/'Object Storage Service'/" /var/www/html/lib/private/Files/ObjectStore/SwiftFactory.php

の行を追加。

FROM nextcloud
COPY ./entrypoint.sh /

とだけ書いたDockerfileを作成し、buildした。そのあとの設定は上記リンクでOK。 テナント名とユーザー名が同じと思って1日時間使ったのは悲しかった。

もし既にNextcloudとJellyfinを連携している人が、オブジェクトストレージに移行する場合、 外部ストレージの連携名はちょっと気にした方が良い。 というのも、この後Jellyfinにオブジェクトストレージmountするのだが、 Nextcloudの一番の親フォルダがmountされる。 いままでNextcloudの/Musicフォルダと連携していたのであれば、 外部ストレージの名前もMusicフォルダという名前にしておくことで今までのJellyfinのライブラリ情報がそのまま使える。

Jellyfinとオブジェクトストレージ連携

オブジェクトストレージを利用しているからなのか、それ以上の悪い原因があるのかわからないが、1曲目の再生に時間がかかる。 よってこれがベストプラクティスかわからないが、とりあえず下記の手順でできた報告。

Rcloneのインストール

rcloneをインストール。外部ストレージをマウント出来るようにするのが目的。 ここではオブジェクトストレージを直接マウントするのではなく、NextCloudをマウントするようにした。

rclone v1.56.2 で Nextcloud を利用する方法 -その1を参考。 設定項目が増えてて番号が変わってたが、それ以外はわりと英語で聞かれているまま答えれば大丈夫。

マウントはRcloneでs3をローカルPCにマウントしてみるを参考。 ただコマンドを打つだけなので公式リファレンス見ればいいわけなんだけど、初見の情報を日本語で手に入れれるのは助かる。

RcloneのDockerプラグインインストール

ただrcloneからmountしたものを直接jellyfinのDockerでmountすることはできなかった。 かわりにDocker Volume Pluginを見つけることができた。 公式の例に挙がっている、

docker volume create firstvolume -d rclone -o type=sftp -o sftp-host=_hostname_ -o sftp-user=_username_ -o sftp-pass=_password_ -o allow-other=true

これが全て。-oの後はオプションの羅列になっており、Nextcloud等のWebdavの場合webdavオプションが使える。

一つ注意なのは、Passwordは暗号化されている必要がある。 もし、最初のRcloneのインストールでNextcloudの設定が上手くいっていれば、~/.config/rclone/rclone.confに設定時に入力したパスワードが暗号化された状態で保存されている。 ということで、最後にjellyfinのdocker compose.ymlに共有volumeの設定を追加。

    version: "3.5"
    services:
            jellyfin:
                    image: jellyfin/jellyfin
                    network_mode: "host"
                    volumes:
                            - ./config:/config
                            - ./cache:/cache
                            - type: volume
                            source: music
                            target: /media
    volumes:
            music:
                    driver: rclone
                    driver_opts:
                            type: 'webdav'
                            webdav-url: 'NextcloudのWebdav URL'
                            webdav-user: 'Nextcloudのuser'
                            webdav-pass: 'Nextcloudの暗号化されたパスワード'
                            vfs_cache_mode: full

Docker composeでこの定義の方法は名前付きボリュームと呼ばれるらしい。 また、musicはNextcloudの親フォルダのことを指す。 名前付きボリュームから、例えばNextcloud/ext-storage/musicをmountするといった新たにパスを指定することはできない。 強制的にNextcloud/フォルダがmountされる。 今までNextcloud/musicというパスにしており、JellyfinのライブラリデータもNextcloud/musicというパスにしていたので、 外部ストレージの名前をmusicとすることでこの問題を回避した。 最初ext-storageという名前で外部ストレージを連携し、Jellyfinのライブラリスキャンを実施していたが、 オブジェクトストレージの性質の問題か、何日経っても終わる気がしなかったので過去のリソースを使うことに切り替えた。

だからまあ、例えばこれからiPhoneの画像ファイルの待避場所にNextcloudの外部ストレージを使おうとすると、 今のままではMusicフォルダにアップロードするという気持ち悪いことになる。 外部ストレージ連携を更に追加してPhotoとか作ればいいのかな。

最古の記事です。 2022年12月26日 >

コメントを投稿

注意事項
  • 承認を受けるまでコメントは公開されません。
  • 非公開を希望した場合、コメントは公開されません。

プロフィール

カテゴリ

未実装