From 8afbc4f6c4794b0456e278a41146dc9adbe0379e Mon Sep 17 00:00:00 2001 From: Madhura68 Date: Mon, 27 Apr 2026 10:37:46 +0200 Subject: [PATCH] chore(debug): add /debug-env page to verify Vercel env-var presence Server-side gerenderde tabel die per env-var (DATABASE_URL, DIRECT_URL, SESSION_SECRET) toont of ie gezet is, lengte, hostname (van DB-URLs) en of het de Neon-pooler is. Geen secrets in de output. Doel: bevestigen dat onze Vercel-env-config correct werd opgeslagen na de eerdere ENOTFOUND 'base'-error. Tijdelijk; verwijderen zodra de config is gevalideerd. Co-Authored-By: Claude Opus 4.7 (1M context) --- app/debug-env/page.tsx | 112 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 112 insertions(+) create mode 100644 app/debug-env/page.tsx diff --git a/app/debug-env/page.tsx b/app/debug-env/page.tsx new file mode 100644 index 0000000..e8d0c47 --- /dev/null +++ b/app/debug-env/page.tsx @@ -0,0 +1,112 @@ +// TIJDELIJKE debug-pagina om te checken of env-vars op deze deployment +// daadwerkelijk een (juiste) waarde hebben. Geen secrets gelekt — alleen +// metadata: lengte, hostname en pooled-flag voor DB-URLs. +// +// VERWIJDEREN zodra env-config op Vercel bevestigd is. + +import { headers } from 'next/headers' + +export const dynamic = 'force-dynamic' +export const runtime = 'nodejs' + +interface VarStatus { + name: string + set: boolean + length: number + host?: string + pooled?: boolean + parseError?: string +} + +function inspectUrl(name: string, raw: string | undefined): VarStatus { + if (!raw) return { name, set: false, length: 0 } + try { + const url = new URL(raw) + return { + name, + set: true, + length: raw.length, + host: url.hostname, + pooled: url.hostname.includes('pooler.'), + } + } catch (e) { + return { + name, + set: true, + length: raw.length, + parseError: e instanceof Error ? e.message : String(e), + } + } +} + +function inspectSecret(name: string, raw: string | undefined): VarStatus { + if (!raw) return { name, set: false, length: 0 } + return { name, set: true, length: raw.length } +} + +export default async function DebugEnvPage() { + // Force dynamic so each visit reads runtime env (niet build-time gecached) + await headers() + + const vars: VarStatus[] = [ + inspectUrl('DATABASE_URL', process.env.DATABASE_URL), + inspectUrl('DIRECT_URL', process.env.DIRECT_URL), + inspectSecret('SESSION_SECRET', process.env.SESSION_SECRET), + ] + + const node = process.env.NODE_ENV ?? '(unset)' + const vercel = process.env.VERCEL_ENV ?? '(unset)' + const url = process.env.VERCEL_URL ?? '(unset)' + const region = process.env.VERCEL_REGION ?? '(unset)' + + return ( +
+

Env-var debug

+

+ Server-side gerenderd. Toont alleen metadata, geen waardes. Verwijderen na env-config check. +

+ +

Runtime

+ + + + + + + +
NODE_ENV{node}
VERCEL_ENV{vercel}
VERCEL_URL{url}
VERCEL_REGION{region}
+ +

Variables

+ + + + + + + + + + + + + {vars.map((v) => ( + + + + + + + + + ))} + +
namesetlengthhostpooledparse_error
{v.name} + {v.set ? 'yes' : 'NO'} + {v.length}{v.host ?? '—'} + {v.pooled === undefined ? '—' : v.pooled ? 'yes (LISTEN may not work)' : 'no'} + + {v.parseError ?? '—'} +
+
+ ) +}