diff --git a/Dockerfile b/Dockerfile
index 440a7d3..36bdcb8 100644
--- a/Dockerfile
+++ b/Dockerfile
@@ -39,7 +39,7 @@ COPY packages/meta-fuse-core/src/ ./src/
RUN npm run build
# Stage 3: Build FUSE Driver
-FROM rust:1.83-bookworm AS fuse-builder
+FROM rust:1.86-bookworm AS fuse-builder
WORKDIR /build
diff --git a/docker/welcome.html b/docker/welcome.html
new file mode 100644
index 0000000..7acc16f
--- /dev/null
+++ b/docker/welcome.html
@@ -0,0 +1,2 @@
+
+
MetaFuseMetaFuse
diff --git a/packages/meta-fuse-core/src/api/APIServer.ts b/packages/meta-fuse-core/src/api/APIServer.ts
index f2492d9..4d59503 100644
--- a/packages/meta-fuse-core/src/api/APIServer.ts
+++ b/packages/meta-fuse-core/src/api/APIServer.ts
@@ -85,7 +85,40 @@ export class APIServer {
this.app.post('/api/fuse/rules/validate', this.handleValidateRule.bind(this));
this.app.get('/api/fuse/rules/variables', this.handleGetVariables.bind(this));
- // Note: /api/services is handled by nginx proxy to meta-core (centralized service discovery)
+ // Service discovery — proxies to meta-core's /api/services, resolving the
+ // current leader's URL via LeaderClient (no hardcoded hostname).
+ this.app.get('/api/services', this.handleServices.bind(this));
+ }
+
+ /**
+ * Proxy handler that forwards /api/services to meta-core's canonical
+ * registry endpoint using LeaderClient for discovery.
+ */
+ private async handleServices(_req: FastifyRequest, reply: FastifyReply): Promise {
+ try {
+ const leaderClient = this.kvManager?.getLeaderClient();
+ if (!leaderClient) {
+ reply.status(503).send({ error: 'KVManager not initialized' });
+ return;
+ }
+ const apiUrl = await leaderClient.getApiUrl();
+ if (!apiUrl) {
+ reply.status(503).send({ error: 'Leader not available yet' });
+ return;
+ }
+ const response = await fetch(`${apiUrl}/api/services`, {
+ signal: AbortSignal.timeout(5000),
+ });
+ if (!response.ok) {
+ reply.status(response.status).send({
+ error: `Upstream ${apiUrl} returned ${response.status}`,
+ });
+ return;
+ }
+ reply.send(await response.json());
+ } catch (err: any) {
+ reply.status(502).send({ error: err?.message ?? String(err) });
+ }
}
/**