WordPressをshellで丸ごとコピーする

WordPressを丸ごとshellスクリプトでコピーする方法をメモ。
プラグインとか色々と入れてまたやり直すのってつらいじゃないですか。
今動いているWordPressを丸ごとコピーして済ませたいです。

まず、シェルコマンド単位で。

まず、データベースをdump!

mysqldump -u user -ppassword wordpress > tmp.sql


dumpしたSQLに記載されている「WordPressのパス」と「ドメイン」をコピー先のものに置換

sed -i -e "s/old_path/new_path/g" tmp.sql
sed -i -e "s/old_domain/new_domain/g" tmp.sql


新しいWordPressのデータベースを作成し、置換後のSQLを実行

mysql -u root -ppassword -e "create database new_db"
mysql -u root -ppassword new_db < tmp.sql


権限も割り当てておきましょう

mysql -u root -ppassword -e "GRANT ALL PRIVILEGES ON \`new_db\`.* TO 'user'@'localhost'"


WordPressのディレクトリをコピー

cp -r /pathto/old_wordpress /pathto/new_wordpress


所有者と権限を変更(Ubuntu)

chown -R www-data:www-data /pathto/new_wordpress
chmod -R 777 /pathto/new_wordpress/wp-content


config.php内のデータベース設定を置換

sed -i -e "s/define('DB_NAME', 'old_wordpress');/define('DB_NAME', 'new_wordpress');/g" /pathto/new_wordpress/wp-config.php


新しいWordPress用のapacheのsites-availableを作成

cp /etc/apache2/sites-available/old_domain.conf /etc/apache2/sites-available/new_domain.conf


conf内のドメインとパスを置換しましょう

sed -i -e "s/old_path/new_path/g" /etc/apache2/sites-available/new_domain.conf
sed -i -e "s/old_domain/new_domain/g" /etc/apache2/sites-available/new_domain.conf


新しいapacheの設定を有効化

a2ensite new_domain.conf
service apache2 reload 


ついでにSSLも有効化しておきましょう

letsencrypt run -d new_domain


色々と足して、シェルスクリプトにするとこうなる。
実行する時は第1引数に新しいドメイン、第2引数に新しいDB名を入れる感じ。

# /usr/bin/sh

if [ -z "$1" ]; then
   echo 'please input new domain'
   exit 1
fi
if [ -z "$2" ]; then
   echo 'please input DB name'
   exit 1
fi

#copy database
mysqldump -u root -ppassword old_db > tmp.sql
sed -i -e "s/old_path/$2/g" tmp.sql
sed -i -e "s/old_domain/$1/g" tmp.sql
mysql -u root -ppassword -e "drop database $2"
mysql -u root -ppassword -e "create database $2"
mysql -u root -ppassword $2 < tmp.sql
rm tmp.sql
mysql -u root -ppassword -e "GRANT ALL PRIVILEGES ON `$2`.* TO 'user'@'localhost'"
 
#files
rm -rf /var/www/$2
cp -r /var/www/old_path /var/www/$2
chown -R www-data:www-data /var/www/$2
chmod -R 777 /var/www/$2/wp-content
sed -i -e "s/define('DB_NAME', 'old_db');/define('DB_NAME', '$2');/g" /var/www/$2/wp-config.php

#apache
rm /etc/apache2/sites-available/$1.conf /etc/apache2/sites-available/${1}-le-ssl.conf
cp /etc/apache2/sites-available/old_domain.conf /etc/apache2/sites-available/$1.conf
sed -i -e "s/old_path/$2/g" /etc/apache2/sites-available/$1.conf
sed -i -e "s/old_domain/$1/g" /etc/apache2/sites-available/$1.conf
rm -rf /var/log/apache2/$1
mkdir /var/log/apache2/$1
a2ensite $1.conf
service apache2 reload
letsencrypt run -d $1


oldの部分を今動いているWordPressに書きかえて、ファイル名をcopy_wp.shとかにして、パスの通っているところに置けば

copy_wp new_domain new_db

みたいにいつでもコマンドで実行できる