Let's Encrypt
OwnStack stacks ship with the dokku-letsencrypt plugin pre-installed. It uses the ACME HTTP-01 challenge by default, runs renewals nightly, and reloads nginx automatically when certs roll.
HTTP-01 challenge: how it works
- You add a domain to an app and Let's Encrypt issuance is triggered (automatic on
app domains:add). - The plugin spins up a temporary web server that responds to
http://<domain>/.well-known/acme-challenge/<token>with a known signature. - Let's Encrypt's prober fetches that URL — for this to work, your DNS must resolve and port 80 must be reachable from the internet.
- If the prober gets the right response, Let's Encrypt issues a cert.
- Plugin installs the cert, reloads nginx, traffic is now HTTPS.
Renewals
Certs are valid for 90 days; the plugin renews 30 days before expiry. Cron job runs nightly. Manual renewal:
$ ssh dokku@<stack-ip> letsencrypt:auto-renew <app>
Inspecting
$ ssh dokku@<stack-ip> certs:report <app>
Ssl enabled: true
Ssl hostnames: example.com www.example.com
Ssl expires at: Aug 1 02:14:27 2026 GMT
Ssl issuer: C = US, O = Let's Encrypt, CN = R10
$ ssh dokku@<stack-ip> letsencrypt:list
App name Certificate Expiry Time before expiry
my-app 2026-08-01 02:14:27 2m 25d
Account email
Let's Encrypt requires an account email for renewal notices. Set it once per app or per stack:
$ ssh dokku@<stack-ip> letsencrypt:set --global email you@example.com
Rate limits
Let's Encrypt rate-limits at:
- 50 certs per registered domain per week. Includes renewals — enough for almost everyone.
- 5 failed authorizations per hostname per hour. If you misconfigured DNS and tried five times, you're blocked for the rest of the hour.
- 5 duplicate certs per week. If your hostnames don't change, no concern.
If you get rate-limited, fix the underlying issue (DNS, port 80) and wait. Don't keep retrying — it counts against you.
When HTTP-01 won't work
- Wildcards — must use DNS-01. See Wildcard certs.
- Port 80 closed — corporate firewall, weird CDN setup. Use DNS-01 or supply your own cert.
- Internal-only domains — Let's Encrypt's prober has to reach your domain from the public internet.