サーバーのバックアップに関して
発端
自宅サーバーでnextcloudというクラウドソフトを動かしています。
立ち上げた時にバックアップを自動でとるようにしていたつもりだったのですが、確認してみると意図した通りに動いていないことが確認されたので、再度整理して構築し直します。
構成
OS : ubuntu 20.04
関連しているソフト : apache2, nextcloud
HDD : PC本体に500GB, 外付けとして4TB(nextcloudのデータ用), 4TB(バックアップ用)
やりたいこと
ex_HDD
├── nextcloud
│ └── data(nextcloudのデータディレクトリ)
└── backup
├── mysqldump_nextcloud.bkp(/var/www/html/nextcloudのバックアップ)
├── nextcloud(/var/www/html/nextcloudのバックアップ)
├── mysqldump_wordpress.bkp(wordpressテーブルのバックアップ)
├── wordpress/(/var/www/html/wordpressのバックアップ)
├── mysqldump_all.bkp(全てのデータベースのバックアップ)
├── php(php.iniのバックアップ)
│ ├── cli
│ │ └── php.ini
│ └── apache2
│ └── php.ini
└── cron(バックアップ)
上記のようなファイル構造を構築してまんまバックアップ用のhddにrsyncで朝3時くらいに同期させる
データベースのバックアップファイルの作成の仕方
とりあえずmysqlのバックアップをとるための構文mysqldump --single-transaction -u root -p nextcloud > ./test
試してところ、現在のディレクトリにtestという名前のファイルが生成された。
もう一度コマンドを叩いてみるとzsh: file exists: ./test
と表示される。
どうも>
を>|
とすればいいらしい。
testはこれでファイルが存在していても更新されるようになった。
しかし、出力先を外付けHDDに変えてみるとzsh: permission error
が出てしまうようになった
ファイル出力でsudo権限がないユーザーのコマンドになってしまうらしいので、解決法としては| sudo tee
で出力を渡してあげるといいらしい。
標準出力としてプロンプトとして表示されてしまうので、標準出力は捨ててエラーのみ表示するために1> /dev/null
を加える。mysqldump --single-transaction -u root -p nextcloud | sudo tee /media/ex_HDD/backup/nextcloud.bkp 1 > /dev/null
これでコマンドで外付けHDDにバックアップを保存できた。
次はこれをcronできちんと処理できるか。
なんとなくsudo権限が必要なところが怪しい気がしている。
調べたかんじ、sudo crontab -e
でrootユーザーのcrontabに登録してしまえばsudoも動いてくれるようだ。時間設定+ sh /.../backup.sh
をcrontabに追記して動作を確認した。
同様にwordpressに関してもmysqlのバックアップファイルを作成。
データベースの復元
特定のデータベースの復元mysql -u ユーザー名 -p データベース名 < dumpファイル名
rsyncでその他のディレクトリのバックアップを作成
nextcloudのdata保管用HDD(仮名HDD1)にデータベースやファイルのバックアップを作成
nextcloudのdata以外でバックアップしておきたいファイルのリストは以下
- /var/www/html/nextcloud
- /var/www/html/wordpress
上記のファイルをnextcloudのdataをメインで保存しているHDDにbackupディレクトリ作成し、その下にバックアップとして保存
HDD1をバックアップ用として使用するHDD(仮名HDD2)にrsync
rsync -vAax --delete /media/HDD1/nextcloud/data /media/HDD2/nextcloud
rsync -vAax --delete /media/HDD1/backups /media/HDD2
スクリプト全体(仮)
バックアップ開始時間と終了時間も記載させて完成。
#!/bin/sh
echo start at `date`
#念の為apache2の再起動(nextcloudのメンテナンスモードがうまく働かないことがあるらしい)
systemctl restart apache2
#メンテナンスモードオン
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --on
#dbのバックアップ
mysqldump --single-transaction -u root -p nextcloud | sudo tee /media/ex_HDD/backup/nextcloud.bkp 1>/dev/null
mysqldump --single-transaction -u root -p wordpress | sudo tee /media/ex_HDD/backup/wordpress.bkp 1>/dev/null
#nextcloudとwordpressのファイルのバックアップ
rsync -rlOtcv --delete /var/www/html/nextcloud /media/HDD1/backup
rsync -rlOtcv --delete /var/www/html/wordpress /media/HDD1/backup
#HDD1 --> HDD2 のバックアップ
rsync -vAax --delete /media/HDD1/nextcloud /media/HDD2
rsync -vAax --delete /media/HDD1/backup /media/HDD2
#メンテナンスモードオフ
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --off
#終了時間
echo end at `date`
トラブル
sudo crontab -e
でrootのcrontabに登録してみたのですが、バックアップファイルが作成されず。chmod 774
で権限を設定したら実行してくれるようになりました。(よくわからない)
rootのcrontabに登録しておけば実行権限なんて変更しなくてもroot権限で実行してくれるんじゃあないんですかね?
謎。
ついでにメンテナンスモードのコマンドもwww-dataではなくsudoから直接つかえるのか試してみたけどConsole has to be executed with the user that owns the file config/config.php Current user id: 0 Owner id of config.php: 33 Try adding 'sudo -u #33' to the beginning of the command (without the single quotes) If running with 'docker exec' try adding the option '-u 33' to the docker command (without the single quotes)
と表示されてだめでした。
なんでも間でもrootなら行けるってわけでもないんでしょうかね。
こっちはさっきの話とは別だとは思いますがなんにせよ ここらへんちゃんと勉強したいところ。
今度こそ完成スクリプト
#!/bin/sh
echo start at `date`
systemctl restart apache2
#メンテナンスモードオン
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --on
#DBバックアップ
echo ---database backup start---
mysqldump --single-transaction -u root -p nextcloud |tee /media/HDD1/backups/nextcloud_backup.bkp 1>/dev/null
mysqldump --single-transaction -u root -p wordpress |tee /media/HDD1/backups/wordpress_backup.bkp 1>/dev/null
echo ---finish---
#nextcloudとwordpressのファイルバックアップ
echo ---files backup start---
rsync -rlOtcv --delete /var/www/html/nextcloud /media/HDD1/backups | grep -e sent -e total
rsync -rlOtcv --delete /var/www/html/wordpress /media/HDD1/backups | grep -e sent -e total
echo ---finish---
#important_filesバックアップ
echo ---important_files---
rsync -rlOtcv --delete /home/{username}/important_files /HDD1/backups
echo ---finish---
#HDD1からHDD2へのバックアップ
echo ---HDD backup start---
rsync -vAax --delete /media/HDD1/nextcloud /media/HDD2 | grep -e sent -e total
rsync -vAax --delete /media/HDD1/backups /media/HDD2 | grep -e sent -e total
echo ---finish---
#メンテナンスモードオフ
sudo -u www-data php /var/www/html/nextcloud/occ maintenance:mode --off
echo end at `date`
ログも出力できるようにして動作確認もして完成。sudo crontab -e
でrootのcrontabに登録して標準出力をリダイレクトして完了です。30 3 * * * {DIR}/backup.sh > {DIR}/backup.log
最後の最後でディレクトリ名を間違えて1時間くらい混乱していましたが、なんとかうまく動いてくれてホッとしました。
コメント