VCCWとWordMoveで本番サーバー(エックスサーバー)とローカル環境を同期してみた

技術情報

welaika/wordmove: Capistrano for WordPress

前回はVagrantとVCCWでWindows10のローカルにWordPressの環境を構築する方法をご紹介いたしました。

VagrantとVCCWでWindows10のローカルにWordPressの環境を構築してみた
VCCW - A WordPress development environment. 今まではWordPressのローカル環境はXAMPPで行っていたのですが、VCCWというのが話題になっているようなので、導入してみることにしました。 V...

今回はVCCWとWordMoveで本番サーバーとローカル環境を同期する方法をご紹介いたします。

WordMoveとは

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

GitHub - welaika/wordmove: Multi-stage command line deploy/mirroring and task runner for Wordpress
Multi-stage command line deploy/mirroring and task runner for Wordpress - welaika/wordmove

WordMoveは比較的導入が簡単で、コマンド一発で本番とローカルを同期することができます。テーマのみ、プラグインのみ、データベースのみの同期など、オプションで部分的な同期を行うことができます。また、データベース内のURLを本番環境とローカル環境で自動的に置換してくれるなど至れり尽くせりです。SSHとrsyncが出来るのであれば、一般のレンタルサーバーでも利用することができます。

Cygwinとは

Cygwin

Cygwin

VCCWでWordMoveをする前にCygwinを導入します。CygwinはWindows上で動作するUNIXライクな環境の一つで、Windowsのコマンドプロンプトでは実行できないコマンドをCygwinは実行することができます。

今回のVCCWとWordMoveでサーバーを同期するに当たり、コマンドプロンプトでは実行できないコマンドなどが多数あったので、導入することにしました。

Cygwinを導入する

ダウンロード

Cygwin」に行き、「Install Cygwin」をクリックします。

Cygwin 「Install Cygwin」をクリック
「Install Cygwin」をクリック

Cygwinの対応するOSのバージョンを選択します。

Cygwin 対応するOSのバージョンを選択
対応するOSのバージョンを選択

インストール

Cygwinをダウンロードした後、exeファイルをクリックします。

Cygwin exeファイルをクリック
exeファイルをクリック

セットアップウィザードが始まるので、「次へ」をクリックします。

Cygwin セットアップウィザードが始まるので、「次へ」をクリック
セットアップウィザードが始まるので、「次へ」をクリック

「Install from Internet」を選択し、「次へ」をクリックします。

Cygwin 「Install from Internet」を選択し、「次へ」をクリック
「Install from Internet」を選択し、「次へ」をクリック

インストール先と使用者を決めて、「次へ」をクリックします。

Cygwin インストール先と使用者を決めて、「次へ」をクリック
インストール先と使用者を決めて、「次へ」をクリック

一時的に設置するパッケージ場所を決めて、「次へ」をクリックします。

Cygwin 一時的に設置するパッケージ場所を決めて、「次へ」をクリック
一時的に設置するパッケージ場所を決めて、「次へ」をクリック

Internet Explorerが使用できる状態であれば、IEを選択し、「次へ」をクリックします。

Cygwin IEを選択し、「次へ」をクリック
IEを選択し、「次へ」をクリック

ダウンロード元は基本どこでもかまわないのですが、「http://ftp.jaist.ac.jp」を選択して、「次へ」をクリックします。

Cygwin 「http://ftp.jaist.ac.jp」を選択して、「次へ」をクリック
「http://ftp.jaist.ac.jp」を選択して、「次へ」をクリック

パッケージの一覧が表示されるので、「Net Default」をクリックします。

Cygwin 「Net Default」をクリック
「Net Default」をクリック

「Net Default」にある「openssh: The OpenSSH server and client programs」選択します。

Cygwin 「openssh: The OpenSSH server and client programs」を選択
「openssh: The OpenSSH server and client programs」を選択

上記パッケージを選択して進むと、インストールされるので待ちます。私は15分ほどかかりました。

Cygwin パッケージがインストールされるので待つ
パッケージがインストールされるので待つ

