このブログのバックアップロジックを書いたメモ

はじめに

このブログの環境

バックアップの概要

定期的にバックアップファイルを作成して、個人利用しているDropboxにアップロードする。

バックアップするもの

  • Ghostの設定ファイル
  • ブログのコンテンツ(テーマや画像など)
  • 記事データ

ロジック

以下のスクリプトを /usr/local/bin/backup_ghost.sh として保存。
crontabで 0 5 * * 1 backup_ghost.sh として毎週月曜のAM5:00に定期実行する。

#!/bin/sh
# backup ghost blog
NOW=`date "+%Y%m%d%H%M"`
BACKUP="blog_${NOW}"
BACKUP_NAME="${BACKUP}.tar.gz"
BACKUP_ROOT="${HOME}/tmp/backup"
BACKUP_PATH="${BACKUP_ROOT}/${BACKUP}"
DB_EXTRA_FILE="${HOME}/.backup_ghost_database.my"
#
############
# make dir
if [ ! -e ${BACKUP_PATH} ]; then
   mkdir -p ${BACKUP_PATH}
fi
#
############
# copy files
cp -r /var/www/ghost/config.production.json "${BACKUP_PATH}/"
cp -r /var/www/ghost/content "${BACKUP_PATH}/"
#
############
# backup database
mysqldump --defaults-extra-file="${DB_EXTRA_FILE}" ghost_prod > "${BACKUP_PATH}/ghost_prod_${NOW}.dump"
#
############
# complession files
cd ${BACKUP_ROOT}
tar czf ${BACKUP_NAME} ${BACKUP}
#
############
# upload backup file
dropbox_uploader.sh -q upload ${BACKUP_NAME} "backup/${BACKUP_NAME}"
#
############
# remove
rm -rf "${BACKUP_PATH}"

処理の流れ

  1. 現在日時を年月日時分のフォーマットで取り出し、バックアップファイル名にする。
  2. バックアップファイルを配置するディレクトリは $HOME/tmp/backup 無かったら作る
  3. Ghostの設定ファイルとコンテンツをバックアップディレクトリに複製
  4. 記事データはGhostのCUIでExportできないのでmysqlのデータベースをdumpする
  5. 圧縮
  6. Dropboxにアップロード
  7. バックアップディレクトリを削除(圧縮ファイルは一応残している)

補足

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

DropboxへのアップロードはDropbox-Uploaderを使用する。
クローンしてPATHを通す。今回は/usr/local/binに配置からシンボリックリンク。

$ cd /usr/local/src/
$ git clone https://github.com/andreafabrizi/Dropbox-Uploader
$ ln -s /usr/local/src/Dropbox-Uploader/dropbox_uploader.sh /usr/local/bin/dropbox_uploader.sh

DropboxのMy Appsでアプリを作成する。
※参考 https://blog.bgbgbg.net/archives/2507

mysql(mysqldump)コマンドでパスワードをコマンドに書かない方法

今回はcrontabで実行するため対話的にパスワードを入力することができない。
しかしパスワードをワンライナーで入力するとワーニングが発生する。
例としてユーザを saito パスワードを himitsu データベース名を ghost_prod として。

$ mysqldump -u saito --password=himitsu -h localhost ghost_prod > ghost_prod_202002110918
mysqldump: [Warning] Using a password on the command line interface can be insecure.

回避する為に --defaults-extra-file を指定する。
内容は下記の通り。これを今回は ~/.backup_ghost_database.my として配置。

[client]
user=saito
password=himitsu
host=localhost

あとは通常通りmysqldumpコマンドを実行。

mysqldump --defaults-extra-file="${DB_EXTRA_FILE}" ghost_prod > "${BACKUP_PATH}/ghost_prod_${NOW}.dump"

追記

記事データはGhostのCUIでExportできないのでmysqlのデータベースをdumpする

できたっぽい。

ghost export {path_to_export}

ファイルの中身は管理画面でExportするものと同じものに見えました(ちゃんと確認していない)。