Dokkuのletsencryptプラグインの自動更新失敗後の手動更新

公式サイトdokku-letsencrypt のとおりに dokku letsencrypt:cron-job --add を実行して、dokkuユーザーのcrontabに自動更新コマンドが設定されていることは確認済みだったが、Let’s EncryptからSSL証明書の有効期限まであと20日ですよ、というメールが届いた。

更新コマンドの手動実行

更新コマンドを手動実行したがまだ証明書の有効期限が残ってるよ、と言われて更新できない。

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 gnoteubuntu$ 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