以前の記事では、Backblaze B2を rclone でマウントし、systemdサービスで安定運用する方法を紹介しました。
これで「クラウドストレージをローカルディスクのように扱える」環境はできたわけですが、Nextcloudではもう一つ考えなければならない問題があります。
それが 「何をクラウドへ置くのか」 です。最初は筆者も
dataディレクトリごとB2へ持っていけばいいだろう
と思っていました。ところが調べていくと、これは運用上かなり危険な構成でした。
今回は、Nextcloudのデータ領域のうちユーザーの実ファイルだけをBackblaze B2へ移し、それ以外はローカルSSDへ残す構成にした話です。
dataディレクトリを丸ごと移すと何が起きるのか
Nextcloudのデータ領域には、ユーザーが保存したファイル以外にも様々なものが置かれています。
例えば
- サムネイル
- プレビュー画像
- キャッシュ
- アプリ内部データ
- ログ
などです。
特に問題になるのが appdata_xxx 以下です。画像を開くだけでもサムネイルが作られ、不要になれば削除されます。
つまり、 大量に作って、大量に消す という処理を何度も繰り返しています。ローカルSSDなら何の問題もありません。
しかし、これをオブジェクトストレージ上で行うと話は変わります。API呼び出しは増えますし、オブジェクトの作成・削除も大量に発生します。
Wasabiで痛い目を見った経験
以前、筆者はWasabiを使っていました。
Wasabiには「90日以内に削除されたオブジェクトでも、90日分の利用料金が発生する」というルールがあります。
つまり、
- サムネイルを作る
- 数秒後に削除される
という処理でも、90日分の容量として計算されます。その結果、
「実際には存在しないサムネイルの料金だけが積み上がる」
という状態になりました。見た目の容量はほとんど増えていないのに、請求対象だけが増えていくという、なかなか厄介な運用になります。
Backblaze B2ではWasabiほど厳しい制約はありませんが、それでも大量のAPIアクセスや不要なI/Oをわざわざクラウドへ投げる理由はありません。
そこで残すものと移すものを分ける
最終的に採用した構成はシンプルです。
ローカルSSDへ残すものは、
appdata_xxx- プレビュー
- キャッシュ
- ログ
.ncdata
だけです。逆にB2へ置くのは
data/<ユーザー名>/files
だけにしました。ユーザーが保存した実データだけをクラウドへ置く構成です。
今回の環境
今回確認した環境は次の通りです。
- Ubuntu 24.04 LTS
- Nextcloud
- Backblaze B2
- rclone(FUSE3)
- マウントポイント:
/mnt/b2
ユーザー名などは例としてダミーのものを使用しています。対象となるディレクトリは、
/home/www-data/example/data/demo/files
です。
まずはB2へ同期する
先にローカルのデータをB2へコピーします。まずはドライランで確認します。
rclone sync /home/www-data/example/data/demo/files example-b2:example-bucket/nextcloud/files --dry-run -P -v
問題がなければ本番同期です。
rclone sync /home/www-data/example/data/demo/files example-b2:example-bucket/nextcloud/files -P
同期が終われば、ローカル側を退避します。
cd /home/www-data/example/data/demo
mv files files_backup_local
mkdir files
chown www-data:www-data files
chmod 750 files
シンボリックリンクでは動かない
最初に試したのはシンボリックリンクでした。
ln -sfn /mnt/b2/nextcloud/files files
ところが、
php occ files:scan
を実行すると、
Following symlinks is not allowed
で停止します。最初は権限かと思いました。しかし原因はNextcloud側でした。Nextcloudはデータ領域内のシンボリックリンクを追跡しない仕様になっています。
セキュリティ上は正しい動作なのですが、この用途では少々困ります。
bindマウントなら問題なく動く
そこで使ったのがLinux標準のbindマウントです。
sudo mount --bind \
/mnt/b2/nextcloud/files \
/home/www-data/example/data/demo/files
Nextcloudから見ると、これは普通のディレクトリです。そのため、
sudo -u www-data php /home/www-data/example/occ files:scan demo
も問題なく完走しました。シンボリックリンクでは拒否されても、bindマウントなら普通に扱ってくれます。
fstabだけでは少し危ない
bindマウントが成功したので、そのまま /etc/fstab に書けば終わり…… と思ったのですが、ここにも落とし穴がありました。起動直後は、まだ rclone がB2をマウントしていません。
その状態でbindマウントすると、 空ディレクトリをbindしてしまいます。
そこで、
/mnt/b2/nextcloud/files \
/home/www-data/example/data/demo/files \
none \
bind,nofail,x-systemd.after=rclone-b2.service \
0 0
のように、 x-systemd.after を指定して、rcloneサービスの起動後にbindマウントされるようにしました。これなら再起動しても順序が崩れません。
この構成にして良かったこと
結果として、今回の構成にはかなり満足しています。
まず、サムネイルやキャッシュはローカルSSDで処理されるため、クラウドストレージに不要なI/Oが流れません。
一方で、ユーザーが保存した実データだけはBackblaze B2へ退避されるため、ローカルディスク容量を気にし続ける必要もなくなりました。
さらに、Nextcloudのシンボリックリンク制限にも引っ掛からず、Linux標準のbindマウントだけで自然に動いてくれます。
結果として、「速いものはローカル、保存したいものはクラウド」という、それぞれの長所を活かした構成になりました。
Nextcloudをオブジェクトストレージへ移そうとしている方は、data ディレクトリを丸ごと載せ替える前に、一度「本当にクラウドへ置くべきものは何か」を考えてみることをおすすめします。
その一手間だけで、後々の運用はかなり楽になります。
コメントを残す