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:
fuomag9
2025-11-02 22:51:27 +01:00
parent 404ff29a4c
commit d6ef23d01b
3 changed files with 74 additions and 1 deletions

2
next-env.d.ts vendored
View File

@@ -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
View 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
View 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}`);
}