ロリポップが用意しているバックアップ機能は何かとお金がかかります。
https://lolipop.jp/service/specs/backup/
そこで、自力でWordPressのバックアップ機能を実装しました。
※手順通りに行えば実装できると思いますが、あくまで参考程度に認識してください。
※特に、削除処理については内容が理解できる方のみでお願いします。
復元に必要なファイル
WordPressの復元に最低限必要なもの。
- データベース
- wp-content
もう少し削減できるかもしれませんが、
とりあえずこれら2つのバックアップを考えていきます。
シェルスクリプト作成
まずはロリポップのサーバーにSSHでアクセスします。
接続方法:https://lolipop.jp/manual/user/ssh/
※以下、CUIでの操作を行いますが、WinSCPなどのGUI操作でも実装可能です。
接続後、バックアップファイルを格納するディレクトリ作成
mkdir ~/web/bkup
シェルスクリプトを作成します
vi ~/web/bkup/bkup.sh
以下の内容をコピペし、「入力箇所」のダブルコーテーション内を編集してください。
# !/bin/bash
# 入力箇所
hostname="データベースホスト名"
user="ユーザ名"
dbname="データベース名"
password="データベースのパスワード"
bkupdir="バックアップ先のフルパス(末尾にスラッシュ不要)"
wpdir="wp-contentのフルパス(末尾にスラッシュ不要)"
shdir="シェルスクリプトを格納しているディレクトリのフルパス(末尾にスラッシュ不要)"
daletenum="バックアップファイルの上限数"
# 基本的に編集不要
date=`date +%Y%m%d%H%M%S`
dumpdir="${bkupdir}/$date"
dbquery="/usr/bin/mysqldump -h $hostname -u $user -p$password --databases $dbname"
# 実行
eval "mkdir $dumpdir"
eval "$dbquery > ${dumpdir}/dbdump.sql"
eval "cp -a $wpdir ${dumpdir}"
eval "cd $bkupdir && zip -rm ${date}.zip ${date}"
# 古い順に削除
eval "cd $shdir && python rm.py $daletenum"
実行権限の付与
chmod 755 ~/web/bkup/bkup.sh
■■■!!!ここからはソースコードの内容が理解できる方だけでお願いします!!!■■■
■■■!!!削除処理があるため大変危険です!!!!■■■
次に、バックアップファイルが上限数に達した場合、
古い順に削除するという処理をpythonで実装します。
(ロリポップにはデフォルトでpythonが入っています)
※シェルスクリプトと同じディレクトリに配置してください
vi ~/web/bkup/rm.py
import os
import sys
MAX_CNT=int(sys.argv[1])
from operator import itemgetter
filelists = []
for file in os.listdir():
base, ext = os.path.splitext(file)
if ext == '.zip':
filelists.append([file, os.path.getctime(file)])
filelists.sort(key=itemgetter(1), reverse=True)
for i,file in enumerate(filelists):
if i > MAX_CNT - 1:
print('{}は削除します'.format(file[0]))
os.remove(file[0])
実行権限の付与
chmod 755 ~/web/bkup/rm.py
試しに実行し、バックアップできているか確認します。
zipファイルが作成されているはずです。
また、バックアップファイルの上限数を超えた場合、
古い順に削除されているか確認するのも良いかもです。
sh ~/web/bkup/bkup.sh && ls -la ~/web/bkup/
cron設定
- ロリポップサイトにログインします
- 次に「サーバーの管理・設定」 > 「cron設定」を押下
- 実行ファイルパスに先ほど作成したシェルのパスを記入(web/より後ろのパスを記入)
実行スケジュールはお好みで。
※ディスクの容量に注意してください(追記参照)
参考資料
バックアップ機能実装
https://matatabisoft.com/114/
古い順に削除の実装
https://tonari-it.com/python-file-remove/
追記
2021-08-07
・ダンプをzip圧縮する処理を追記。
・バックアップの古い順に削除する機能を追加。
2021-08-08
・ディスクの容量に注意してください。
私の場合、一つのzipファイルで113MBほどあります。
これを毎月×12ヶ月分保存するとなると、1.4GBほどになります。
人によってはさらに頻度が高く、個数を多く保存すると思います。
その場合、定期的にバックアップファイルを自身のPCなどにダウンロードすることで、サーバのディスクを圧迫せず、長期間分のバックアップが可能です。
ファイルの定期転送についても気が向いたら自動化してみたいと思います。