【プロジェクト管理ツール】 TaskBoard のバックアップおよびリストアを考える

■ はじめに

https://blogs.yahoo.co.jp/dk521123/37620136.html
について、運用時にデータを失った時のことを考えて
バックアップを行うことを考える

■ バックアップ対象

* 他にもあるかもしれませんが...
【a】 DBファイル「taskboard.db」
【b】アップロードしたファイル群が格納されたディレクトリ「uploads」 

主なディレクトリ構成

/var/www/taskboard
 + api
   + taskboard.db ... SQLite の DBファイル
   + uploads      ... アップロードしたファイル群を格納するディレクト

■ バックアップについて

環境

 * バックアップ元 : CentOS7 / TaskBoard(v0.3.1)
 * バックアップ先 : Windows Server 2008

バックアップ方針概要

シンプルに...

【1】 バックアップ対象「taskboard.db」「uploads」を日時を付加して圧縮し、バックアップ先に格納
【2】 古いファイルは削除する
【3】 【1】【2】をシェルで行い、cronで定期実行(一日夜間に一回実行)

■ 設定手順

【1】 バックアップ先のWindowsでバックアップ用のユーザおよびバックアップ用の共有ファルダを作成する
【2】 バックアップ元のCentOS7 からWindows共有フォルダをマウントする
【3】 バックアップ用のシェルスクリプトを作成
【4】 cronでバックアップ用のシェルスクリプトを定期実行

【1】 バックアップ先でバックアップ用のユーザ/共有ファルダを作成する

 * バックアップ用のユーザ「backup-admin (一般ユーザ)」でパスワード「password」にする
 * バックアップ用の共有ファルダ「shards」は、「Everyone:書き込み、読み込み」にする

【2】 バックアップ元のCentOS7 からWindows共有フォルダをマウントする

 * マウント先を「/home/admin/backups」にする
 * やり方は以下の関連記事を参照
https://blogs.yahoo.co.jp/dk521123/37415363.html
コマンド例
mkdir -p /home/admin/backups

sudo vi /etc/fstab
~~~~
//192.168.16.XXX/shared   /home/admin/backups   cifs   username=backup-admin,password=password    0    0
~~~~

# fstab の反映
sudo mount -a

【3】 バックアップ用のシェルスクリプトを作成

 * 以下を圧縮し、日時を付加して圧縮
 ~~~~~
  【a】 DBファイル「/var/www/taskboard/api/taskboard.db」
  【b】 ディレクトリ「/var/www/taskboard/api/uploads」 
 ~~~~~
 * /etc/backups/backups-taskboard.sh に保存
/etc/backups/backups-taskboard.sh
#!/bin/bash

# 付加する日付
NOW=$(date "+%Y%m%d_%H%M%S")

# 削除対象日数(7日以上前のファイルを消す)
DAY_TO_DELETE="+7"

# バックアップ先(マウント先)のパス情報
BACKUP_DIR="/home/admin/backups/taskboard"
BACKUP_FILENAME="${NOW}-taskboard.tar.gz"
BACKUP_FULLPATH="${BACKUP_DIR}/${BACKUP_FILENAME}"

# バックアップ対象
BACKUP_TARGET1="/var/www/taskboard/api/taskboard.db"
BACKUP_TARGET2="/var/www/taskboard/api/uploads"

# 一時ディレクトリ(もっとちゃんとやるならランダム生成した方がいいが簡易でいいので)
TMP_ROOT_DIR="/tmp"
WORK_DIR_NAME="taskboard-${NOW}"
WORK_DIR="${TMP_ROOT_DIR}/${WORK_DIR_NAME}"
mkdir -p ${WORK_DIR}

# 一時ディレクトリにバックアップ対象をコピー
cp ${BACKUP_TARGET1} "${WORK_DIR}/."
if[ -d ${BACKUP_TARGET2} ] && cp -R ${BACKUP_TARGET2} "${WORK_DIR}/."

# 圧縮
tar -zcvf ${BACKUP_FULLPATH} -C ${TMP_ROOT_DIR} ${WORK_DIR_NAME}

# 念のため権限変更
chmod 777 ${BACKUP_FULLPATH}

# 古いファイルを削除
find ${BACKUP_DIR} -type f -mtime ${DAY_TO_DELETE} -exec rm {} \;

# 後片付け
rm -R ${WORK_DIR}

【4】 cronでバックアップ用のシェルスクリプトを定期実行

 * cron については、以下の関連記事を参照
https://blogs.yahoo.co.jp/dk521123/36463384.html
サンプル:平日23:45にバックアップ用のシェルスクリプトを定期実行
sudo crontab -e
~~~~~~~~~
45 23 * * 1-5 /etc/backups/backups-taskboard.sh
~~~~~~~~~

■ リストア

前提条件

 * 以下の関連記事のようにTaskBoard の環境が整っていること
https://blogs.yahoo.co.jp/dk521123/37620136.html

手順

【1】 バックアップの圧縮ファイルを解凍
~~~~~
tar xvzf 20180816_234500-taskboard.tar.gz
~~~~~

【2】 デプロイ
~~~~~
sudo cp /var/www/taskboard/api/taskboard.db /var/www/taskboard/api/taskboard.db.orig

cd 20180816_234500-taskboard
sudo mv taskboard.db /var/www/taskboard/api/taskboard.db
sudo mv uploads /var/www/taskboard/api/.
~~~~~

【3】 サーバ再起動
~~~~~
sudo systemctl restart httpd
~~~~~

■ 補足 : 使用したTips

日付/日時を付加するには

echo `date "+%Y%m%d_%H%M%S"`

# 変数として利用するなら...
NOW=$(date "+%Y%m%d_%H%M%S")
参考文献
https://qiita.com/mochizukikotaro/items/f3a78d631595f9744a75
http://www.atmarkit.co.jp/flinux/rensai/linuxtips/240datefilename.html

古いファイルを削除

 * findコマンドのmtimeオプションを使う
  => 「-type f」: ファイルに限定(ディレクトリではなく)

【例】
find /home/admin/backups -type f -mtime +7 -exec rm {} \;
参考文献
https://curecode.jp/tech/find-mtime-delete/
https://qiita.com/makaaso/items/474d9f198c35d9587f15

関連記事

【プロジェクト管理ツール】TaskBoard

https://blogs.yahoo.co.jp/dk521123/37620136.html

CentOS7 からWindows共有フォルダをマウントする

https://blogs.yahoo.co.jp/dk521123/37415363.html

cronデーモン / crontabコマンド

https://blogs.yahoo.co.jp/dk521123/36463384.html

解凍・圧縮 ~ zip / tar など ~

https://blogs.yahoo.co.jp/dk521123/34102411.html

【シェル】 ログバックアップを考える & 簡易スクリプトの作成

https://blogs.yahoo.co.jp/dk521123/34859476.html