GCPにGrowiを構築する 08 GROWIのバックアップ

GCPのデータをファイルに吐き出し、Google Driveにアップロードするシェルを作成する。
また、この処理を自動で定期的に実行するようにする。

Google Driveアクセス

Google Driveにバックアップしようと思うが、いくつかツールがある。

  • gdrive
  • skicka

今回はskickaを使うことにする。

インストール

公式サイトを見ながら。

https://github.com/google/skicka

と思ったけど英語辛いので以下のサイトも参考にさせていただいた。

https://matoken.org/blog/2018/11/05/try-skicka-to-access-google-drive-with-command-line/

以下、ホームディレクトリで実行。
前提でGoが必要なのでインストール。

~$ sudo apt install golang -y  

直下にgoフォルダが出来上がる。

skickaのダウンロードとインストール
./go/bin/にインストールされる。

~$ go get github.com/google/skicka  

初期設定。
以下のコマンドで、ホームディレクトリに.skicka.configが作成される。

~$ ./go/bin/skicka init  

GCAにはブラウザが入っていないので以下のコマンドを実行。

~$ ./go/bin/skicka -no-browser-auth ls  
Go to the following link in your browser:  
https://accounts.google.com/o/oauth2/auth?(秘密)  

WindowsでURLに接続するといつものGoogleの認証画面。
認証すると認証キーが表示される。

元の画面に戻って貼り付け。

Enter verification code: (秘密)  
Updating metadata cache: [===============================================================================================================]  99.98% 1m10s  
(Google Driveのルートディレクトリの一覧)  

Google Driveのルートディレクトリの一覧が表示されれば成功。

試しにファイルを送ってみる。

~$ ./go/bin/skicka upload ./users.json /  
Files:  725 B / 725 B [=====================================================================================================================] 100.00% 2s  
2019/03/13 22:58:37 Preparation time 0s, sync time 2s  
2019/03/13 22:58:37 Updated 1 Drive files, 0 local files  
2019/03/13 22:58:37 725 B read from disk, 0 B written to disk  
2019/03/13 22:58:37 725 B uploaded (304 B/s), 0 B downloaded (0 B/s)  
2019/03/13 22:58:37 24.49 MiB peak memory used  

確認

~$ ./go/bin/skicka ls  
(省略)  
users.json  
(省略)  

users.jsonが増えました。

自動化シェル作成

さて、バックアップスクリプトを作成しましょう。

~$ vi ./backup.sh  
# Set variables  
# バックアップ用ディレクトリ  
backup_root_dir=~/backup  
# バックアップ用ディレクトリ名(日時情報付)  
backup_dir_name=growi_backup_$(date '+%Y%m%d_%H%M%S')  
# バックアップディレクトリパス  
backup_dir_path=${backup_root_dir}/${backup_dir_name}  
# アーカイブフィル名  
archive_file_name=${backup_dir_name}.tar.xz  
# アーカイブファイルパス  
archive_file_path=${backup_root_dir}/${archive_file_name}  

# バックアップ用ディレクトリ作成  
mkdir ${backup_dir_path}  
# growiアップロードファイルコピー  
sudo cp -r /var/lib/docker/volumes/growi_growi_data/_data/uploads "${backup_dir_path}"  
# MongoDBのgrowiデータベースのダンプ情報出力  
mongodump --port 27017 -d growi -u growiuser -p (秘密) --out "${backup_dir_path}/mongodump_growi"  
# 圧縮  
tar -Jcvf "${archive_file_path}" -C "${backup_root_dir}" "${backup_dir_name}"  

# Googleドライブのルートに/growi/backupディレクトリ作成  
~/go/bin/skicka mkdir /growi  
~/go/bin/skicka mkdir /growi/backup  
# アーカイブファイルをアップロード  
~/go/bin/skicka upload "${archive_file_path}" /growi/backup/  

# Slack通知  
python3 ~/source/growi-server/postwebhook.py "バックアップを取得しました。${archive_file_name}"  

Google Driveにフォルダが無いとだめなのでmkdirしておく。再帰的に作る方法はない?

tarの圧縮は-Cを付けて相対で。^tar

最後のSlack通知はおまけ。バックアップ完了を通知。
なお、エラーチェックしていないのでコケても正常終了で通知する。
とりあえず、で。

定期実行

cronで毎日実行。
現状確認。

~$ crontab -l  
no crontab for (ユーザ名)  

編集。エディタが立ち上がる。

~$ crontab -e  

編集結果。お試しで23時代毎分バックアップシェルが実行されるように。

# Edit this file to introduce tasks to be run by cron.  
#   
# Each task to run has to be defined through a single line  
# indicating with different fields when the task will be run  
# and what command to run for the task  
#   
# To define the time you can provide concrete values for  
# minute (m), hour (h), day of month (dom), month (mon),  
# and day of week (dow) or use '*' in these fields (for 'any').#   
# Notice that tasks will be started based on the cron's system  
# daemon's notion of time and timezones.  
#   
# Output of the crontab jobs (including errors) is sent through  
# email to the user the crontab file belongs to (unless redirected).  
#   
# For example, you can run a backup of all your user accounts  
# at 5 a.m every week with:  
# 0 5 * * 1 tar -zcf /var/backups/home.tgz /home/  
#   
# For more information see the manual pages of crontab(5) and cron(8)  
#   
# m h  dom mon dow   command  

CRON_TZ=Asia/Tokyo  
# backup growi  
0 */3  * * *   ~/backup.sh  

CRON_TZ=Asia/Tokyoはcronの設定時刻を東京のタイムゾーンにする。
https://qiita.com/munaita_/items/7bf0e786a1a431230691
0 */3 * * * ~/backup.shは3時間毎~/backup.shを実行する。
タイムゾーン変更有効化のためにはcrondを再起動する必要がある。
Linuxディストリビューションによりcrondの場所が異なるようなので、Ubuntuのコマンドを調べて実行。

~$ sudo /etc/init.d/cron restart  

これで3時間毎にGoogle Driveにファイルが出来上がる。