インストールが終わった後、「完了」をクリックします。

Cygwin インストールが終わった後、「完了」をクリック
インストールが終わった後、「完了」をクリック

起動

デスクトップにショートカットが出来ているのでクリックします。

Cygwin デスクトップにあるショートカットをクリック
デスクトップにあるショートカットをクリック

Cygwinが起動します。

Cygwinが起動
Cygwinが起動

これで準備が出来ました。

SSHの設定をする

公開鍵と秘密鍵を生成する

サーバーとはSSHで接続を行う必要があるので、公開鍵と秘密鍵を生成するためにCygwinで「ssh-keygen」と入力します。

ssh-keygen

「ssh-keygen」と入力します。

open-ssh 「ssh-keygen」と入力
「ssh-keygen」と入力

次に「Enter file in which to save the key」と表示されるのでそのままEnterキーを押します。

open-ssh Enterキーを押す
Enterキーを押す

「Enter passphrase」とパスフレーズの登録を求められるので、パスワードを入力します。2回入力することになるので、同じパスワードを入力します。

open-ssh パスフレーズの登録を求められる
パスフレーズの登録を求められる

2回とも同じパスワードを入力すると「id_rsa」、「id_rsa.pub」というファイルが生成される旨のメッセージが出てきます。

open-ssh 「id_rsa」、「id_rsa.pub」ファイルが生成される旨のメッセージ
「id_rsa」、「id_rsa.pub」ファイルが生成される旨のメッセージ

「C:/cygwin64/home/ユーザー名/.ssh」フォルダ内を見ると「id_rsa」、「id_rsa.pub」と二つのファイルが生成されています。公開鍵である「id_rsa.pub」の方をエディタで開き、内容をコピーしてサーバーに登録します。

opne-ssh 「id_rsa.pub」内の内容をコピー
「id_rsa.pub」内の内容をコピー

秘密鍵のパーミッション(権限)を変更する

サーバーに公開鍵を登録する前に、秘密鍵の方のパーミッションを下記のようにCygwinで変更しておきます。

chmod 600 /home/ユーザ名/.ssh/id_rsa

上記のようにパーミッションの変更をしないでSSH接続をした場合、「Permission denied (publickey,gssapi-with-mic).」とエラーが発生する場合があります。

サーバーに公開鍵を登録する

秘密鍵の方のパーミッションを変更した後、サーバーに公開鍵を登録します。今回は「エックスサーバー」で行っています。サーバーパネルから「SSH設定」に行きます。

open-ssh サーバーパネルから「SSH設定」に行く
サーバーパネルから「SSH設定」に行く

「SSH設定」から状態を「ON」にします。

open-ssh 「SSH設定」から状態を「ON」にする
「SSH設定」から状態を「ON」にする

次に「公開鍵登録・設定」に行き、下記の操作を行います。

  1. 「公開鍵登録・設定」を選択。
  2. 「公開鍵」に「id_rsa.pub」の内容を張り付ける。
  3. 「公開鍵を登録(確認)」をクリック。
open-ssh 「公開鍵登録・設定」
「公開鍵登録・設定」

登録の確定画面で「公開鍵を登録する(確定)」をクリックします。

open-ssh 「公開鍵を登録する(確定)」をクリック
「公開鍵を登録する(確定)」をクリック

公開鍵のパーミッション(権限)を変更する

公開鍵を登録したあと、パーミッションを秘密鍵と同じ「600」にします。FTPソフトなどで該当のサーバーに入ります。ホームディレクトリにある「.ssh」フォルダの「authorized_keys」上で右クリックをして、「600」をします。

open-ssh authorized_keysnのパーミッションを「600」とする
「authorized_keys」のパーミッションを「600」とする

SSHの接続を確認する

公開鍵と秘密鍵の設定が終わった後、サーバーとSSHで接続できるか確認します。「ssh xserver_account@xserver_account.xsrv.jp -p 10022」と入力すると、登録したパスフレーズを求められるので入力します。

