WordMoveを使ってVagrant内のWordPressと本番環境を同期する!

先日、@_tanshio さんからプルリクエストをいただきまして、VCCWにWordMoveというデプロイツールを組み込みました。

VCCW

http://vccw.cc/

@_tanshio さん、ありがとうございます!

そんなわけで、今回はWordMoveを使って本番環境とVCCWでコンテンツを同期する方法を解説します。

WordMoveとは?

WordMoveとは、Rubyで作られたWordPress専用のデプロイツールで、GitHubにて公開されています。

https://github.com/welaika/wordmove

WordMoveの特徴

  • WordPressに特化しているのでセットアップが簡単。
  • テーマだけ、プラグインだけ、データベースだけの同期など、オプションで部分的な同期も可能。
  • データベース内のURLを本番環境とテスト環境で自動的に置換してくれる。
  • ステージングと同期、本番と同期など、複数のサーバーをコマンドラインオプションで選択することが可能。
  • SSHだけじゃなく、FTPも利用できるのでレンタルサーバーでも利用可能。(だと思う。笑)

設定方法 – VCCWとAmimotoのコンテンツを同期する

今回はAmimotoとVCCWのコンテンツを同期してみます。

VCCWとAmimotoは、ApacheとNginx、CentOSとAmazon Linuxなど環境が微妙に違いますが、それでも問題なく使うことができます。

VCCWを起動

なにはともあれVCCWを起動してください。

$ vagrant up

Amimotoの権限の設定を変更する

まずはじめに、AmimotoではSSHでログインできるユーザーec2-userに対して、WordPressのファイルへの書き込み権限がありませんので、それを修正します。

これに関しては、gistにシェルスクリプトを用意しておきましたので、SSHでAmimotoにログインした後で以下のコマンドを実行すれば一発で完了します。

$ curl -L https://raw.githubusercontent.com/amimoto-ami/run-httpd-as-ec2-user/master/run-httpd-as-ec2-user.sh | sudo bash

このスクリプトを実行すると以下の処理を行います。内容をよくご理解した上で自己責任でお願いします。

  • /var/www/vhosts以下のファイルのオーナーをec2-userに変更
  • Nginxやphp-fpmの実行ユーザーをec2-userに変更
  • 上述の変更に伴うmonitの設定の変更や、PHPのセッションで使用される/var/tmp/php/sessionのオーナーの変更

VCCWで起動した仮想マシン内からAmimotoにSSHでアクセスできるようにする

まずVCCWにSSHでログインしてください。

$ vagrant ssh

次に秘密鍵を作成します。

$ ssh-keygen

秘密鍵へのパスはデフォルトのままで、パスワードは適当にお願いします。

コマンドが完了したら秘密鍵と公開鍵が生成されているはずなので、以下のコマンドで公開鍵をコピーしてください。

$ cat ~/.ssh/id_rsa.pub

最後にAmimotoの~/.ssh/authorized_keysに先ほどの作業でコピーした公開鍵を追加してください。

既存のやつを消しちゃうとログインできなくなるので注意してくださいね。

2014/9/25追記

ssh-agentを使えばこの作業は不要です。

Movefileの作成

WordMoveを使用するには、Movefileというファイルに、サーバーへの接続情報等を書き込む必要があります。

VCCW側の情報はvagrant upの際に自動的に書き込まれますから変更する必要はありませんので、Amimoto側の設定情報のみを記述していきます。

MovefileはVagrantfileと同じパスにありますので、ホストマシン側で使い慣れたエディター等で編集していただいても問題ありません。

以下は、デフォルトでVCCWが生成してくれるMovefileです。

local:
  vhost: "http://wordpress.local/"
  wordpress_path: "/varwww/" # use an absolute path here

  database:
    name: "wordpress"
    user: "wordpress"
    password: "wordpress"
    host: "localhost"

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

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

  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
#   [...]

ホストの情報を記述する

まず、以下の行をAmimotoの環境に合わせて変更してください。

  vhost: "http://example.com"
  wordpress_path: "/var/www/your_site" # use an absolute path her

vhostの値は、皆さんのサイトのドメイン名です。

この値はWordPress内のリンク先のURL等でも使用されるものなので、ドメイン名を取得済みであればそのドメイン名を入力してください。

