開発・運営しているWebサービス満点学習帳が、アップデートした際にうごかなくなってしまいました。
アップデート前のコードに戻したものの直らず。
dockerコンテナの状態を確認すると、https-portal
のコンテナがRestartを繰り返していました。
(ここに至るまでかなり時間がかかりました。次回からはまず$ docker container ls
ですべてのコンテナの起動状態を確認したいと思います)
https-portalとは
- https化するためのSSL証明書の取得と設定を全自動でやってくれるdockerコンテナ
- 満点学習帳ではAPIサーバーをhttps化するためにつかっています。
SSL証明書が取得できないエラー
$ docker logs コンテナID
でhttps-portal
コンテナのログを見てみると、証明書の取得ができないとのことでした。
SSL証明書の取得回数の制限を超えていた
ログをもうすこしよく読んでみると、Let's Encrypt
からSSL証明書を取得する回数の制限を超えているとのこと
。
Let's Encryptを読んでみると
主なレート制限としては、登録ドメインごとの証明書数 (1週間に50個まで) があります。
証明書の発行に使用されたリソースはすでに消費されているため、証明書を取り消してもレート制限はリセットされません。
どうやら1週間サービスを再開できなさそう。さすがにそれはマズイので、ドメインを変更することにしました。(APIサーバーなので変更して問題無し)
原因: https-portal
コンテナにvolumeを設定していなかった
ドメインを変更するまえに、なぜ制限を超えてしまったか調べてみると、https-portal
コンテナにvolumeを設定していないことが原因でした。
volumeを設定しないと、コンテナのビルド時やRestart時に毎回SSL証明書を取得するため、あっという間に制限回数を超えてしまうとのことです。
下はgithub: https-portalより拝借
version: '3'
https-portal:
image: steveltn/https-portal:1
ports:
- '80:80'
- '443:443'
links:
- wordpress
restart: always
environment:
DOMAINS: 'wordpress.example.com -> http://wordpress:80'
# STAGE: 'production' # Don't use production until staging works
# FORCE_RENEW: 'true'
volumes: # ここを書いていなかった
- https-portal-data:/var/lib/https-portal # ここを書いていなかった
wordpress:
image: wordpress
links:
- db:mysql
db:
image: mariadb
environment:
MYSQL_ROOT_PASSWORD: '<a secure password>'
volumes: # ここを書いていなかった
https-portal-data: # ここを書いていなかった
なぜ今までvolumeを設定せずにエラーが起こらなかったのか、なぜ今回エラーが起きてしまったのかは謎です。
とりあえずvolumeを設定し、ドメインを変更すると無事エラーは解決し、サービスを再開できました。