【最新版】#1073: 研究室のサーバ/DMZ/WordPressのバックアップ環境の構築

githubURL https://github.com/cdsl-research/dsm_wordpress_backup

ワードプレスが導入されたVMにSSH用鍵の作成

# WordPress VMで実行
ssh-keygen
cd ~/.ssh/
ls

バックアップ先VMに鍵を登録

# バックアップ先 VMで実行
install -m 0700 -d ~/.ssh
cd .ssh
sudo nano authorized_keys 
chmod 600 authorized_keys

ワードプレスが導入されたVMにSSH接続情報を追加

# WordPress VMで実行
sudo nano ~/.ssh/config
~/.ssh/config
Host backup_vm
HostName 192.168.56.102
User wp

ワードプレスが導入されたVMから接続情報を使用してSSH接続できるか確認

# WordPress VMで実行
ssh backup_vm
パスワードを入力する事なくSSH接続ができる

ワードプレスが導入されたVMからバックアップ用VMへデータを転送

# WordPress VMで実行
cd ~
nano test_file.txt
scp -r test_file.txt backup_vm:~
# バックアップ先 VMで実行
cd ~
ls
バックアップVMにファイルが転送されていれば成功

ワードプレスのデータを集めて転送

# バックアップ先 VMで実行
cd ~
mkdir backup_data
# WordPress VMで実行
cd ~
mkdir backup_data
mkdir send_data
sudo mysqldump wp > ~/backup_data/wp_database.sql
sudo cp -r /var/www/html/ ~/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -czf ~/send_data/`echo $data_var`.tgz ~/backup_data

scp -r ~/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
sudo rm -r backup_data
sudo rm -r send_data

スクリプトにして実行してみる

# WordPress VMで実行
cd ~
sudo nano auto_backup.sh
auto_backup.sh
mkdir backup_data
mkdir send_data
sudo mysqldump wp > ~/backup_data/wp_database.sql
sudo cp -r /var/www/html/ ~/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C  -czf ~/send_data/`echo $data_var`.tgz ~/backup_data

scp -r ~/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
sudo rm -r backup_data
sudo rm -r send_data
# WordPress VMで実行
sudo chmod +x auto_backup.sh
./auto_backup.sh

slackにPOSTするスクリプトを作成する

初めにslackのカスタムインテグレーションでIncoming Webhookを追加し、POST用URLを取得する。

# WordPress VMで実行
cd ~
sudo nano slack_post.sh
slack_post.sh
URL='https://hooks.slack.com/services/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'

if [ $# != 2 ]; then
    echo "ユーザー名とメッセージを指定してください"
    exit 1
else
    USER_NAME=`echo $1`
    MESSAGE=`echo $2`
fi

payload="payload={
    \"username\": \"${USER_NAME}\",
    \"text\": \"${MESSAGE}\"
}"
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null
# WordPress VMで実行
sudo chmod +x slack_post.sh¥
./slack_post.sh ワードプレスVM バックアップ開始します
./slack_post.sh ワードプレスVM バックアップ成功しました
実行例 スクリーンショット 2022-02-04 14.59.57.png (11.2 kB)

こちらを参考にしました

自動でスクリプトを実行するテスト

# WordPress VMで実行
crontab -e
crontab:
# 毎回0分に実行
0 * * * * ~/auto_backup.sh 2>>~/cron_err

バックアップのスクリプトを変更(管理者権限で実行する事)

(廃止)

# バックアップ先 VMで実行
sudo mkdir /var/backup_data
sudo chown -R wp:wp /var/backup_data
# WordPress VMで実行
cd ~
sudo nano auto_backup.sh
auto_backup.sh
# 管理者権限で実行
mkdir /var/backup_data
mkdir /var/send_data
mysqldump wp > ~/wp_database.sql
mv ~/wp_database.sql /var/backup_data/wp_database.sql
cp -r /var/www/html/ /var/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C /var/send_data -czf /var/send_data/`echo $data_var`.tgz /var/backup_data
scp -r /var/send_data/`echo $data_var`.tgz backup_vm:/var/backup_data/`echo $data_var`.tgz
rm -r /var/backup_data
rm -r /var/send_data
# WordPress VMで実行
sudo crontab -e

バックアップ用ユーザーの作成

ユーザの作成とパスワードの設定

# WordPress VMで実行
sudo useradd -m backupuser
sudo passwd backupuser
sudo usermod -G sudo backupuser
exit

新しいユーザでログイン

