公式サイトdokku-letsencrypt のとおりに dokku letsencrypt:cron-job --add
を実行して、dokkuユーザーのcrontabに自動更新コマンドが設定されていることは確認済みだったが、Let's EncryptからSSL証明書の有効期限まであと20日ですよ、というメールが届いた。
Agenda
更新コマンドの手動実行
更新コマンドを手動実行したがまだ証明書の有効期限が残ってるよ、と言われて更新できない。
ubuntu$ dokku letsencrypt:ls
-----> App name Certificate Expiry Time before expiry Time before renewal
gnote 2019-08-03 14:20:12 19d, 22h, 20m, 21s 19d, 22h, 18m, 51s
ubuntu$ dokku letsencrypt:auto-renew
=====> Auto-renewing all apps...
gnote still has 19d, 22h, 18m, 24s days left before renewal
=====> Finished auto-renewal
gnote still has 19d, 22h, 18m, 24s days left before renewal
ubuntu$ dokku letsencrypt:auto-renew gnote
や ubuntu$ dokku letsencrypt gnote
などのコマンドも試したがNG。
Nginx再起動や、Nginxを停止してから上記コマンドの実行なども試したが、いずれも全く同じメッセージが返ってきた。
証明書の手動削除
仕方がないため手動で証明書を削除。
ubuntu$ dokku letsencrypt:revoke gnote
=====> Revoke Let's Encrypt certificate from gnote...
-----> Updating letsencrypt docker image...
latest: Pulling from dokkupaas/letsencrypt-simp_le
Digest: sha256:XXXXXXXXXXXXX
Status: Image is up to date for dokkupaas/letsencrypt-simp_le:latest
done updating
-----> Revoking letsencrypt certificate for gnote...
- Domain 'gnote.ujull.com'
darkhttpd/1.12, copyright (c) 2003-2016 Emil Mikulic.
listening on: http://0.0.0.0:80/
-----> Certificate revoked successfully.
-----> Removing SSL endpoint from gnote
-----> Configuring gnote.ujull.com...(using built-in template)
-----> Creating http nginx.conf
-----> Running nginx-pre-reload
Reloading nginx
nginx.service is not active, cannot reload.
done
証明書の再インストール
証明書インストールコマンド実行するも、うまくインストールされない。
ubuntu$ dokku letsencrypt gnote
=====> Let's Encrypt gnote
-----> Updating letsencrypt docker image...
latest: Pulling from dokkupaas/letsencrypt-simp_le
Digest: sha256:XXXXXXXXXXXXX
Status: Image is up to date for dokkupaas/letsencrypt-simp_le:latest
done updating
-----> Enabling ACME proxy for gnote...
nginx.service is not active, cannot reload.
ubuntu$ dokku letsencrypt:ls
-----> App name Certificate Expiry Time before expiry Time before renewal
$ dokku ps:stop gnote
で停止してから上記コマンドの実行したり、Dokkuのアプリを再起動してから実行したが、うまくいかず。
サーバーの再起動
ubuntu$ reboot
で再起動してからSSL証明書の再インストールをしたら、うまくいった。
自動更新が失敗した理由はよくわからなかったが、ひとまず手動更新で失敗する場合は、サーバー再起動を試してもよさそう。
原因が判明
DOKKU_LETSENCRYPT_GRACEPERIOD の設定を「90」と指定していたためだった。秒で指定するところを日と勘違いしていた。
デフォルトの「30」日=「2592000」秒で設定しなおして更新したらOKだった。
ubuntu$ dokku config:get --global DOKKU_LETSENCRYPT_GRACEPERIOD
90
ubuntu:ls
-----> App name Certificate Expiry Time before expiry Time before renewal
gnote 2019-10-12 16:07:11 19d, 20h, 24m, 26s 19d, 20h, 22m, 56s
ubuntu$ dokku config:set --global DOKKU_LETSENCRYPT_GRACEPERIOD=2592000
-----> Setting config vars
DOKKU_LETSENCRYPT_GRACEPERIOD: 2592000
ubuntu$ dokku letsencrypt:auto-renew
=====> Auto-renewing all apps...
-----> gnote needs renewal
=====> Let's Encrypt gnote
-----> Updating letsencrypt docker image...
latest: Pulling from dokkupaas/letsencrypt-simp_le
Digest: sha256:xxxxx
Status: Image is up to date for dokkupaas/letsencrypt-simp_le:latest
done updating
-----> Enabling ACME proxy for gnote...
-----> Getting letsencrypt certificate for gnote...
- Domain 'gnote.ujull.com'
darkhttpd/1.12, copyright (c) 2003-2016 Emil Mikulic.
listening on: http://0.0.0.0:80/
2019-09-22 12:32:23,012:INFO:__main__:1305: gnote.ujull.com was successfully self-verified
2019-09-22 12:32:23,205:INFO:__main__:1313: Generating new certificate private key
2019-09-22 12:32:29,749:INFO:__main__:391: Saving fullchain.pem
2019-09-22 12:32:29,750:INFO:__main__:391: Saving cert.pem
2019-09-22 12:32:29,751:INFO:__main__:391: Saving key.pem
-----> Certificate retrieved successfully.
-----> Installing let's encrypt certificates
-----> Configuring gnote.ujull.com...(using built-in template)
-----> Creating https nginx.conf
-----> Running nginx-pre-reload
Reloading nginx
-----> Configuring gnote.ujull.com...(using built-in template)
-----> Creating https nginx.conf
-----> Running nginx-pre-reload
Reloading nginx
-----> Disabling ACME proxy for gnote...
done
=====> Finished auto-renewal
ubuntu$ dokku letsencrypt:ls
-----> App name Certificate Expiry Time before expiry Time before renewal
gnote 2019-12-21 20:32:28 89d, 22h, 59m, 49s 59d, 22h, 59m, 49s
公式サイトにも以下のように Time in seconds left on a certificate
と書かれていたので秒で指定する必要あり。
Variable | Default | Description |
---|---|---|
DOKKU_LETSENCRYPT_EMAIL |
(none) | REQUIRED: E-mail address to use for registering with Let's Encrypt. |
DOKKU_LETSENCRYPT_GRACEPERIOD |
30 days | Time in seconds left on a certificate before it should get renewed |
DOKKU_LETSENCRYPT_SERVER |
default | Which ACME server to use. Can be 'default', 'staging' or a URL |