Fix foreign key constraint error when creating proxy hosts
The issue occurred because the auth system uses a hardcoded JWT user ID (1) that didn't exist in the database, causing foreign key constraint violations when creating proxy hosts. Changes: - Added init-db.ts to ensure admin user exists in database - Added instrumentation.ts to run DB initialization on server startup - Admin user (from ADMIN_USERNAME env var) is now created with ID 1 - Matches the hardcoded ID in auth.ts for JWT tokens Fixes foreign key constraint error (P2003) when creating proxy hosts. 🤖 Generated with [Claude Code](https://claude.com/claude-code) Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
2
next-env.d.ts
vendored
2
next-env.d.ts
vendored
@@ -1,6 +1,6 @@
|
||||
/// <reference types="next" />
|
||||
/// <reference types="next/image-types/global" />
|
||||
import "./.next/dev/types/routes.d.ts";
|
||||
import "./.next/types/routes.d.ts";
|
||||
|
||||
// NOTE: This file should not be edited
|
||||
// see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
|
||||
|
||||
18
src/instrumentation.ts
Normal file
18
src/instrumentation.ts
Normal file
@@ -0,0 +1,18 @@
|
||||
/**
|
||||
* Next.js instrumentation hook - runs once when the server starts
|
||||
* https://nextjs.org/docs/app/building-your-application/optimizing/instrumentation
|
||||
*/
|
||||
export async function register() {
|
||||
// Only run on the server side
|
||||
if (process.env.NEXT_RUNTIME === "nodejs") {
|
||||
const { ensureAdminUser } = await import("./lib/init-db");
|
||||
|
||||
try {
|
||||
await ensureAdminUser();
|
||||
console.log("Database initialization complete");
|
||||
} catch (error) {
|
||||
console.error("Failed to initialize database:", error);
|
||||
// Don't throw - let the app start anyway, errors will surface when users try to use features
|
||||
}
|
||||
}
|
||||
}
|
||||
55
src/lib/init-db.ts
Normal file
55
src/lib/init-db.ts
Normal file
@@ -0,0 +1,55 @@
|
||||
import prisma, { nowIso } from "./db";
|
||||
import { config } from "./config";
|
||||
|
||||
/**
|
||||
* Ensures the admin user from environment variables exists in the database.
|
||||
* This is called during application startup.
|
||||
*/
|
||||
export async function ensureAdminUser(): Promise<void> {
|
||||
const adminId = 1; // Must match the hardcoded ID in auth.ts
|
||||
const adminEmail = `${config.adminUsername}@localhost`;
|
||||
const provider = "credentials";
|
||||
const subject = config.adminUsername;
|
||||
|
||||
// Check if admin user already exists
|
||||
const existingUser = await prisma.user.findUnique({
|
||||
where: { id: adminId }
|
||||
});
|
||||
|
||||
if (existingUser) {
|
||||
// Admin user exists, update if needed
|
||||
if (existingUser.email !== adminEmail || existingUser.subject !== subject) {
|
||||
const now = new Date(nowIso());
|
||||
await prisma.user.update({
|
||||
where: { id: adminId },
|
||||
data: {
|
||||
email: adminEmail,
|
||||
subject,
|
||||
updatedAt: now
|
||||
}
|
||||
});
|
||||
console.log(`Updated admin user: ${config.adminUsername}`);
|
||||
}
|
||||
return;
|
||||
}
|
||||
|
||||
// Create admin user
|
||||
const now = new Date(nowIso());
|
||||
await prisma.user.create({
|
||||
data: {
|
||||
id: adminId,
|
||||
email: adminEmail,
|
||||
name: config.adminUsername,
|
||||
passwordHash: null, // Using environment variable auth, not password hash
|
||||
role: "admin",
|
||||
provider,
|
||||
subject,
|
||||
avatarUrl: null,
|
||||
status: "active",
|
||||
createdAt: now,
|
||||
updatedAt: now
|
||||
}
|
||||
});
|
||||
|
||||
console.log(`Created admin user: ${config.adminUsername}`);
|
||||
}
|
||||
Reference in New Issue
Block a user