Docker上でWebアプリを簡単にHTTPS化してみた(https-portal)

現在、Docker上でRailsAPIを作っています。
既に本番環境で動かしているWebアプリ(API)をHTTPS化する作業を行った際のメモ。

主にこちらのQiitaの記事を参考にしました。
https://qiita.com/c18t/items/c693d5bcda2e9b82e39bqiita.com

https-portalというDockerコンテナを導入するだけで簡単にHTTPS化できるらしい・・・!?
github.com

使ってみた結果、docker-composeファイルに設定を少し加えるだけでできました。

https-portalとは?

簡単にいうと、サイトのHTTPS化を自動でやってくれるコンテナみたいです。
無料でSSLサーバー証明書を発行し、更に自動で証明書の更新などをしてくれるLet's Encrypt・nginx・dockerを搭載しているHTTPSサーバーだそうです。すごい。

今回の環境

  • OSはUbuntu 18.04(Conohaで借りたVPS)
  • docker・docker-composeが動作する
  • Rails + unicorn + nginxで既に環境を構築済み

docker-composeファイルにhttps-portalコンテナを追加していくことで、HTTPS化します。

docker-composeファイル

このファイルの細かい設定については省きますが、全体のdocker-composeファイルはこんな感じです。
ちなみに私はdocker-compose.development.ymlとdocker-compose.production.ymlで設定ファイルを分けています。

# docker-comose.production.yml

version: '3'
services:
  # 今回追加したhttps-portalコンテナ
  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    environment:
      DOMAINS: 'mydomain.app -> http://dockerhost:8000/'
      STAGE: 'production'
    depends_on:
      - nginx

  # Rails用コンテナ
  web:
    build: .
    ports:
      - "3000:3000"
    depends_on:
      - db
    volumes:
      - .:/app-name
      - public-data:/app-name/public
      - tmp-data:/app-name/tmp
    environment:
      RAILS_ENV: 'production'
      RACK_ENV: 'production'
      LENBO-API_DATABASE_PASSWORD: 'password'
    command: bundle exec unicorn -p 3000 -c /app-name/config/unicorn.rb -E production

  #  db用コンテナ
  db:
    image: mysql:5.7
    volumes:
      - ./db/data:/var/lib/mysql/
      - ./db/conf:/etc/mysql/conf.d
    environment:
      MYSQL_ROOT_PASSWORD: password
    ports:
      - "3306:3306"

  # nginx用コンテナ
  nginx:
    build: containers/nginx
    ports:
      - 8000:8000
    volumes:
      - public-data:/app-name/public
      - tmp-data:/app-name/tmp
    depends_on:
      - web
volumes:
  public-data:
  tmp-data:

ほぼhttps-portalコンテナの設定を追加しただけ。

  https-portal:
    image: steveltn/https-portal:1
    ports:
      - '80:80'
      - '443:443'
    environment:
      DOMAINS: 'mydomain.app -> http://dockerhost:8000/'
      STAGE: 'production'
    depends_on:
      - nginx

DOMAINSの所で、ここで既に作ってあったnginxコンテナとhttps-portalコンテナを結びつけてる。
リポジトリのこの辺りをみると良さそう。
https://github.com/SteveLTN/https-portal#hybrid-setup-with-non-dockerized-apps

nginxコンテナの設定で、portsの所を8000:8000(ホスト:コンテナ)で指定している。
そのため、http://dockerhost:8000でnginxのコンテナにアクセスできる。(https-portalhttp://dockerhostでホストマシンにアクセス可)

まとめ

https-portalコンテナを入れただけですぐHTTPS化できた。
でも、とりあえず軽く読んで動かしてみただけなので深く理解できてない…。今後も使うことがありそうなのでもう少しちゃんと読みたいなー。
Dockerとかサーバー周りの知識とか全然ないので誰かアドバイスとか間違いの指摘とかあると思うので教えてください!

追記

このままコンテナを更新すると,毎回証明書を取得してしまうため、Let's Encryptの制限回数にひっかかってしまいます。
一回達すると一週間ぐらい発行できなくなり、泣きます…(´;ω;`)

その場合はdocker-compose.ymlのenvironmentに

FORCE_RENEW: 'false'

を追加することで、起動するたびに証明書の取得はしなくなります。