Shellの使えるレンタルサーバで動かしているWordPressのバックアップを定期的に取得し、リモートに送り、そのデータを使って、運用中のWordPress環境と全く同じ環境を、他のサーバ上に構築したいです。目的は下記の通り。
- 万が一本番サーバが壊れた場合には、復旧するためのデータを手元に残しておきたい
- テンプレートやプラグインのテストの為に実運用環境と同じ環境が手元にほしい
- スクリプト一発で何時でもリモート環境を再現したい
- cronで定期処理することでバックアップを取りたい
最初は、mysqldumpでバックアップして、WordPressの各種ファイルと一緒にtar.gzに固めてリモートに送り、その復元までを行うスクリプトを書こうとしていましたが、既に先駆者がRubyで実装済みでした。Wordmoveというパッケージ名で公開されています。
という事で、Ubuntu15.04導入後からの設定を書いていきます。
Ruby2.2のインストール
rubyはディストビューション付属のパッケージをapt-getでインストールすると、結構古いバージョンがインストールされるので、rbenvを使ってインストールします。rbenvは下記のスクリプトを実行したユーザーのホームディレクトリ以下に必要なファイルを配備するため、他のユーザーの環境を汚さずに、いつでも最新のRubyが使える優れものです。
~/.bash_profileに、rbenvをロードするためのコードを書いて、Ruby等へのパスを通します。which rubyすれば、どこにインストールされているのかがわかりますよ。
# Rubyを導入するために必要なライブラリを入れる。 sudo apt-get install libssl-dev libffi-dev build-essential git-core curl libreadline-dev \ zlib1g-dev libyaml-dev libxml2-dev libxslt1-dev libcurl4-openssl-dev \ python-software-properties libffi-dev # rbenvを入れる git clone https://github.com/sstephenson/rbenv.git ~/.rbenv echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile echo 'eval "$(rbenv init -)"' >> ~/.bash_profile source ~/.bash_profile # ruby-buildを入れる git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build echo 'export PATH="$HOME/.rbenv/plugins/ruby-build/bin:$PATH"' >> ~/.bashrc source ~/.bash_profile # インストール可能なRubyのバージョンを確認する。 # 時期によっては、2.3等になっているかもしれないので、その場合には読み替えてください。 rbenv install -l rbenv install 2.2.2 rbenv global 2.2.2 ruby -v # gemでのインストール時のオプションを.gemrcに書いておく。 echo "gem: --no-ri --no-rdoc" > ~/.gemrc gem install bundler
インストール時に使う環境変数のセット
下記、4つの環境変数を適宜設定してください。MYSQL_ROOT_PASSだけは絶対に書き換えないと、MYSQLに接続できないはずです。
# opensslコマンドでの生成でも良いし、お好きなものを指定してもいいです。 export NEW_DB_PASS=`openssl rand -hex 10` # MySQLのROOTパスワードを指定してください。 # インストール中に使います。 export MYSQL_ROOT_PASS=yourpassword # ローカル側に作成するDB名を指定してください。このままでもOKです。 # 面倒なので、DB名とユーザー名は同じにします。 export DB=wordpress # ローカル側にコピーしたWordPressにアクセスする際のURLです。 export MY_FQDN=wordpress.local # ローカル側DBユーザーに対応するMySQLのパスワード。 echo $NEW_DB_PASS
必要なパッケージのインストール
# ApacheやMySQLのインストール sudo apt-get install mysql-server mysql-client libmysqlclient-dev apache2 \ php5-mysqlnd dbconfig-common libapache2-mod-php5 # wordmoveをインストール。 gem install wordmove
DBのセットアップ
sudo cp /etc/mysql/mysql.conf.d/mysqld.cnf /etc/mysql/mysql.conf.d/mysqld.cnf.bak sudo sed -i "s/\[client\]/[client]\ndefault-character-set=utf8/g" \ /etc/mysql/mysql.conf.d/mysqld.cnf sudo sed -i "s/\[mysqld\]/[mysqld]\ncharacter-set-server=utf8/g" \ /etc/mysql/mysql.conf.d/mysqld.cnf sudo service mysql restart # DB作成 mysql -uroot -p$MYSQL_ROOT_PASS -e "drop database if exists $DB;" mysql -uroot -p$MYSQL_ROOT_PASS -e "CREATE DATABASE $DB character set utf8;" mysql -uroot -p$MYSQL_ROOT_PASS -e "grant all privileges on $DB.* to '$DB'@'localhost' identified by '$NEW_DB_PASS'" mysql -uroot -p$MYSQL_ROOT_PASS -e "flush privileges" mysql -u$DB -p$NEW_DB_PASS -e "show databases"
Apacheのセットアップ
sudo tee /etc/apache2/sites-available/$MY_FQDN.conf <<_EOF_ > /dev/null <VirtualHost *:80> ServerName $MY_FQDN DocumentRoot /var/www/$MY_FQDN/ <Directory /var/www/$MY_FQDN/> AllowOverride all Options -MultiViews Require all granted </Directory> </VirtualHost> _EOF_ sudo ln -s /etc/apache2/sites-available/$MY_FQDN.conf /etc/apache2/sites-enabled/$MY_FQDN.conf sudo a2enmod rewrite sudo service apache2 restart echo "下記のURLにブラウザでアクセスする" echo "http://$MY_FQDN/"
Wordmoveの設定ファイルを作成する
wordmove initで、実行したディレクトリにMovefileができます。その中身をvi等で直接編集してもいいですし、その下に定義しておいた環境変数を突っ込んでひな型を作るスクリプトを用意しておいたので、そちらを実行してもいいです。
cd /var/www/$MY_FQDN wordmove init vi Movefile
Movefileのひな型はwordmove initでできますが、ここまで、各種環境変数をセットしていたので、下記のコマンドでも作成可能です。本番環境のDB接続ユーザーや、SSH接続ユーザーは、適当な文言が入っているので、作成した後に、見直してください。なお、このファイルはYAML形式なので、各行の先頭のスペースの数が間違っているとエラーが出ます。
# 下記2つの環境変数は適宜修正してください。 export HONBAN_URL=eco.senritu.net export HONBAN_PATH=/var/www/eco.senritu.net # teeコマンドでMovefileを上書きする。 tee Movefile <<_EOF_ > /dev/null local: vhost: 'http://$MY_FQDN' wordpress_path: '/var/www/$MY_FQDN' database: name: '$DB' user: '$DB' password: '$NEW_DB_PASS' host: '127.0.0.1' staging: vhost: 'http://$HONBAN_URL' wordpress_path: '$HONBAN_PATH' database: name: 'wordpress' user: 'wordpress' password: 'password' host: 'localhost' exclude: - '.git/' - '.gitignore' - '.sass-cache/' - 'bin/' - 'tmp/*' - 'Gemfile*' - 'Movefile' - 'wp-config.php' - 'wp-content/*.sql' ssh: host: '$HONBAN_URL' user: '$USER' port: 22 rsync_options: '--verbose' _EOF_
sshによるリモートログインができるようにする。
SSHでリモートにログインするために、Linux、macOSから対象サーバへパスワード無しで高速ログインするの設定を行ってください。既に似たようなことを実施済みの方も多いと思うので、実施済みであれば次に進んでください。
Wordmoveの実行
wordmove pull --all
他にも、下記のようにオプションが各種そろっています。
Options: -w, [--wordpress], [--no-wordpress] -u, [--uploads], [--no-uploads] -t, [--themes], [--no-themes] -p, [--plugins], [--no-plugins] -l, [--languages], [--no-languages] -d, [--db], [--no-db] -v, [--verbose], [--no-verbose] -s, [--simulate], [--no-simulate] -e, [--environment=ENVIRONMENT] -c, [--config=CONFIG] [--no-adapt], [--no-no-adapt] [--all], [--no-all]
コピーしたWordPress環境にログインする
この例だと、wordpress.localにブラウザでアクセスすることになります。最初にアクセスすると、WordPress用の設定ファイルがコピーされていないので、初期設定画面が表示されます。初期設定といっても、コピーした環境用のwp-config.phpがないだけなので、wp-config.phpを作るまでをインストールウィザードを使って進める感じです。
コピーした環境なので、間違って初期化されてしまっても問題ないので、『さあ、始めましょう!』を押します。
データベース名やユーザー名は、セットアップ中に出てきた通りです。パスワードは『echo $NEW_DB_PASS』で、予め設定しておいた環境変数に入っていると思います。テーブル接頭辞は、リモートの本番環境を構築した際に設定したはずです。デフォルトだとWP_となっているとので、特に設定した覚えがなければ、デフォルトのままでいいでしょう。
上記の大きな赤枠内のコードをローカルのWordpress環境状にwp-config.phpとして保存します。その後、インストール実行を押します。
インストール実行を押しても、既にインストール済みであることから、『すでにインストールされています』と出て、ログイン画面に遷移するので、ログインします。
上記のように、ログインしたら本番環境と同じデータが表示されました。
トラブルシューティング
- TOPページは見れるが、カテゴリや各投稿が表示できない場合には、設定>パーマリンク設定>で『投稿名』が選ばれているが、.htaccessが無い場合には、その画面で『変更を保存』ボタンを押してください。.htaccessが再作成されます(nginxからApacheに移行した場合に、コピー元が無いのでそうなった模様)、もしくは.htaccessを有効にしていない原因も考えられます。/etc/apache2/apache2.conf内のAllowOverrideがAllになっていなければ、Allにして、sudo service apache2 restartしてください。
- DBにつながらない場合は、mysql -u<ユーザー名> -pで、設定したパスワードを指定してログイン可能なことを確認してください。
- リモート側で、DBのバックアップに失敗する場合には、wp-contentの下に一時的にダンプファイルを出力するようなので、SSHでログインするユーザーがそのディレクトリ上にファイルを書き込めない場合に、パーミッションエラーとなります。リモート側の権限設定を見直してください。
参考情報
- wordmove(github)
- WordMoveを使ってVagrant内のWordPressと本番環境を同期する!