feat(admin-ui): add configurable Admin UI domain routing
This commit is contained in:
@@ -10,15 +10,20 @@
|
||||
|
||||
import { logger } from '../logging.ts';
|
||||
import { getErrorMessage } from '../utils/error.ts';
|
||||
import { normalizeHostname } from '../utils/domain.ts';
|
||||
import { OneboxDatabase } from './database.ts';
|
||||
import { SmartProxyManager } from './smartproxy.ts';
|
||||
|
||||
const adminUiRouteName = 'onebox-admin-ui';
|
||||
const adminUiPort = 3000;
|
||||
|
||||
interface IProxyRoute {
|
||||
domain: string;
|
||||
targetHost: string;
|
||||
targetPort: number;
|
||||
serviceId: number;
|
||||
serviceId?: number;
|
||||
serviceName?: string;
|
||||
routeType: 'service' | 'admin-ui';
|
||||
}
|
||||
|
||||
export class OneboxReverseProxy {
|
||||
@@ -112,6 +117,7 @@ export class OneboxReverseProxy {
|
||||
targetPort,
|
||||
serviceId,
|
||||
serviceName,
|
||||
routeType: 'service',
|
||||
};
|
||||
|
||||
this.routes.set(domain, route);
|
||||
@@ -127,6 +133,25 @@ export class OneboxReverseProxy {
|
||||
}
|
||||
}
|
||||
|
||||
async addAdminUiRoute(domain: string): Promise<void> {
|
||||
const normalizedDomain = normalizeHostname(domain);
|
||||
if (!normalizedDomain) return;
|
||||
|
||||
const targetHost = this.getAdminUiTargetHost();
|
||||
const route: IProxyRoute = {
|
||||
domain: normalizedDomain,
|
||||
targetHost,
|
||||
targetPort: adminUiPort,
|
||||
serviceName: adminUiRouteName,
|
||||
routeType: 'admin-ui',
|
||||
};
|
||||
|
||||
this.routes.set(normalizedDomain, route);
|
||||
const upstream = `${targetHost}:${adminUiPort}`;
|
||||
await this.smartProxy.addRoute(normalizedDomain, upstream);
|
||||
logger.success(`Added Admin UI proxy route: ${normalizedDomain} -> ${upstream}`);
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a route
|
||||
*/
|
||||
@@ -166,6 +191,11 @@ export class OneboxReverseProxy {
|
||||
}
|
||||
}
|
||||
|
||||
const adminUiDomain = this.getAdminUiDomain();
|
||||
if (adminUiDomain) {
|
||||
await this.addAdminUiRoute(adminUiDomain);
|
||||
}
|
||||
|
||||
logger.success(`Loaded ${this.routes.size} proxy routes`);
|
||||
} catch (error) {
|
||||
logger.error(`Failed to reload routes: ${getErrorMessage(error)}`);
|
||||
@@ -173,6 +203,18 @@ export class OneboxReverseProxy {
|
||||
}
|
||||
}
|
||||
|
||||
private getAdminUiDomain(): string {
|
||||
return normalizeHostname(this.database.getSetting('adminUiDomain') || '');
|
||||
}
|
||||
|
||||
private getAdminUiTargetHost(): string {
|
||||
const serverIP = this.database.getSetting('serverIP');
|
||||
if (!serverIP) {
|
||||
logger.warn('serverIP is not configured; Admin UI proxy route will use host.docker.internal');
|
||||
}
|
||||
return serverIP || 'host.docker.internal';
|
||||
}
|
||||
|
||||
/**
|
||||
* Add TLS certificate for a domain
|
||||
* Sends PEM content to SmartProxy via Admin API
|
||||
|
||||
Reference in New Issue
Block a user