# Macで実行
ssh backupuser@192.168.56.101

シェルの変更

# WordPress VMで実行
ssh backupuser@192.168.56.101
chsh
# /bin/bash を入力

再ログイン

# Macで実行
ssh backupuser@192.168.56.101

新規ユーザにSSH用鍵の作成

# WordPress VMで実行
ssh-keygen
cd ~/.ssh/
ls

バックアップ先VMに鍵を登録

# バックアップ先 VMで実行
install -m 0700 -d ~/.ssh
cd .ssh
sudo nano authorized_keys 
sudo chmod 600 authorized_keys

ワードプレスが導入されたVMの新規ユーザにSSH接続情報を追加

# WordPress VMで実行
sudo nano ~/.ssh/config
~/.ssh/config
Host backup_vm
HostName 192.168.56.102
User wp

ワードプレスが導入されたVMから接続情報を使用してSSH接続できるか確認

# WordPress VMで実行
ssh backup_vm
パスワードを入力する事なくSSH接続ができる

ワードプレスが導入されたVMからバックアップ用VMへデータを転送

# WordPress VMで実行
cd ~
nano test_file.txt
scp -r test_file.txt backup_vm:~
# バックアップ先 VMで実行
cd ~
ls
バックアップVMにファイルが転送されていれば成功

新規ユーザがMYSQLを操作できる様にする

# バックアップ先 VMで実行
sudo mysql
# バックアップ先 VMで実行
CREATE USER backupuser@localhost;
GRANT ALL PRIVILEGES ON * . * TO 'backupuser'@'localhost';
exit

新規ユーザでバックアップをしてみる

ここではsudoは付けない様に

# WordPress VMで実行
# 作業フォルダを作成する
mkdir /var/tmp/backup_data
mkdir /var/tmp/send_data
chown -R backupuser:backupuser send_data
chown -R backupuser:backupuser backup_data
mysqldump wp > /var/tmp/backup_data/wp_database.sql
cp -r /var/www/html/ /var/tmp/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C /var/tmp/send_data -czf /var/tmp/send_data/`echo $data_var`.tgz /var/tmp/backup_data
scp -r /var/tmp/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
rm -r /var/tmp/backup_data
rm -r /var/tmp/send_data

スクリプトの配置

今回は /usr/local/bin にスクリプトを配置する

# WordPress VMで実行
cd /usr/local/bin
sudo nano slack_post.sh
slack_post.sh
#!/bin/sh
URL='https://hooks.slack.com/services/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'

if [ $# != 2 ]; then
    echo "ユーザー名とメッセージを指定してください"
    exit 1
else
    USER_NAME=`echo $1`
    MESSAGE=`echo $2`
fi

payload="payload={
    \"username\": \"${USER_NAME}\",
    \"text\": \"${MESSAGE}\"
}"
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null
# WordPress VMで実行
sudo chmod +x slack_post.sh
./slack_post.sh ワードプレスVM_テスト バックアップ開始します

# WordPress VMで実行
cd /usr/local/bin
sudo nano auto_backup.sh
auto_backup.sh
#!/bin/sh
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を開始します"
mkdir /var/tmp/backup_data
mkdir /var/tmp/send_data
chown -R backupuser:backupuser /var/tmp/backup_data
chown -R backupuser:backupuser /var/tmp/send_data
mysqldump wp > /var/tmp/backup_data/wp_database.sql
cp -r /var/www/html/ /var/tmp/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C /var/tmp/send_data -czf /var/tmp/send_data/`echo $data_var`.tgz /var/tmp/backup_data
scp -r /var/tmp/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
rm -r /var/tmp/backup_data
rm -r /var/tmp/send_data
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を終了します"
# WordPress VMで実行
sudo chmod +x auto_backup.sh
./auto_backup.sh

テスト環境で実行できた為,実際の環境でユーザー作成から開始

差分だけ記載 ↓

ワードプレスが導入されたVMの新規ユーザにSSH接続情報を追加

# WordPress VMで実行
sudo nano ~/.ssh/config
~/.ssh/config
Host backup_vm
HostName 192.168.201.69
User web
IdentityFile ~/.ssh/id_rsa
auto_backup.sh
#!/bin/sh
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を開始します"
mkdir /var/tmp/backup_data
mkdir /var/tmp/send_data
chown -R backupuser:backupuser /var/tmp/backup_data
chown -R backupuser:backupuser /var/tmp/send_data
mysqldump wordpress > /var/tmp/backup_data/wp_database.sql
cp -r /var/www/html/ /var/tmp/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C /var/tmp/send_data -czf /var/tmp/send_data/`echo $data_var`.tgz /var/tmp/backup_data
scp -r /var/tmp/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
rm -r /var/tmp/backup_data
rm -r /var/tmp/send_data
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を終了します"
何故か,ssh送信時にパスワードを求められるため,未完成

