VultrでKUSANAGI Runs on Dockerが動くまで(その4)


はじめに

前回の記事『VultrでKUSANAGI Runs on Dockerが動くまで(その3)』ではVPC環境であるVultrにKUSANAGI RoD環境を構築しWordpressが動くところまで確認しました。
今回はリバプロサーバとしてhttps-portal環境を作っていきます。

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

動作環境など

  • Ubuntu 20.04
  • docker 19.03.12
  • docker-compose 1.26.2
$ 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-portalLet's Encrypt対応のリバプロサーバDockerコンテナです。複数FQDNへの分散、Let's Encryptの自動更新などさくっとやってくれます。

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を設定します。

$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環境を再構築します。

$ 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証明書になります。

$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環境を再構築します。

$ docker-compose down
$ docker-compose up -d

動作確認

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

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

$ 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のアクセスログ

$ 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"