From f6a7143d1bbd490d00b45b8dd53aa272c7744d7b Mon Sep 17 00:00:00 2001 From: Patrick Plate Date: Sat, 13 Jun 2026 09:44:21 +0200 Subject: [PATCH] fix(frontend): guard metadataBase against undefined BASE_URL Root cause of the SSG/page-data build crash: src/app/layout.tsx evaluated new URL(process.env.BASE_URL) at module load. BASE_URL was never set as a build-time ENV, so it was undefined -> ERR_INVALID_URL, input: 'undefined'. Because this is the root layout, its metadata is collected for every route, explaining why both /impressum (marketing) and /portal-login (non-marketing) failed identically. The earlier NextAuth/middleware/force-dynamic fixes could not help because metadata evaluation happens before any of that. - layout.tsx: fall back to http://localhost:3000 when BASE_URL is unset - Dockerfile: add BASE_URL build-time placeholder (matches AUTH_URL pattern) --- cannamanage-frontend/Dockerfile | 1 + cannamanage-frontend/src/app/layout.tsx | 5 ++++- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/cannamanage-frontend/Dockerfile b/cannamanage-frontend/Dockerfile index 346b785..45039fe 100644 --- a/cannamanage-frontend/Dockerfile +++ b/cannamanage-frontend/Dockerfile @@ -20,6 +20,7 @@ ENV AUTH_SECRET=build-time-placeholder-secret-minimum-32-characters ENV NEXTAUTH_SECRET=build-time-placeholder-secret-minimum-32-characters ENV AUTH_TRUST_HOST=1 ENV BACKEND_URL=http://localhost:8080 +ENV BASE_URL=http://localhost:3000 RUN pnpm build FROM base AS runner diff --git a/cannamanage-frontend/src/app/layout.tsx b/cannamanage-frontend/src/app/layout.tsx index bf48909..39af928 100644 --- a/cannamanage-frontend/src/app/layout.tsx +++ b/cannamanage-frontend/src/app/layout.tsx @@ -22,7 +22,10 @@ export const metadata: Metadata = { default: "CannaManage", }, description: "Cannabis club management platform — CannaManage", - metadataBase: new URL(process.env.BASE_URL as string), + // Guard against undefined BASE_URL: `new URL(undefined)` throws ERR_INVALID_URL + // during Next.js "Collecting page data" (root layout metadata is evaluated for + // every route). Falls back to localhost; real value injected at runtime via env. + metadataBase: new URL(process.env.BASE_URL ?? "http://localhost:3000"), manifest: "/manifest.json", themeColor: "#2ECC71", appleWebApp: {