ssh xserver_account@xserver_account.xsrv.jp -p 10022
Enter passphrase for key '/home/ユーザ名/.ssh/id_rsa':
Last login: xxx from xxx.com
[xserver_account@sv1xx ~]$

エックスサーバーの場合、SSH接続ポートは「10022」なので、「-p 10022」とすると接続できるはずです。

SSHをaddする

次に下記の順でコマンドを入力して、秘密鍵を登録しておきます。

eval `ssh-agent`

ssh-add /home/ユーザー名/.ssh/id_rsa

上記の順でコマンドを入力すると、登録したパスフレーズを求められるので入力して秘密鍵を登録します。登録した後、下記のように秘密鍵が登録される旨のメッセージが表示されます。

Identity added: /home/ユーザー名/.ssh/id_rsa

登録されている秘密鍵を確認したい場合は、下記のコマンドで確認することができます。

ssh-add -l

Movefileの設定を行う

作業フォルダ下にMovefileが設置されているので確認します。デフォルトのMovefileは下記のような感じになっているはずです。

local:
  vhost: "http://vccw.dev"
  wordpress_path: "/var/www/html" # use an absolute path here

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

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

production:
  vhost: "http://example.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
    mysqldump_options: "--max_allowed_packet=50MB" # Only available if using SSH

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

  ssh:
    host: "host"
    user: "user"
    port: 22
    rsync_options: --verbose

VCCWとWordMoveでエックスサーバーの本番サーバーとローカル環境をSSH接続で同期するには、以下の部分の変更が必要です。

production

production:
  vhost: "本番サイトURL"
  wordpress_path: "本番のWordPressが入っている場所" # use an absolute path here

注意点として、vhostに記述するURLの末尾には「/(スラッシュ)」を記述しないようにします。

  • 正しい vhost: “http://example.com”
  • 間違い vhost: “http://example.com/”

「wordpress_path」はエックスサーバーの場合、「/home/サーバーID/サイトURL/public_html/」となります。「本番のWordPressが入っている場所」と記述していますが、正確には「wp-settings.php」があるパスを記述します。

エックスサーバーの場合、下記のようなコマンドでパスを確認することができます。

#ローカル側で下記を入力
ssh xxxx@xxxx.xsrv.jp -p 10022

#エックスサーバー側で下記を入力
cd xxxx.xsrv.jp/public_html/
pwd
/home/xxxx/xxxx.xsrv.jp/public_html←のような感じでパスが表示される。

入力する「xxxx」はエックスサーバーのアカウントとなります。

database

  database:
    name: "本番データベース名"
    user: "本番データベースユーザー名"
    password: "本番データベースパスワード"
    host: "XXXX.xserver.jp"
    charset: "utf8"

「port: “3308”」と「mysqldump_options: “–max_allowed_packet=50MB”」は削除し、「charset: “utf8″」を追加しています。「database:」にはサーバー側にある「wp-config.php」に記述されている情報を記述します。

ssh

  ssh:
    host: "xxxx.xsrv.jp"
    user: "サーバーID"
    port: 10022
    rsync_options: --verbose

エックスサーバーの場合、「host」は「サーバーID.xsrv.jp」、「user」は「サーバーID」、「port」は「10022」となります。「ssh:」、「host」、「user」、「port」、「rsync」は「#」を外します。

Movefileはインデントに非常に厳しく、変更を行った場合はデフォルトの並びを参考にしてインデントを揃えます。インデントがずれている場合、 wordmoveコマンドを実行時したときに下記のようなエラーが発生します。

