wordmoveを使ってWordPressで開発環境と本番環境とを分けた運用をしてみる

wordmoveとは

wordmoveはWordPressのデータをサーバ間で同期するツールです。ruby製でgemでインストールできます。

https://github.com/welaika/wordmove

これを使うと開発環境用のサーバでWordPressのコンテンツ更新をして、本番環境用のサーバへコンテンツを同期させて反映をさせる、といった使い方ができるようになります。

WordPressのデータの持ち方には癖があり、DBの中にFQDNが直接書き込まれているため、単純に開発環境のdumpを本番環境へ適用するだけだと、別のFQDNで運用することができません。

かといってdump内の文字列を置換すればよいかというとそんな簡単な話でもなく、WordPressのDBにはPHPでシリアライズされたデータが含まれてしまっており、これらは値と文字列長の情報をセットで持っているために、単純にdump内のFQDNを置換しただけだと文字列長と食い違ってしまうため、正常に動作しなくなります。

しかし、wordmoveを使うと、同期の際に自動でこの食い違いを修正してくれますので非常に便利です。

実行もコマンド一発で開発環境ー>本番環境へ同期(push)、開発環境<ー本番環境へ同期(pull)ができます。

DBだけ、テーマだけなどデータを個別で同期することも可能です。

 

概要

ローカルマシン上にVMで開発環境にあたるWordPress環境を構築し、ここで更新した内容を本番環境へ同期させてみます。

wordmoveは開発環境にインストールし、rubyはrbenvでインストールします。

 

開発機側の構築作業

Vagrantなどで適当にVMを作ります。今回はopscode-centos-6.5を使いました。

関連パッケージのインストール

sudo yum -y install httpd php mysql-server php-pdo php-mysql php-mbstring
sudo yum -y install openssl-devel

※openssl-develが無いとrubyのコンパイルでこけます。

 

gcc他をまとめてインストール

sudo yum -y groupinstall "Development Tools"

 

rbenvでrubyインストール

git clone https://github.com/sstephenson/rbenv.git ~/.rbenv

echo 'export PATH="$HOME/.rbenv/bin:$PATH"' >> ~/.bash_profile
echo 'eval "$(rbenv init -)"' >> ~/.bash_profile
 
. ~/.bash_profile
 
git clone https://github.com/sstephenson/ruby-build.git ~/.rbenv/plugins/ruby-build
 
rbenv install -l
rbenv install -v 2.1.3 

現時点で最新版を入れました。

[vagrant@wordpress ~]$ ruby -v
ruby 2.1.3p242 (2014-09-19 revision 47630) [x86_64-linux]

rubyが入りました。

 

wordmoveのインストール

gem install wordmove

これだけで入ります。

ただ、wordmoveは

~/.rbenv/versions/2.1.3/bin/wordmove

に入っていくのですが、パスが通っていないので

cp -ap ~/.rbenv/shims/ruby ~/.rbenv/shims/wordmove

しました。これでwordmoveコマンドが実行できるようになりました。

※これで正しいやり方なのかはよくわかっていませんが。。

[vagrant@wordpress ~]$ wordmove
Commands:
  wordmove help [COMMAND]  # Describe available commands or one specific command
  wordmove init            # Generates a brand new Movefile
  wordmove pull            # Pulls WP data from remote host to the local machine
  wordmove push            # Pushes WP data from local machine to remote host

 

wordmoveの設定ファイルのひな形を作成

wordmove init

を実行すると、カレントディレクトリにMovefileという設定ファイルが出力されます。

設定ファイルはこの1ファイルだけです。中身は

local:
vhost: "http://vhost.local"
wordpress_path: "/home/vagrant/work" # use an absolute path here

database:
name: "database_name"
user: "user"
password: "password"
host: "127.0.0.1"

staging:
vhost: "http://remote.com"
wordpress_path: "/var/www/your_site" # use an absolute path here

database:
name: "database_name"
user: "user"
password: "password"
host: "host"
# port: "3308" # Use just in case you have exotic server config

exclude:
- ".git/"
- ".gitignore"
- ".sass-cache/"
- "bin/"
- "tmp/*"
- "Gemfile*"
- "Movefile"
- "wp-config.php"
- "wp-content/*.sql"

# paths: # you can customize wordpress internal paths
# wp_content: "wp-content"
# uploads: "wp-content/uploads"
# plugins: "wp-content/plugins"
# themes: "wp-content/themes"
# languages: "wp-content/languages"
# themes: "wp-content/themes"

# ssh:
# host: "host"
# user: "user"
# password: "password" # password is optional, will use public keys if available.
# port: 22 # Port is optional
# rsync_options: "--verbose" # Additional rsync options, optional
# gateway: # Gateway is optional
# host: "host"
# user: "user"
# password: "password" # password is optional, will use public keys if available.

# ftp:
# user: "user"
# password: "password"
# host: "host"
# passive: true

# production: # multiple environments can be specified
# [...]

のようにとなっており、localとstagingという環境がひな形として定義されています。

この状態で

wordmove push -all

とすると、localとして定義されたサーバののコンテンツが、stagingとして定義されたサーバへ同期されます。

localとstagingの各設定値は、FQDNやWordPressのインストールパス、WordPressのDB接続情報などを実際の環境に合わせて修正します。

なお、環境間でのデータ転送はscpとftpが使えます。ftpの方は使ってないのでよくわかりませんが、scpを使う場合は、SSHの接続情報を設定する必要があります。サーバ間の接続は鍵認証パスフレーズなしでログインが出来るという前提の場合、以下のように設定する必要があります。

Movefile

ssh:
    host: "【実際のホスト名(~/.ssh/configで定義)】"
    user: "【ログインユーザ名】"

~/.ssh/config

Host 【任意の名前】
 HostName 【FQDN】
 User 【ログインユーザ名】
 Port 22
 UserKnownHostsFile /dev/null
 StrictHostKeyChecking no
 PasswordAuthentication no
 IdentityFile 【秘密鍵へのパス】
 IdentitiesOnly yes

これでセットアップは完了です。

常に開発環境からpush/pullするだけなら本番環境には何もいれないで大丈夫です。

wordmove pull --all

とすると、stagingで定義した本番環境からWordPressのデータがlocalで定義した開発環境へ同期されます。

開発環境でコンテンツを更新し、

wordmove push --all

とすると、開発環境からstagingで定義した本番環境へWordPressのデータが同期され、本番に反映されます。

 

 

まとめ

特にハマりどころ無く導入でき、環境をを分けて運用をしづらいWordPressで開発環境・本番環境をわけて運用できて非常に便利に使えそうです。

(でもそもそもWordPressのデータの持ち方に問題があると思います)