From afa448c523ac4d56f1d1793f3a1cdec71950550f Mon Sep 17 00:00:00 2001 From: Chris Arderne Date: Mon, 29 Jun 2026 12:40:31 +0100 Subject: [PATCH] fix(dashboard-agent-db): load .env for local migrations MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The Drizzle migrator (migrate.mjs / migrate-status.mjs) reads only process.env, so `pnpm run db:migrate` failed locally with "No database url set" — unlike Prisma, which auto-loads .env. Load the repo .env via node's --env-file-if-exists (no-op in the container/cloud, where the file is absent and real env vars win) and expand ${VAR} refs the flag would otherwise keep literal (e.g. DIRECT_URL=${DATABASE_URL}). --- internal-packages/dashboard-agent-db/migrate-status.mjs | 7 ++++--- internal-packages/dashboard-agent-db/migrate.mjs | 7 +++++-- internal-packages/dashboard-agent-db/package.json | 4 ++-- 3 files changed, 11 insertions(+), 7 deletions(-) diff --git a/internal-packages/dashboard-agent-db/migrate-status.mjs b/internal-packages/dashboard-agent-db/migrate-status.mjs index 8b3791a06b3..1f66c000fc0 100644 --- a/internal-packages/dashboard-agent-db/migrate-status.mjs +++ b/internal-packages/dashboard-agent-db/migrate-status.mjs @@ -8,12 +8,13 @@ import postgres from "postgres"; const MIGRATIONS_SCHEMA = "drizzle"; const MIGRATIONS_TABLE = "__dashboard_agent_migrations"; -// Match migrate.mjs: a direct (non-pooler) connection, same precedence. -const connectionString = +// Match migrate.mjs: same precedence, and expand `${VAR}` refs (see migrate.mjs). +const connectionString = ( process.env.DASHBOARD_AGENT_DIRECT_URL ?? process.env.DASHBOARD_AGENT_DATABASE_URL ?? process.env.DIRECT_URL ?? - process.env.DATABASE_URL; + process.env.DATABASE_URL +)?.replace(/\$\{(\w+)\}/g, (_, k) => process.env[k] ?? ""); if (!connectionString) { console.error( diff --git a/internal-packages/dashboard-agent-db/migrate.mjs b/internal-packages/dashboard-agent-db/migrate.mjs index ba4e4c6c803..cff97c4bc69 100644 --- a/internal-packages/dashboard-agent-db/migrate.mjs +++ b/internal-packages/dashboard-agent-db/migrate.mjs @@ -14,11 +14,14 @@ import postgres from "postgres"; // can't run the migrator. Prefer the agent's direct url, then its pooled url, // then the main DIRECT_URL/DATABASE_URL (OSS single-database fallback; tables // still land in the `trigger_dashboard_agent` schema). -const connectionString = +// `.replace` expands `${VAR}` refs (e.g. the repo .env's DIRECT_URL=${DATABASE_URL}); +// node's --env-file loads them literally, unlike Prisma's dotenv-expand. +const connectionString = ( process.env.DASHBOARD_AGENT_DIRECT_URL ?? process.env.DASHBOARD_AGENT_DATABASE_URL ?? process.env.DIRECT_URL ?? - process.env.DATABASE_URL; + process.env.DATABASE_URL +)?.replace(/\$\{(\w+)\}/g, (_, k) => process.env[k] ?? ""); if (!connectionString) { console.error( diff --git a/internal-packages/dashboard-agent-db/package.json b/internal-packages/dashboard-agent-db/package.json index b91535c0e97..15a1d9d7326 100644 --- a/internal-packages/dashboard-agent-db/package.json +++ b/internal-packages/dashboard-agent-db/package.json @@ -16,8 +16,8 @@ "typecheck": "tsc --noEmit", "db:generate": "drizzle-kit generate", "db:migrate": "drizzle-kit migrate", - "db:migrate:deploy": "node migrate.mjs", - "db:migrate:status": "node migrate-status.mjs", + "db:migrate:deploy": "node --env-file-if-exists=../../.env migrate.mjs", + "db:migrate:status": "node --env-file-if-exists=../../.env migrate-status.mjs", "db:studio": "drizzle-kit studio" } }