Each service represents a domain that Wild Central manages. When a service is registered,
Central creates DNS entries, proxy routes, and optionally provisions TLS certificates
and public DNS records.
),
});
const handleShowAdvanced = async () => {
if (!showAdvanced) {
setLoadingAdvanced(true);
try {
const result = await haproxyApi.getConfig();
setAdvancedConfig(result.content || '');
} catch {
setAdvancedConfig('# Could not load HAProxy config');
}
setLoadingAdvanced(false);
}
setShowAdvanced(!showAdvanced);
};
return (
{/* Page header */}
Services
Registered domains and their networking status
setShowAddForm(!showAddForm)} className="gap-1">
Add Service
{/* Add Service Form */}
{showAddForm && (
setNewSubdomains(e.target.checked)} className="rounded" />
Include wildcard subdomains (*.domain)
setShowAddForm(false)}> Cancel
registerMutation.mutate({
domain: newDomain,
backend: { address: newBackendAddr, type: newBackendType },
reach: newReach,
subdomains: newSubdomains,
source: 'manual',
})}
>
{registerMutation.isPending ? : }
Register
)}
{/* Loading */}
{isServicesLoading && (
Loading services...
)}
{/* Empty state */}
{!isServicesLoading && services.length === 0 && (
No Services
Services appear here when Wild Cloud or Wild Works registers domains,
or add one manually.
)}
{/* Service Cards */}
{services.map(service => {
const isExpanded = expandedDomain === service.domain;
const tlsStatus = getTlsStatus(service, certDomains);
const ddnsStatus2 = service.reach === 'public' ? 'ok' as const : 'na' as const;
return (
setExpandedDomain(isExpanded ? null : service.domain)}
className="w-full px-4 py-3 text-left hover:bg-muted/30 transition-colors"
>
{isExpanded ?
: }
{service.subdomains ? `*.${service.domain}` : service.domain}
{service.backend.type === 'tcp-passthrough' ? 'L4' : 'L7'}
{service.reach}
{isExpanded && (
DNS (LAN)
{service.backend.type === 'tcp-passthrough'
? `→ ${service.backend.address.split(':')[0]}`
: `→ ${globalConfig?.cloud?.dnsmasq?.ip ?? '(Central IP)'}`}
{service.reach === 'public' && (
DNS (Public)
A record → {publicIp ?? '—'}
)}
Proxy
{getProxyLabel(service)}
TLS
{getTlsLabel(service, certDomains)}
Backend: {service.backend.address}
Source: {service.source}
{ e.stopPropagation(); deregisterMutation.mutate(service.domain); }}
disabled={deregisterMutation.isPending}
>
{deregisterMutation.isPending ? : }
Deregister
)}
);
})}
{/* Advanced */}
Advanced
{loadingAdvanced ?
: showAdvanced ?
: }
generateHaproxy()} disabled={isHaproxyGenerating} size="sm" className="gap-1">
{isHaproxyGenerating ? : }
Generate & Apply
restartHaproxy()} disabled={isHaproxyRestarting} size="sm" className="gap-1">
{isHaproxyRestarting ? : }
Restart HAProxy
{haproxyGenerateData && (
{haproxyGenerateData.message}
)}
{haproxyGenerateError && (
{(haproxyGenerateError as Error).message}
)}
);
}