Compare commits

...

2 Commits

Author SHA1 Message Date
3d443fa147 v11.12.1
Some checks failed
Docker (tags) / security (push) Failing after 3s
Docker (tags) / test (push) Has been skipped
Docker (tags) / release (push) Has been skipped
Docker (tags) / metadata (push) Has been skipped
2026-03-27 19:26:40 +00:00
2efdd2f16b fix(dcrouter): retry auto certificate provisioning after SmartAcme becomes ready 2026-03-27 19:26:39 +00:00
5 changed files with 40 additions and 3 deletions

View File

@@ -1,5 +1,12 @@
# Changelog # Changelog
## 2026-03-27 - 11.12.1 - fix(dcrouter)
retry auto certificate provisioning after SmartAcme becomes ready
- detects certificates that failed during startup before the DNS-01 provider was available
- clears provisioning backoff and failed status for affected domains before retrying
- re-triggers auto certificate provisioning for SmartProxy routes once SmartAcme is ready
## 2026-03-27 - 11.12.0 - feat(web-ui) ## 2026-03-27 - 11.12.0 - feat(web-ui)
pause dashboard polling, sockets, and chart updates when the tab is hidden pause dashboard polling, sockets, and chart updates when the tab is hidden

View File

@@ -1,7 +1,7 @@
{ {
"name": "@serve.zone/dcrouter", "name": "@serve.zone/dcrouter",
"private": false, "private": false,
"version": "11.12.0", "version": "11.12.1",
"description": "A multifaceted routing service handling mail and SMS delivery functions.", "description": "A multifaceted routing service handling mail and SMS delivery functions.",
"type": "module", "type": "module",
"exports": { "exports": {

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@serve.zone/dcrouter', name: '@serve.zone/dcrouter',
version: '11.12.0', version: '11.12.1',
description: 'A multifaceted routing service handling mail and SMS delivery functions.' description: 'A multifaceted routing service handling mail and SMS delivery functions.'
} }

View File

@@ -388,6 +388,36 @@ export class DcRouter {
await this.smartAcme.start(); await this.smartAcme.start();
this.smartAcmeReady = true; this.smartAcmeReady = true;
logger.log('info', 'SmartAcme DNS-01 provider is now ready'); logger.log('info', 'SmartAcme DNS-01 provider is now ready');
// Re-provision any certificates that failed during the startup window
// (before SmartAcme was ready — the certProvisionFunction returned 'http01'
// which fails because Rust ACME is disabled when certProvisionFunction is set)
if (this.smartProxy) {
const failedDomains = [...this.certificateStatusMap.entries()]
.filter(([_, status]) => status.status === 'failed')
.map(([domain]) => domain);
if (failedDomains.length > 0) {
logger.log('info', `Re-provisioning ${failedDomains.length} certificates that failed before SmartAcme was ready`);
// Clear backoff and status for failed domains — these failures were from the startup race
for (const domain of failedDomains) {
if (this.certProvisionScheduler) {
await this.certProvisionScheduler.clearBackoff(domain);
}
this.certificateStatusMap.delete(domain);
}
// Re-trigger provisioning for all auto-cert routes
const routes = this.smartProxy.routeManager.getRoutes();
for (const route of routes) {
const tls = (route as any).action?.tls;
if (tls && tls.certificate === 'auto') {
this.smartProxy.provisionCertificate(route.name).catch((err: any) => {
logger.log('warn', `Re-provision for route '${route.name}' failed: ${err?.message || err}`);
});
}
}
}
}
} }
}) })
.withStop(async () => { .withStop(async () => {

View File

@@ -3,6 +3,6 @@
*/ */
export const commitinfo = { export const commitinfo = {
name: '@serve.zone/dcrouter', name: '@serve.zone/dcrouter',
version: '11.12.0', version: '11.12.1',
description: 'A multifaceted routing service handling mail and SMS delivery functions.' description: 'A multifaceted routing service handling mail and SMS delivery functions.'
} }