wordmoveでWordPressを同期したりしてみる

##目的
pushはすべて上書きしてしまうので、本番環境をpullしてテスト環境にpushする目的で使用します。

https://github.com/welaika/wordmove

やってみるにあたり、Ryo Kawamata氏のリポジトリを利用させていただきました。

https://github.com/kawamataryo/quick-start-wordpress-docker

##環境
- docker-compose version 1.29.0
    - wordmove
    - ssh-agent
    - mySQL version 5.7
    - phpmyadmin

##準備
###環境変数の設定 + テスト環境を追加する
利用したリポジトリにはテスト環境の設定がないので、ついでに追加していきます。
コンテナの設定部分をコピーし、"PRODUCTION_"を"STAGING_"に置換するだけでOK。

```:.env
# -------------------------------------------
# wordpress・mysqlコンテナの設定
# -------------------------------------------
# プロダクトの名前 作成されるcontainer名の接頭語として使用
PRODUCTION_NAME= hogehoge
# local wordpressを紐付けるPort名（ex: 8080)
LOCAL_SERVER_PORT= 8080
# localのmysqlを紐付けるPort名（ex: 3306)
LOCAL_DB_PORT= 3306
MYSQL_NETWORK= hogehoge
# -------------------------------------------
# wordmoveコンテナの設定
# -------------------------------------------
# 全て本番環境の情報
# URL
PRODUCTION_URL=https://*****.com
# wordpressのディレクトリの絶対パス
PRODUCTION_DIR_PATH= /*****/
# DB名
PRODUCTION_DB_NAME= *****
# DBのユーザー名
PRODUCTION_DB_USER= *****
# DBのパスワード
PRODUCTION_DB_PASSWORD= *****
# DBのホスト名
PRODUCTION_DB_HOST= *****.*****.jp
# DBの接続ポート
PRODUCTION_DB_PORT=3306
# SSHホスト名
PRODUCTION_SSH_HOST= *****
# SSHユーザー名
PRODUCTION_SSH_USER= *****
# SSHポート名
PRODUCTION_SSH_PORT= 10022
# -------------------------------------------
# テスト環境の情報
# -------------------------------------------
# URL
STAGING_URL=
# wordpressのディレクトリの絶対パス
STAGING_DIR_PATH=
# DB名
STAGING_DB_NAME=
# DBのユーザー名
STAGING_DB_USER=
# DBのパスワード
STAGING_DB_PASSWORD=
# DBのホスト名
STAGING_DB_HOST=
# DBの接続ポート
STAGING_DB_PORT=
# SSHホスト名
STAGING_SSH_HOST=
# SSHユーザー名
STAGING_SSH_USER=
# SSHポート名
STAGING_SSH_PORT=
# SSHパスワード（パスアクセスの場合）
STAGING_SSH_PASS=
```

