mirror of
https://github.com/fosrl/pangolin.git
synced 2026-07-21 17:34:41 -05:00
[GH-ISSUE #3243] Support using external certificates (file provider / BYOC, no ACME) with the cert scraper #30173
Reference in New Issue
Block a user
Originally created by @L0sWach0s on GitHub (Jun 11, 2026).
Original GitHub issue: https://github.com/fosrl/pangolin/issues/3243
Originally assigned to: @oschwartz10612 on GitHub.
Describe the Bug
When Pangolin runs with externally managed certificates — Traefik serves certificates
from a file provider (e.g. wildcard certs issued by
acme.sh) and no Traefik ACMEcertResolveris configured — the dashboard shows the certificate status forresources/domains as
pendingpermanently.HTTPS works correctly the whole time (Traefik picks the matching certificate from the
file-provider store via SNI), so this is purely a status/UI issue: Pangolin never learns
that a valid certificate already exists for the domain, because the only code path that
marks a certificate
validis the ACME cert sync, which doesn't apply to afile-provider / BYOC deployment.
Environment
fosrl/pangolin:ee-1.18.4)To Reproduce
certResolver.config.ymlsettraefik.cert_resolver: "".privateConfig.yml→flags.enable_acme_cert_sync: false.Actual result: the certificate status stays
Pendingindefinitely, even though theresource is reachable over HTTPS with a valid certificate the whole time (Traefik selects
the matching cert from the file-provider store via SNI).
Expected Behavior
The dashboard should reflect that a valid certificate is being served — or expose a
"bring your own certificate" / "externally managed" state — instead of showing
pendingforever.
Why it stays
pending(from reading the source):certificatestable defaultsstatustopending(
server/setup/scriptsSqlite/1.11.0.ts; status enum inserver/routers/certificates/types.ts:pending, requested, valid, expired, failed).status: "valid"is the ACME cert-sync logic(
server/private/lib/acmeCertSync.ts), which reads Traefik'sacme.jsonor an HTTPendpoint exposing issued certs.
acme.jsonand no ACME flow, so nothing evertransitions the record from
pendingtovalid.Possible fixes (any one):
pendingstatus and ACME logic for it.
mark it
validindependent of ACME.acmeCertSyncingest PEM certs from a directory, not only Traefikacme.json.Note: this is not a functional bug — routing and TLS work correctly. It's confusing
because the UI permanently implies the certificate is incomplete.
@AstralDestiny commented on GitHub (Jun 11, 2026):
Cert is what self signed elsewhere or in the acme.json?
@AstralDestiny commented on GitHub (Jun 11, 2026):
Will answer better detail after shower
@L0sWach0s commented on GitHub (Jun 11, 2026):
For clarity, here's how the cert is wired in — Traefik's file provider loads the
PEM files that
acme.shproduced; there is nocertificatesResolversblock:acme.sh(running in its own container) obtains/renews the cert from a public CA viaDNS-01 and writes
fullchain.cer+ the private key to/opt/certs/.... Traefik justserves it via SNI (
watch: truepicks up renewals automatically). Noacme.json, noself-signed cert — a fully browser-trusted certificate that Traefik did not issue.
@AstralDestiny commented on GitHub (Jun 11, 2026):
Well sni and snistrict are vastly different things but can ask the certificate status does check only against the acme.json populated data and doesn't look for stuff provided elsewhere outside of that.
@AstralDestiny commented on GitHub (Jun 11, 2026):
I assume you have multiple RP's for this and you ust only want the cert that is generated off site or elsewhere to distribute it to the other hosts?
@AstralDestiny commented on GitHub (Jun 11, 2026):
Sorry for additional messages or whatnot I'm responding from within discord even though I know I can update my edits to messages though that hits github's rate limits faster annoyingly.
@oschwartz10612 commented on GitHub (Jun 11, 2026):
Right now as I think you figured we only support the acme.json file but I agree that we should support pulling certs from the file provider as this would be a common use case. I will mark this as such and we can see if we can fit it in.