Hyper.shでSSL接続するアプリの継続的デプロイ(まだ決定打なしのイマイチな方法)

 Dockerコンテナでアプリを運用したい場合、Hyper.shがイカす。そのHyper.shで、Let's encryptで取得する証明書を使ってHTTPSで接続できるようにしてみる。

Serviceを使う
→コンテナ立ち上げコマンドで証明書を引数として渡している。Let's encryptは証明書の有効期間が短いから自動更新を繰り返していきたいんだけど、そのたびにコンテナを立ち上げ直さなきゃならない?それをクリアできるならば一番いい方法

・アプリコンテナにリバースプロキシを入れてごにょごにょ
→アプリコンテナがちょいややこしくなるのと後述する理由でナシ

・アプリコンテナの外にリバースプロキシコンテナを用意して接続
https-portalという、超簡単にLet's encryptの証明書でSSLを使えるようにしてくれるコンテナがある。これを使って今回はやってみるが、結果は問題が残った。

 https-portalのGithubページのサンプルをちょっといじったdocker-compose.ymlを書く。
docker-compose.yml

version: '2'

services:
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
environment:
DOMAINS: 'example.com -> http://dncindocker'
STAGE: 'production'
FORCE_RENEW: 'true'
fip: xxx.xxx.xxx.xxx
dncindocker:
image: matoba/dncindocker:latest

 こいつをHyper.shへ。
hyper compose -up d -p foo

これで一分ほど待てばアプリのデプロイが完了するだろう。このコマンドに加えて下記のコマンドでプロジェクト消去コマンドがあれば、デプロイを容易にサイクル化できる。
hyper compose rm -v -p foo


 で、この方法はデプロイするたびにhttps-portalコンテナが証明書を取りに行く。これが問題となる。じっさいデプロイを何度も試しているうちに遭遇したのが、証明書の期間あたりの取得上限。変更がなければ週に20回までのようだ。これに達すれば証明書の発行はいったんストップするので、https-portalコンテナが正常な動作をしなくなる。そういうわけで、https-portalコンテナをデプロイの度に動かし直すのはよくない。コンテナのデプロイを分けなければならない。そうしたらそうしたで、デプロイの度にどうやってhttps-portalコンテナからアプリコンテナへの接続をやるかという課題が生まれる。
 そういうわけでLet's encrypt + 継続的デプロイのプロセスの確立に失敗した。

解決のために取るべき方法
・Serviceで証明書の自動更新と継続的デプロイができるか調査
・リバースプロキシコンテナとアプリコンテナをComposeで管理しない。リバースプロキシコンテナは動かしっぱなし、アプリコンテナだけを更新。走りっぱなしのリバースプロキシコンテナからアプリコンテナへの接続手段を得る。
comment: 0