I’m getting to that point of desperation, because trying to have the Discourse Bot or Claude to fix this issue, seems impossible. I can’t really explain the issue, because I’m not that knowledgable, and I believe that’s what is really bothering me.
I will try to explain what happened, from my point of view.
When I was converting from single container to dual container, the file in samples/ used web-only and I left it by mistake instead of using web_only.
Then, because of that (I believe), my images weren’t loading, because one “thing” was expected to point to web_only, but it was set to web-only. Made some changes and the images were fixed. not the issue is the LetsEncrypt certificates.
I asked the bot to help me fix it, it told me to wait for the next day, because the issue was the certificates rate-limit. The issue was gonna get fixed. It didn’t. Then asked it again, then asked Claude, then Claude again… and we’ve been in this “wait until tomorrow at X hours and it WILL get fixed” for the past week. It never gets fixed, they both say “oh, I’m sorry, I shouldn’t have assumed it would get fixed, let’s try this instead, because now it will really get fixed”. It never does.
The website itself is up and running, but I feel that every time I want to rebuild, something will happen, and to be honest I don’t want to rely on bandaids all the time.
Claude told me to add something to the hooks in web_only.yml but since nothing like that is mentioned in the instructions provided here on the forum, I was expecting something other solution, such as… solving the actual problem.
Can someone please help me figure out what the issue is, and where things are breaking? I would really appreciate it, because it’s exhausting at this point. Not the work, but not understanding what’s happening and why the “wait until tomorrow” never seems to fix anything.
Thanks!
I asked Claude to explain what the issue seems to be, maybe that helps? Here’s what it said:
Title: Two-container setup: ECC cert folder missing after split, --force loop hitting rate limit every boot
Setup: Two containers (data + web_only), migrated from standalone. Templates: web, ratelimited, ssl, letsencrypt, cloudflare. Hostname alltiago.com, no aliases.
Symptom: Every web_only start hits the Let’s Encrypt rate limit and nginx fails to serve, returning connection errors until the ECC lines are manually removed from /etc/nginx/conf.d/outlets/server/20-https.conf.
What I found:
/shared/letsencrypt/alltiago.com_ecc/ does not exist on my install. /shared/letsencrypt/alltiago.com/ (RSA) exists and works fine, renewing normally.
In web.letsencrypt.ssl.template.yml:
cert_exists() {
[[ "$(cd ${LETSENCRYPT_DIR}/${DISCOURSE_HOSTNAME}$1 && openssl verify -CAfile <(openssl x509 -in ca.cer) fullchain.cer | grep "OK")" ]]
}
issue_cert "ec-256"
if ! cert_exists "_ecc"; then
issue_cert "ec-256" "--force"
fi
Because the directory is missing, cert_exists "_ecc" fails on every boot, so --force runs and requests a brand new ECC cert regardless of what’s on disk. This is via the after_ssl hook that patches /etc/runit/1.d/install-ssl, so it runs on every container start, not just bootstrap.
Result: 429 too many certificates (5) already issued for this exact set of identifiers in the last 168h. Then --installcert runs anyway against the empty directory and writes an unusable /shared/ssl/alltiago.com_ecc.cer. nginx is configured with both certs, can’t load the ECC one, and won’t serve.
Confirmed working: ACME HTTP-01 validation succeeds (tested via staging, ECC cert issued fine against letsencrypt_test, correct directory structure created). RSA cert renewed successfully today. So this is not DNS, firewall, or validation.
Questions:
- Is there a supported way to recreate
alltiago.com_ecc/without waiting out the rate limit? - Should
cert_existsreturning false really trigger--forcerather than a normal issue?--forcebypasses the “existing valid cert” check and guarantees rate-limit exhaustion when the directory is absent. - Is there a documented way to run RSA-only?
Two factual notes so the thread doesn’t go sideways: the retry date moved from Aug 27 to Aug 29 because the RSA renewal today consumed a slot in the rolling 168-hour window. And the reason nobody else reports this is that on a normal install both directories are created at first boot and the --force branch never runs.