Ubuntu Weekly Recipe

第826回snap版Nextcloudのバックアップ方法を現実的に考える

今回はsnapパッケージ版Nextcloudの実践的なバックアップ方法を、現実的に考えます。

snap版Nextcloud

snapパッケージ版Nextcloudは、本連載でも度々紹介しています。直近だと第778回第781回が該当しますし、第822回ではおすすめsnapパッケージとして紹介しています。

snapに関しては賛否両論悲喜交々いろいろありますが、このNextcloudがsnapパッケージとして存在しているだけですべてが許されるといっても過言ではありません。いえ、やはり過言かもしれません。

個人のデータはできることであれば他人に預けないほうがいいに越したことはありません。そんな際真っ先に候補に上がるのがこのNextcloudです[1]

単なるオンラインストレージに限らず、前述のようにアプリを追加することによってさまざまなことができるので非常に魅力的です。

Nextcloudはどこで動かしてもいいです。現に筆者も第703回で紹介したようにNASのような使い方もしています。現在も2TBほどのデータを置いています。

しかし、特性上VPSサーバーに置くことが多いでしょう。そうなってくると気になるのがバックアップの方法です。

snap版Nextcloudのバックアップ方法

snap版Nextcloudのバックアップ方法は大きく3つの方法が考えられます。

Backupアプリを使用する

その名もBackupというアプリがあって、これを使用すれば簡単にバックアップを取れるはずです。しかし現段階でNextcloud最新版(執筆時点だと29)に対応しておらず[2]、また以前試したときもきちんと動作させることができませんでした。

信頼性が第一のバックアップ方法としては、あまりいい選択とはいえません。

snapのスナップショットを使用する

snap版NextcloudのWikiにはSnap snapshot backup & restoreという項目があります。すなわちsnapの機能として実装されているスナップショット機能を使用し、バックアップとします。リンク先のドキュメントによるとスナップショットをエクスポートする機能まであって至れり尽くせりです。

これは使用してみたいところです。

snap版Nextcloudのエクスポート機能を使用する

snap版NextcloudのWikiにはExport and Importという項目もあります。これはsnap版Nextcloudが独自に持っているエクスポート機能を使用し、バックアップとします。

こちらも使用し、snapのスナップショット機能との違いを知りたいところです。

バックアップの実行

では実際にバックアップを実行します。

snapのスナップショット機能を実行する

Snap snapshot backup & restoreという項目のとおりのコマンドを実行します。

$ sudo snap stop nextcloud
$ sudo snap save nextcloud
$ sudo snap start nextcloud 

すると/var/lib/snapd/snapshots以下に拡張子がzipのアーカイブが作成されます。

このスナップショットはsnapによって管理されていますので、削除などはドキュメントに沿って行うのがいいでしょう。

現在取得しているスナップショット一覧を表示するには次のコマンドを実行します。

$ snap saved
Set  Snap       Age    Version      Rev    Size    Notes
1    nextcloud  7m32s  29.0.4snap2  43538  4.79GB  -

取得したスナップショットはエクスポートできます。例として次のようなコマンドを実行します。

$ sudo snap export-snapshot 1 /media/backup/nextcloud-backup.zip

ご覧のとおり、1番のスナップショットを/media/backup/nextcloud-backup.zipとしてエクスポートしています。

スナップショットを削除するには次のコマンドを実行します。

$ sudo snap forget 1

挙動を見てるとスナップショットを全部消したら番号が1に戻るというわけではないようでした。もしもスクリプトで管理したいのであれば、そのあたりに考慮が必要そうです。

snap版Nextcloudのエクスポート機能を実行する

こちらもExport and Importという項目のとおりのコマンドを実行します。

$ sudo nextcloud.export

引数の意味もドキュメントのとおりで、和訳してみます。

使い方:
    nextcloud.export [オプション]
    サーバーの移行に沿うようにデータをエクスポートします。デフォルトでは
    Nextcloudのデータベース、設定とデータが含まれます
    (nextcloud.export -abcdを実行したのと同等です)。

利用できるオプション:
    -h: このヘルプメッセージを表示する
    -a: (デフォルトではない)アプリを含む
    -b: データベースを含む
    -c: 設定を含む
    -d: データを含む(とても大きくなることでしょう)

バックアップしたファイルは/var/snap/nextcloud/common/backups/以下に、バックアップを実行した日付と時間で作成されたフォルダーの中にあります。こちらは特に管理されていません。

考察

snapのスナップショット機能は非常にスマートですが、毎回全部のファイルを圧縮するので完了するまでに時間がかかります。しかも圧縮するということはCPUにも負荷がかるということであり、VPSで動かしているような場合にはあまり現実的とは思えません。現実的にはLAN内にあるNextcloudサーバーで、データ量が2桁ギガバイト前半くらいの場合には便利そうです。

となると、たいていの場合はsnap版Nextcloudのエクスポート機能が現実的となりますが、こちらは単純には現在使用しているデータ量と同等の空き領域が必要となります。例えばVPSのストレージが100GBのプランで(Nextcloud専用で使用しているという前提で)すでに50GBほど使用している場合、この方法を取るのはなかなかに難しいでしょう。ディスクフルからの復旧は大変であまり思い出したくありません[3]

よって空き領域を充分に確保できるという前提で、例えば次のようなスクリプトを定時で実行すればいいのではないかという結論に達しました。

#!/bin/sh

BACKUP_PATH=/var/snap/nextcloud/common/backups
BACKUP_TO=nextcloud@example.com:/home/nextcloud/nextcloud-backup/

nextcloud.export
STATUS=$?
if [ $STATUS = "0" ];then 
    BACKUP_DIR=$(ls $BACKUP_PATH)
else
    exit 1
fi
if [ -n "$BACKUP_DIR" ]; then
    BACKUP_FROM=$BACKUP_PATH/$BACKUP_DIR/
    rsync -az --delete-after -e "ssh -i /root/.ssh/id_rsa" "$BACKUP_FROM" "$BACKUP_TO"
    rm -rf "$BACKUP_FROM"
else
    exit 1
fi

このスクリプトでは、エクスポート後、他に用意したサーバーへrsyncで差分のみコピーするようにし、その後エクスポートしたフォルダー自体を削除しています。

これはあくまで一例で、空き容量のチェックをしたほうがいいとか、BACKUP_PATHに以前バックアップしたフォルダーがないかチェックしたほうがいいとか、エラーを通知したほうがいいとか、そもそもPythonで書いたほうがいいとかいろいろと変更すべきところはあるでしょう。

エラー通知はNextcloud TalkにもWebhookの仕組みはあるので、これを利用するのがいいでしょうか。

自動実行はsystemd timerを使用するのがいいでしょう。systemdに関してはsystemdの思想と機能がオススメです。というかすでにお読みのことでしょうが。

[オマケ] ゴミ箱にあるファイルの自動削除

デフォルトでは、Nextcloudはゴミ箱にあるファイルを自動削除しません。これを見落としているおっちょこちょいは筆者くらいだと信じたいですが、Nextcloudの使用量に対して全体の空き容量が少なすぎるのはなぜかを調査していて気づいたことです。

自動削除したい場合は次のコマンドを実行してください。

$ sudo nextcloud.occ config:system:set --value='auto, 90' trashbin_retention_obligation

これで90日後に問答無用で削除するようになります。詳細はドキュメントを確認してください。オプションにちょっとクセがあるので注意が必要です。

おすすめ記事

記事・ニュース一覧