▬▬ ✓ Using Movefile: ./Movefile ▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬▬
/usr/lib/ruby/2.3.0/psych.rb:377:in `parse': (<unknown>): did not find expected key while parsing a block mapping at line 25 column 5 (Psych::SyntaxError)
        from /usr/lib/ruby/2.3.0/psych.rb:377:in `parse_stream'
        from /usr/lib/ruby/2.3.0/psych.rb:325:in `parse'
        from /usr/lib/ruby/2.3.0/psych.rb:252:in `load'
        from /home/vagrant/.gem/ruby/2.3.0/gems/wordmove-2.0.0/lib/wordmove/depler/base.rb:42:in `fetch_movefile'
        from /home/vagrant/.gem/ruby/2.3.0/gems/wordmove-2.0.0/lib/wordmove/deplyer/base.rb:10:in `deployer_for'
        from /home/vagrant/.gem/ruby/2.3.0/gems/wordmove-2.0.0/lib/wordmove/cli.b:63:in `pull'
        from /home/vagrant/.gem/ruby/2.3.0/gems/thor-0.19.4/lib/thor/command.rb:7:in `run'
        from /home/vagrant/.gem/ruby/2.3.0/gems/thor-0.19.4/lib/thor/invocation.b:126:in `invoke_command'
        from /home/vagrant/.gem/ruby/2.3.0/gems/thor-0.19.4/lib/thor.rb:369:in `ispatch'
        from /home/vagrant/.gem/ruby/2.3.0/gems/thor-0.19.4/lib/thor/base.rb:444in `start'
        from /home/vagrant/.gem/ruby/2.3.0/gems/wordmove-2.0.0/exe/wordmove:6:in`<top (required)>'
        from /home/vagrant/.gem/ruby/2.3.0/bin/wordmove:23:in `load'
        from /home/vagrant/.gem/ruby/2.3.0/bin/wordmove:23:in `<main>'

最終的なMovefile

最終的なMovefileは下記のようになります。

local:
  vhost: "http://vccw.dev"
  wordpress_path: "/var/www/html" # use an absolute path here

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

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

production:
  vhost: "本番サイトURL"
  wordpress_path: "本番のWordPressが入っている場所" # use an absolute path here

  database:
    name: "本番データベース名"
    user: "本番データベースユーザー名"
    password: "本番データベースパスワード"
    host: "XXXX.xserver.jp"
    charset: "utf8"

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

  ssh:
    host: "xxxx.xsrv.jp"
    user: "サーバーID"
    port: 10022
    rsync_options: --verbose

Wordmoveコマンドを実行してサイトを表示する

Wordmoveコマンドを実行

いよいよWordmoveコマンドを実行して、本番サーバーとローカルを同期させます。VCCWがあるディレクトリまで移動した後、下記の順番でコマンドを入力します。

vagrant ssh

cd /vagrant

wordmove pull --all

コマンドが実行されると本番からファイルがローカルにダウンロードされます。

wordmove 本番からファイルがローカルにダウンロード
本番からファイルがローカルにダウンロードされる

エラーもなく、無事にダウンロードが完了すると、下記のように「pulling Database」で終わるはずです。

wordmove 「pulling Database」で終わる
「pulling Database」で終わる

Internal Server Error

wordmove pull --all」コマンドで本番サイトをpullした後、おそらくフロントも管理側も下記のようなエラーが表示されるはずです。

wordmove Internal Server Error
Internal Server Error

これはエックスサーバー側の設定が記述されている「.htaccess」をローカルで使用することによって発生するエラーなので、エラーを回避するために「.htaccess」の記述を下記のようにします。

