From 9d4b1dabae865229cb1a84f8896384f4a72121b0 Mon Sep 17 00:00:00 2001 From: R0m1k3 Date: Fri, 10 Apr 2026 10:19:51 +0200 Subject: [PATCH] feat: implement Prisma SQLite adapter, upgrade to Node 22, and improve container initialization and permissions --- Dockerfile | 17 ++++++++++------- entrypoint.sh | 22 ++++++++++++++++------ lib/db.ts | 29 +++++++++++++++++++++++++---- package.json | 2 +- 4 files changed, 52 insertions(+), 18 deletions(-) diff --git a/Dockerfile b/Dockerfile index 0405c70..f9ec056 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,9 @@ # Stage 1: Build -FROM node:20-bookworm-slim AS builder +FROM node:22-bookworm-slim AS builder WORKDIR /app -# Install build dependencies for better-sqlite3 and bcrypt +# Install build dependencies RUN apt-get update && apt-get install -y \ python3 \ make \ @@ -11,9 +11,6 @@ RUN apt-get update && apt-get install -y \ build-essential \ && rm -rf /var/lib/apt/lists/* -# Set a dummy database URL for build time -ENV DATABASE_URL="file:./build.db" - COPY package*.json ./ COPY prisma ./prisma/ @@ -25,19 +22,21 @@ COPY . . RUN npx prisma generate # Build Next.js app +ENV DATABASE_URL="file:./build.db" RUN npm run build # Stage 2: Runner -FROM node:20-bookworm-slim AS runner +FROM node:22-bookworm-slim AS runner WORKDIR /app ENV NODE_ENV=production ENV NEXT_TELEMETRY_DISABLED=1 -# Install runtime dependencies for SQLite +# Install runtime dependencies RUN apt-get update && apt-get install -y \ openssl \ + curl \ && rm -rf /var/lib/apt/lists/* # Copy standalone build and static files @@ -45,6 +44,10 @@ COPY --from=builder /app/public ./public COPY --from=builder /app/.next/standalone ./ COPY --from=builder /app/.next/static ./.next/static COPY --from=builder /app/prisma ./prisma +COPY --from=builder /app/prisma.config.ts ./prisma.config.ts + +# Ensure prisma directory is accessible and writable for SQLite +RUN mkdir -p /app/prisma && chmod -R 777 /app/prisma # Expose port EXPOSE 3214 diff --git a/entrypoint.sh b/entrypoint.sh index c517fe9..8e61ab8 100644 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -3,14 +3,24 @@ # Exit immediately if a command exits with a non-zero status set -e -echo "Starting Menu Professional..." +echo "=== Menu Professional Entrypoint ===" +echo "Node version: $(node -v)" +echo "Working directory: $(pwd)" + +# Check permissions +echo "Checking prisma directory permissions..." +ls -ld /app/prisma +touch /app/prisma/test_write && echo "Write check: SUCCESS" && rm /app/prisma/test_write || echo "Write check: FAILED" # Run database synchronization -# Note: In a production environment with persistent data, -# 'prisma db push' ensures the schema matches the code. -echo "Synchronizing database schema..." +echo "Synchronizing database schema with Prisma..." +# Ensure DATABASE_URL is set for the CLI +export DATABASE_URL=${DATABASE_URL:-"file:/app/prisma/dev.db"} npx prisma db push --accept-data-loss || echo "Database sync failed, but proceeding..." -# Start the application using node as Next.js is in standalone mode -echo "Launching server..." +# Show database file if exists +ls -l /app/prisma/dev.db || echo "Database file dev.db not yet created" + +# Start the application +echo "Launching server on port ${PORT:-3214}..." exec node server.js diff --git a/lib/db.ts b/lib/db.ts index 93e3fc8..e044937 100644 --- a/lib/db.ts +++ b/lib/db.ts @@ -4,10 +4,31 @@ import { PrismaBetterSqlite3 } from '@prisma/adapter-better-sqlite3'; const globalForPrisma = global as unknown as { prisma: PrismaClient }; const createPrismaClient = () => { - const dbUrl = process.env.DATABASE_URL || 'file:./dev.db'; - const adapter = new PrismaBetterSqlite3({ url: dbUrl }); - - return new PrismaClient({ adapter }); + try { + const dbUrl = process.env.DATABASE_URL || 'file:/app/prisma/dev.db'; + const filePath = dbUrl.replace('file:', ''); + + console.log(`[DB Init] Attempting to connect to SQLite at: ${filePath}`); + + // Check if the URL is valid + if (!filePath) { + throw new Error("DATABASE_URL must be provided and contain a valid path."); + } + + const adapter = new PrismaBetterSqlite3({ url: dbUrl }); + + const client = new PrismaClient({ + adapter, + log: ['error', 'warn'] + }); + + console.log(`[DB Init] Prisma Client initialized successfully with adapter.`); + return client; + } catch (error) { + console.error(`[DB Init Error] Critical failure during database initialization:`, error); + // Rethrow to let Next.js handle the server component error + throw error; + } }; export const prisma = globalForPrisma.prisma || createPrismaClient(); diff --git a/package.json b/package.json index 16a015c..48ef4f7 100644 --- a/package.json +++ b/package.json @@ -11,6 +11,7 @@ "dependencies": { "@prisma/adapter-better-sqlite3": "^7.7.0", "@prisma/client": "^7.7.0", + "prisma": "^7.7.0", "bcrypt": "^6.0.0", "better-sqlite3": "^12.8.0", "lucide-react": "^1.8.0", @@ -27,7 +28,6 @@ "@types/react-dom": "^19", "eslint": "^9", "eslint-config-next": "16.2.3", - "prisma": "^7.7.0", "typescript": "^5" } }