私みたいに趣味でWordPressを使ってる人はレンタルサーバーを借りてサイトを公開していると思います。
最近のレンタルサーバーにはバックアップ機能が標準/オプションで用意されているものがほとんどですが、テーマファイル程度のバックアップにお金を払いたくないってのが正直なとこなので、FTPクライアントとシェルでサーバー上のファイルをローカルバックアップする処理を作成しました。
動作環境
- Mac OS High Sierra ※たぶんLinuxでも動きます
- bash
- Cyberduck 6.8.0
やりたいこと
[wordpressルート]/wp-content/themes/[テーマ名称]/配下のファイルとディレクトリをローカルにダウンロードしてtar.gz形式にアーカイブします。今回は.php,、.css、jsディレクトリ、imagesディレクトリを例にします。
プロトコルはSFTP、FTPクライアントはCyberduckを使います。
CyberduckはCLIを使いますので、事前にインストールしておいてください。
ソースコード
ファイルは2つです。
メイン処理のwp-backup.shと設定ファイルのconfigです。
まずメイン処理です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
#!/bin/bash # Initialize CONF_FILE="./config" : ${CONF_FILE:? "設定ファイルが指定されていません"} if [ ! -f $CONF_FILE ]; then echo "設定ファイルが存在しません" exit 1 else . $CONF_FILE fi # バリデーションチェック : ${TMP_DL_DIR:? "ダウンロードするTMPディレクトリが指定されていません"} : ${BKUP_DIR:? "バックアップディレクトリが指定されていません"} : ${THEME:? "バックアップ対象テーマが指定されていません"} : ${ROOT_DIR:? "接続先ディレクトリが指定されていません"} : ${FTP_USER:? "接続ユーザーが指定されていません"} : ${SFTP_HOST:? "接続先ホストが指定されていません"} if [ -z "$BK_FILE_TYPE" -a -z "$BK_DIR_TYPE" ]; then echo "バックアップ対象が指定されていません" exit 1 fi # TMP DLディレクトリの存在確認 if [ ! -d $TMP_DL_DIR ]; then echo "配下に${TMP_DL_DIR}が存在しないため作成します" mkdir $TMP_DL_DIR fi # BACKUPディレクトリの存在確認 if [ ! -d $BKUP_DIR ]; then echo "配下に${BKUP_DIR}が存在しないため作成します" mkdir $BKUP_DIR fi # TMPディレクトリのクリア if ls ./$TMP_DL_DIR/* > /dev/null 2>&1 then rm -r ./$TMP_DL_DIR/* fi # Passwordが設定ファイルにない時に入力を促す if [ -z "$PASS" ]; then echo "Enter your sftp password: " read -s PASS fi # ファイルバックアップ # バックアップ対象に指定された拡張子のファイルをループでDL for i in ${BK_FILE_TYPE[@]}; do TARGET="${TARGET_DIR}/*.${i}" duck -v --username $FTP_USER --password $PASS --download $TARGET $TMP_DL_DIR -existing overwrite done # ディレクトリバックアップ # バックアップ対象に指定されたディレクトリをループでDL for i in ${BK_DIR_TYPE[@]}; do TARGET="${TARGET_DIR}/${i}/" duck -v --username $FTP_USER --password $PASS --download $TARGET $TMP_DL_DIR -existing overwrite done # アーカイブ tar -cvzf $BKUP_DIR/`date "+%Y%m%d_%H%M%S"`.duck_download.tar.gz $TMP_DL_DIR/* # TMPディレクトリのクリア if ls ./$TMP_DL_DIR/* > /dev/null 2>&1 then rm -r ./$TMP_DL_DIR/* fi echo "Finish !!" exit 0 |
続いて設定ファイル。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 |
# ディレクトリ設定 TMP_DL_DIR="duck_download" BKUP_DIR="backup" # WordPress設定 THEME="stinger8-child" #ここに自身が使っているテーマ名を指定 ROOT_DIR="root" #ここに自身が設定しているwordpressのルートディレクトリを指定 # SFTP設定 FTP_USER="username" #ここにFTPユーザー名を指定 PASS="" #ここにFTPのパスワードを指定。ただしセキュリティの観点から非推奨 SFTP_HOST="hostname" #ここにFTPホストを指定 TARGET_DIR="ftps://${SFTP_HOST}/${ROOT_DIR}/wp-content/themes/${THEME}" # バックアップ対象設定 BK_FILE_TYPE=("php" "css") #バックアップする拡張子を指定 BK_DIR_TYPE=("js" "images") #バックアップするディレクトリ名を指定 |
実行結果
1 2 3 4 5 6 7 8 9 10 11 12 13 |
localhost:wordpress_bkup user$ pwd ~/Desktop/wordpress_bkup localhost:wordpress_bkup user$ ls backup duck_download wp-backup.sh config localhost:wordpress_bkup user$ sh wp-backup.sh [中略] Finish !! localhost:wordpress_bkup user$ localhost:wordpress_bkup user$ ls backup duck_download wp-backup.sh config localhost:wordpress_bkup user$ ls backup/ 20190105_015218.duck_download.tar.gz localhost:wordpress_bkup user$ |
説明
概要
wp-backup.shのカレント配下にduck_download/とbackup/というディレクトリを作成し(上記では事前に作ってますが)、duck_download/に一時的にダウンロードファイルが保存され、backup/にバックアップファイルがアーカイブされて保存されます。
duck_download/は処理の前後でクリアされます。
FTP設定
FTP設定はconfigに記述してください。
ただし、パスワードだけはセキュリティの関係で設定ファイル非推奨です。設定していない場合は入力を求められます。
入力ミスしてもduckがちゃんと聞き返してくれます。
バックアップ対象
バックアップ対象は設定ファイルのBK_FILE_TYPE、BK_DIR_TYPEでそれぞれ配列形式で指定します。
BK_FILE_TYPEではバックアップしたいファイルの拡張子を指定します。指定された拡張子のファイルが全てダウンロードされます。
BK_DIR_TYPEではバックアップしたいディレクトリ名称を指定します。指定されたディレクトリが丸ごとダウンロードされます。
FTPの途中経過
実行するとずらずら出てくるのはFTPの途中経過です。
表示させたくない場合はメイン処理のduck -v --username $FTP_USER --password $PASS --download $TARGET $TMP_DL_DIR -existing overwrite
の-vオプションを外してください。
その他
- ログファイルは吐きません。ローカル利用なので良いかなと。。。
- ダウンロードの都度コネクションを貼ってるっぽいです。最初にまとめることもできるんですが疲れたのでやめました。。。どなたか訂正していただけるとありがたいです。
- 最終的にはローカルで更新したファイルをCIでサーバー自動更新することを考えているんですが、重そうなので今はバックアップまでです。。。