# BEGIN WordPress
<IfModule mod_rewrite.c>
RewriteEngine On
RewriteBase /
RewriteRule ^index\.php$ - [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule . /index.php [L]
</IfModule>

# END WordPress

「.htaccess」の内容を上記のようにすると、Internal Server Errorは発生しないはずです。

ローカルで同期したサイトを表示する

ローカルで同期したサイトを表示するには、hostsに「192.168.33.10 vccw.dev」と記述した場合、フロント側は「http://vccw.dev(192.168.33.10)」、管理側は「http://vccw.dev(192.168.33.10)/wp-login.php」で表示するはずです。hostsなどの設定は前回の記事を参照してください。

VagrantとVCCWでWindows10のローカルにWordPressの環境を構築してみた
VCCW - A WordPress development environment. 今まではWordPressのローカル環境はXAMPPで行っていたのですが、VCCWというのが話題になっているようなので、導入してみることにしました。 V...
wordmove WordPressフロント画面表示
WordPressフロント画面表示
wordmove WordPress管理画面表示
WordPress管理画面表示

管理側やフロント側が本当にローカルで表示されていることの確認は、ソース内のURLを見るとわかります。

vccw ソース内のURLを見る
ソース内のURLを見る

もしURLがローカルのものではなく本番のURLの場合、「Movefile」ファイルの設定を見直します。

.htaccessを同期対象から除外する

ローカルにある「.htaccess」の内容を変更した場合、本番にアップロードすると大変なことになるので、「Movefile」の「exclude」に記述を追加して同期の除外対象とします。

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

「exclude」に上記のように記述すると同期の対象から除外されます。

本番サイトにpushする

試しにローカルで作った記事を本番にpushしてみます。

VCCW ローカルで記事を作る
ローカルで記事を作る

コマンドで最初から行う場合は下記の順番で行います。

eval `ssh-agent`

ssh-add /home/ユーザー名/.ssh/id_rsa

#パスフレーズを二回入力。

cd でvccwがあるディレクトリに移動

vagrant ssh

cd /vagrant

wordmove push -db

今回は記事のみなので「wordmove push -db」とします。すべて本番にpushするときは、「wordmove push --all」とします。pushに成功すると下記のように「Pushing Database」で終わるはずです。

「Pushing Database」で終わる
「Pushing Database」で終わる

pushが終わった後、本番を見てみると、先ほどローカルで作成した記事が生成されています。

ローカルで作成した記事が本番に生成
ローカルで作成した記事が本番に生成

はまったこと

Wordmoveで本番とローカルを同期する際にはまったことは、管理側はしっかりローカルのURLで表示し、ログインもできるのに、なぜかフロント側だけが下記のように表示しませんでした。

フロントページが機能しない
フロントページが機能しない

「vccw/wordpress/wp-content/debug.log」にあるデバッグログを見ていても、該当するようなエラーを確認できなかったので、思い切ってローカルのプラグインをすべて切ってみるとフロントページが表示しました。

一個一個プラグインの入り切りをしていると、どうやら「WP External Links」プラグインのようでした。「WP External Links」はサイト内の外部リンクを別ウィンドウで開くというプラグインで、なぜ「WP External Links」でフロントペ-ジが機能しないのか特定はできなかったのですが、停止し、とりあえずの処置をとりました。特定のファイルやフォルダを「exclude」で同期対象を除外することもできるので、大きな問題にはならないと思っています。

おまけ wordmove コマンド一覧

pull コマンド
wordmove pull ––all WordPress 全て
wordmove pull –w WordPressのソースファイル
wordmove pull -t テーマファイル(themeフォルダ以下全て)
wordmove pull -d データベース(記事データなど)
wordmove pull -p プラグイン
wordmove pull –u uploads(uploadsフォルダ以下全て)

wordmove pull -w -t -d など複数指定も可能。「pull」の部分を「push」にするとpushのコマンドになります。「wordmove help pull」、「wordmove help push」でコマンドの一覧を見ることができます。

Wordmoveコマンド一覧
Wordmoveコマンド一覧

まとめ

  • Cygwinを導入する。
  • SSHの設定をする。
  • Movefileの設定を行う。
  • Wordmoveコマンドを実行してサイトを表示する。
  • .htaccessを同期対象から除外する
  • 本番サイトにpushする

前回のVagrantとVCCWの記事から一か月以上経過していますが、その間ずっとはまっており、WindowsでダメならMacで試してみたりといろいろ行って、この記事を書くことが出来ました。

Wordmoveを利用すると、とてつもなく簡単にデプロイが出来るようになります。ぜひVagrantとVCCW、Wordmoveを駆使してWordPressの開発を行ってみてください。

スポンサーリンク
技術情報
スポンサーリンク
シェアする
ボヘミアンをフォローする
この記事が気に入ったら
いいね!しよう
最新情報をお届けします。
スポンサーリンク
PC ウェブログ

コメント