はじめに
WordPress の backWPup プラグインでバックアップを作成すると、私の環境では LOLIPOP! のレンタルサーバ内の特定フォルダに記録されます。保管する世代の数を指定できますが、(ないとは思いますが) レンタルサーバの記憶装置の故障によって消失するリスクがあります。
WinSCP 等で手動でダウンロードする事は可能ですが、人間のやることにはミスはつきもの、忘れたり操作ミスで消去したりする可能性もあります。
そこで、自宅で常時稼働させている Synology DS218+ (NAS) に自動で同期して、更に多重バックアップしておける環境を作成しました。
バックアップの前提条件と方針
WordPress のバックアップは、BackWPup プラグインでレンタルサーバー内に記録されている事を前提とします。BackWPup プラグインによるバックアップとリストアについては、以下の過去記事を参照ください。
BackWPup プラグインでバックアップされたデータとログは、私の環境では以下のディレクトリに保管されています。(abcdef は BackWPup をインストールした際に決められる文字列です)
~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-backups
~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-logs
この二つのディレクトリを、定期的に Synology DS218+ の特定のディレクトリに同期します。なお、同期の際に Synology DS218+ 側のファイルを削除しないようにして、古いファイルも残すようにします。
こちらのサイトを参考にして、rsync + ssh で同期します。rsync の使い方が分かりやすくまとめられています。
「rsync」は非常に便利なのですが、間違った設定で実行してしまいますとデータ消失の危険性があります。
「--dry-run」(省略形は-n)と「-v」オプションを使用することで、データ変更を行わずに動作結果を詳しく表示させることが出来るので、必ずこれでテストを行ってから、実際にデータコピーを行うように習慣づけましょう。
面倒でもすごく大事です。
データが消失してから後悔しても手遅れです・・・テストしないのダメ絶対!!
https://www.server-memo.net/tips/rsync/rsync.html (強調は筆者)
キチンとテストを行ってから実際に同期させましょう。以下のコマンドのサンプルでは、--dry-run を付けた形で記載します。
Synology DS218+ へ ssh でログイン
Synology DS218+ へ ssh でログインします。DSM のコントロールパネルから SSH サービスを有効にします。
Windows11 か WSL2 の ssh で、Synology DS218+ にログインします。なお、公開鍵認証でログインする為にはディレクトリのパーミッションを変更する必要があります。
KeePassXC に ssh 秘密鍵を登録しておくと、パスフレーズなしでログインできるのでお勧めです。今回は、Synologh DS218+ 用の秘密鍵を作成して KeePassXC に登録しました。
Synology DS218+ で ssh 鍵ペアの作成と接続確認
私は Synology DS218+ 内の様々な同期用に専用のユーザー sync_user を作成しています。以下、このユーザーで作業します。
始めに、LOLIPOP! に Synology DS218+ から接続する為の ssh の鍵ペアを、sync_user で ssh-keygen を使用して作成します。後で Synology DSM のタスクマネージャー (cron) で実行させる為に -N '' でパスフレーズなしにしています。
# Synology DS218+ : sync_user
$ ssh-keygen -t ed25519 -N '' -C rsync -f ~/.ssh/ed25519_rsync
作成した ssh 鍵ペアの公開鍵を LOLIPOP! レンタルサーバーの ~/.ssh/authorized_keys に追加します。LOLIPOP! レンタルサーバーにはエディタは vim と nano が入っていますので、どちらかを使用して編集します。
# LOLIPOP! レンタルサーバー
$ cat .ssh/authorized_keys
ssh-ed25519 XXXXXXXXXXXXXXXXYYYYYYYYYYYYYYYZZZZZZZZZZZZZZZZZZZZZZZZZZZZZZAAAAAAA hiro20180901
ssh-ed25519 XXXXXXXXXXXXXXYYYYYYYYYYYYYYYYYYYYYYYYYYYYYYZZZZZZZZZZZZZAAAAAAAAAAA rsync
2行目を追加しました。ここまで設定すれば、パスフレーズなしで Synology DS218+ から LOLIPOP! にログインできます。
# Synology DS218+ : sync_user
# lolipop のエントリを作成済み
$ cat .ssh/config
Host lolipop
HostKeyAlgorithms +ssh-rsa
UpdateHostKeys no
Hostname ssh.lolipop.jp
User lolipop-username
Port 2222
# 接続テスト
$ ssh lolipop
[lolipop-username@server ~]$ exit
ログアウト
Connection to ssh.lolipop.jp closed.
rsync による同期
パスフレーズ無しで ssh で接続できたら、次は rsync の動作を確認します。
先に記載した通り、以下のサンプルでは --dry-run を有効にしていますので、参考にされる際には除外してください。
同期元ディレクトリの確認と除外ファイルの設定
同期元のディレクトリで、同期したくない or しなくてもよいファイルを探します。
$ ls -a ~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-backups
.
..
.donotbackup
.htaccess
2023-02-02_22-38-23_AABB0011CC.tar.gz
...snip...
2023-02-18_04-37-39_AABB0011CC.tar.gz
index.php
$ ls -a ~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-logs
.
..
.htaccess
backwpup_log_aabb00_2023-02-10_02-24-40.html
...snip...
backwpup_log_aabb00_2023-02-17_02-58-07.html
backwpup_log_aabb00_2023-02-08_05-16-33.html
index.php
同期対象は tar.gz と html です。それ以外の .donotbackup、.htaccess、index.php は同期しないように設定します。
$ cat rsync-exclude
.htaccess
.donotbackup
*.php
この rsync-exclude を rsync の --exclude-from オプションに設定します。
rsync 動作テスト
rsync の基本形は以下の形です。
$ rsync [OPTION]... SRC [SRC]... DEST
or
$ rsync [OPTION]... [USER@]HOST:SRC [DEST]
今回は、LOLIPOP! のレンタルサーバーが SRC、Synology DS218+ が DEST になります。DEST には ~/WordPress_hiro20180901_Backup を指定します。
OPTION として以下を設定します。
- -a : アーカイブモード (通常使うモード)
- -z : データ圧縮
- -v : 詳細表示
- --dry-run : 動作テスト 実際に rsync を実行する場合には外す
- --exclude-from : 除外リスト
- -e ssh : ssh を使用
# BackWPup のバックアップが保存されているディレクトリを同期
$ rsync -azv --dry-run --exclude-from=rsync-exclude -e ssh lolipop:~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-backups ~/WordPress_hiro20180901_Backup
# BackWPup のログが保存されているディレクトリを同期
$ rsync -azv --dry-run --exclude-from=rsync-exclude -e ssh lolipop:~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-logs ~/WordPress_hiro20180901_Backup
実際に (といっても --dry-run ですが) 1行目を動作させたログは以下の通りです。
$ rsync -azv --dry-run --exclude-from=rsync-exclude -e ssh lolipop:~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-backups ~/WordPress_hiro20180901_Backup
receiving incremental file list
backwpup-abcdef-backups/
backwpup-abcdef-backups/2023-02-02_22-38-23_AABB0011CC.tar.gz
backwpup-abcdef-backups/2023-02-03_00-59-21_AABB0011CC.tar.gz
...snip...
backwpup-abcdef-backups/2023-02-17_19-45-54_AABB0011CC.tar.gz
backwpup-abcdef-backups/2023-02-18_04-37-39_AABB0011CC.tar.gz
sent 150 bytes received 1151 bytes 2602.00 bytes/sec
total size is 1857693312 speedup is 1427896.47 (DRY RUN)
これで受け取るファイルが確認できたら、--dry-run を外して実行します。同期先に新しいディレクトリとファイルが出来て、同じコマンドを二回実行したときに同期されるファイルが無ければ完了です。
# 1回目の実行
$ rsync -azv (--dry-run を除いたコマンド)
receiving incremental file list
backwpup-abcdef-backups/
backwpup-abcdef-backups/2023-02-02_22-38-23_AABB0011CC.tar.gz
backwpup-abcdef-backups/2023-02-03_00-59-21_AABB0011CC.tar.gz
...snip...
backwpup-abcdef-backups/2023-02-17_19-45-54_AABB0011CC.tar.gz
backwpup-abcdef-backups/2023-02-18_04-37-39_AABB0011CC.tar.gz
sent 550 bytes received 1853914920 bytes 18821476.85 bytes/sec
total size is 1857693312 speedup is 1.00
# 2回目の実行。incremental file list に何も表示されない
$ rsync -azv (--dry-run を除いたコマンド)
receiving incremental file list
sent 68 bytes received 1077 bytes 763.33 bytes/sec
total size is 1857693312 speedup is 1622439.57
# 手動でバックアップした後の3回目の実行
$ rsync -azv (--dry-run を除いたコマンド)
receiving incremental file list
backwpup-abcdef-backups/
backwpup-abcdef-backups/2023-02-18_14-48-38_AABB0011CC.tar.gz
sent 94 bytes received 119430003 bytes 34122884.86 bytes/sec
total size is 1977260781 speedup is 16.56
ちゃんと動作しているようです。
rsync の速度制限
現在の私のサイトのバックアップファイルは、せいぜい100 MB 程度ですので問題ないと思いますが、バックアップファイルが大きい場合には、ネットワークへの負荷が高くなる心配があります。
rsync には同期速度を制限するオプションがあります。
--bwlimit=2048 としておけば、同期速度を 2MB/sec に制限できます。
LOLIPOP! レンタルサーバーでは authrized_keys でコマンド制限が出来ない
パスフレーズなしで ssh が使える状態というのは良い状態とは言えませんので、用途を rsync のみに制限したいと考えていました。
先に紹介したページでも rsync コマンドのみを実行するように、リモート側の ~/.ssh/authorized_keys に command を追記する方法が記載されています。
また、以下のページでも authorized_keys に command を追記する方法が紹介されています。
Windows11 の Hyper-V 仮想マシンの Ubuntu 22.04 LTS で検証すると、想定通り動作しました。指定したコマンドを実行してログアウトしています。
# 172.25.225.142 は Hyper-V 仮想マシンの Ubuntu 22.04 LTS
$ ssh hiro@172.25.225.142
command="cat .ssh/auth*; pwd" ssh-ed25519 XXXXXXXYYYYYYYYYYYYYYYZZZZZZZZZZZZZZAAAAAAAAAABBBBBBBBBBBBCCCCCCCCCC id_ed25519
/home/hiro
Connection to 172.25.225.142 closed.
同じ事を LOLIPOP! レンタルサーバーで実行しても、command の部分を認識せず、bash のプロンプトが表示されます。
という事で、LOLIPOP! レンタルサーバーでは、authorized_keys の command が無効になっている事が分かりました。これでは公開鍵の種類によって特定のコマンドのみ実行するように制限する事は出来ません。
もう少しセキュアな設定にしたかったのですが残念です。
同期用スクリプト
rsync で同期できるようになりましたので、簡単な同期用のスクリプトを作成しました。同期した後に50個より古いバックアップデータは削除するようにしました。(--dry-run 付加しています)
$ cat ./rsync_WordPress_hiro20180901.sh
#!/bin/bash
echo "*******************"
echo "Start rsync backups"
echo "*******************"
rsync -azv --dry-run --bwlimit=2048 --exclude-from=rsync-exclude -e ssh lolipop:~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-backups ~/WordPress_hiro20180901_Backup
echo
echo "*******************"
echo "Start rsync logs"
echo "*******************"
rsync -azv --dry-run --bwlimit=2048 --exclude-from=rsync-exclude -e ssh lolipop:~/web/hiro20180901.com/wp-content/uploads/backwpup-abcdef-logs ~/WordPress_hiro20180901_Backup
echo
echo "*******************"
echo "Delete Old File"
echo "*******************"
cd ~/WordPress_hiro20180901_Backup/backwpup-abcdef-backups
echo "`ls -t . | tail -n+51`"
rm -f `ls -t . | tail -n+51`
cd ~/WordPress_hiro20180901_Backup/backwpup-abcdef-logs
echo "`ls -t . | tail -n+51`"
rm -f `ls -t . | tail -n+51`
現在のバックアップデータはもっと少ないので、tail の後の数字を小さくしてから手動で実行して、正常に動作する事を確認しました。
$ ./rsync_WordPress_hiro20180901.sh
*******************
Start rsync backups
*******************
receiving incremental file list
sent 68 bytes received 1187 bytes 2510.00 bytes/sec
total size is 2216503331 speedup is 1766138.11
*******************
Start rsync logs
*******************
receiving incremental file list
sent 68 bytes received 1262 bytes 886.67 bytes/sec
total size is 202548 speedup is 152.29
*******************
Delete Old File
*******************
2023-02-03_01-03-11_AABBCCDD00.tar.gz
2023-02-03_00-59-21_AABBCCDD00.tar.gz
2023-02-02_22-38-23_AABBCCDD00.tar.gz
backwpup_log_abcdef_2023-02-03_01-03-11.html
backwpup_log_abcdef_2023-02-03_00-59-21.html
backwpup_log_abcdef_2023-02-02_22-38-23.html
Synology DS218+ の sync_user の home ディレクトリは
- Hyper Backup で外付HDD にバックアップ
- Cloud Sync で OneDrive にバックアップ
と多重でバックアップされていますので、機器障害等で消失するリスクは低いと思います。
Synology DS218+ のタスクスケジューラに登録
スクリプトを定期的に呼び出すように、Synology DS218+ のタスクスケジューラに登録します。
コントロールパネルのタスクスケジューラから、新規の予約タスクを作成します。ユーザー指定のスクリプトを指定します。
全般タブでタスクの名称と実行するユーザーを指定します。
スケジュールは毎日、05:00 に開始としました。バックアップの作成は 02:00 を指定していますが、多少ズレて 04:00 頃に実行されている事があったからです。念の為、バックアップが生成されなかった事を考慮して12時間毎としています。
タスク設定では、実行結果の情報を送信するメールアドレスを設定し、作成したスクリプトをユーザー指定のスクリプトに記入します。
これで OK を押すとタスクが登録できます。
登録後の状態です。実行ボタンを押すと直ぐにスクリプトが実行できます。
BackWPup プラグインから手動でバックアップを作成してからタスクを手動で実行し、メールアドレス宛に実行結果が送付され、正常に動作していれば完了です。
まとめ
WordPress の BackWPup プラグインで作成しているバックアップデータを、Synology DS218+ へ同期するように設定しました。
LOLIPOP! レンタルサーバーの指定したディレクトリと Synology DS218+ の指定したディレクトリを rsync + ssh で同期するスクリプトを作成し、Synology DSM のタスクスケジューラ (cron) で定期的に実行する事により、バックアップデータを NAS に記録するようにしました。
NAS に記録されたバックアップデータは、外付 HDD と OneDrive に同期していますので、多重バックアップが手間を掛けずに実現できたと思います。
ssh の authorized_keys の command が LOLIPOP! レンタルサーバーでは使えないようなので、rsync + ssh 接続に限定した使い方に出来なかったのは残念な所です。
設定は終わりましたので、後は日々送られてくるメールを見て、正常に動作しているかどうかを確認すれば良い状態です。ある程度確認できたら、BackWPup プラグインのバックアップの保管数を減らし、Synology DS218+ 側に保管する日数を増やして、バックアップデータのバランスを取ろうと考えています。
私の手持ちの NAS は Synology DS218+ ですが、BUFFALO でも I-O DATA でも QNAP でも、同様の機能があれば実現可能かと思います。参考になれば幸いです。
今回のアイキャッチ画像
Stable Diffusion WebUI で作成した桜並木です。細かいプロンプトの指示はいれていませんが、昔 (30年程前) に見た青森弘前城の桜並木と似ているように感じました。水面に落ちて浮いている桜の花弁が綺麗です。
コメント