DockerでPoundを使うのをやめてhttps-portalする(Synology DS1819+)

前回のDockerでPoundを使うはうまくいったので、そのままSSL対応までやろうかと思っていたのだがどうもNASのシステムを汚さずにやる方法がなさそうなことが分かった。

しょうがないのでPoundを諦めたら意外と便利なツールを見つけた・・・・けど凡ミスした。

2019/06/06現在,SSL認証死亡中。1週間我慢らしい。とほほ。

いままではWebサーバー上でPoundLet's Encrypt純正ツールを使ってSSL証明を取得していた。

今回、Synology NASの購入をきっかけに、外部アクセスを整理することにした。

経路はかなり多岐にわたるのですべてを記載することは避けるが、ざっくり書くとこんな感じ。

network-layout.png

SSLを各サーバー毎に管理するのではなく、リバースプロキシ上でまとめて管理するという方法。期限切れ、更新など管理上のメリットがある。

今まではWebサーバー系のマシンがすべてESXiだったので、物理マシンの入り口にPoundを設置して各仮想マシンに振っていた。今回、NASでサブドメインを有効利用しようと思った場合、結局他の物理マシンにアクセスを戻すという経路的な無駄が発生することになったため、Poundを上流のマシン(今回はNAS)に移動させようと思った次第。

今まで通り、NASのDocker上にPoundの設置でいいかと思っていたのだが、どうもLet's Encryptをまとめて片付ける方法が見つからない(正確にいえばNASのOSに変更を加えればできそうだった)。

NASのアップデート時に不安を抱えるのも嫌なので他のソリューションを探していたらいた。リバースプロキシとLet's EncryptのSSLを自動取得、更新してくれるすごいやつ。https-portalだ。

今回はDocker-composeは使わず、SynologyのGUI上から設定した。

設定についてだが、ポート設定は例えばこんな感じ。

ローカルポート
(ルーターからの転送ポート)
コンテナのポート
(固定値)
タイプ
(固定値)
4443 443 tcp
880 80 tcp
ルーターからのポートをコンテナのポートに割り振る。

次にボリューム。Docker内(動作時はオンメモリ)の設定ファイルを物理フォルダに割り当てる。
htmlは宛先を指定しない場合のコンテンツフォルダ。certsはSSL証明の保管フォルダ。
ファイル/フォルダ
(Volume内に自分で作成)
マウントパス
(固定値)
タイプ
docker/https-portal/html /var/www/vhosts rw
docker/https-portal/certs /var/lib/https-portal rw
最後に環境変数の設定。最低限追記しなければいけないのはこの2つ。
ドメインはアクセス元、転送先を -> でつなぐ。アクセス元だけ記載すると上記ボリューム先にドメイン名でコンテンツフォルダができる。STAGEはSSL証明取得の扱い。productionを選ぶと本気で取りに行くのだが、新規取得は週に5つという制限があるため、引っかかると1週間待つ必要がある。
DOMAINS XXX.YYY.JP , OOO.PPP.JP -> https://192.168.0.10
STAGE
staging or
local or production
今回はここで嵌った。例によって他のサイトを参考にしたのだが(ありがとうございます)、docker-composeの設定に「FORCE_RENEW: 'true'」をコメントアウトしろと書いてあるサイトが散見される。
作法なのかと思って例に倣っていたのだが、当然、起動毎に強制的にSSL証明を更新するため週5件制限にあっという間に引っかかってしまった。(dockerなので当然設定を変えるために停止→起動する)
確信が得られるまではSTAGEをstagingもしくはlocalで運用すべき。
あと、個人的な問題ではあるが、ブログの更新などに時間がかかる場合にリバースプロキシがタイムアウトすることがある。

413 Request Entity Too Large

このメッセージが出た場合は環境変数に
CLIENT_MAX_BODY_SIZE  100M (数字は任意)
を加えることで解決でき、

504 Gateway Time-out

このメッセージが出た場合は環境変数に以下の該当する変数
PROXY_CONNECT_TIMEOUT 60 (それぞれ60秒が標準なのでそれ以上に延ばす)
PROXY_SEND_TIMEOUT 60
PROXY_READ_TIMEOUT 60
を加えることで解決できる。