db/ fix DB env var name
This commit is contained in:
@@ -51,7 +51,7 @@ Fill in your environment variables in the `.env` file:
|
||||
|
||||
```env
|
||||
# Database
|
||||
DATABASE_URL="postgresql://username:password@localhost:5432/your_database_name"
|
||||
POSTGRES_URL="postgresql://username:password@localhost:5432/your_database_name"
|
||||
|
||||
# Authentication - Better Auth
|
||||
BETTER_AUTH_SECRET="your-random-32-character-secret-key-here"
|
||||
@@ -92,7 +92,7 @@ Your application will be available at [http://localhost:3000](http://localhost:3
|
||||
2. Navigate to the **Storage** tab
|
||||
3. Click **Create** → **Postgres**
|
||||
4. Choose your database name and region
|
||||
5. Copy the `DATABASE_URL` from the `.env.local` tab
|
||||
5. Copy the `POSTGRES_URL` from the `.env.local` tab
|
||||
6. Add it to your `.env` file
|
||||
|
||||
### Google OAuth Credentials
|
||||
@@ -171,7 +171,7 @@ npm run db:reset # Reset database (drop all tables)
|
||||
|
||||
Ensure these are set in your production environment:
|
||||
|
||||
- `DATABASE_URL` - Production PostgreSQL connection string
|
||||
- `POSTGRES_URL` - Production PostgreSQL connection string
|
||||
- `BETTER_AUTH_SECRET` - Secure random 32+ character string
|
||||
- `GOOGLE_CLIENT_ID` - Google OAuth Client ID
|
||||
- `GOOGLE_CLIENT_SECRET` - Google OAuth Client Secret
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
import type { Config } from "drizzle-kit"
|
||||
import type { Config } from "drizzle-kit";
|
||||
|
||||
export default {
|
||||
dialect: "postgresql",
|
||||
schema: "./src/lib/schema.ts",
|
||||
out: "./drizzle",
|
||||
dbCredentials: {
|
||||
url: process.env.DATABASE_URL!,
|
||||
url: process.env.POSTGRES_URL!,
|
||||
},
|
||||
} satisfies Config
|
||||
} satisfies Config;
|
||||
|
||||
@@ -1,8 +1,9 @@
|
||||
# Database
|
||||
DATABASE_URL=
|
||||
POSTGRES_URL=
|
||||
|
||||
# Authentication - Better Auth
|
||||
BETTER_AUTH_SECRET="yourauthsecretgoeshere"
|
||||
# Generate key using https://www.better-auth.com/docs/installation
|
||||
BETTER_AUTH_SECRET=qtD4Ssa0t5jY7ewALgai97sKhAtn7Ysc
|
||||
|
||||
# Google OAuth (Get from Google Cloud Console)
|
||||
GOOGLE_CLIENT_ID=
|
||||
|
||||
@@ -5,7 +5,7 @@ type StatusLevel = "ok" | "warn" | "error";
|
||||
interface DiagnosticsResponse {
|
||||
timestamp: string;
|
||||
env: {
|
||||
DATABASE_URL: boolean;
|
||||
POSTGRES_URL: boolean;
|
||||
BETTER_AUTH_SECRET: boolean;
|
||||
GOOGLE_CLIENT_ID: boolean;
|
||||
GOOGLE_CLIENT_SECRET: boolean;
|
||||
@@ -29,7 +29,7 @@ interface DiagnosticsResponse {
|
||||
|
||||
export async function GET(req: Request) {
|
||||
const env = {
|
||||
DATABASE_URL: Boolean(process.env.DATABASE_URL),
|
||||
POSTGRES_URL: Boolean(process.env.POSTGRES_URL),
|
||||
BETTER_AUTH_SECRET: Boolean(process.env.BETTER_AUTH_SECRET),
|
||||
GOOGLE_CLIENT_ID: Boolean(process.env.GOOGLE_CLIENT_ID),
|
||||
GOOGLE_CLIENT_SECRET: Boolean(process.env.GOOGLE_CLIENT_SECRET),
|
||||
@@ -41,7 +41,7 @@ export async function GET(req: Request) {
|
||||
let dbConnected = false;
|
||||
let schemaApplied = false;
|
||||
let dbError: string | undefined;
|
||||
if (env.DATABASE_URL) {
|
||||
if (env.POSTGRES_URL) {
|
||||
try {
|
||||
const [{ db }, { sql }, schema] = await Promise.all([
|
||||
import("@/lib/db"),
|
||||
@@ -65,7 +65,7 @@ export async function GET(req: Request) {
|
||||
} else {
|
||||
dbConnected = false;
|
||||
schemaApplied = false;
|
||||
dbError = "DATABASE_URL is not set";
|
||||
dbError = "POSTGRES_URL is not set";
|
||||
}
|
||||
|
||||
// Auth route check: we consider the route responding if it returns any HTTP response
|
||||
@@ -95,7 +95,7 @@ export async function GET(req: Request) {
|
||||
const aiConfigured = env.OPENAI_API_KEY; // We avoid live-calling the AI provider here
|
||||
|
||||
const overallStatus: StatusLevel = (() => {
|
||||
if (!env.DATABASE_URL || !dbConnected || !schemaApplied) return "error";
|
||||
if (!env.POSTGRES_URL || !dbConnected || !schemaApplied) return "error";
|
||||
if (!authConfigured) return "error";
|
||||
// AI is optional; warn if not configured
|
||||
if (!aiConfigured) return "warn";
|
||||
|
||||
@@ -63,7 +63,7 @@ export default function Home() {
|
||||
configure:
|
||||
</p>
|
||||
<ul className="text-sm text-muted-foreground space-y-1 list-disc list-inside">
|
||||
<li>DATABASE_URL (PostgreSQL connection string)</li>
|
||||
<li>POSTGRES_URL (PostgreSQL connection string)</li>
|
||||
<li>GOOGLE_CLIENT_ID (OAuth credentials)</li>
|
||||
<li>GOOGLE_CLIENT_SECRET (OAuth credentials)</li>
|
||||
<li>OPENAI_API_KEY (for AI functionality)</li>
|
||||
@@ -86,22 +86,16 @@ export default function Home() {
|
||||
<div className="p-4 border rounded-lg">
|
||||
<h4 className="font-medium mb-2">3. Try the features</h4>
|
||||
<div className="space-y-2">
|
||||
{(loading || !isAuthReady) ? (
|
||||
<Button
|
||||
size="sm"
|
||||
className="w-full glow"
|
||||
disabled={true}
|
||||
>
|
||||
{loading || !isAuthReady ? (
|
||||
<Button size="sm" className="w-full glow" disabled={true}>
|
||||
View Dashboard
|
||||
</Button>
|
||||
) : (
|
||||
<Button asChild size="sm" className="w-full glow">
|
||||
<Link href="/dashboard">
|
||||
View Dashboard
|
||||
</Link>
|
||||
<Link href="/dashboard">View Dashboard</Link>
|
||||
</Button>
|
||||
)}
|
||||
{(loading || !isAiReady) ? (
|
||||
{loading || !isAiReady ? (
|
||||
<Button
|
||||
variant="outline"
|
||||
size="sm"
|
||||
@@ -117,9 +111,7 @@ export default function Home() {
|
||||
size="sm"
|
||||
className="w-full"
|
||||
>
|
||||
<Link href="/chat">
|
||||
Try AI Chat
|
||||
</Link>
|
||||
<Link href="/chat">Try AI Chat</Link>
|
||||
</Button>
|
||||
)}
|
||||
</div>
|
||||
@@ -139,20 +131,18 @@ export default function Home() {
|
||||
|
||||
<footer className="border-t py-8 text-center text-sm text-muted-foreground">
|
||||
<div className="container mx-auto px-4">
|
||||
<p className="mb-2">
|
||||
Boilerplate template by Leon van Zyl
|
||||
</p>
|
||||
<p className="mb-2">Boilerplate template by Leon van Zyl</p>
|
||||
<p>
|
||||
Visit{" "}
|
||||
<a
|
||||
href="https://youtube.com/@leonvanzyl"
|
||||
target="_blank"
|
||||
<a
|
||||
href="https://youtube.com/@leonvanzyl"
|
||||
target="_blank"
|
||||
rel="noopener noreferrer"
|
||||
className="text-primary hover:underline"
|
||||
>
|
||||
@leonvanzyl on YouTube
|
||||
</a>
|
||||
{" "}for tutorials on using this template
|
||||
</a>{" "}
|
||||
for tutorials on using this template
|
||||
</p>
|
||||
</div>
|
||||
</footer>
|
||||
|
||||
@@ -6,7 +6,7 @@ import { Button } from "@/components/ui/button";
|
||||
type DiagnosticsResponse = {
|
||||
timestamp: string;
|
||||
env: {
|
||||
DATABASE_URL: boolean;
|
||||
POSTGRES_URL: boolean;
|
||||
BETTER_AUTH_SECRET: boolean;
|
||||
GOOGLE_CLIENT_ID: boolean;
|
||||
GOOGLE_CLIENT_SECRET: boolean;
|
||||
@@ -69,12 +69,12 @@ export function SetupChecklist() {
|
||||
key: "env",
|
||||
label: "Environment variables",
|
||||
ok:
|
||||
!!data?.env.DATABASE_URL &&
|
||||
!!data?.env.POSTGRES_URL &&
|
||||
!!data?.env.BETTER_AUTH_SECRET &&
|
||||
!!data?.env.GOOGLE_CLIENT_ID &&
|
||||
!!data?.env.GOOGLE_CLIENT_SECRET,
|
||||
detail:
|
||||
"Requires DATABASE_URL, BETTER_AUTH_SECRET, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET",
|
||||
"Requires POSTGRES_URL, BETTER_AUTH_SECRET, GOOGLE_CLIENT_ID, GOOGLE_CLIENT_SECRET",
|
||||
},
|
||||
{
|
||||
key: "db",
|
||||
|
||||
@@ -5,7 +5,7 @@ import { useEffect, useState } from "react";
|
||||
type DiagnosticsResponse = {
|
||||
timestamp: string;
|
||||
env: {
|
||||
DATABASE_URL: boolean;
|
||||
POSTGRES_URL: boolean;
|
||||
BETTER_AUTH_SECRET: boolean;
|
||||
GOOGLE_CLIENT_ID: boolean;
|
||||
GOOGLE_CLIENT_SECRET: boolean;
|
||||
@@ -51,7 +51,10 @@ export function useDiagnostics() {
|
||||
fetchDiagnostics();
|
||||
}, []);
|
||||
|
||||
const isAuthReady = data?.auth.configured && data?.database.connected && data?.database.schemaApplied;
|
||||
const isAuthReady =
|
||||
data?.auth.configured &&
|
||||
data?.database.connected &&
|
||||
data?.database.schemaApplied;
|
||||
const isAiReady = data?.ai.configured;
|
||||
|
||||
return {
|
||||
@@ -62,4 +65,4 @@ export function useDiagnostics() {
|
||||
isAuthReady: Boolean(isAuthReady),
|
||||
isAiReady: Boolean(isAiReady),
|
||||
};
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +1,12 @@
|
||||
import { drizzle } from "drizzle-orm/postgres-js"
|
||||
import postgres from "postgres"
|
||||
import * as schema from "./schema"
|
||||
import { drizzle } from "drizzle-orm/postgres-js";
|
||||
import postgres from "postgres";
|
||||
import * as schema from "./schema";
|
||||
|
||||
const connectionString = process.env.DATABASE_URL as string
|
||||
const connectionString = process.env.POSTGRES_URL as string;
|
||||
|
||||
if (!connectionString) {
|
||||
throw new Error("DATABASE_URL environment variable is not set")
|
||||
throw new Error("POSTGRES_URL environment variable is not set");
|
||||
}
|
||||
|
||||
const client = postgres(connectionString)
|
||||
export const db = drizzle(client, { schema })
|
||||
const client = postgres(connectionString);
|
||||
export const db = drizzle(client, { schema });
|
||||
|
||||
Reference in New Issue
Block a user