https-portal があまり知られてないようなので紹介記事だけ書いとく。
https://github.com/SteveLTN/https-portal
あなたがすでにhttpで動作するサービスのdockerコンテナを持ってるなら、こいつを docker-compose に加えるだけで https 対応は完了。
え?
加えるだけで完了。
まじです。
https-portal は何をするものか
基本的には https のリクエストを受け取り、他のコンテナの http へ転送するリバースプロキシとして動作する nginx である。
ところで https を提供するには証明書の取得、設定などが必要だが、こいつはそれを全自動でやってくれる。
え?
証明書の取得、設定を全自動でやってくれる。
まじです。
期間延長も自動でやってくれるらしい。
まあとにかく便利なので、 Let's encrypt したい人は使わない手はないですね。
設定方法
冒頭のURL見れば全部書いてあるので改めて書くこと何もないのだけど、 Quick Start のとこだけコピペしてざっくり解説しておくと、
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
links:
- wordpress
restart: always
environment:
DOMAINS: 'wordpress.example.com -> http://wordpress'
# STAGE: 'production'
# FORCE_RENEW: 'true'
wordpress:
image: wordpress
links:
- db:mysql
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: '<a secure password>'
という感じ。 wordpress と db のとこは、おのおの公開したいwebサービスの設定と置き換わる。ポイントとなるのは https-portal.environment のあたり。
DOMAINS: 'wordpress.example.com -> http://wordpress'
左側が実際に公開したいドメイン名。 (当たり前だけどドメインは事前に取得しておく必要があり、 Let's encrypt が所有権を確認するためにはあらかじめDNSを設定しておく必要がある)
-> の右側は docker のコンテナ名。https-portal が受け取ったリクエストをこのURLへリダイレクトし、レスポンスをまたsslにして返却してくれるという感じ。
# STAGE: 'production'
これコメントアウトしておくと、Let's encrypt せずに、オレオレ証明書を用いたhttps プロキシとして動作してくれるのでまずはこれでローカル環境などで動作確認をする。うまくhttps通信ができることを確認できたら、コメントを外してパブリックな環境にデプロイし、DNSを向けると、自動的に証明書を取得、設定してくれる。