From 250b7c5261e8a88c2d1d7b1a88dae711f7b4990a Mon Sep 17 00:00:00 2001 From: bagasbanuna Date: Tue, 3 Mar 2026 12:03:30 +0800 Subject: [PATCH] Fix Prisma --- next.config.js | 8 ++++++++ scripts/postbuild.js | 41 +++++++++++++++++++++++++++++++++++++++++ src/lib/prisma.ts | 10 ++++++++++ 3 files changed, 59 insertions(+) create mode 100644 scripts/postbuild.js diff --git a/next.config.js b/next.config.js index 438386a8..40c379a2 100644 --- a/next.config.js +++ b/next.config.js @@ -3,12 +3,20 @@ const nextConfig = { reactStrictMode: false, experimental: { serverActions: true, + serverComponentsExternalPackages: ['@prisma/client'], }, output: "standalone", staticPageGenerationTimeout: 180, // tingkatkan menjadi 3 menit eslint: { ignoreDuringBuilds: true, }, + webpack: (config, { isServer }) => { + if (isServer) { + config.externals = config.externals || []; + config.externals.push('@prisma/client'); + } + return config; + }, // async headers() { // return [ // { diff --git a/scripts/postbuild.js b/scripts/postbuild.js new file mode 100644 index 00000000..adb56ed0 --- /dev/null +++ b/scripts/postbuild.js @@ -0,0 +1,41 @@ +const fs = require('fs'); +const path = require('path'); + +const standaloneDir = path.join(__dirname, '../.next/standalone'); +const prismaDir = path.join(__dirname, '../node_modules/.prisma'); + +console.log('🚀 Running postbuild script...'); + +// Copy Prisma binaries ke standalone output +if (fs.existsSync(prismaDir)) { + const dest = path.join(standaloneDir, 'node_modules/.prisma'); + fs.mkdirSync(path.dirname(dest), { recursive: true }); + fs.cpSync(prismaDir, dest, { recursive: true }); + console.log('✓ Prisma binaries copied to standalone output'); +} else { + console.warn('⚠ Prisma binaries directory not found, skipping...'); +} + +// Copy schema.prisma jika diperlukan +const schemaSrc = path.join(__dirname, '../prisma/schema.prisma'); +const schemaDest = path.join(standaloneDir, 'prisma/schema.prisma'); +if (fs.existsSync(schemaSrc)) { + fs.mkdirSync(path.dirname(schemaDest), { recursive: true }); + fs.copyFileSync(schemaSrc, schemaDest); + console.log('✓ schema.prisma copied to standalone output'); +} else { + console.warn('⚠ schema.prisma not found, skipping...'); +} + +// Copy prisma client dari node_modules/@prisma/client +const prismaClientSrc = path.join(__dirname, '../node_modules/@prisma/client'); +const prismaClientDest = path.join(standaloneDir, 'node_modules/@prisma/client'); +if (fs.existsSync(prismaClientSrc)) { + fs.mkdirSync(path.dirname(prismaClientDest), { recursive: true }); + fs.cpSync(prismaClientSrc, prismaClientDest, { recursive: true }); + console.log('✓ @prisma/client copied to standalone output'); +} else { + console.warn('⚠ @prisma/client not found, skipping...'); +} + +console.log('✅ Postbuild script completed!'); diff --git a/src/lib/prisma.ts b/src/lib/prisma.ts index bf87ef84..ac62c007 100644 --- a/src/lib/prisma.ts +++ b/src/lib/prisma.ts @@ -12,11 +12,21 @@ if (process.env.NODE_ENV === "production") { prisma = new PrismaClient({ // Reduce logging in production to improve performance log: ['error', 'warn'], + datasources: { + db: { + url: process.env.DATABASE_URL, + }, + }, }); } else { if (!global.prisma) { global.prisma = new PrismaClient({ log: ['error', 'warn', 'info', 'query'], // More verbose logging in development + datasources: { + db: { + url: process.env.DATABASE_URL, + }, + }, }); } prisma = global.prisma;