WordPress on App Engine Standard for PHP 7.2

この記事は2019/2/1時点の[こちら](
https://github.com/GoogleCloudPlatform/php-docs-samples/tree/master/appengine/php72/wordpress)にあるコマンドラインツールを使用してWordPressをGAEにデプロイする手順を説明します。

# 前提条件
* [Cloud Console][cloud-console] 上で新規プロジェクトを作成する
* 作成したプロジェクトの支払い設定を有効にする
* [Google Cloud SDK][gcloud-sdk] をインストールする
* [Cloud SQL API][cloud-sql-api-enable] を有効にする
* [Composer][composer] をインストールする

# Cloud SQL for MySQL インスタンスの作成と設定

> **注**: このガイドでは, インスタンスとデータベース名に `wordpress` を使用します。データベースでは `root` ユーザーを使用します。

1. 下記コマンドで、新規 Cloud SQL for MySQL Second Generation インスタンスを作成

```sh
$ gcloud sql instances create wordpress \
    --activation-policy=ALWAYS \
    --tier=db-n1-standard-1
```

２. 次に、WordPressで使うデータベースを作成します
 
```sh
$ gcloud sql databases create wordpress --instance wordpress
```

3. 最後に、インスタンスの root パスワードを変更します

```sh
$ gcloud sql users set-password root \
    --host=% \
    --instance wordpress \
    --password=YOUR_INSTANCE_ROOT_PASSWORD # このパスワードは使ってはいけません!
```

## Create or Update a WordPress project for App Engine

`wp-age` コマンドは新規に WordPress プロジェクトを作成するか、既に WordPress プロジェクトがある場合は必要な設定ファイルを追加します

### Setup

1. この[リポジトリ](https://github.com/GoogleCloudPlatform/php-docs-samples)をダウンロードし `cd` で `appengine/php72/wordpress` ディレクトリに入ります

```sh
$ git clone https://github.com/GoogleCloudPlatform/php-docs-samples.git
$ cd php-docs-samples/appengine/php72/wordpress
```

2. このディレクトリで composer を使って依存パッケージをインストールします

```sh
$ composer install
```

> **注** エラーが発生したら, PHP拡張モジュールの `phar` と `zip` をインストールし再実行してみてください

### Create a new WordPress Project

Google Cloud に WordPress をダウンロードとセットアップするために、`create` コマンドを実行します

```sh
$ php vendor/bin/wp-gae create
```

実行するといくつか質問をするので回答してください。
完了すると、新しい WordPress プロジェクトを作成します。
デフォルトでは `my-wordpress-project` が現在のディレクトリに作成されます。

> **注**: データベースのリージョンを確認したい場合は、`gcloud sql instances describe wordpress`を実行する

### Update an existing WordPress Project

もし既にある WordPress プロジェクトを Google Could に移行したい場合は、 `update` コマンドを使用します

```
$ php vendor/bin/wp-gae update path/to/your-wordpress-site
```

実行するといくつか質問をするので回答してください。
完了すると、`files` ディレクトリにファイルがコピーされ、設定が書き出されます。これで Google Could にデプロイする準備ができました！


## Deploy to Google Cloud

`cd` で WordPress プロジェクトのルートに移動します 

```sh
$ cd my-wordpress-project
```

App Engine にデプロイするために次のコマンドを実行します

```sh
$ gcloud app deploy app.yaml cron.yaml
```

これでサイトにアクセスできます。引き続きインストールStepを続けてください。
https://PROJECT_ID.appspot.com/

### Enable the Google Cloud Storage plugin

メディアをアップロードするために[Google Cloud Storage plugin][gcs-plugin]を使います。手順は以下です。

1. あとで使うためにApp EngineのデフォルトGCSバケットを設定します。デフォルトの App Engine バケットは YOUR_PROJECT_ID.appspot.com です。このバケットのデフォルトのアクセスコントロールリスト（ACL）を以下のコマンドで変更します

```
$ gsutil defacl ch -u AllUsers:R gs://YOUR_PROJECT_ID.appspot.com
```

2. ダッシュボードに行きます https://PROJECT_ID.appspot.com/wp-admin
3. プラグインベージで `Google Cloud Storage plugin` をアクティブにします。
4. プラグイン設定ページで、上記で設定したバケット名をセットします。

プラグインを有効化した後、メディアのアップロードを試すと、GCSバケット[Google Cloud console's Storage page][cloud-storage-console]に画像が確認できます。

## Local Development

Cloud SQL Proxy を使用して、Cloud SQL　の　MySQL　にアクセスします。はじめに ローカルマシン上で[Cloud SQL Proxy][cloud-sql-proxy-download] をダウンロードして、実行してください。 

あなたのプロジェクトの[認証情報][credentials-section]を開き、'認証情報を作成する'をクリックしてください。そして'サービスアカウントキー'を選択してください。'App Engine app default service account'を選択して、'作成'をクリックし、JSONファイルをダウンロードしてください。

Proxyを実行するには以下のコマンドを使用します。

```
$ cloud_sql_proxy \
    -dir /cloudsql \
    -instances=YOUR_PROJECT_ID:us-central1:wordpress \
    -credential_file=/path/to/YOUR_SERVICE_ACCOUNT_JSON_FILE.json
```

> **Note**: 実行ユーザーが`/cloudsql`に書き込み可能なことを確認してください。このコマンドはここに Unix socketを作成します。

これで MySQL Client を使って Cloud SQL インスタンスにアクセスできるようになりました。
別タブを開き、下記のコマンドで確認できます。

```
$ mysql --socket /cloudsql/YOUR_PROJECT_ID:us-central1:wordpress -u root -p
mysql> use database wordpress;
mysql> show tables;
mysql> exit
```

### ローカルでWordPressを起動する (mkamakura追記）

`wp-config.php`にあるデータベースの接続設定を変更します。

```php5
if ($onGae) {
  /* 省略 */
} else {
    /** The name of the local database for WordPress */
    define('DB_NAME', 'wordpress');
    /** Local environment MySQL login info */
    /* define('DB_HOST', '127.0.0.1'); コメントアウト*/
    define('DB_HOST', ':/cloudsql/YOUR_PROJECT_ID:us-central1:wordpress'); /* 追加 */
    define('DB_USER', 'root');
    define('DB_PASSWORD', 'YOUR_INSTANCE_ROOT_PASSWORD');
}
```

phpビルドインサーバーを使用して起動する

```
php -S localhost:8000
```

## Various Workflows

### Install and Update WordPress, Plugins, and Themes

`wp-content`ディレクトリはサーバー上ではRead-Onlyのため、ローカル環境でコードのアップデートをする必要があります。WordPressをローカルで起動し、ダッシュボードからプラグインやテーマをアップデートし、コードをサーバーにデプロイします。そして、サーバー上のWordPressのダッシュボードから有効化をします。また `wp-cli` は以下のような機能を提供します。(Cloud SQL proxy が起動していることを確認してください)

```
# wp-cli のインストール
$ composer require wp-cli/wp-cli-bundle

# WoldPressのアップデート
$ vendor/bin/wp core update --path=wordpress

# すべてのプラグインのアップデート, すべてのテーマのアップデート
$ vendor/bin/wp plugin update --all
$ vendor/bin/wp theme update --all
```

もし、以下のエラーが発生した場合は、

```
Failed opening required 'google/appengine/api/urlfetch_service_pb.php'
```

`WP_CLI_PHP_ARGS`環境変数に`include_path`を設定してください。

```
$ export WP_CLI_PHP_ARGS='-d include_path=vendor/google/appengine-php-sdk'
```

### Remove Plugins and Themes

最初にサーバー上のダッシュボードで無効化してから、ローカルで削除してください。次にデプロイするとサーバー上でも完全に削除されます。

[sql-settings]: https://console.cloud.google.com/sql/instances
[mysql-client]: https://dev.mysql.com/doc/refman/5.7/en/mysql.html
[composer]: https://getcomposer.org/
[cloud-console]: https://console.cloud.google.com/
[cloud-storage-console]: https://www.console.cloud.google.com/storage
[cloud-sql-api-enable]: https://console.cloud.google.com/flows/enableapi?apiid=sqladmin
[app-engine-setting]: https://console.cloud.google.com/appengine/settings
[gcloud-sdk]: https://cloud.google.com/sdk/
[cloud-sql-proxy-download]: https://cloud.google.com/sql/docs/mysql/connect-external-app#install
[credentials-section]: https://console.cloud.google.com/apis/credentials/
[gcs-plugin]: https://wordpress.org/plugins/gcs/