```:config/movefile.yml
global:
  sql_adapter: default

local:
  vhost: "http://localhost:<%= ENV['LOCAL_SERVER_PORT'] %>"
  wordpress_path: "/var/www/html/"
  database:
    name: "wordpress"
    user: "root"
    password: "wordpress"
    host: "database"

production:
  vhost: "<%= ENV['PRODUCTION_URL'] %>"
  wordpress_path: "<%= ENV['PRODUCTION_DIR_PATH'] %>"

  database:
    name: "<%= ENV['PRODUCTION_DB_NAME'] %>"
    user: "<%= ENV['PRODUCTION_DB_USER'] %>"
    password: "<%= ENV['PRODUCTION_DB_PASSWORD'] %>"
    host: "<%= ENV['PRODUCTION_DB_HOST'] %>"
    port: "<%= ENV['PRODUCTION_DB_PORT'] %>"

  exclude:
    - '.git/'
    - '.gitignore'
    - '.gitmodules'
    - '.env'
    - 'node_modules/'
    - 'bin/'
    - 'tmp/*'
    - 'Gemfile*'
    - 'Movefile'
    - 'movefile'
    - 'movefile.yml'
    - 'movefile.yaml'
    - 'wp-config.php'
    - 'wp-content/*.sql.gz'
    - '*.orig'
    - "wp-content/uploads/backwpup*/*"
    - ".htaccess"

  ssh:
    host: "<%= ENV['PRODUCTION_SSH_HOST'] %>"
    user: "<%= ENV['PRODUCTION_SSH_USER'] %>"
    port: "<%= ENV['PRODUCTION_SSH_PORT'] %>"
    password: "<%= ENV['PRODUCTION_SSH_PASS'] %>" # パス接続の場合
    rsync_options: "--verbose"

staging:
  vhost: "<%= ENV['STAGING_URL'] %>" 
  wordpress_path: "<%= ENV['STAGING_DIR_PATH'] %>" 

  database:
    name: "<%= ENV['STAGING_DB_NAME'] %>" 
    user: "<%= ENV['STAGING_DB_USER'] %>" 
    password: "<%= ENV['STAGING_DB_PASSWORD'] %>" 
    host: "<%= ENV['STAGING_DB_HOST'] %>" 
    port: "<%= ENV['STAGING_DB_PORT'] %>" 

  exclude:
    - '.git/'
    - '.gitignore'
    - '.gitmodules'
    - '.env'
    - 'node_modules/'
    - 'bin/'
    - 'tmp/*'
    - 'Gemfile*'
    - 'Movefile'
    - 'movefile'
    - 'movefile.yml'
    - 'movefile.yaml'
    - 'wp-config.php'
    - 'wp-content/*.sql.gz'
    - '*.orig'
    - "wp-content/uploads/backwpup*/*"
    - ".htaccess"

  ssh:
    host: "<%= ENV['STAGING_SSH_HOST'] %>"
    user: "<%= ENV['STAGING_SSH_USER'] %>"
    port: "<%= ENV['STAGING_SSH_PORT'] %>"
    password: "<%= ENV['STAGING_SSH_PASS'] %>" # パス接続の場合
    rsync_options: "--verbose"
```

```:docker-compose.xml
version: '3'
services:
    database:
        image: mysql:5.7
        command:
            - "--character-set-server=utf8"
            - "--collation-server=utf8_unicode_ci"
        ports:
            - "${LOCAL_DB_PORT}:3306"
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_db"
        environment:
            MYSQL_USER: wordpress
            MYSQL_DATABASE: wordpress
            MYSQL_PASSWORD: wordpress
            MYSQL_ROOT_PASSWORD: wordpress
    wordpress:
        depends_on:
            - database
        image: wordpress:latest
        container_name: "${PRODUCTION_NAME}_wordpress"
        ports:
            - "${LOCAL_SERVER_PORT}:80"
        restart: on-failure:5
        volumes:
            - ./public:/var/www/html
        environment:
            WORDPRESS_DB_HOST: database:3306
            WORDPRESS_DB_PASSWORD: wordpress
    wordmove:
        tty: true
        depends_on:
            - wordpress
        image: welaika/wordmove
        restart: on-failure:5
        container_name: "${PRODUCTION_NAME}_wordmove"
        volumes:
            - ./config:/home/
            - ./public:/var/www/html
            - ~/.ssh:/home/.ssh
        environment:
            LOCAL_SERVER_PORT: "${LOCAL_SERVER_PORT}"
            PRODUCTION_URL: "${PRODUCTION_URL}"
            PRODUCTION_DIR_PATH: "${PRODUCTION_DIR_PATH}"
            PRODUCTION_DB_NAME: "${PRODUCTION_DB_NAME}"
            PRODUCTION_DB_USER: "${PRODUCTION_DB_USER}"
            PRODUCTION_DB_PASSWORD: "${PRODUCTION_DB_PASSWORD}"
            PRODUCTION_DB_HOST: "${PRODUCTION_DB_HOST}"
            PRODUCTION_DB_PORT: "${PRODUCTION_DB_PORT}"
            PRODUCTION_SSH_HOST: "${PRODUCTION_SSH_HOST}"
            PRODUCTION_SSH_USER: "${PRODUCTION_SSH_USER}"
            PRODUCTION_SSH_PORT: "${PRODUCTION_SSH_PORT}"
            PRODUCTION_SSH_PASS: "${PRODUCTION_SSH_PASS}"
            STAGING_URL: "${STAGING_URL}"
            STAGING_DIR_PATH: "${STAGING_DIR_PATH}"
            STAGING_DB_NAME: "${STAGING_DB_NAME}"
            STAGING_DB_USER: "${STAGING_DB_USER}"
            STAGING_DB_PASSWORD: "${STAGING_DB_PASSWORD}"
            STAGING_DB_HOST: "${STAGING_DB_HOST}"
            STAGING_DB_PORT: "${STAGING_DB_PORT}"
            STAGING_SSH_HOST: "${STAGING_SSH_HOST}"
            STAGING_SSH_USER: "${STAGING_SSH_USER}"
            STAGING_SSH_PORT: "${STAGING_SSH_PORT}"
            STAGING_SSH_PASS: "${STAGING_SSH_PASS}"
            RUBYOPT: -EUTF-8
    phpmyadmin:
        container_name: "${PRODUCTION_NAME}_pma"
        image: phpmyadmin/phpmyadmin
        restart: on-failure:5
        depends_on:
            - database
        ports:
            - 8888:80
        environment:
            PMA_HOST: database
```


