無料でHTTPS化したWordPressをdocker-composeで始める方法

プログラミングor技術

ネットワーク側での準備

使いたいドメイン名がちゃんと名前解決できるように設定しておきます。

ホスト側の準備

以下のポートを解放しておきます。ncコマンド等で外から通信できることを確認しておいてください。(phpmyadminとFTPは管理上必要でない場合、攻撃を受ける機会を増やすので使わない方がいいです!)

# HTTPとHTTPS
TCP:80
TCP:443

# phpmyadminのため
TCP:9020

# FTPのため
TCP:21
TCP:30000

dockerの準備

ファイル類の準備

ディレクトリ構造は以下。

docker-wordpress/
├── db-data/
├── docker-compose.yml
├── ftp/
└── wordpress/

参考1
参考2(サンプルも配布している)

docker-compose.ymlは以下のようにします。

外部に公開されるFTPのパスワードなどは適当に良い感じにしてください。
あと一通りの準備作業が終わり不要になったらFTPやphpMyAdminは無効にしたほうがいいです。攻撃されます。

version: "3.2"
services:
  # WordPressの記事などを管理するDB
  mysql:
    # 5にしといた方が面倒がないが8でも良い
    image: mysql:5
    environment:
      - MYSQL_ROOT_USER=root
      - MYSQL_ROOT_PASSWORD=rootpass
      - MYSQL_DATABASE=wpdb1
      - MYSQL_USER=wp_user1
      - MYSQL_PASSWORD=user1pass
    volumes:
      - ./db-data:/var/lib/mysql
      - ./db-data:/docker-entrypoint-initdb.d
    expose:
      - 3306

  # WordPressをホストするHTTPサーバ
  wordpress:
    image: wordpress:latest
    expose:
      - 80
    depends_on:
      - mysql
    links:
      - mysql
    environment:
      - WORDPRESS_DB_HOST=mysql:3306
      - WORDPRESS_DB_NAME=wpdb1
      - WORDPRESS_DB_USER=wp_user1
      - WORDPRESS_DB_PASSWORD=user1pass
    volumes:
      - ./wordpress:/var/www/html

  # phpmyadmin、WordPressで使用するDBの管理に用いる
  phpmyadmin:
    image: phpmyadmin/phpmyadmin
    environment:
      - PMA_ARBITRARY=1
      - PMA_HOST=mysql
      - PMA_USER=root
      - PMA_PASSWORD=rootpass
    depends_on:
      - mysql
    links:
      - mysql
    ports:
      - 9020:80
    volumes:
      - /sessions

  # pluginとかアップロード用のFTPサーバ(https://github.com/stilliard/docker-pure-ftpd/wiki/Docker-stack-with-Wordpress-&-FTP)
  # パーミッションが適切に設定されていれば、WordPress管理画面からできるのであまり必要ない
  ftp:
    # optionally replace username/repo:tag with your name and image details
    image: stilliard/pure-ftpd:latest
    deploy:
      replicas: 1
      restart_policy:
        condition: on-failure
    environment:
      PUBLICHOST: 127.0.0.1   #(**MUST REPLACE!** ホストのIPアドレスにする)
      FTP_USER_NAME: "user1"
      FTP_USER_PASS: "ftpuser1pass"
      FTP_USER_HOME: "/var/www/html"
      FTP_USER_UID: 33
      FTP_USER_GID: 33
    volumes:
      - ./wordpress:/var/www/html
      - ./ftp:/etc/ssl/private
    ports:
      - target: 21
        published: 21
        protocol: tcp
        mode: host

# Bind each passive ports to the host
      - target: 30000
        published: 30000
        protocol: tcp
        mode: host

  # HTTPとHTTPSサーバ
  # Lets's encryptのドメイン認証(DV)を取得、自動更新もしてくれる!
  # HTTP(80番ポート)にきたリクエストもHTTPSに301リダイレクトしてくれる
  https-portal:
    image: steveltn/https-portal:latest
    ports:
      - '80:80'
      - '443:443'
    depends_on:
      - wordpress
    links:
      - wordpress
    restart: always
    environment:
      # wordpressイメージから作成したコンテナはTCP80番で待ち受けるので矢印の右側はhttpにする。(WordPress内の設定画面ではちゃんとアドレスはhttps://...にする)
      DOMAINS: 'yourdomain.com -> http://wordpress' #(**MUST REPLACE!** 矢印の左側を自分のドメインにする)
      STAGE: 'production'
      FORCE_RENEW: 'true'

https-portalを上の設定で何回もup/downさせてると、Let’s Encryptのレートリミットに達してしまう可能性があるので気をつけてください。
そこら辺は SteveLTN/https-portal に書いてあります。最初はSTAGEは staging にして試すべきですし、FORCE_RENEWはfalseにして、無駄に繰り返さないで済むようにデータをvolumeに保存するといいようです。
(今回は面倒だったのでサイトの公開最優先で無理矢理やるように書きました。)

サーバの起動

コンテナ起動

sudo docker-compose up

1分か2分くらいでhttps-portalの準備ができ、下のようになります。これで通信できるようになりました!

準備ができた時のhttps-portalの出力

準備ができた時のhttps-portalの出力

なお、マルチドメインの場合でも、https-portalによって複数のドメイン名をホストできます。こんがらかって嫌な場合は、HAProxyを使っていい感じにします。

以上です。

コメント