django の自動バックアップとローカルへのダウンロード

vps の ubuntu 18.04 に django を設定して、その中にデータベースを作成し自分用のメモとして使っています。
他人にとってはほとんど意味のないデータですが、私にとっては重要なデータでありバックアップしておく必要があります。

シェルスクリプト

サーバー上で、以下のようなシェルスクリプトを作成。

/home/user/bak.sh

#!/bin/bash

dirpath='/home/user/jsonbak'
filename=`date +%Y%m%d`.json

cd /home/django/testdjango
source venv/bin/activate
python manage.py dumpdata > $dirpath/$filename

chmod 700 $dirpath/$filename
find $dirpath -type f -daystart -mtime +3 |xargs rm -f

下から2行は古いものを削除するものですが、おそらくこれで動くはずです。

crontab 設定

crontab の設定をします。


0 2 * * * /home/user/bak.sh

これで深夜2時に自動的にバックアップが実行されます。

ローカルから scp

ローカルの linux mint 20.2 から ssh 接続ができているという前提です。

dbbackup.sh

#!/bin/bash

scp -r -P 11123 -i ~/.ssh/kagoya/kagoya.key root@123.45.67.89:/home/user/jsonbak/*.json ~/backup/jsonbak
scp -r -P 11123 -i ~/.ssh/kagoya/kagoya.key root@123.45.67.89:/home/django/testdjango/media ~/backup/mediabak

# json のインポート
cd ~/backup/jsonbak
latest=`ls -rt | tail -n 1`
echo $latest
cd ~/backup/testdjango
source venv/bin/activate
python manage.py loaddata ~/backup/jsonbak/$latest
# media のコピー
cp -r ~/backup/mediabak/media ~/backup/testdjango

データベースだけではなくて、画像もアップロードしているので、そしてそれは media の中に蓄積されているので、フォルダごと scp ダウンロードした後でローカル環境の media に上書きしています。

これで、プライベートなデータベースのバックアップがとても簡単になりました。

NAS 上でバックアップする

ローカルのシェルスクリプトに crontab を設定しようかと思ったのですが、自宅でコンピュータの電源をオンにするのは不定期なので、バックアップを NAS にさせるようにしました。

ローカルのシェルスクリプトをほとんどそのまま使えますが、ssh キーはパーミッションの設定が必要なようです。
以下のようにしました。


chmod 700 .ssh
chmod 700 .ssh/kagoya
chmod 600 .ssh/kagoya/kagoya.key

json データと media の保存先を homes 以外の所に設定します。
そしてタスクスケジューラで深夜に1回シェルスクリプトを実行するようにします。

これで、json と media が毎日バックアップされ、ほぼ同時に rsync で他の NAS に同期され、さらに1日1回外付けHDDにバックアップされます。

これで私のメモ代わりのデータベースのバックアップは完璧になりました。