GoogleAppEngine/StandardでWordpressサイトを構築

# GoogleAppEngine/StandardでWordpressサイトを構築

* 表題の通り、今更感ありますが、GoogleAppEngine/StandardでWordpressサイトを構築する方法です。案外、phpインストール周りで手こずったので自分のメモとしてまとめておきます。
* 正直構築とか面倒なのでdocker-wordpressでやりたいが、gae standardだとできない...（Flexならできるでしょうけど）
* Wordpressの構築だけでなく、便利そうなコマンド（`hub`とか`gibo`とか）もいれています。
* 作業環境はmac(mojave)です。

## 準備
### hubコマンド
1. brewで`hub`をinstall

    ```bash
    brew install hub
    ```
    * github操作をコマンドラインから簡単にできるコマンド。便利です。
        * 参考：[GitHub のコマンドラインツール「hub」の基本と便利な使い方のまとめ ｜ DevelopersIO](https://dev.classmethod.jp/tool/git/hub/)
1. hubにgithubアカウントを設定する

    ```hub
    hub
    ```
   * アカウント情報を対話形式で聞かれるのでよしなに入力。本題ではないので、詳細は参考サイトをみてください。
1. hubコマンドのテストのためにリポジトリを作ってみる。`hogehoge`はアカウント名なので自分のアカウントに変更してください。

    ```bash
    $ mkdir gae_wordpress_example
    $ cd gae_wordpress_example
    $ git init
    $ hub create -p hogehoge/gae_wordpress_example
    https://github.com/hogehoge/gae_wordpress_example
    ```
1. 表示されたURLをブラウザで開いてみると、リポジトリができてますね。

    ```bash
    open https://github.com/hogehoge/gae_wordpress_example
    ```

### gcp設定
* 詳細はこちら->[macOS 用のクイックスタート  |  Cloud SDK のドキュメント  |  Google Cloud](https://cloud.google.com/sdk/docs/quickstart-macos?hl=ja)

1. `gcloud`コマンドをcomponentsをupdateする。

    ```bash
    gcloud components update
    ```
1. `gcloud`コマンドをアカウント認証する。

    ```bash
    gcloud auth login アカウント名
    ```
   * ブラウザが開いてgoogleアカウントに認証とかが出ますのでよしなに済ませる。
1. projectを作成する。

    ```bash
    $ gcloud projects create gae-wordpress-example
    ```
1. projectを切り替える。

    ```bash
    $ gcloud config set project gae-wordpress-example
    Updated property [core/project].
    ```

### cloud sqlにwordpress用のinstanceを用意

* gae se on wordprssの公式の手順に従ってやってみる。
  * [Run WordPress on Google App Engine standard environment | Run WordPress on Google App Engine standard environment  |  Google Cloud Platform Community  |  Google Cloud](https://cloud.google.com/community/tutorials/run-wordpress-on-appengine-standard)
  * ただし上記の手順はregion/zoneが指定されていないので、東京や大阪で使いたい場合はregionを指定する。
    * [リージョンとゾーン  |  Compute Engine ドキュメント  |  Google Cloud](https://cloud.google.com/compute/docs/regions-zones/?hl=ja)

1. wordpress用のcloud sqlインスタンスを作成する。

    ```bash
    $ gcloud sql instances create wordpress001 \
     --activation-policy=ALWAYS \
     --tier=db-n1-standard-1 \
     --region=asia-northeast1
    ```
    * インスタンス名に`001`とつけているのは、今後増やした時に同じ名前にならないようにするため。
    * `region`と`zone`のオプションは同時には指定できない。大抵は`region`だけでいい。
    * `db-n1-standard-1`は普通のwordprssを動かすには問題ない性能ですが、練習で立ち上げたりするにはオーバースペックです。料金も月で`$64`ぐらいかかるので、最初は`db-f1-micro`（月$10程度）でもいい。あと練習のために構築してるだけなら、忘れずに停止or削除しておきましょう。
2. wordpress用のdatabasesを作成する。

    ```bash
    $ gcloud sql databases create wordpress --instance wordpress001
    Creating Cloud SQL database...done.
    Created database [wordpress].
    instance: wordpress001
    name: wordpress
    project: gae-wordpress-example
    ```
1. 作ったデータベースにpasswordを設定する。

    ```bash
    gcloud sql users set-password root \
     --host=% \
     --instance wordpress \
     --password=YOUR_INSTANCE_ROOT_PASSWORD
    ```

   * パスワードは必ずランダムなものを設定するようにしましょう。練習だから適当でいいか、と推測可能なものをつけてしまって止め忘れて侵入されるなどはよくある話。たとえ練習でも簡単に推測不可能な文字列を入れる習慣をつけてください。大した手間じゃないです。

### php動作環境の用意

1. anyenvをインストール

    ```bash
    $ git clone https://github.com/riywo/anyenv ~/.anyenv
    $ echo 'export PATH="$HOME/.anyenv/bin:$PATH"' >> ~/.bash_profile
    $ echo 'eval "$(anyenv init -)"' >> ~/.bash_profile
    $ exec $SHELL -l
    ```
    * ここは`anyenv`でなくとも`phpenv`でもいいのですが、`phpenv`は`rbenv`と併用した時に競合して正常に動作しなかったりするため、`anyenv`でいれておいた方がいいです。

1. phpをインストール

    ```bash
    $ brew install bison re2c libxml2 libjpeg libpng icu4c libzip autoconf automake
    $ echo 'export PATH="/usr/local/opt/bison/bin:$PATH"' >> ~/.bash_profile
    $ exec $SHELL -l
    $ sudo installer -pkg /Library/Developer/CommandLineTools/Packages/macOS_SDK_headers_for_macOS_10.14.pkg -target /
    $ phpenv install 7.2.22
    ```
    * mac(mojave)で普通にphpenvでinstallしようとすると色々エラーが出るので、先にその解決をしています。
      * 参考：[Macのphpenv(php-build)でビルドしようとしたら出るエラーと解決まとめ - Qiita](https://qiita.com/fruitriin/items/3028c2e2170e3e93459d)

1. composerで必要なtoolをインストール

    ```bash
    composer require google/cloud-tools
    ```

### wordpressを用意
1. `gibo`コマンドでgitignoreファイルを作っておく。

    ```bash
    gibo dump vim Wordpress > .gitignore
    echo "vendor" >> .gitignore
    ```
    * 意図しないファイルをリポジトリにアップしてしまわないようにgitignoreは先に作っておきます。

2. gae用のwordpressパッケージをインストール

    ```bash
    php vendor/bin/wp-gae create
    ```
    * dbの情報とかregionとか対話形式で入力してください。

### gaeにdeploy
1. deployの前に`my-wordress-project/app.yaml`に以下の設定を追加します。

     ```bash
     automatic_scaling:
       min_instances: 0
       max_instances: 1
     ```
     * 初期設定では`automatic_scaling`の`max_instances`の設定がありませんが、これは少々危険です。gaeインスタンスは`max_isntances`の設定がない場合、アクセス数に応じて際限なくインスタンスを増やす可能性があります。特にテストの場合は`max_instances`は`1`、`min_instances`は`0`とすべきです。
     * ただ今回の場合だとminを`0`にしても、cronで定期的にアクセスがあるため起動台数は常に`1`となります。

2. deployする。

    ```bash
    $ gcloud app deploy app.yaml cron.yaml -v 1
    You are creating an app for project [gae-wordpress-example].
    ```
    * `-v`は必ずつけましょう。省略した場合、タイムスタンプがversion名になりますが、これは削除しない限り残るので、deployするたびにinstanceが増えていくことになります。同じversion名を指定した場合は、インスタンスは上書きされます。

3. deployが成功したらすぐにブラウザでアクセスしてwordpressのログイン設定をします。

    ```bash
    $ gcloud app browse
    Opening [https://gae-wordpress-example.appspot.com] in a new tab in your default browser.
    ```
    * 初期設定されていないwordpressは勝手に設定されてしまう危険があるので、deploy後は速やかに設定を行う。

1. deployされているか確認します。

    ```bash
    $ gcloud app versions list --service=default
    SERVICE  VERSION          TRAFFIC_SPLIT  LAST_DEPLOYED              SERVING_STATUS
    default  1                1.00           2019-09-17T01:41:47+09:00  SERVING
    ```

### GoogleCloudStorageの設定

* wordpressからメディアをアップロードする時に、google cloud storageにアップロードできる設定をしておきます。

1. GCSバケットを設定。`YOUR_PROJECT_ID.appspot.com`はデフォルトです。PROJECT IDは書き換えて以下のコマンドを実行。

    ```bash
    $ gsutil defacl ch -u AllUsers:R gs://YOUR_PROJECT_ID.appspot.com
    ```
    * プラグイン設定ページで、指定したバケット名を入力します。

### projectの削除
* 必要なければgaeインスタンスは削除しておきたいところですが、gaeのdefaultサービス（１つしかgaeサービスがない場合はdefaultになります）は削除できません。削除したいならprojectごと消すしかない。また、`cron.yaml`を見るとわかりますが、wordpressのcron実行のために15分毎にcron endpointにアクセスしているためインスタンス台数も1から下がりません。
* ですので、必要ない場合はprojectごと削除します。
    * この辺りはgcp、何とかして欲しい...

1. sqlインスタンスを停止する。

    ```bash
    gcloud sql instances patch wordpress001 --activation-policy NEVER
    ```
1. projectを削除する。

    ```bash
    gcloud projects delete gae-wordpress-example
    ```

### 終わりに

* gcpが公式の手順を公開してくれているので簡単にできました。
* このままだと再現性に乏しい（手作業）なので、circleciとかにあとでしておきたい。
* 独自ドメインにしてSSLも設定しておきたい。
* さらに言えばgae seやめてdocker使いたい...