VultrでKUSANAGI Runs on Dockerが動くまで（その4）

#はじめに
前回の記事[『VultrでKUSANAGI Runs on Dockerが動くまで（その3）』](https://qiita.com/chiruparu/items/0108442b57946081b0bf)ではVPC環境であるVultrにKUSANAGI RoD環境を構築しWordpressが動くところまで確認しました。
今回はリバプロサーバとして[https-portal](https://github.com/SteveLTN/https-portal)環境を作っていきます。

https-portal
https://github.com/SteveLTN/https-portal

#動作環境など

- Ubuntu 20.04
- docker 19.03.12
- docker-compose 1.26.2

```shell
$ docker-compose ps
       Name                     Command                 State                          Ports                     
-----------------------------------------------------------------------------------------------------------------
kusanagi01_config    docker-entrypoint.sh wp -- ...   Restarting                                                 
kusanagi01_db        docker-entrypoint.sh mysqld      Up                                                         
kusanagi01_ftp       /bin/sh -c /docker-entrypo ...   Up                                                         
kusanagi01_httpd     /docker-entrypoint.sh /usr ...   Up           0.0.0.0:8080->8080/tcp, 0.0.0.0:8443->8443/tcp
kusanagi01_php       /usr/local/bin/docker-entr ...   Up  
```

#https-portalとは
[https-portal](https://github.com/SteveLTN/https-portal)は[Let's Encrypt](https://letsencrypt.org/ja/)対応のリバプロサーバDockerコンテナです。複数FQDNへの分散、[Let's Encrypt](https://letsencrypt.org/ja/)の自動更新などさくっとやってくれます。

Let's Encrypt
https://letsencrypt.org/ja/


#フォルダ構成
フォルダ構成は以下のようにしました。新たにhttps-portalフォルダを作成し、その中にdocker-compose.ymlを作成しています。

```
/home
  └＄USER
        ├https-portal　　　　　　　　　　　　　　　　← リバプロサーバー（マルチサイト＆ Let’s Encrypt対応）
        │ └docker-compose.yml
        │ 
        ├kusanagi01　　　　　　　　　　　　　　　　　← KUSANAGI Runs on Docker（WordPressサイト1つ目）
        │ ├nginx
        │ │ └nginx.conf
        │ ├php
        │ │ └ uploads.ini
        │ └docker-compose.yml
        │
        └kusanagi02　　　　　　　　　　　　　　　　　← KUSANAGI Runs on Docker（WordPressサイト2つ目）
          └docker-compose.yml
```

#Kusanagi Rodのdocker-compose.ymlを修正する
https-portalとKusanagi Rod間で通信をできるように同一のネットワークに属するようにします。
docker-compose.ymlでnetworkにshared-networkを設定します。

```yml:$HOME/kusanagi01/docker-compose.yml
version: '3'

networks:
  default:
    driver: bridge
    driver_opts:
      com.docker.network.driver.mtu: 9000
  shared-network:　　　　　　　　　　　　　　　　　　　　　　　　　　※追加
    external: true　　　　　　　　　　　　　　　　　　　　　　　　　 ※追加

services:
  httpd:
    container_name: kusanagi01_httpd
    image: primestrategy/kusanagi-nginx:1.17.9-r0
    restart: always
    env_file:
      - .kusanagi
      - .kusanagi.httpd
    volumes:
      - kusanagi:/home/kusanagi
      #- kusanagi:/etc/letsencrypt
      - kusanagi:/var/www/html/.well-known
      - ./nginx/nginx.conf:/etc/nginx/nginx.conf
    ports:
      - "8080:8080"
      - "8443:8443"
    extra_hosts:
      - "example.com:127.0.0.1"
    networks:　　　　　　　　　　　　　　　　　　　　　　　   　　　※追加
      - shared-network　　　　　　　　　　　　　　　　　   　　　　※追加

        #certbot:
        #container_name: kusanagi01_certbot
        #image: certbot/certbot:v1.6.0
        #restart: always
        #network_mode: "service:httpd"
        #env_file:
        #- .kusanagi.httpd
        #volumes:
        #- kusanagi:/var/www/html/.well-known
        #- kusanagi:/etc/letsencrypt
        #command:
        #- --version

## CONFIG
  config:
    container_name: kusanagi01_config
    restart: always
    build:
        context: ./wpcli
    user: "1000:1001"
    env_file:
      - .kusanagi
      - .kusanagi.wp
      - .kusanagi.db
    volumes:
      - database:/var/run/mysqld
      - kusanagi:/home/kusanagi
    command: wp --version

  php:
    container_name: kusanagi01_php
    image: primestrategy/kusanagi-php:7.4.8-r0
    restart: always
    env_file:
      - .kusanagi
      - .kusanagi.php
      - .kusanagi.mail
    network_mode: "service:httpd"
    volumes:
      - database:/var/run/mysqld
      - kusanagi:/home/kusanagi
      - ./php/uploads.ini:/usr/local/etc/php/conf.d/uploads.ini

## MYSQL 
  db:
    container_name: kusanagi01_db
    image: mariadb:10.5.4-focal
    restart: always
    user: "999:999"
    env_file:
      - .kusanagi.mysql
    network_mode: "service:httpd"
    volumes:
      - database:/var/run/mysqld
      - database:/var/lib/mysql

## FTPD
  ftp:
    container_name: kusanagi01_ftp
    image: primestrategy/kusanagi-ftpd:1.0.2-r1
    restart: always
    network_mode: "service:httpd"
    env_file:
      - .kusanagi
      - .kusanagi.wp
    volumes:
      - kusanagi:/home/kusanagi


volumes:
  kusanagi:
  database:
```

docker環境を再構築します。

```sh
$ docker-compose down
$ docker-compose up -d
```


#https-portalのdocker-compose.yml
networkをshared-networkにしてkusanagi01とkusanagi02と同一ネットワークにしています。
DOMAINS行で振り分け先のWebサーバを指定します。複数指定する場合はカンマで区切ればOKです。振り分け先をhttpではなくhttpsにしているのはうまくサイトが表示されないからです。（Wordpress側の設定を変えてあげればここをhttpにできるかもです。）
テスト中はSTAGE行をlocalにしておくことでオレオレ証明書で通信ができます。productionに変更すればLet's Encrypt証明書になります。


```yml:$HOME/https-portal/docker-compose.yml
version: '3'

services:
  https-portal:
    container_name: https-portal
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    restart: always
    environment:
      DOMAINS: 'fqdn1 -> https://kusanagi01_httpd:8443, fqdn2 -> https://kusanagi02_httpd:8443'
      #STAGE: 'production'
      STAGE: 'local'
      #FORCE_RENEW: "true"
      ERROR_LOG: stderr
      ACCESS_LOG: stdout
      CLIENT_MAX_BODY_SIZE: 64M
    networks:
      - shared-network

networks:
  shared-network:
    external: true
```

docker環境を再構築します。

```sh
$ docker-compose down
$ docker-compose up -d
```

#動作確認
ブラウザでアクセスできることを確認します。今度は8080/TCPとか8443/TCPにする必要はないです。
http://FQDN/
https://FQDN/

ちゃんとログが出力されていることも確認しておきましょう。
**https-portalのアクセスログ**

```shell
$ docker logs https-portal
xxx.xxx.xxx.xxx - - [31/Jul/2020:15:18:45 +0000] "GET /wp-login.php HTTP/2.0" 200 2237 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.49" "-"
```

**kusanagi01-httpdのアクセスログ**

```shell
$ docker logs kusanagi01_httpd
0.126 - - 172.19.0.3 - - [01/Aug/2020:00:18:45 +0900] "GET /wp-login.php HTTP/1.0" 200 2237 "-" "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/84.0.4147.105 Safari/537.36 Edg/84.0.522.49" "xxx.xxx.xxx.xxx"
```