Ghostのバックアップ

このブログはGhostを使っていますが特に今までまともにバックアップを取っていなかったので、バックアップを作成することにしました。

Ghostでバックアップすべきなのはこの2点かなと思っています。

  1. /contents
  2. /config.js

環境など

  • さくらVPS
  • Scientific Linux 6系
  • Dropboxのアカウントあり

処理の流れ

  1. これらをまとめたディレクトリを作る
  2. tarで圧縮する
  3. dropboxにアップロードする
  4. 残骸を削除

この流れをcronで毎日4時に行うことにしました。

Dropboxにファイルをアップロードする

DropboxへのファイルアップロードにはDropbox-Uploaderを使うことにしました。Starも多くユーザも多そうだったので。

cloneするとdropbox_uploader.shはパーミッションが775だったのでchmodする必要はありませんでした。

# /usr/local/src 移動
cd /usr/local/src

# /usr/local/src にクローン
git clone https://github.com/andreafabrizi/Dropbox-Uploader.git 

# pathに通すためシンボリックリンクを作成
ln -s /usr/local/bin/Dropbox-Uploader/dropbox_uploader.sh /usr/local/bin/

これでdropbox_uploader.shを実行できるようになりました。

# $HOMEへ移動
cd ~

# dropbox_uploader.sh を実行する
dropbox_uploader.sh

パスが通っていれば実行に成功します。するとこんなメッセージが表示されました。

 This is the first time you run this script, please follow the instructions:

 1) Open the following URL in your Browser, and log in using your account: https://www.dropbox.com/developers/apps
 2) Click on "Create App", then select "Dropbox API app"
 3) Now go on with the configuration, choosing the app permissions and access restrictions to your DropBox folder
 4) Enter the "App Name" that you prefer (e.g. MyUploader1828286482513)

 Now, click on the "Create App" button.

 When your new App is successfully created, please click on the Generate button
 under the 'Generated access token' section, then copy and paste the new access token here:

 # Access token:

というわけなので、https://www.dropbox.com/developers/apps でDropboxアプリを作成してGenerated access token します。

生成されたアクセストークンをシェルにコピペしてEnterすれば完了でした。

動作を確認します。

touch text.txt # 空のファイルを作成
dropbox_uploader.sh upload text.txt /test_upload/text.txt # ファイルをアップロード

Dropboxアプリで設定したパス配下にファイルのアップロードが確認できました。

/path/to/DropboxApp/text_upload/text.txt

バックアップ作成とアップロードスクリプトを書く

書きました。こんな感じのパスにバックアップファイルがアップロードされます。

/アプリ/DropboxAppDir/ghost/2016/ghost-201611141539.tar.gz

このスクリプトのパスは /home/user_name/bin/backup_ghost.sh として。

#!/bin/sh
#
DATE=`date +"%Y-%m-%d-%H-%M"`
TARGET_ROOT="/path/to/ghost_parent"
TARGET_DIR="ghost"
BACKUP_ROOT="/tmp"
BACKUP_DIR="${TARGET_DIR}-${DATE}"
UPLOAD_PATH="/ghost/`date +'%Y'`"
#
# echo "-- start"
#
############
# create backup dir
############
# echo "-- backup section"
# echo "backup dir: ${BACKUP_ROOT}/${BACKUP_DIR}"
if [ ! -d "${BACKUP_ROOT}/${BACKUP_DIR}" ]; then
    mkdir -p "${BACKUP_ROOT}/${BACKUP_DIR}"
    # echo "make backup dir"
fi
#
############
# copy
############
# echo "-- copy file section"
cd "${BACKUP_ROOT}/${BACKUP_DIR}"
CONTENT="${TARGET_ROOT}/${TARGET_DIR}/content"
# echo "copy ${CONTENT}"
cp -r "${CONTENT}" .
CONFIG="${TARGET_ROOT}/${TARGET_DIR}/config.js"
# echo "copy ${CONFIG}"
cp -r "${CONFIG}" .
# echo ""
#
############
# archive
############
# echo "-- archive section"
ARCHIVED="${BACKUP_DIR}.tar.gz"
cd $BACKUP_ROOT
tar czf "${BACKUP_ROOT}/${ARCHIVED}" $BACKUP_DIR
# echo "backup finished"
# echo ""
#
############
# remove cache
############
# echo "-- remove file cache section"
CACHE="${BACKUP_ROOT}/${BACKUP_DIR}"
rm -rf ${CACHE}
#
############
# upload dropbox
############
# echo "-- upload archive section"
dropbox_uploader.sh -q upload "${BACKUP_ROOT}/${ARCHIVED}" "${UPLOAD_PATH}/${ARCHIVED}"
if [ $? == 0 ]; then
    # echo "upload success"
    rm -rf "${BACKUP_ROOT}/${ARCHIVED}"
    # echo "remove archive file. ${BACKUP_ROOT}/${ARCHIVED}"
    exit 0
else
    # echo "upload failed"
    exit 1
fi
#
exit 1

実際にスクリプトを実行して動くか確認

/home/user_name/bin/backup_ghost.sh

cronでまわす

バックアップのアップロードなどができたら後は、そんなに毎日記事を書くわけでもないけど、毎日バックアップすることにしました。時間は毎朝4時です。

/etc/cron.d/blog-ghost-backup

#
# cron-jobs for certbot-renewal
#

MAILTO=user_name

0 4 * * *     user_name /home/user_name/bin/backup_ghost.sh

結果は明日確認します。