バックアップ先に世代に応じた自動削除スクリプトを配置

# バックアップ先 VMで実行
cd /usr/local/bin
sudo nano slack_post.sh
slack_post.sh
#!/bin/sh
URL='https://hooks.slack.com/services/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'

if [ $# != 2 ]; then
    echo "ユーザー名とメッセージを指定してください"
    exit 1
else
    USER_NAME=`echo $1`
    MESSAGE=`echo $2`
fi

payload="payload={
    \"username\": \"${USER_NAME}\",
    \"text\": \"${MESSAGE}\"
}"
curl -s -S -X POST --data-urlencode "${payload}" ${URL} > /dev/null

# バックアップ先 VMで実行
cd /usr/local/bin
sudo nano auto_remove.sh
auto_remove.sh
FilePath=~/backup_data/
Generations=2

rm_num=`expr $Generations + 1`
file_num=`ls -1 ${FilePath} | wc -l`
array=($(ls ${FilePath} | tail -n+$rm_num))

echo バックアップファイル総数は${file_num}です。
/usr/local/bin/slack_post.sh "バックアップVM_テスト" "バックアップファイル総数は${file_num}です。"

echo 世代数は${Generations}でセットアップされています。
/usr/local/bin/slack_post.sh "バックアップVM_テスト" "世代数は${Generations}でセットアップされています。"

for eachValue in ${array[@]}; do
    echo ${eachValue}を削除します。
    /usr/local/bin/slack_post.sh "バックアップVM_テスト" "${eachValue}を削除します。"
    rm m ${FilePath}${eachValue}
done
# バックアップ先 VMで実行
sudo chmod +x auto_remove.sh
sudo chmod +x slack_post.sh
./auto_remove.sh

自動削除スクリプトの自動化

# バックアップ先 VMで実行
crontab -e
# 以下を記述
0 * * * * /usr/local/bin/auto_remove.sh 2>>~/cron_err

バックアップの自動化

# ワードプレス VMで実行
crontab -e
# 以下を記述
0 * * * * /usr/local/bin/auto_backup.sh 2>>~/auto_backup_err.log

次やること

  • sshを使用して送信時,鍵を配置しているのにパスワードが求められる為 原因特定
  • 実行結果をslackにポストしたい

2/12

鍵を設置しているのにも関わらずパスワードを求められた原因

authorized_keysの所有者がrootだった(sudoを付けて新規ファイル作成してしまったのだろう)

# ワードプレス VMで実行
chown -R $(whoami).$(id `whoami` -gn) ~/.ssh
これで所有者がログインユーザになる。

cronの頻度変更

1日1回のバックアップに変更(仮)

# ワードプレス VMで実行
crontab -e
# 以下を記述
0 0 * * * /usr/local/bin/auto_backup.sh 2>>~/auto_backup_err.log

バックアップスクリプト改良

ファイル名を表示させたい

# ワードプレス VMで実行
sudo nano /usr/local/bin/auto_backup.sh
auto_backup.sh
#!/bin/sh
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を開始します"
mkdir /var/tmp/backup_data
mkdir /var/tmp/send_data
chown -R backupuser:backupuser /var/tmp/backup_data
chown -R backupuser:backupuser /var/tmp/send_data
mysqldump wordpress > /var/tmp/backup_data/wp_database.sql
cp -r /var/www/html/ /var/tmp/backup_data/
data_var=`date "+%Y%m%d_%H%M%S"`
tar -C /var/tmp/send_data -czf /var/tmp/send_data/`echo $data_var`.tgz /var/tmp/backup_data
scp -r /var/tmp/send_data/`echo $data_var`.tgz backup_vm:~/backup_data/`echo $data_var`.tgz
rm -r /var/tmp/backup_data
rm -r /var/tmp/send_data
/usr/local/bin/slack_post.sh "ワードプレスVM_テスト" "バックアップを処理を終了します"

メモ

1つのバックアップが522MBぐらい VM 40GB? 1つのバックアップが1GBとして 40世代は残しておけそう.

とりあえず,30世代の設定で 毎日0時にバックアップを作成する.