Skip to content

fix(portal): drop GC_CADDY_EMAIL preflight — ACME issues portal cert without an account email - #181

Merged
CallMeTechie merged 1 commit into
masterfrom
fix/portal-acme-email-preflight
Jun 25, 2026
Merged

CallMeTechie merged 1 commit into
masterfrom
fix/portal-acme-email-preflight

Conversation

@CallMeTechie

Copy link
Copy Markdown
Owner

Problem

Beim Umstellen der Portal-Domain auf eine verifizierte öffentliche Domain wurde der Save mit 400 abgelehnt:

„Eine öffentliche Domain benötigt eine konfigurierte ACME-E-Mail (GC_CADDY_EMAIL) für die Zertifikatsausstellung"

Ursache

Der Preflight in src/routes/api/settings/portal.js (if (base && !config.caddy.email) → 400) beruhte auf der falschen Annahme, Caddy stelle ohne Account-Email kein Zertifikat aus.

Das stimmt nicht: Let's Encrypt verlangt keine Account-Email. In Produktion ist GC_CADDY_EMAIL leer, apps.tls in der laufenden Caddy-Config ist null (buildTlsAutomation gibt bei leerer Email null zurück) — und trotzdem bekommen alle ~15 öffentlichen Route-Domains (nas/jellyfin/pihole.domaincaster.com …) gültige Zertifikate über Caddys Default-ACME-Automation. Der Portal-Host bekommt sein Cert über genau denselben Mechanismus.

Der Preflight war also ein Fehlalarm, der das Feature grundlos blockierte.

Fix

  • Preflight-Block entfernt — der Portal-Host wird wie jede Route über Caddys Default-ACME ausgestellt.
  • Toten i18n-Key settings.portal.host_requires_caddy_email aus beiden Locales entfernt.
  • tests/portal_settings_host.test.js läuft jetzt mit config.caddy.email === '' + neuer expliziter Regressionstest: „verifizierte öffentliche Domain wird OHNE GC_CADDY_EMAIL akzeptiert".

GC_CADDY_EMAIL bleibt optional (nur für LE-Ablauf-Benachrichtigungen, die Caddys Auto-Renew ohnehin überflüssig machen).

Tests

Volle Portal-Suite 60/60 grün lokal (inkl. neuem Regressionstest + i18n-Parität).

🤖 Generated with Claude Code

…without an account email

The public-host save was rejected with a 400 unless GC_CADDY_EMAIL was set, on the
assumption that Caddy silently fails issuance without it. That is wrong: Let's Encrypt
does not require an account email, and in production GC_CADDY_EMAIL is empty yet every
public route domain gets a valid cert via Caddy's default ACME automation (apps.tls is
null). The portal host gets its cert the same way. Remove the false guard + dead i18n
key; tests now run with caddy.email='' and assert a verified public domain is accepted.
@CallMeTechie
CallMeTechie merged commit 8e88a08 into master Jun 25, 2026
8 checks passed
@CallMeTechie
CallMeTechie deleted the fix/portal-acme-email-preflight branch June 25, 2026 08:20
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.

1 participant