[Redmine] DockerでHTTPS対応


以下記事の続きです。
AWS環境にRedmineを構築し、ドメイン取得・DNS設定までを行なっています。

[AWS]ほぼ全自動Redmine構築
[AWS]Route53 ドメイン取得

本記事では、HTTP通信からHTTPS通信に切り替える方法を紹介します。
なお、本記事で使用するドメインは例としてwww.example.comとさせて頂きます。

対応方法

今回はletsencryptを使用します。
letsencryptは無料でSSL証明書を発行することができ、誰でもSSL/TLS通信を実現することができるサービスとなっています。
SSL証明書は申請や作成・設定に時間を要しますが、以下リポジトリはDockerコンテナ一つ立てることで証明書の取得・設定を全て自動で行なってくれます。

こんな便利なものを無料で展開してくれるなんて、とてもありがたいことです。。

READMEに書いてある通り、docker-compose.ymlを編集します。

docker-compose.yml
version: '3'
services:
  redmine:
    image: redmine:4.0.5
    restart: always
    container_name: redmine_container
    environment:
      - REDMINE_DB_POSTGRES=db
      - REDMINE_DB_USERNAME=postgres
      - REDMINE_DB_PASSWORD=postgres
      - VIRTUAL_HOST=www.example.com    <- ご自身のドメイン
    expose:
      - 3000
    volumes:
      - ./redmine/files:/usr/src/redmine/files
    links:
      - db
  db:
    image: postgres:10.3
    restart: always
    environment:
      - POSTGRES_USER=postgres
      - POSTGRES_PASSWORD=postgres
    volumes:
      - ./postgres/data:/var/lib/postgresql/data
  https-portal:
    image: steveltn/https-portal:latest
    ports:
      - '80:80'
      - '443:443'
    links:
      - redmine
    restart: always
    environment:
      DOMAINS: 'www.example.com -> http://redmine_container:3000'   <-ご自身のドメイン
      #STAGE: 'production'
      #FORCE_RENEW: 'true'

たったこれだけでSSL通信を実現することができます。
letsencryptは申請に制限があるため、最初は以下をコメントアウトしコンテナを立ち上げてください。
コメントアウトすることで、SSL証明書の代わりに自己証明でテストを行い証明書作成に問題がないか判定してくれます。

#STAGE: 'production'
#FORCE_RENEW: 'true'

コンテナを立ち上げましょう。

$ docker-compose up -d

ログの確認方法は以下の通りです。

$ docker ps
CONTAINER ID        IMAGE                          COMMAND                  CREATED             STATUS              PORTS                                      NAMES
a328ea2b95a3        steveltn/https-portal:latest   "/init"                  4 hours ago         Up 4 hours          0.0.0.0:80->80/tcp, 0.0.0.0:443->443/tcp   redminedocker_https-portal_1
f24edf5e687f        redmine:4.0.5                  "/docker-entrypoint.…"   4 hours ago         Up 4 hours          3000/tcp                                   redmine_container
8f51137977c3        postgres:10.3                                           4 hours ago         Up 4 hours          5432/tcp                                   redminedocker_db_1
$ docker logs a328ea2b95a3

ログを確認し無事成功していると、以下のような出力となるはずです。

Found domains: www.example.com
Getting directory...
Directory found!
Registering account...
Registered!
Creating new order...
Order created!
Verifying www.example.com...
www.example.com verified!
Signing certificate...

成功していたら、コメントアウトを戻しコンテナを再度立ち上げましょう。
また、以前作成したAWSでのセキュリティグループがHTTPSを許可していないと思います。
コンソールからインバウンドでHTTPSを通すよう設定してください。

ブラウザからご自身のドメインをhttpsで叩いてみてください。

以上で、HTTPS対応は完了です。

終わりに

letsencryptは大変素晴らしいサービスですが、信頼性がやや劣るため商用利用するサービスでは普通にSSL証明書を購入しましょう。