wordpress_pathは、WordPressのドキュメントルートディレクトリ(正確にはwp-load.phpがあるディレクトリ?)を指定してください。

Amimotoであれば/var/www/vhosts/i-xxxxのような感じになるはずです。

データベースの情報を記述する

次にデータベースに接続するための情報をMovefileに記述してください。

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

これらはAmimoto内のWordPressのwp-config.phpと同じ値になるべきです。

接続情報の設定

接続情報の部分はデフォルトではコメントアウトされています。

WordMoveでは、SSHまたはFTPが使用できますので、使いたい方のコメントアウトを解除してください。

  # 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

Amimotoに対してSSHを使って接続するなら以下のような感じです。

  ssh:
    host: "example.com"
    user: "ec2-user"
    port: 22 # Port is optional
    rsync_options: "--verbose" # Additional rsync options, optional

今回の例では、SSHの接続に秘密鍵を使用しますのでパスワードの行は単純に消してください。

以上で設定は完了です。

WordMoveを使ってみる

まず、本番環境がすでにある場合は、以下のコマンドでVagrantにデータを移行することができます。

$ wordmove pull --all

コマンドは、`vagrant ssh`した後で、`/vagrant`以下のディレクトリで実行してください。

実際にこのブログをwordmove pull --allで手元に持ってきた結果は以下のとおり。

ソースを確認したらURLもすべてVagrantのURLに自動的に置換されています。すごい。

また、Vagrant側の環境を本番環境に移行するには以下のとおりです。

$ wordmove push --all

WordMoveはstagingproductionなど、複数の環境を設定することも可能です。

stagingにデプロイするには以下のような感じ。

$ wordmove push staging --all

驚いたのは、Vagrant側の`wp-contet/`以下にDBのデータのバックアップを残してくれることでした。

このバックアップファイルは、ローカルにのみ保存されており、リモートサーバー側には残されていませんので、そういうところも素晴らしいですね。

[vagrant@wordpress wp-content]$ ls -al
合計 70308
drwxr-xr-x. 1 vagrant vagrant      510  9月 18 12:56 2014 .
drwxr-xr-x. 1 vagrant vagrant     1496  9月 18 12:52 2014 ..
-rw-r--r--. 1 vagrant vagrant       28  9月 18 09:47 2014 index.php
drwxr-xr-x. 1 vagrant vagrant      476  9月 18 12:49 2014 languages
-rw-r--r--. 1 vagrant vagrant    25671  9月 18 12:38 2014 local-backup-1411043896.sql
-rw-r--r--. 1 vagrant vagrant    25671  9月 18 12:39 2014 local-backup-1411043948.sql
-rw-r--r--. 1 vagrant vagrant    25671  9月 18 12:40 2014 local-backup-1411044055.sql
-rw-r--r--. 1 vagrant vagrant    25671  9月 18 12:43 2014 local-backup-1411044183.sql
-rw-r--r--. 1 vagrant vagrant   394453  9月 18 12:49 2014 local-backup-1411044544.sql
drwxr-xr-x. 1 vagrant vagrant     1292  9月 18 12:48 2014 plugins
-rw-r--r--. 1 vagrant vagrant     1265  9月 18 12:31 2014 staging-backup-1411043507.sql
-rw-r--r--. 1 vagrant vagrant 71475091  9月 18 12:54 2014 staging-backup-1411044846.sql
drwxr-xr-x. 1 vagrant vagrant      306  9月 18 12:48 2014 themes
drwxr-xr-x. 1 vagrant vagrant       68  9月 18 09:47 2014 upgrade
drwxr-xr-x. 1 vagrant vagrant      578  9月 18 12:46 2014 uploads

その他にもコマンドラインのオプションによって、テーマやプラグインだけをデプロイするとかもできます。

[vagrant@wordpress ~]$ wordmove help
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

[vagrant@wordpress ~]$ wordmove help push
Usage:
  wordmove push

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]              

Pushes WP data from local machine to remote host
[vagrant@wordpress ~]$ wordmove help pull
Usage:
  wordmove pull

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]              

Pulls WP data from remote host to the local machine

詳しくは以下のURLをご覧になってください。

https://github.com/welaika/wordmove

というわけで、今後はこれを前提にした運用方法でちょっといろいろ試してみようかと思います。

事故防止のためにGitでの管理は必須になりますね。サイトまるごとGitで管理するとかのほうがいいのかも。