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のデータの持ち方に問題があると思います)