From 3fd4b0db86f1c3ab3cc4c62c49daf6a328e0eff1 Mon Sep 17 00:00:00 2001 From: User Date: Sun, 12 Jul 2026 16:32:00 +0200 Subject: [PATCH] feat(deploy): configurable backend HOST + env-driven vite base/assetsDir - backend: HOST env (default 127.0.0.1, dev-safe; 0.0.0.0 in container) - frontend: VITE_BASE drives base/assetsDir/manifest for portal embedding - backward compatible: no env => identical to previous behavior --- backend/src/config.ts | 3 ++- backend/src/server.ts | 2 +- backend/test/config.test.ts | 20 ++++++++++++++++++++ frontend/vite.config.ts | 18 +++++++++++------- 4 files changed, 34 insertions(+), 9 deletions(-) create mode 100644 backend/test/config.test.ts diff --git a/backend/src/config.ts b/backend/src/config.ts index d16dd5f8..1bae9bf8 100644 --- a/backend/src/config.ts +++ b/backend/src/config.ts @@ -1,5 +1,5 @@ export interface AppConfig { - port: number; harnessDir: string; thtBin: string; piBin: string; + host: string; port: number; harnessDir: string; thtBin: string; piBin: string; authMode: "none" | "mock" | "oidc"; defaults: { provider?: string; model?: string; thinking?: string }; maxPiProcesses: number; @@ -8,6 +8,7 @@ export interface AppConfig { } export function loadConfig(env: Record): AppConfig { return { + host: env.HOST ?? "127.0.0.1", port: Number(env.PORT ?? 8787), harnessDir: env.THT_HARNESS_DIR ?? "../harness", thtBin: env.THT_BIN ?? "tht", diff --git a/backend/src/server.ts b/backend/src/server.ts index ffc62349..6cef6b0d 100644 --- a/backend/src/server.ts +++ b/backend/src/server.ts @@ -2,5 +2,5 @@ import { buildApp } from "./app.js"; import { loadConfig } from "./config.js"; const config = loadConfig(process.env); const app = buildApp(config); -app.listen({ port: config.port, host: "127.0.0.1" }) +app.listen({ port: config.port, host: config.host }) .then((addr) => console.log(`backend listening on ${addr}`)); diff --git a/backend/test/config.test.ts b/backend/test/config.test.ts new file mode 100644 index 00000000..9786f513 --- /dev/null +++ b/backend/test/config.test.ts @@ -0,0 +1,20 @@ +import { test, expect } from "vitest"; +import { loadConfig } from "../src/config.js"; + +test("loadConfig espone host con default dev-safe 127.0.0.1", () => { + expect(loadConfig({})).toMatchObject({ host: "127.0.0.1" }); +}); + +test("loadConfig rispetta HOST esplicito (necessario in container)", () => { + expect(loadConfig({ HOST: "0.0.0.0" })).toMatchObject({ host: "0.0.0.0" }); +}); + +test("loadConfig merge altri campi con l'host", () => { + expect( + loadConfig({ HOST: "0.0.0.0", THT_BIN: "/opt/venv/bin/tht", PORT: "9000" }) + ).toMatchObject({ + host: "0.0.0.0", + thtBin: "/opt/venv/bin/tht", + port: 9000, + }); +}); diff --git a/frontend/vite.config.ts b/frontend/vite.config.ts index 6109f839..01a047cc 100644 --- a/frontend/vite.config.ts +++ b/frontend/vite.config.ts @@ -2,11 +2,15 @@ import { defineConfig } from "vite"; import react from "@vitejs/plugin-react"; import path from "path"; -export default defineConfig({ - plugins: [react()], - resolve: { - alias: { - "@": path.resolve(__dirname, "./src"), - }, - }, +export default defineConfig(() => { + const embedBase = process.env.VITE_BASE; // "/datamart-builder/assets/" in embedded; undefined = standalone + return { + plugins: [react()], + // base: prefisso pubblico degli asset. Default "/" (standalone). + // assetsDir vuoto in embedded → asset alla root di dist/ così il proxy + // /datamart-builder/assets/ → frontend-root mappa 1:1 (niente /assets/assets/). + base: embedBase ?? "/", + build: { manifest: true, outDir: "dist", assetsDir: embedBase ? "" : "assets" }, + resolve: { alias: { "@": path.resolve(__dirname, "./src") } }, + }; });