Nextcloudのバックアップスクリプト

by

in

セルフホスティング型のファイルストレージとしてとても人気な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のバックアップを作成するシェルスクリプトの紹介でした。

ちょっとした定型処理を書くのは楽しいものです。

それでは、今回もお疲れ様でした。

レンタルサーバーを最大限使いこなすための方法

Laravelの記事を厳選して紹介

投稿者


Comments

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA