[Wordpress•Docker•さくらVPS]Wordpressをモダンな技術でデプロイしてみた

### 最初に

このやり方はいかに現代のweb技術を使ってwebで作成•デプロイまで行けるかを考えて作成しました。

Wordpressを使い慣れている方はローカルで作成してFTPで本番にあげてしまうのがめっちゃ簡単、

### 自分にとって現代webとは
- Git, Github等のバージョン管理ツール
- Docker等のコンテナツール
- VPSを使ってデプロイ
...etc

いろいろありますが、最低限この３つは使いたいなぁと思っています。

### 環境設定

カレントディレクトリに作成

docker-compose.yml

```
version: "3.7"
services:
   wordpress:
      image: wordpress:latest
      container_name: wordpress
      depends_on:
         - db
      environment:
         WORDPRESS_DB_HOST: db:3306 # データベースサーバ名：ポート番号
         WORDPRESS_DB_USER: '${DB_USER}' # WordPress用データベース接続ユーザ名(dbの内容に合わせる)
         WORDPRESS_DB_PASSWORD: '${DB_PASSWORD}' # WordPress用データベース接続パスワード(dbの内容に合わせる)
         WORDPRESS_DB_NAME: '${DB_NAME}' # WordPress用データベース名(dbの内容に合わせる)
      volumes:
         - ./html:/var/www/html
      networks:
         - myappnet
 
   db:
      image: mysql:8.0
      container_name: mysql
      environment:
         MYSQL_ROOT_PASSWORD: '${DB_PASSWORD}' # rootユーザのパスワード
         MYSQL_DATABASE: '${DB_NAME}' # WordPress用データベース名
         MYSQL_USER: '${DB_USER}' # WordPress用データベース接続ユーザ名
         MYSQL_PASSWORD: '${DB_PASSWORD}' # WordPress用データベース接続パスワード
      volumes: 
         - db_data:/var/lib/mysql
      networks:
         - myappnet

   phpmyadmin:
      image: phpmyadmin/phpmyadmin:latest
      container_name: phpmyadmin_ingrid
      depends_on:
         - db
      volumes:
         - ./phpmyadmin/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini
      networks:
         - myappnet

volumes:
   wordpress:
   db_data:

networks:
  myappnet:
    driver: bridge
```

#### ビルドコマンド

```
docker-compose build
docker-compose up -d
```

htmlのファイルが生成されるので、そのファイル内のhtmlを修正して開発していくイメージです


### 気をつけること


1.wordpressのdocker imageが癖ありすぎる

dockerhubのimage説明です。

https://hub.docker.com/_/wordpress

引用

>静的イメージ / 再デプロイによる更新
>このイメージのデフォルト設定は、自動更新が有効になっている公式の WordPress デフォルトと一致します (したがって、最初のインストールはイメージから行われますが、その後は/var/www/html/データ ボリューム内で自己管理されるようになります)。


となっていいてボリューム内で自己完結してしまいます。
つまり、ボリュームを使って環境を構築しているので、場合によっては過去のボリュームを使ってdbの接続などが失敗してしまいます。

なので以下のコマンドを使います

```
docker-compose stop
docker-compose build --no-cache
```

キャッシュを使うと

```
Error Establishing a Database Connection
```
このようなエラーが出てしまいます。

テーマやプラグインを使う場合はimageの説明にも書いてある通り追加でDockerflieを読み込ませる必要があったります。

2.wordpress ssl設定するにはリバースプロキシかまさないといけない🥺


docker-imageのwordpressにはApacheがすでに入っていて、それを使ってssl設定を行うことはできないです。
ですのでリバースプロキシでnginxをかましてnginxでSSLを設定する必要があります。

参考サイト
https://wa3.i-3-i.info/word1755.html

```
version: "3.7"
services:
   proxy:
      image: jwilder/nginx-proxy
      privileged: true
      ports:
         - 80:80
         - 443:443
      volumes:
         - ./data/docker-compose.d/certs:/etc/nginx/certs:ro
         - /etc/nginx/vhost.d
         - /usr/share/nginx/html
         - /var/run/docker.sock:/tmp/docker.sock:ro
      restart: always
      networks:
         - myappnet


   letsencrypt-proxy:
      image: jrcs/letsencrypt-nginx-proxy-companion
      privileged: true
      volumes:
         - ./data/docker-compose.d/certs:/etc/nginx/certs:rw
         - /var/run/docker.sock:/var/run/docker.sock:ro
      volumes_from:
         - proxy

   wordpress:
      restart: always
      environment:
         WORDPRESS_DEBUG: 0 # デバッグモードOFF
         VIRTUAL_HOST: "example.com"
         VIRTUAL_PORT: 80
         LETSENCRYPT_HOST: "example.com"
         LETSENCRYPT_EMAIL: '${OWNER_EMAIL_ADDRESS}'
      networks:
         - myappnet
```

3. テーマを使わない

テーマ内の修正はDBで管理しているので、バージョン管理ツールで追えないので。ローカルと本番環境にDBごと移さないと変更が反映されず運用しにくいです。


### まとめ

gitやdockerを使ってデプロイ自体はできますが、現状はFTPでデプロイした方が楽です。

また一から作れるのであれば極力テーマは使わない方がいいです。