セルフホスティング型のファイルストレージとしてとても人気なNextcloudを活用していく中で、もしもの時のためのバックアップを作成しようと設定を行いました。
アプリの追加やコマンドラインで簡単にできるかと思っていたのですが、特に無いようで 公式ページ ではrsyncやmysqldumpを使用した方法が紹介されていたのでそれに則ったバックアップ用のスクリプトを作成しました。
#!/bin/bash
PHP=/usr/bin/php8.1
NEXTCLOUD_PATH=/path/to/nextcloud/public_html/
DATE=`date +"%Y-%m-%d-%H-%M"`
BACKUP_DIR=nextcloud-bk-${DATE}
BACKUP_PATH=/path/to/tmp/
BACKUP_FINALY=/path/to/backups/nextcloud/
BACKUP_FILE=$(cd $(dirname $0); pwd)/$(basename $0)
MYSQL_HOST=
MYSQL_USER=
MYSQL_PASS=
MYSQL_DATABASE=
cd $NEXTCLOUD_PATH
$PHP occ maintenance:mode --on
trap finally EXIT
finally() {
cd $NEXTCLOUD_PATH
$PHP occ maintenance:mode --off
}
mkdir -p $BACKUP_PATH
cd $BACKUP_PATH
mkdir $BACKUP_DIR
cd $BACKUP_DIR
cp ${BACKUP_FILE} .
rsync -Aaxq \
$NEXTCLOUD_PATH \
nextcloud-dirbkp/
mysqldump --single-transaction \
-h $MYSQL_HOST \
-u $MYSQL_USER \
-p$MYSQL_PASS \
$MYSQL_DATABASE > nextcloud-sqlbkp_${DATE}.sql
cd $NEXTCLOUD_PATH
$PHP occ maintenance:mode --off
cd $BACKUP_PATH
zip -rq ${BACKUP_DIR}.zip ${BACKUP_DIR}
mv ${BACKUP_DIR}.zip ${BACKUP_FINALY}
rm -rf ${BACKUP_DIR}
rm -rf ${BACKUP_DIR}.zip
# バックアップファイルが10件以上であれば古いものを削除
cd ${BACKUP_FINALY}
rm -f `ls -1t *.zip | tail -n+11`
流れとしてはメンテナンスモードに以降、作業用のtmpディレクトリを作成して
- バックアップ用のスクリプトをコピー
- Nextcloudのファイル群をrsyncでコピー
- mysqldumpでデータベース内容を出力
したのちにメンテナンスを解除、zipファイルとしてまとめて BACKUP_FINALY
で指定したディレクトリに結果を置いて最新10件を残して過去のバックアップファイルは削除しています。
メンテナンス解除については trap
コマンドを使ってメンテナンス実行と同時に終了時に解除する予約を行っています。ですがzip作成など後処理に時間がかかるので途中でもメンテナンス解除を行なっているため2重に実行しています。
メンテナンス解除を2回実行するのは、特に問題はないですが、なんらかの理由でスクリプトが途中で終わってしまった場合にメンテナンス中になり続けるというリスク回避のために行なっています。気になる方は調整してみてください。
終わりに
以上、Nextcloudのバックアップを作成するシェルスクリプトの紹介でした。
ちょっとした定型処理を書くのは楽しいものです。
それでは、今回もお疲れ様でした。
コメントを残す