Skip to content

docs: document volatile ban/rate-limit state and the ACME contact email - #376

Merged
bihius merged 1 commit into
mainfrom
docs/upgrade-state-bans-acme
Oct 14, 2026
Merged

bihius merged 1 commit into
mainfrom
docs/upgrade-state-bans-acme

Conversation

@bihius

@bihius bihius commented Oct 14, 2026

Copy link
Copy Markdown
Owner

Found while running a beta.7 → beta.8 upgrade end to end from the published
kits on a test host.

Ban/rate-limit state is not persisted, contrary to what the install guide
said: both live in HAProxy stick-tables, which are held in the HAProxy
process's memory. A graceful reload — including Apply configuration, which
reloads through the master socket — starts a fresh worker with empty tables,
so every ban and every request counter is dropped; so does restarting or
recreating the container. Measured: a ban at gpc0=6 was gone (GET /security/banned-ips returned an empty list) right after an apply that only
added an unrelated vhost. A tag-only upgrade does not recreate the pinned
haproxy container, so the tables do survive that specific upgrade — but
nothing guarantees it.

  • Document the mechanism and its volatility in docs/architecture.md (the
    feature had no page there at all).
  • Correct the claim in release/README.md and add a "What an upgrade does not
    carry over" subsection covering both volatile pieces of state.

ACME contact address: ADMIN_EMAIL from the install guide's seed step is
also the ACME contact for the built-in certificate flow. Let's Encrypt rejects
reserved domains such as example.com at account registration, so a tester
who leaves the guide's you@example.com placeholder gets a cryptic failure on
every certificate request — verified against LE production: Unable to register an account with ACME server. The ACME server believes admin@example.com is an invalid email address. A note next to the example is enough to stop it.

Also noted while testing, not changed here: the renewal job
(app/services/scheduler.py) always uses admin@<vhost domain> as the ACME
contact instead of the creating admin's address, unlike the create path. It
only matters for a domain LE finds unacceptable, so it is left alone.

Docs only — no code, config or test changes.

The install guide claimed ban/rate-limit state is persisted in Docker
volumes. It is not: both live in HAProxy stick-tables, which a reload or a
recreated container starts empty, so a single "Apply configuration" drops
every ban and request counter. Document the mechanism in docs/architecture.md
and correct the claim in release/README.md, alongside what an upgrade does
carry over and what it does not — certbot's ACME account key and renewal
configuration sit in the backend container's /tmp, while the issued
certificate lives in the database and on the shared runtime volume.

The guide's ADMIN_EMAIL example is also the ACME contact for the built-in
certificate flow, and Let's Encrypt rejects reserved domains such as
example.com at account registration, which fails every certificate request
with a cryptic error. Say so next to the example.
Copilot AI balanced review requested due to automatic review settings October 14, 2026 19:10

Copilot AI left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Copilot was unable to review this pull request because the user who requested the review has reached their quota limit.

@bihius
bihius merged commit f8ecaab into main Oct 14, 2026
6 checks passed
@bihius
bihius deleted the docs/upgrade-state-bans-acme branch October 14, 2026 19:13
bihius added a commit that referenced this pull request Oct 14, 2026
Keeps #376's ban/rate-limit and ACME documentation, and applies the beta
wording to its rewritten beta-status paragraph.
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants