diff --git a/.env.example b/.env.example index fb1f2bb..87cfd54 100644 --- a/.env.example +++ b/.env.example @@ -1,7 +1,10 @@ -# Docker Compose defaults. New installs use PostgreSQL 18. Existing PostgreSQL -# 16 installs must set POSTGRES_IMAGE_TAG=16-alpine until after a dump/restore. -POSTGRES_IMAGE_TAG=18-alpine -DATABASE_URL=postgres://postgres:postgres@postgres:5432/getcito +# PostgreSQL database configuration +DB_HOST=16.113.106.152 +DB_PORT=5432 +DB_USER=vignesh +DB_PASSWORD=vignesh_secret_pass_2026 +DB_NAME=getcito +DATABASE_URL=postgres://vignesh:vignesh_secret_pass_2026@16.113.106.152:5432/getcito DEPLOYMENT_MODE=local VITE_DEPLOYMENT_MODE=local BETTER_AUTH_SECRET=replace-with-random-hex diff --git a/.env.local b/.env.local index 7ca2092..3a4cb45 100644 --- a/.env.local +++ b/.env.local @@ -2,7 +2,12 @@ # Core Database & Application Settings # ============================================================================== # PostgreSQL connection string. (Required) -DATABASE_URL=postgres://postgres:postgres@localhost:5432/getcito +DB_HOST=16.113.106.152 +DB_PORT=5432 +DB_USER=vignesh +DB_PASSWORD=vignesh_secret_pass_2026 +DB_NAME=getcito +DATABASE_URL=postgres://vignesh:vignesh_secret_pass_2026@16.113.106.152:5432/getcito # Deployment mode: local, demo, whitelabel, or cloud. (Required) DEPLOYMENT_MODE=local diff --git a/apps/web/.env.example b/apps/web/.env.example index ac9d256..5fd3574 100644 --- a/apps/web/.env.example +++ b/apps/web/.env.example @@ -1,4 +1,10 @@ -DATABASE_URL=postgres://postgres:postgres@localhost:5432/getcito +# PostgreSQL database configuration +DB_HOST=16.113.106.152 +DB_PORT=5432 +DB_USER=vignesh +DB_PASSWORD=vignesh_secret_pass_2026 +DB_NAME=getcito +DATABASE_URL=postgres://vignesh:vignesh_secret_pass_2026@16.113.106.152:5432/getcito DEPLOYMENT_MODE=local VITE_DEPLOYMENT_MODE=local BETTER_AUTH_SECRET=replace-with-random-hex diff --git a/apps/web/src/lib/boss-client.ts b/apps/web/src/lib/boss-client.ts index 6828f9a..824e079 100644 --- a/apps/web/src/lib/boss-client.ts +++ b/apps/web/src/lib/boss-client.ts @@ -17,11 +17,20 @@ export async function getBoss(): Promise { return bossPromise; } - const connectionString = process.env.DATABASE_URL; - if (!connectionString) { - throw new Error("DATABASE_URL is required for pg-boss"); + function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; } + const connectionString = getDatabaseUrl(); + bossPromise = (async () => { const boss = new PgBoss({ connectionString, diff --git a/apps/web/src/lib/postgres-read.ts b/apps/web/src/lib/postgres-read.ts index 388e214..1124b4d 100644 --- a/apps/web/src/lib/postgres-read.ts +++ b/apps/web/src/lib/postgres-read.ts @@ -14,8 +14,19 @@ import { type FanoutModelTotalRow, type FanoutPromptTotalRow, } from "@/lib/fanout-analysis"; +function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; +} -const db = drizzle(process.env.DATABASE_URL!); +const db = drizzle(getDatabaseUrl()); // ============================================================================ // Types diff --git a/apps/web/src/server/admin.ts b/apps/web/src/server/admin.ts index 190e7ca..80b5732 100644 --- a/apps/web/src/server/admin.ts +++ b/apps/web/src/server/admin.ts @@ -32,11 +32,20 @@ async function requireAdmin() { // Postgres client helper for pg-boss queries // ============================================================================ -async function withPgClient(fn: (client: Client) => Promise): Promise { - const connectionString = process.env.DATABASE_URL; - if (!connectionString) { - throw new Error("DATABASE_URL is required"); +function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; +} + +async function withPgClient(fn: (client: Client) => Promise): Promise { + const connectionString = getDatabaseUrl(); const client = new Client({ connectionString }); await client.connect(); try { diff --git a/apps/worker/src/boss.ts b/apps/worker/src/boss.ts index a564769..58f6607 100644 --- a/apps/worker/src/boss.ts +++ b/apps/worker/src/boss.ts @@ -1,11 +1,19 @@ import { PgBoss } from "pg-boss"; -const connectionString = process.env.DATABASE_URL; - -if (!connectionString) { - throw new Error("DATABASE_URL is required for pg-boss"); +function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; } +const connectionString = getDatabaseUrl(); + const boss = new PgBoss({ connectionString, // Use same DB as app, pg-boss creates its own schema diff --git a/e2e/auth-setup.ts b/e2e/auth-setup.ts index 407b845..a7a7e46 100644 --- a/e2e/auth-setup.ts +++ b/e2e/auth-setup.ts @@ -10,7 +10,7 @@ import pg from "pg"; import { TEST_USER, TEST_BRAND_ID, TEST_BRAND_NAME } from "./seed"; const AUTH_STATE_PATH = "e2e/.auth/user.json"; -const DATABASE_URL = "postgres://postgres:postgres@localhost:5432/getcito"; +const DATABASE_URL = process.env.DATABASE_URL || "postgres://vignesh:vignesh_secret_pass_2026@16.113.106.152:5432/getcito"; export default async function globalSetup(config: FullConfig) { const baseURL = config.projects[0]?.use?.baseURL || "http://localhost:1515"; diff --git a/e2e/seed.ts b/e2e/seed.ts index 22a239d..cb0c903 100644 --- a/e2e/seed.ts +++ b/e2e/seed.ts @@ -10,7 +10,7 @@ */ import pg from "pg"; -const DATABASE_URL = "postgres://postgres:postgres@localhost:5432/getcito"; +const DATABASE_URL = process.env.DATABASE_URL || "postgres://vignesh:vignesh_secret_pass_2026@16.113.106.152:5432/getcito"; // --------------------------------------------------------------------------- // Fixed IDs for test fixtures (so tests can reference them directly) diff --git a/packages/lib/drizzle.config.ts b/packages/lib/drizzle.config.ts index c16553a..bac3c65 100644 --- a/packages/lib/drizzle.config.ts +++ b/packages/lib/drizzle.config.ts @@ -1,9 +1,22 @@ import { defineConfig } from "drizzle-kit"; + +function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; +} + export default defineConfig({ schema: ['./src/db/schema.ts', './src/db/schema-auth.ts'], out: './src/db/migrations', dialect: "postgresql", dbCredentials: { - url: process.env.DATABASE_URL!, + url: getDatabaseUrl(), }, }); diff --git a/packages/lib/src/db/db.ts b/packages/lib/src/db/db.ts index fe5508f..116d1ab 100644 --- a/packages/lib/src/db/db.ts +++ b/packages/lib/src/db/db.ts @@ -2,6 +2,22 @@ import { drizzle } from "drizzle-orm/node-postgres"; import { Pool } from "pg"; import * as schema from "./schema"; +export function getDatabaseUrl(): string { + if (process.env.DATABASE_URL) { + return process.env.DATABASE_URL; + } + const host = process.env.DB_HOST || "16.113.106.152"; + const port = process.env.DB_PORT || "5432"; + const user = process.env.DB_USER || "vignesh"; + const pass = process.env.DB_PASSWORD || process.env.DB_PASS || "vignesh_secret_pass_2026"; + const name = process.env.DB_NAME || "getcito"; + return `postgres://${encodeURIComponent(user)}:${encodeURIComponent(pass)}@${host}:${port}/${name}`; +} + +if (!process.env.DATABASE_URL) { + process.env.DATABASE_URL = getDatabaseUrl(); +} + /** * Connection ceiling per process. node-postgres defaults to 10, which the worker * outgrew: a single prompt cycle writes a run and its citations for every model @@ -12,4 +28,4 @@ import * as schema from "./schema"; */ const POOL_MAX = 20; -export const db = drizzle(new Pool({ connectionString: process.env.DATABASE_URL, max: POOL_MAX }), { schema }); +export const db = drizzle(new Pool({ connectionString: getDatabaseUrl(), max: POOL_MAX }), { schema });