@samitouri / QOSami-HFS / commits / 9cdbd4b3

admin/home: report certificate renewing errors

Massimo Melina committed Oct 6, 2024 at 11:02 UTC 9cdbd4b3f011580eab7a77a091fd3b7b950a3100
3 files changed +6 -1
admin/src/HomePage.ts
+1
@@ -60,6 +60,7 @@ export default function HomePage() {
60 _.map(serverErrors, (v,k) => k + " " + (v ? "is in error" : "is off")).join(', '),
61 !errors.length && [ SOLUTION_SEP, cfgLink("switch http or https on") ]
62 ),
63 + with_(status.acmeRenewError, x => x && entry('warning', x)),
64 plugins.find(x => x.badApi) && entry('warning', "Some plugins may be incompatible"),
65 !cfg.data?.split_uploads && (Date.now() - Number(status.cloudflareDetected || 0)) < DAY
66 && entry('', wikiLink('Reverse-proxy#cloudflare', "Cloudflare detected, read our guide")),
src/acme.ts
+3 -1
@@ -106,8 +106,10 @@ export const makeCert = debounceAsync(async (domain: string, email?: string, alt
106 await fs.writeFile(KEY_FILE, res.key)
107 cert.set(CERT_FILE) // update config
108 privateKey.set(KEY_FILE)
109 + acmeRenewError = ''
110 })
111
112 +export let acmeRenewError = ''
113 const acmeDomain = defineConfig('acme_domain', '')
114 const acmeEmail = defineConfig('acme_email', '')
115 const acmeRenew = defineConfig('acme_renew', false) // handle config changes
@@ -125,6 +127,6 @@ const renewCert = debounceAsync(async () => {
127 if (now > new Date(cert.validFrom) && now < validTo && validTo.getTime() - now.getTime() >= 30 * DAY)
128 return console.log("certificate still good")
129 await makeCert(domain, acmeEmail.get(), altNames)
128 - .catch(e => console.log(`error renewing certificate, expiring ${validTo.toLocaleDateString()}:`, String(e.message || e)))
130 + .catch(e => console.log(acmeRenewError = `Error renewing certificate, expiring ${validTo.toLocaleDateString()}: ${String(e.message || e)}`))
131 }, { retain: DAY, retainFailure: HOUR })
132
src/adminApis.ts
+2
@@ -38,6 +38,7 @@ import { SendListReadable } from './SendList'
38 import { get_dynamic_dns_error } from './ddns'
39 import { addBlock, BlockingRule } from './block'
40 import { alerts, getProjectInfo } from './github'
41 +import { acmeRenewError } from './acme'
42
43 export const adminApis = {
44
@@ -130,6 +131,7 @@ export const adminApis = {
131 proxyDetected: getProxyDetected(),
132 cloudflareDetected,
133 ram: process.memoryUsage.rss(),
134 + acmeRenewError,
135 frpDetected: localhostAdmin.get() && !getProxyDetected()
136 && getConnections().every(isLocalHost)
137 && await frpDebounced(),