feat: add dcrouter external gateway sync

This commit is contained in:
2026-04-29 15:24:25 +00:00
parent 1f3705fa25
commit 7ee740695f
12 changed files with 643 additions and 6 deletions
+32 -2
View File
@@ -34,6 +34,24 @@ export class OneboxServicesManager {
);
}
private async syncExternalGatewayRoute(service: IService): Promise<void> {
if (!this.oneboxRef.externalGateway) return;
try {
await this.oneboxRef.externalGateway.syncServiceRoute(service);
} catch (error) {
logger.warn(`Failed to sync external gateway route for ${service.domain}: ${getErrorMessage(error)}`);
}
}
private async deleteExternalGatewayRoute(service: Pick<IService, 'id' | 'name' | 'domain'>): Promise<void> {
if (!this.oneboxRef.externalGateway) return;
try {
await this.oneboxRef.externalGateway.deleteServiceRoute(service);
} catch (error) {
logger.warn(`Failed to delete external gateway route for ${service.domain}: ${getErrorMessage(error)}`);
}
}
/**
* Deploy a new service (full workflow)
*/
@@ -210,6 +228,8 @@ export class OneboxServicesManager {
// Note: SSL certificates are now handled automatically by CertRequirementManager
// which processes pending requirements created above. No direct obtainCertificate call needed.
await this.syncExternalGatewayRoute(this.database.getServiceByName(options.name)!);
}
logger.success(`Service deployed successfully: ${options.name}`);
@@ -252,6 +272,8 @@ export class OneboxServicesManager {
} catch (routeError) {
logger.warn(`Failed to add proxy route for ${service.domain}: ${getErrorMessage(routeError)}`);
}
await this.syncExternalGatewayRoute(this.database.getServiceByName(name)!);
}
logger.success(`Service started: ${name}`);
@@ -291,7 +313,8 @@ export class OneboxServicesManager {
// Remove reverse proxy route if service has a domain
if (service.domain) {
this.oneboxRef.reverseProxy.removeRoute(service.domain);
await this.oneboxRef.reverseProxy.removeRoute(service.domain);
await this.deleteExternalGatewayRoute(service);
}
logger.success(`Service stopped: ${name}`);
@@ -359,6 +382,8 @@ export class OneboxServicesManager {
logger.warn(`Failed to remove reverse proxy route: ${getErrorMessage(error)}`);
}
await this.deleteExternalGatewayRoute(service);
// Note: We don't remove DNS records or SSL certs automatically
// as they might be used by other services or need manual cleanup
}
@@ -617,10 +642,12 @@ export class OneboxServicesManager {
// Remove old route if it existed
if (oldDomain) {
try {
this.oneboxRef.reverseProxy.removeRoute(oldDomain);
await this.oneboxRef.reverseProxy.removeRoute(oldDomain);
} catch (error) {
logger.warn(`Failed to remove old reverse proxy route: ${getErrorMessage(error)}`);
}
await this.deleteExternalGatewayRoute({ ...service, domain: oldDomain });
}
// Add new route if domain specified
@@ -650,6 +677,9 @@ export class OneboxServicesManager {
}
const refreshedService = this.database.getServiceByName(name)!;
if (refreshedService.domain && refreshedService.status === 'running') {
await this.syncExternalGatewayRoute(refreshedService);
}
await this.broadcastServiceUpdate(name, 'updated');
return refreshedService;
} catch (error) {