###docker-composeでビルド

```
$ docker-compose up -d
```

###Wordpressを初期化、一旦docker-composeを停止
.envで設定した8080にアクセスし、Wordpressを同期する前に初期化しておきます。

```
$ open http://localhost:8080
```

いつもdownでやっているので1回間違えてしまったのですが、DBのデータも初期化されてしまうのでstopで停止させます。
毎度忘れるので、どこかにメモしておきます。

```
$ docker-compose stop
```
###ssh-agentの設定
####wordmoveのコンテナに移動

```
docker exec -w /home/ -it wordmoveのコンテナ /bin/bash
```

####ssh-agentを起動、公開鍵を設定

```
$ ssh-agent bash
$ ssh-add -K /home/.ssh/id_rsa
```
登録できているか確認

```
$ ssh-add -l
```
使うときは

```
ssh -A [鍵の名前]
```

##wordmoveを使ってみる
Rubyのエンコーディングはdocker-compose.xmlで設定済
wordmoveのコマンドは以下

```
> wordmove help
Commands:
  wordmove --version, -v    # Print the version
  wordmove doctor           # Do some local configuration and environment checks
  wordmove help [TASK]      # Describe available tasks or one specific task
  wordmove init             # Generates a brand new movefile.yml
  wordmove list             # List all environments and vhosts
  wordmove pull             # Pulls WP data from remote host to the local machine
  wordmove push             # Pushes WP data from local machine to remote host
```
###本番環境をpullしてみる

```
$ wordmove pull -e [production / staging] -[オプション]
```
複数環境を設定している場合、(今回はテスト環境)```-e [production / staging]```で指定することができます。一つだけであれば、```-e```は省略。
pullの場合はdefaultで常にlocalにpullされるので、localにpullするときは指定しなくてもOK。複数環境を設定していて且つpull先を指定したい場合は、```-e```をつけて指定します。
pushの場合は毎回push先を指定する必要があります。

```
$ wordmove push -t -e test
```

>When you pull/push you can specify a remote w/ -e flag if you have multiple remotes.
>If you have just one remote it will be used by default, so you can omit -e flag.
>When you pull, the destination will always be local; tell Wordmove the environment from where it should take the bits w/ -e. E.g.:
>
```
wordmove pull -t -e live
```

>will sync from live to local
>When you push, the destination will always be the requested remote; tell Wordmove the required destination environment w/ -e. E.g.:
>
```
wordmove push -t -e test
```
>will sync from local to test.

[引用元](https://github.com/welaika/wordmove/wiki/Multiple-environments-explained)

##ToDo
sshの公開鍵認証を自動化しているかたがいるので参考にしたい。

https://taak.biz/archives/3942